summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md5
-rw-r--r--docs/index.rst5
-rw-r--r--docs/swagger/swagger.json195
-rw-r--r--docs/swagger/swagger.pdf11809
-rw-r--r--extra/sql/bulkload/clds-create-db-objects.sql8
-rw-r--r--pom.xml32
-rw-r--r--src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java13
-rw-r--r--src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java7
-rw-r--r--src/main/java/org/onap/clamp/clds/client/req/sdc/SdcCatalogServices.java1051
-rw-r--r--src/main/java/org/onap/clamp/clds/client/req/sdc/SdcRequests.java229
-rw-r--r--src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java46
-rw-r--r--src/main/java/org/onap/clamp/clds/config/ClampProperties.java12
-rw-r--r--src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java10
-rw-r--r--src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserMappingConfiguration.java19
-rw-r--r--src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java15
-rw-r--r--src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java26
-rw-r--r--src/main/java/org/onap/clamp/clds/dao/CldsDao.java39
-rw-r--r--src/main/java/org/onap/clamp/clds/model/CldsModelInstance.java3
-rw-r--r--src/main/java/org/onap/clamp/clds/model/actions/ActionsHandler.java23
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java177
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/Global.java28
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/Holmes.java9
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/ModelBpmn.java28
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/ModelProperties.java25
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/Policy.java10
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/PolicyChain.java32
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java67
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/Tca.java11
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/TcaItem.java26
-rw-r--r--src/main/java/org/onap/clamp/clds/model/properties/TcaThreshold.java22
-rw-r--r--src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java3
-rw-r--r--src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java62
-rw-r--r--src/main/java/org/onap/clamp/clds/service/CldsService.java126
-rw-r--r--src/main/java/org/onap/clamp/clds/service/CldsUser.java2
-rw-r--r--src/main/java/org/onap/clamp/clds/service/SecureServicePermissionDeserializer.java (renamed from src/main/java/org/onap/clamp/clds/service/JacksonObjectMapperProvider.java)40
-rw-r--r--src/main/java/org/onap/clamp/clds/util/JacksonUtils.java53
-rw-r--r--src/main/java/org/onap/clamp/clds/util/JsonUtils.java170
-rw-r--r--src/main/resources/META-INF/resources/designer/index.html7
-rw-r--r--src/main/resources/META-INF/resources/designer/lib/jsoneditor.js10235
-rw-r--r--src/main/resources/META-INF/resources/designer/lib/query-builder.standalone.js6541
-rw-r--r--src/main/resources/META-INF/resources/designer/partials/menu.html10
-rw-r--r--src/main/resources/META-INF/resources/designer/partials/portfolios/clds_create_model_off_Template.html87
-rw-r--r--src/main/resources/META-INF/resources/designer/partials/portfolios/global_properties.html92
-rw-r--r--src/main/resources/META-INF/resources/designer/partials/portfolios/refresh_asdc.html146
-rw-r--r--src/main/resources/META-INF/resources/designer/partials/portfolios/tosca_model_properties.html80
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js95
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/CldsOpenModelCtrl.js157
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/GlobalPropertiesCtrl.js10
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/ToscaModelCtrl.js156
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/ToscaModelService.js38
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/aOnBoot.js108
-rw-r--r--src/main/resources/META-INF/resources/designer/scripts/app.js58
-rw-r--r--src/main/resources/META-INF/resources/swagger.html383
-rw-r--r--src/main/resources/application-noaaf.properties17
-rw-r--r--src/main/resources/application.properties19
-rw-r--r--src/main/resources/clds/camel/rest/clds-services.xml10
-rw-r--r--src/main/resources/clds/templates/sdc-decode-service_ids.json1
-rw-r--r--src/main/resources/clds/templates/sdc-template.json1
-rw-r--r--src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java19
-rw-r--r--src/test/java/org/onap/clamp/clds/client/req/policy/GuardPolicyAttributesConstructorTest.java3
-rw-r--r--src/test/java/org/onap/clamp/clds/client/req/policy/OperationalPolicyAttributesConstructorTest.java11
-rw-r--r--src/test/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatterTest.java98
-rw-r--r--src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java3
-rw-r--r--src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java26
-rw-r--r--src/test/java/org/onap/clamp/clds/it/CldsDaoItCase.java34
-rw-r--r--src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java38
-rw-r--r--src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java24
-rw-r--r--src/test/java/org/onap/clamp/clds/it/PolicyClientItCase.java67
-rw-r--r--src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesItCase.java305
-rw-r--r--src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java106
-rw-r--r--src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java51
-rw-r--r--src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java3
-rw-r--r--src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java6
-rw-r--r--src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java59
-rw-r--r--src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java12
-rw-r--r--src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java32
-rw-r--r--src/test/java/org/onap/clamp/clds/model/sdc/SdcResourceBasicInfoTest.java22
-rw-r--r--src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java29
-rw-r--r--src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java66
-rw-r--r--src/test/java/org/onap/clamp/clds/util/JacksonUtilsTest.java96
-rw-r--r--src/test/java/org/onap/clamp/clds/util/JsonUtilsTest.java157
-rw-r--r--src/test/resources/application.properties17
-rw-r--r--src/test/resources/example/model-properties/custom/modelBpmnPropertiesMultiVF.json273
-rw-r--r--src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml104
-rw-r--r--src/test/resources/example/sdc/service-Simsfoimap0112.csarbin49933 -> 52391 bytes
-rw-r--r--src/test/resources/tosca/dcea_blueprint.yml170
86 files changed, 24365 insertions, 10155 deletions
diff --git a/README.md b/README.md
index 783501a66..e5b6090f2 100644
--- a/README.md
+++ b/README.md
@@ -45,11 +45,6 @@ Note that all others configurations can be configured in the JSON as well,
"spring.datasource.cldsdb.username": "admin",
"spring.datasource.cldsdb.password": "password"
- "clamp.config.sdc.catalog.url": "https://sdchost:8443/sdc/v1/catalog/",
- "clamp.config.sdc.hostUrl": "https://sdchost:8443/",
- "clamp.config.sdc.serviceUrl": "https://sdchost:8443/sdc/v1/catalog/services",
- "clamp.config.sdc.serviceUsername": "clamp",
- "clamp.config.sdc.servicePassword": "b7acccda32b98c5bb7acccda32b98c5b05D511BD6D93626E90D18E9D24D9B78CD34C7EE8012F0A189A28763E82271E50A5D4EC10C7D93E06E0A2D27CAE66B981",
"clamp.config.dcae.inventory.url": "http://dcaegen2.host:8080",
"clamp.config.dcae.dispatcher.url": "http://dcaegen2.host:8080",
"clamp.config.policy.pdpUrl1": "https://policy-pdp.host:9091/pdp/ , testpdp, alpha123",
diff --git a/docs/index.rst b/docs/index.rst
index 677c32b12..03859a994 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -116,11 +116,6 @@ There are one datasource for Clamp. By default, it will try to connect to the lo
"spring.datasource.cldsdb.username": "admin",
"spring.datasource.cldsdb.password": "password",
- "clamp.config.sdc.catalog.url": "https://sdchost:8443/sdc/v1/catalog/",
- "clamp.config.sdc.hostUrl": "https://sdchost:8443/",
- "clamp.config.sdc.serviceUrl": "https://sdchost:8443/sdc/v1/catalog/services",
- "clamp.config.sdc.serviceUsername": "clamp",
- "clamp.config.sdc.servicePassword": "b7acccda32b98c5bb7acccda32b98c5b05D511BD6D93626E90D18E9D24D9B78CD34C7EE8012F0A189A28763E82271E50A5D4EC10C7D93E06E0A2D27CAE66B981",
"clamp.config.dcae.inventory.url": "http://dcaegen2.host:8080",
"clamp.config.dcae.dispatcher.url": "http://dcaegen2.host:8188",
"clamp.config.policy.pdpUrl1": "https://policy-pdp.host:9091/pdp/ , testpdp, alpha123",
diff --git a/docs/swagger/swagger.json b/docs/swagger/swagger.json
index 819d0919c..85fe2f701 100644
--- a/docs/swagger/swagger.json
+++ b/docs/swagger/swagger.json
@@ -1,7 +1,7 @@
{
"swagger" : "2.0",
"info" : {
- "version" : "3.0.3-SNAPSHOT",
+ "version" : "4.0.0-SNAPSHOT",
"title" : "Clamp Rest API"
},
"host" : "0.0.0.0",
@@ -10,7 +10,7 @@
"paths" : {
"/clds/action/{action}/{modelName}?test={test}" : {
"put" : {
- "operationId" : "route10",
+ "operationId" : "route66",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -34,13 +34,13 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route10"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route66"
}
},
"/clds/cldsDetails" : {
"get" : {
- "operationId" : "route2",
+ "operationId" : "route58",
"produces" : [ "application/json" ],
"responses" : {
"200" : {
@@ -53,13 +53,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route2"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route58"
}
},
"/clds/cldsInfo" : {
"get" : {
- "operationId" : "route3",
+ "operationId" : "route59",
"produces" : [ "application/json" ],
"responses" : {
"200" : {
@@ -72,13 +72,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route3"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route59"
}
},
"/clds/dcae/event?test={test}" : {
"post" : {
- "operationId" : "route11",
+ "operationId" : "route67",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -92,13 +92,13 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route11"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route67"
}
},
"/clds/deploy/{modelName}" : {
"put" : {
- "operationId" : "route15",
+ "operationId" : "route69",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -117,13 +117,13 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route15"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route69"
}
},
"/clds/model-names" : {
"get" : {
- "operationId" : "route9",
+ "operationId" : "route65",
"produces" : [ "application/json" ],
"responses" : {
"200" : {
@@ -136,13 +136,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route9"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route65"
}
},
"/clds/model/{modelName}" : {
"get" : {
- "operationId" : "route7",
+ "operationId" : "route63",
"produces" : [ "application/json" ],
"parameters" : [ {
"name" : "modelName",
@@ -161,11 +161,11 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route7"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route63"
},
"put" : {
- "operationId" : "route8",
+ "operationId" : "route64",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -192,13 +192,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route8"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route64"
}
},
"/clds/model/bpmn/{modelName}" : {
"get" : {
- "operationId" : "route5",
+ "operationId" : "route61",
"produces" : [ "text/xml" ],
"parameters" : [ {
"name" : "modelName",
@@ -209,13 +209,13 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route5"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route61"
}
},
"/clds/model/image/{modelName}" : {
"get" : {
- "operationId" : "route6",
+ "operationId" : "route62",
"produces" : [ "text/xml" ],
"parameters" : [ {
"name" : "modelName",
@@ -226,52 +226,24 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route6"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route62"
}
},
"/clds/properties" : {
"get" : {
- "operationId" : "route13",
+ "operationId" : "route68",
"produces" : [ "application/json" ],
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route13"
- }
- },
- "/clds/properties/{serviceInvariantUUID}?refresh={refresh}" : {
- "get" : {
- "operationId" : "route14",
- "produces" : [ "application/json" ],
- "parameters" : [ {
- "name" : "serviceInvariantUUID}?refresh={refresh",
- "in" : "path",
- "required" : true,
- "type" : "string"
- } ],
- "responses" : {
- "200" : { }
- },
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route14"
- }
- },
- "/clds/sdc/services" : {
- "get" : {
- "operationId" : "route12",
- "produces" : [ "application/json" ],
- "responses" : {
- "200" : { }
- },
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route12"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route68"
}
},
"/clds/undeploy/{modelName}" : {
"put" : {
- "operationId" : "route16",
+ "operationId" : "route70",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -290,13 +262,13 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route16"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route70"
}
},
"/cldsTempate/template-names" : {
"get" : {
- "operationId" : "route21",
+ "operationId" : "route75",
"produces" : [ "application/json" ],
"responses" : {
"200" : {
@@ -309,13 +281,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route21"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route75"
}
},
"/cldsTempate/template/{templateName}" : {
"get" : {
- "operationId" : "route19",
+ "operationId" : "route73",
"produces" : [ "application/json" ],
"parameters" : [ {
"name" : "templateName",
@@ -334,11 +306,11 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route19"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route73"
},
"put" : {
- "operationId" : "route20",
+ "operationId" : "route74",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -365,13 +337,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route20"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route74"
}
},
"/cldsTempate/template/bpmn/{templateName}" : {
"get" : {
- "operationId" : "route17",
+ "operationId" : "route71",
"produces" : [ "text/xml" ],
"parameters" : [ {
"name" : "templateName",
@@ -382,13 +354,13 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route17"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route71"
}
},
"/cldsTempate/template/image/{templateName}" : {
"get" : {
- "operationId" : "route18",
+ "operationId" : "route72",
"produces" : [ "text/xml" ],
"parameters" : [ {
"name" : "templateName",
@@ -399,13 +371,13 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route18"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route72"
}
},
"/dictionary" : {
"get" : {
- "operationId" : "route27",
+ "operationId" : "route81",
"produces" : [ "application/json" ],
"responses" : {
"200" : {
@@ -418,13 +390,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route27"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route81"
}
},
"/dictionary/{dictionaryName}" : {
"put" : {
- "operationId" : "route26",
+ "operationId" : "route80",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -451,13 +423,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route26"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route80"
}
},
"/dictionary/{dictionaryName}/items" : {
"get" : {
- "operationId" : "route29",
+ "operationId" : "route83",
"produces" : [ "application/json" ],
"parameters" : [ {
"name" : "dictionaryName",
@@ -476,11 +448,11 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route29"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route83"
},
"put" : {
- "operationId" : "route28",
+ "operationId" : "route82",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -507,24 +479,24 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route28"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route82"
}
},
"/healthcheck" : {
"get" : {
- "operationId" : "route4",
+ "operationId" : "route60",
"produces" : [ "application/json" ],
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route4"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route60"
}
},
"/tosca/models" : {
"get" : {
- "operationId" : "route24",
+ "operationId" : "route78",
"produces" : [ "application/json" ],
"responses" : {
"200" : {
@@ -537,13 +509,13 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route24"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route78"
}
},
"/tosca/models/{toscaModelName}" : {
"get" : {
- "operationId" : "route25",
+ "operationId" : "route79",
"produces" : [ "application/json" ],
"parameters" : [ {
"name" : "toscaModelName",
@@ -562,11 +534,11 @@
}
}
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route25"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route79"
},
"put" : {
- "operationId" : "route22",
+ "operationId" : "route76",
"consumes" : [ "application/json" ],
"produces" : [ "application/json" ],
"parameters" : [ {
@@ -585,13 +557,13 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route22"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route76"
}
},
"/tosca/models/policyType/{policyType}" : {
"get" : {
- "operationId" : "route23",
+ "operationId" : "route77",
"produces" : [ "application/json" ],
"parameters" : [ {
"name" : "policyType",
@@ -602,19 +574,19 @@
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route23"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route77"
}
},
"/user/getUser" : {
"get" : {
- "operationId" : "route30",
+ "operationId" : "route84",
"produces" : [ "text/plain" ],
"responses" : {
"200" : { }
},
- "x-camelContextId" : "camel-1",
- "x-routeId" : "route30"
+ "x-camelContextId" : "camel-3",
+ "x-routeId" : "route84"
}
}
},
@@ -737,6 +709,9 @@
"closeloopName" : {
"type" : "string"
},
+ "modelId" : {
+ "type" : "string"
+ },
"modelName" : {
"type" : "string"
},
diff --git a/docs/swagger/swagger.pdf b/docs/swagger/swagger.pdf
index b5f3ad09f..e201bc815 100644
--- a/docs/swagger/swagger.pdf
+++ b/docs/swagger/swagger.pdf
@@ -4,16 +4,16 @@
<< /Title (Clamp Rest API)
/Creator (Asciidoctor PDF 1.5.0.alpha.10, based on Prawn 1.3.0)
/Producer (Asciidoctor PDF 1.5.0.alpha.10, based on Prawn 1.3.0)
-/CreationDate (D:20181126113707+01'00')
-/ModDate (D:20181126113707+01'00')
+/CreationDate (D:20190212143813+01'00')
+/ModDate (D:20190212143813+01'00')
>>
endobj
2 0 obj
<< /Type /Catalog
/Pages 3 0 R
/Names 20 0 R
-/Outlines 497 0 R
-/PageLabels 631 0 R
+/Outlines 473 0 R
+/PageLabels 600 0 R
/PageMode /UseOutlines
/OpenAction [7 0 R /FitH 793.0]
/ViewerPreferences << /DisplayDocTitle true
@@ -22,8 +22,8 @@ endobj
endobj
3 0 obj
<< /Type /Pages
-/Count 26
-/Kids [7 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 27 0 R 42 0 R 58 0 R 71 0 R 85 0 R 98 0 R 110 0 R 125 0 R 138 0 R 153 0 R 168 0 R 183 0 R 197 0 R 204 0 R 210 0 R 214 0 R 219 0 R 223 0 R 226 0 R 231 0 R]
+/Count 25
+/Kids [7 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 27 0 R 42 0 R 58 0 R 71 0 R 85 0 R 98 0 R 112 0 R 126 0 R 141 0 R 156 0 R 169 0 R 183 0 R 193 0 R 199 0 R 203 0 R 208 0 R 212 0 R 215 0 R 220 0 R]
>>
endobj
4 0 obj
@@ -80,11 +80,11 @@ endobj
<< /Type /Font
/BaseFont /AAAAAA+NotoSerif
/Subtype /TrueType
-/FontDescriptor 633 0 R
+/FontDescriptor 602 0 R
/FirstChar 32
/LastChar 255
-/Widths 635 0 R
-/ToUnicode 634 0 R
+/Widths 604 0 R
+/ToUnicode 603 0 R
>>
endobj
9 0 obj
@@ -1559,11 +1559,11 @@ endobj
/F1.0 8 0 R
>>
>>
-/Annots [234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R]
+/Annots [224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R]
>>
endobj
11 0 obj
-<< /Length 32396
+<< /Length 32456
>>
stream
q
@@ -2055,7 +2055,7 @@ ET
BT
60.24000000000001 523.0259999999998 Td
/F1.0 10.5 Tf
-<322e31322e20474554202f636c64732f70726f706572746965732f7b73657276696365496e76617269616e74555549447d3f726566726573683d7b726566726573687d> Tj
+[<322e31322e20505554202f636c64732f756e6465706c6f> 20.01953125 <792f7b6d6f64656c4e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2064,16 +2064,16 @@ ET
0.200 0.200 0.200 SCN
BT
-401.54025 523.0259999999998 Td
+257.2387499999999 523.0259999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.53075 523.0259999999998 Td
+556.5307499999999 523.0259999999998 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -2175,7 +2175,7 @@ ET
BT
72.24000000000001 467.58599999999973 Td
/F1.0 10.5 Tf
-<322e31322e332e2050726f6475636573> Tj
+<322e31322e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2184,9 +2184,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.69324999999992 467.58599999999973 Td
+161.0377499999999 467.58599999999973 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2213,9 +2213,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 449.1059999999997 Td
+72.24000000000001 449.1059999999997 Td
/F1.0 10.5 Tf
-<322e31332e20474554202f636c64732f7364632f7365727669636573> Tj
+<322e31322e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2224,9 +2224,9 @@ ET
0.200 0.200 0.200 SCN
BT
-198.44924999999995 449.1059999999997 Td
+155.69324999999992 449.1059999999997 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2253,9 +2253,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 430.6259999999997 Td
+60.24000000000001 430.6259999999997 Td
/F1.0 10.5 Tf
-<322e31332e312e20526573706f6e736573> Tj
+[<322e31332e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652d6e616d6573>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2264,9 +2264,9 @@ ET
0.200 0.200 0.200 SCN
BT
-161.0377499999999 430.6259999999997 Td
+262.58324999999996 430.6259999999997 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2295,7 +2295,7 @@ ET
BT
72.24000000000001 412.1459999999997 Td
/F1.0 10.5 Tf
-<322e31332e322e2050726f6475636573> Tj
+<322e31332e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2304,9 +2304,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.69324999999992 412.1459999999997 Td
+161.0377499999999 412.1459999999997 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2333,9 +2333,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 393.66599999999966 Td
+72.24000000000001 393.66599999999966 Td
/F1.0 10.5 Tf
-[<322e31342e20505554202f636c64732f756e6465706c6f> 20.01953125 <792f7b6d6f64656c4e616d657d>] TJ
+<322e31332e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2344,9 +2344,9 @@ ET
0.200 0.200 0.200 SCN
BT
-257.2387499999999 393.66599999999966 Td
+155.69324999999992 393.66599999999966 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2373,9 +2373,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 375.18599999999964 Td
+60.24000000000001 375.18599999999964 Td
/F1.0 10.5 Tf
-[<322e31342e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e31342e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f62706d6e2f7b74656d706c6174654e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2384,16 +2384,16 @@ ET
0.200 0.200 0.200 SCN
BT
-166.38224999999994 375.18599999999964 Td
+342.75075000000004 375.18599999999964 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.5307499999999 375.18599999999964 Td
+556.53075 375.18599999999964 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -2415,7 +2415,7 @@ ET
BT
72.24000000000001 356.7059999999996 Td
/F1.0 10.5 Tf
-<322e31342e322e20526573706f6e736573> Tj
+[<322e31342e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2424,9 +2424,9 @@ ET
0.200 0.200 0.200 SCN
BT
-161.0377499999999 356.7059999999996 Td
+166.38224999999994 356.7059999999996 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2455,7 +2455,7 @@ ET
BT
72.24000000000001 338.2259999999996 Td
/F1.0 10.5 Tf
-<322e31342e332e20436f6e73756d6573> Tj
+<322e31342e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2484,7 +2484,7 @@ ET
BT
557.8905 338.2259999999996 Td
/F1.0 10.5 Tf
-<38> Tj
+<37> Tj
ET
0.000 0.000 0.000 SCN
@@ -2495,7 +2495,7 @@ ET
BT
72.24000000000001 319.7459999999996 Td
/F1.0 10.5 Tf
-<322e31342e342e2050726f6475636573> Tj
+<322e31342e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2535,7 +2535,7 @@ ET
BT
60.24000000000001 301.26599999999956 Td
/F1.0 10.5 Tf
-[<322e31352e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652d6e616d6573>] TJ
+[<322e31352e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f696d6167652f7b74656d706c6174654e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2544,16 +2544,16 @@ ET
0.200 0.200 0.200 SCN
BT
-262.58324999999996 301.26599999999956 Td
+342.75075000000004 301.26599999999956 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.5307499999999 301.26599999999956 Td
+556.53075 301.26599999999956 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -2575,7 +2575,7 @@ ET
BT
72.24000000000001 282.78599999999955 Td
/F1.0 10.5 Tf
-<322e31352e312e20526573706f6e736573> Tj
+[<322e31352e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2584,9 +2584,9 @@ ET
0.200 0.200 0.200 SCN
BT
-161.0377499999999 282.78599999999955 Td
+166.38224999999994 282.78599999999955 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2615,7 +2615,7 @@ ET
BT
72.24000000000001 264.30599999999953 Td
/F1.0 10.5 Tf
-<322e31352e322e2050726f6475636573> Tj
+<322e31352e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2624,9 +2624,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.69324999999992 264.30599999999953 Td
+161.0377499999999 264.30599999999953 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2653,9 +2653,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 245.8259999999995 Td
+72.24000000000001 245.8259999999995 Td
/F1.0 10.5 Tf
-[<322e31362e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f62706d6e2f7b74656d706c6174654e616d657d>] TJ
+<322e31352e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2664,16 +2664,16 @@ ET
0.200 0.200 0.200 SCN
BT
-342.75075000000004 245.8259999999995 Td
+155.69324999999992 245.8259999999995 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.53075 245.8259999999995 Td
+556.5307499999999 245.8259999999995 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -2693,9 +2693,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 227.34599999999952 Td
+60.24000000000001 227.34599999999952 Td
/F1.0 10.5 Tf
-[<322e31362e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e31362e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f7b74656d706c6174654e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2704,16 +2704,16 @@ ET
0.200 0.200 0.200 SCN
BT
-166.38224999999994 227.34599999999952 Td
+310.68375000000003 227.34599999999952 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.5307499999999 227.34599999999952 Td
+556.53075 227.34599999999952 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -2735,7 +2735,7 @@ ET
BT
72.24000000000001 208.86599999999953 Td
/F1.0 10.5 Tf
-<322e31362e322e20526573706f6e736573> Tj
+[<322e31362e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2744,9 +2744,9 @@ ET
0.200 0.200 0.200 SCN
BT
-161.0377499999999 208.86599999999953 Td
+166.38224999999994 208.86599999999953 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2775,7 +2775,7 @@ ET
BT
72.24000000000001 190.38599999999954 Td
/F1.0 10.5 Tf
-<322e31362e332e2050726f6475636573> Tj
+<322e31362e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2784,9 +2784,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.69324999999992 190.38599999999954 Td
+161.0377499999999 190.38599999999954 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2813,9 +2813,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 171.90599999999955 Td
+72.24000000000001 171.90599999999955 Td
/F1.0 10.5 Tf
-[<322e31372e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f696d6167652f7b74656d706c6174654e616d657d>] TJ
+<322e31362e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2824,16 +2824,16 @@ ET
0.200 0.200 0.200 SCN
BT
-342.75075000000004 171.90599999999955 Td
+155.69324999999992 171.90599999999955 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.53075 171.90599999999955 Td
+556.5307499999999 171.90599999999955 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -2853,9 +2853,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 153.42599999999956 Td
+60.24000000000001 153.42599999999956 Td
/F1.0 10.5 Tf
-[<322e31372e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e31372e20505554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f7b74656d706c6174654e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2864,16 +2864,16 @@ ET
0.200 0.200 0.200 SCN
BT
-166.38224999999994 153.42599999999956 Td
+310.68375000000003 153.42599999999956 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.5307499999999 153.42599999999956 Td
+556.53075 153.42599999999956 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -2895,7 +2895,7 @@ ET
BT
72.24000000000001 134.94599999999957 Td
/F1.0 10.5 Tf
-<322e31372e322e20526573706f6e736573> Tj
+[<322e31372e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -2904,9 +2904,9 @@ ET
0.200 0.200 0.200 SCN
BT
-161.0377499999999 134.94599999999957 Td
+166.38224999999994 134.94599999999957 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2935,7 +2935,7 @@ ET
BT
72.24000000000001 116.46599999999958 Td
/F1.0 10.5 Tf
-<322e31372e332e2050726f6475636573> Tj
+<322e31372e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2944,9 +2944,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.69324999999992 116.46599999999958 Td
+161.0377499999999 116.46599999999958 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -2973,9 +2973,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 97.98599999999959 Td
+72.24000000000001 97.98599999999959 Td
/F1.0 10.5 Tf
-[<322e31382e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f7b74656d706c6174654e616d657d>] TJ
+<322e31372e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -2984,16 +2984,16 @@ ET
0.200 0.200 0.200 SCN
BT
-310.68375000000003 97.98599999999959 Td
+161.0377499999999 97.98599999999959 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.53075 97.98599999999959 Td
+556.5307499999999 97.98599999999959 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -3015,7 +3015,7 @@ ET
BT
72.24000000000001 79.5059999999996 Td
/F1.0 10.5 Tf
-[<322e31382e312e20506172> 20.01953125 <616d6574657273>] TJ
+<322e31372e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3024,9 +3024,9 @@ ET
0.200 0.200 0.200 SCN
BT
-166.38224999999994 79.5059999999996 Td
+155.69324999999992 79.5059999999996 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3053,9 +3053,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 61.02599999999961 Td
+60.24000000000001 61.02599999999961 Td
/F1.0 10.5 Tf
-<322e31382e322e20526573706f6e736573> Tj
+<322e31382e20474554202f64696374696f6e617279> Tj
ET
0.000 0.000 0.000 SCN
@@ -3064,9 +3064,9 @@ ET
0.200 0.200 0.200 SCN
BT
-161.0377499999999 61.02599999999961 Td
+166.38224999999994 61.02599999999961 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3102,11 +3102,11 @@ endobj
/Font << /F1.0 8 0 R
>>
>>
-/Annots [306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R]
+/Annots [296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R]
>>
endobj
13 0 obj
-<< /Length 32029
+<< /Length 32083
>>
stream
q
@@ -3118,7 +3118,7 @@ q
BT
72.24000000000001 744.786 Td
/F1.0 10.5 Tf
-<322e31382e332e2050726f6475636573> Tj
+<322e31382e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3127,9 +3127,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.69324999999992 744.786 Td
+161.0377499999999 744.786 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3156,9 +3156,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 726.3059999999999 Td
+72.24000000000001 726.3059999999999 Td
/F1.0 10.5 Tf
-[<322e31392e20505554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f7b74656d706c6174654e616d657d>] TJ
+<322e31382e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3167,16 +3167,16 @@ ET
0.200 0.200 0.200 SCN
BT
-310.68375000000003 726.3059999999999 Td
+155.69324999999992 726.3059999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
BT
-556.53075 726.3059999999999 Td
+556.5307499999999 726.3059999999999 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -3196,9 +3196,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 707.8259999999999 Td
+60.24000000000001 707.8259999999999 Td
/F1.0 10.5 Tf
-[<322e31392e312e20506172> 20.01953125 <616d6574657273>] TJ
+<322e31392e20505554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d> Tj
ET
0.000 0.000 0.000 SCN
@@ -3207,9 +3207,9 @@ ET
0.200 0.200 0.200 SCN
BT
-166.38224999999994 707.8259999999999 Td
+257.2387499999999 707.8259999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3238,7 +3238,7 @@ ET
BT
72.24000000000001 689.3459999999999 Td
/F1.0 10.5 Tf
-<322e31392e322e20526573706f6e736573> Tj
+[<322e31392e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -3247,7 +3247,7 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 689.3459999999999 Td
+166.38224999999994 689.3459999999999 Td
/F1.0 10.5 Tf
<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
@@ -3256,7 +3256,7 @@ ET
0.000 0.000 0.000 scn
BT
-550.66125 689.3459999999999 Td
+556.5307499999999 689.3459999999999 Td
/F1.0 5.25 Tf
<ca> Tj
ET
@@ -3265,9 +3265,9 @@ ET
0.200 0.200 0.200 SCN
BT
-552.021 689.3459999999999 Td
+557.8905 689.3459999999999 Td
/F1.0 10.5 Tf
-<3130> Tj
+<39> Tj
ET
0.000 0.000 0.000 SCN
@@ -3278,7 +3278,7 @@ ET
BT
72.24000000000001 670.8659999999999 Td
/F1.0 10.5 Tf
-<322e31392e332e20436f6e73756d6573> Tj
+<322e31392e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3318,7 +3318,7 @@ ET
BT
72.24000000000001 652.3859999999999 Td
/F1.0 10.5 Tf
-<322e31392e342e2050726f6475636573> Tj
+<322e31392e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3327,9 +3327,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 652.3859999999999 Td
+160.51274999999998 652.3859999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3356,9 +3356,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 633.9059999999998 Td
+72.24000000000001 633.9059999999998 Td
/F1.0 10.5 Tf
-<322e32302e20474554202f64696374696f6e617279> Tj
+<322e31392e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3367,9 +3367,9 @@ ET
0.200 0.200 0.200 SCN
BT
-165.85724999999996 633.9059999999998 Td
+155.16824999999994 633.9059999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3396,9 +3396,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 615.4259999999998 Td
+60.24000000000001 615.4259999999998 Td
/F1.0 10.5 Tf
-<322e32302e312e20526573706f6e736573> Tj
+<322e32302e20474554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d2f6974656d73> Tj
ET
0.000 0.000 0.000 SCN
@@ -3407,9 +3407,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 615.4259999999998 Td
+288.78074999999995 615.4259999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3438,7 +3438,7 @@ ET
BT
72.24000000000001 596.9459999999998 Td
/F1.0 10.5 Tf
-<322e32302e322e2050726f6475636573> Tj
+[<322e32302e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -3447,9 +3447,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 596.9459999999998 Td
+165.85724999999996 596.9459999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3476,9 +3476,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 578.4659999999998 Td
+72.24000000000001 578.4659999999998 Td
/F1.0 10.5 Tf
-<322e32312e20505554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d> Tj
+<322e32302e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3487,9 +3487,9 @@ ET
0.200 0.200 0.200 SCN
BT
-262.05825 578.4659999999998 Td
+160.51274999999998 578.4659999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3518,7 +3518,7 @@ ET
BT
72.24000000000001 559.9859999999999 Td
/F1.0 10.5 Tf
-[<322e32312e312e20506172> 20.01953125 <616d6574657273>] TJ
+<322e32302e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3527,9 +3527,9 @@ ET
0.200 0.200 0.200 SCN
BT
-165.85724999999996 559.9859999999999 Td
+155.16824999999994 559.9859999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3556,9 +3556,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 541.5059999999999 Td
+60.24000000000001 541.5059999999999 Td
/F1.0 10.5 Tf
-<322e32312e322e20526573706f6e736573> Tj
+<322e32312e20505554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d2f6974656d73> Tj
ET
0.000 0.000 0.000 SCN
@@ -3567,9 +3567,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 541.5059999999999 Td
+288.78074999999995 541.5059999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3598,7 +3598,7 @@ ET
BT
72.24000000000001 523.0259999999998 Td
/F1.0 10.5 Tf
-<322e32312e332e20436f6e73756d6573> Tj
+[<322e32312e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -3607,9 +3607,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 523.0259999999998 Td
+165.85724999999996 523.0259999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3627,7 +3627,7 @@ ET
BT
552.021 523.0259999999998 Td
/F1.0 10.5 Tf
-<3131> Tj
+<3130> Tj
ET
0.000 0.000 0.000 SCN
@@ -3638,7 +3638,7 @@ ET
BT
72.24000000000001 504.54599999999976 Td
/F1.0 10.5 Tf
-<322e32312e342e2050726f6475636573> Tj
+<322e32312e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3647,9 +3647,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 504.54599999999976 Td
+160.51274999999998 504.54599999999976 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3676,9 +3676,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 486.06599999999975 Td
+72.24000000000001 486.06599999999975 Td
/F1.0 10.5 Tf
-<322e32322e20474554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d2f6974656d73> Tj
+<322e32312e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3687,9 +3687,9 @@ ET
0.200 0.200 0.200 SCN
BT
-288.78074999999995 486.06599999999975 Td
+160.51274999999998 486.06599999999975 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3718,7 +3718,7 @@ ET
BT
72.24000000000001 467.58599999999973 Td
/F1.0 10.5 Tf
-[<322e32322e312e20506172> 20.01953125 <616d6574657273>] TJ
+<322e32312e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3727,9 +3727,9 @@ ET
0.200 0.200 0.200 SCN
BT
-165.85724999999996 467.58599999999973 Td
+155.16824999999994 467.58599999999973 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3756,9 +3756,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 449.1059999999997 Td
+60.24000000000001 449.1059999999997 Td
/F1.0 10.5 Tf
-<322e32322e322e20526573706f6e736573> Tj
+<322e32322e20474554202f6865616c7468636865636b> Tj
ET
0.000 0.000 0.000 SCN
@@ -3767,9 +3767,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 449.1059999999997 Td
+176.54625 449.1059999999997 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3798,7 +3798,7 @@ ET
BT
72.24000000000001 430.6259999999997 Td
/F1.0 10.5 Tf
-<322e32322e332e2050726f6475636573> Tj
+<322e32322e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3807,9 +3807,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 430.6259999999997 Td
+160.51274999999998 430.6259999999997 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3836,9 +3836,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 412.1459999999997 Td
+72.24000000000001 412.1459999999997 Td
/F1.0 10.5 Tf
-<322e32332e20505554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d2f6974656d73> Tj
+<322e32322e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3847,9 +3847,9 @@ ET
0.200 0.200 0.200 SCN
BT
-288.78074999999995 412.1459999999997 Td
+155.16824999999994 412.1459999999997 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3876,9 +3876,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 393.66599999999966 Td
+60.24000000000001 393.66599999999966 Td
/F1.0 10.5 Tf
-[<322e32332e312e20506172> 20.01953125 <616d6574657273>] TJ
+<322e32332e20474554202f746f7363612f6d6f64656c73> Tj
ET
0.000 0.000 0.000 SCN
@@ -3887,9 +3887,9 @@ ET
0.200 0.200 0.200 SCN
BT
-165.85724999999996 393.66599999999966 Td
+181.89074999999997 393.66599999999966 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3918,7 +3918,7 @@ ET
BT
72.24000000000001 375.18599999999964 Td
/F1.0 10.5 Tf
-<322e32332e322e20526573706f6e736573> Tj
+<322e32332e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3958,7 +3958,7 @@ ET
BT
72.24000000000001 356.7059999999996 Td
/F1.0 10.5 Tf
-<322e32332e332e20436f6e73756d6573> Tj
+<322e32332e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -3967,9 +3967,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 356.7059999999996 Td
+155.16824999999994 356.7059999999996 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -3996,9 +3996,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 338.2259999999996 Td
+60.24000000000001 338.2259999999996 Td
/F1.0 10.5 Tf
-<322e32332e342e2050726f6475636573> Tj
+<322e32342e20474554202f746f7363612f6d6f64656c732f706f6c696379547970652f7b706f6c696379547970657d> Tj
ET
0.000 0.000 0.000 SCN
@@ -4007,9 +4007,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 338.2259999999996 Td
+304.81425 338.2259999999996 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4036,9 +4036,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 319.7459999999996 Td
+72.24000000000001 319.7459999999996 Td
/F1.0 10.5 Tf
-<322e32342e20474554202f6865616c7468636865636b> Tj
+[<322e32342e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -4047,9 +4047,9 @@ ET
0.200 0.200 0.200 SCN
BT
-176.54625 319.7459999999996 Td
+165.85724999999996 319.7459999999996 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4078,7 +4078,7 @@ ET
BT
72.24000000000001 301.26599999999956 Td
/F1.0 10.5 Tf
-<322e32342e312e20526573706f6e736573> Tj
+<322e32342e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4118,7 +4118,7 @@ ET
BT
72.24000000000001 282.78599999999955 Td
/F1.0 10.5 Tf
-<322e32342e322e2050726f6475636573> Tj
+<322e32342e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4158,7 +4158,7 @@ ET
BT
60.24000000000001 264.30599999999953 Td
/F1.0 10.5 Tf
-<322e32352e20474554202f746f7363612f6d6f64656c73> Tj
+<322e32352e20474554202f746f7363612f6d6f64656c732f7b746f7363614d6f64656c4e616d657d> Tj
ET
0.000 0.000 0.000 SCN
@@ -4167,9 +4167,9 @@ ET
0.200 0.200 0.200 SCN
BT
-181.89074999999997 264.30599999999953 Td
+278.09175 264.30599999999953 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4198,7 +4198,7 @@ ET
BT
72.24000000000001 245.8259999999995 Td
/F1.0 10.5 Tf
-<322e32352e312e20526573706f6e736573> Tj
+[<322e32352e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -4207,9 +4207,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 245.8259999999995 Td
+165.85724999999996 245.8259999999995 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4238,7 +4238,7 @@ ET
BT
72.24000000000001 227.34599999999952 Td
/F1.0 10.5 Tf
-<322e32352e322e2050726f6475636573> Tj
+<322e32352e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4247,9 +4247,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 227.34599999999952 Td
+160.51274999999998 227.34599999999952 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4276,9 +4276,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 208.86599999999953 Td
+72.24000000000001 208.86599999999953 Td
/F1.0 10.5 Tf
-<322e32362e20474554202f746f7363612f6d6f64656c732f706f6c696379547970652f7b706f6c696379547970657d> Tj
+<322e32352e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4287,9 +4287,9 @@ ET
0.200 0.200 0.200 SCN
BT
-304.81425 208.86599999999953 Td
+155.16824999999994 208.86599999999953 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4316,9 +4316,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 190.38599999999954 Td
+60.24000000000001 190.38599999999954 Td
/F1.0 10.5 Tf
-[<322e32362e312e20506172> 20.01953125 <616d6574657273>] TJ
+<322e32362e20505554202f746f7363612f6d6f64656c732f7b746f7363614d6f64656c4e616d657d> Tj
ET
0.000 0.000 0.000 SCN
@@ -4327,9 +4327,9 @@ ET
0.200 0.200 0.200 SCN
BT
-165.85724999999996 190.38599999999954 Td
+278.09175 190.38599999999954 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4358,7 +4358,7 @@ ET
BT
72.24000000000001 171.90599999999955 Td
/F1.0 10.5 Tf
-<322e32362e322e20526573706f6e736573> Tj
+[<322e32362e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
@@ -4367,9 +4367,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 171.90599999999955 Td
+165.85724999999996 171.90599999999955 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4387,7 +4387,7 @@ ET
BT
552.021 171.90599999999955 Td
/F1.0 10.5 Tf
-<3132> Tj
+<3133> Tj
ET
0.000 0.000 0.000 SCN
@@ -4398,7 +4398,7 @@ ET
BT
72.24000000000001 153.42599999999956 Td
/F1.0 10.5 Tf
-<322e32362e332e2050726f6475636573> Tj
+<322e32362e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4407,9 +4407,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 153.42599999999956 Td
+160.51274999999998 153.42599999999956 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4436,9 +4436,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 134.94599999999957 Td
+72.24000000000001 134.94599999999957 Td
/F1.0 10.5 Tf
-<322e32372e20474554202f746f7363612f6d6f64656c732f7b746f7363614d6f64656c4e616d657d> Tj
+<322e32362e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4447,9 +4447,9 @@ ET
0.200 0.200 0.200 SCN
BT
-278.09175 134.94599999999957 Td
+160.51274999999998 134.94599999999957 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4478,7 +4478,7 @@ ET
BT
72.24000000000001 116.46599999999958 Td
/F1.0 10.5 Tf
-[<322e32372e312e20506172> 20.01953125 <616d6574657273>] TJ
+<322e32362e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4487,9 +4487,9 @@ ET
0.200 0.200 0.200 SCN
BT
-165.85724999999996 116.46599999999958 Td
+155.16824999999994 116.46599999999958 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4516,9 +4516,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 97.98599999999959 Td
+60.24000000000001 97.98599999999959 Td
/F1.0 10.5 Tf
-<322e32372e322e20526573706f6e736573> Tj
+<322e32372e20474554202f757365722f67657455736572> Tj
ET
0.000 0.000 0.000 SCN
@@ -4527,9 +4527,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 97.98599999999959 Td
+176.54625 97.98599999999959 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4558,7 +4558,7 @@ ET
BT
72.24000000000001 79.5059999999996 Td
/F1.0 10.5 Tf
-<322e32372e332e2050726f6475636573> Tj
+<322e32372e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4567,9 +4567,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 79.5059999999996 Td
+160.51274999999998 79.5059999999996 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4596,9 +4596,9 @@ ET
0.200 0.200 0.200 SCN
BT
-60.24000000000001 61.02599999999961 Td
+72.24000000000001 61.02599999999961 Td
/F1.0 10.5 Tf
-<322e32382e20505554202f746f7363612f6d6f64656c732f7b746f7363614d6f64656c4e616d657d> Tj
+<322e32372e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -4607,9 +4607,9 @@ ET
0.200 0.200 0.200 SCN
BT
-278.09175 61.02599999999961 Td
+155.16824999999994 61.02599999999961 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4645,11 +4645,11 @@ endobj
/Font << /F1.0 8 0 R
>>
>>
-/Annots [382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R]
+/Annots [372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R]
>>
endobj
15 0 obj
-<< /Length 16218
+<< /Length 10245
>>
stream
q
@@ -4659,9 +4659,9 @@ q
0.200 0.200 0.200 SCN
BT
-72.24000000000001 744.786 Td
+48.24 744.786 Td
/F1.0 10.5 Tf
-[<322e32382e312e20506172> 20.01953125 <616d6574657273>] TJ
+<332e20446566696e6974696f6e73> Tj
ET
0.000 0.000 0.000 SCN
@@ -4670,9 +4670,9 @@ ET
0.200 0.200 0.200 SCN
BT
-165.85724999999996 744.786 Td
+117.75674999999995 744.786 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4690,7 +4690,7 @@ ET
BT
552.021 744.786 Td
/F1.0 10.5 Tf
-<3133> Tj
+<3134> Tj
ET
0.000 0.000 0.000 SCN
@@ -4699,9 +4699,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 726.3059999999999 Td
+60.24 726.3059999999999 Td
/F1.0 10.5 Tf
-<322e32382e322e20526573706f6e736573> Tj
+<332e312e20436c647344696374696f6e617279> Tj
ET
0.000 0.000 0.000 SCN
@@ -4710,9 +4710,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 726.3059999999999 Td
+155.16824999999994 726.3059999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4730,7 +4730,7 @@ ET
BT
552.021 726.3059999999999 Td
/F1.0 10.5 Tf
-<3133> Tj
+<3134> Tj
ET
0.000 0.000 0.000 SCN
@@ -4739,9 +4739,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 707.8259999999999 Td
+60.24000000000001 707.8259999999999 Td
/F1.0 10.5 Tf
-<322e32382e332e20436f6e73756d6573> Tj
+<332e322e20436c647344696374696f6e6172794974656d> Tj
ET
0.000 0.000 0.000 SCN
@@ -4750,9 +4750,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 707.8259999999999 Td
+181.89074999999997 707.8259999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4779,9 +4779,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 689.3459999999999 Td
+60.24000000000001 689.3459999999999 Td
/F1.0 10.5 Tf
-<322e32382e342e2050726f6475636573> Tj
+<332e332e20436c64734576656e74> Tj
ET
0.000 0.000 0.000 SCN
@@ -4790,9 +4790,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 689.3459999999999 Td
+133.79024999999996 689.3459999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4810,7 +4810,7 @@ ET
BT
552.021 689.3459999999999 Td
/F1.0 10.5 Tf
-<3134> Tj
+<3135> Tj
ET
0.000 0.000 0.000 SCN
@@ -4821,7 +4821,7 @@ ET
BT
60.24000000000001 670.8659999999999 Td
/F1.0 10.5 Tf
-<322e32392e20474554202f757365722f67657455736572> Tj
+<332e342e20436c6473496e666f> Tj
ET
0.000 0.000 0.000 SCN
@@ -4830,9 +4830,9 @@ ET
0.200 0.200 0.200 SCN
BT
-176.54625 670.8659999999999 Td
+123.10125 670.8659999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4850,7 +4850,7 @@ ET
BT
552.021 670.8659999999999 Td
/F1.0 10.5 Tf
-<3134> Tj
+<3135> Tj
ET
0.000 0.000 0.000 SCN
@@ -4859,9 +4859,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 652.3859999999999 Td
+60.24000000000001 652.3859999999999 Td
/F1.0 10.5 Tf
-<322e32392e312e20526573706f6e736573> Tj
+<332e352e20436c64734d6f64656c> Tj
ET
0.000 0.000 0.000 SCN
@@ -4870,9 +4870,9 @@ ET
0.200 0.200 0.200 SCN
BT
-160.51274999999998 652.3859999999999 Td
+133.79024999999996 652.3859999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4890,7 +4890,7 @@ ET
BT
552.021 652.3859999999999 Td
/F1.0 10.5 Tf
-<3134> Tj
+<3136> Tj
ET
0.000 0.000 0.000 SCN
@@ -4899,9 +4899,9 @@ ET
0.200 0.200 0.200 SCN
BT
-72.24000000000001 633.9059999999998 Td
+60.24000000000001 633.9059999999998 Td
/F1.0 10.5 Tf
-<322e32392e322e2050726f6475636573> Tj
+<332e362e20436c64734d6f64656c496e7374616e6365> Tj
ET
0.000 0.000 0.000 SCN
@@ -4910,9 +4910,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 633.9059999999998 Td
+176.54625 633.9059999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4930,7 +4930,7 @@ ET
BT
552.021 633.9059999999998 Td
/F1.0 10.5 Tf
-<3134> Tj
+<3137> Tj
ET
0.000 0.000 0.000 SCN
@@ -4939,9 +4939,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 615.4259999999998 Td
+60.24000000000001 615.4259999999998 Td
/F1.0 10.5 Tf
-<332e20446566696e6974696f6e73> Tj
+<332e372e20436c64734d6f6e69746f72696e6744657461696c73> Tj
ET
0.000 0.000 0.000 SCN
@@ -4950,9 +4950,9 @@ ET
0.200 0.200 0.200 SCN
BT
-117.75674999999995 615.4259999999998 Td
+192.57975 615.4259999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -4970,7 +4970,7 @@ ET
BT
552.021 615.4259999999998 Td
/F1.0 10.5 Tf
-<3135> Tj
+<3137> Tj
ET
0.000 0.000 0.000 SCN
@@ -4981,7 +4981,7 @@ ET
BT
60.24000000000001 596.9459999999998 Td
/F1.0 10.5 Tf
-<332e312e20436c647344696374696f6e617279> Tj
+[<332e382e20436c647354> 29.78515625 <656d706c617465>] TJ
ET
0.000 0.000 0.000 SCN
@@ -4990,9 +4990,9 @@ ET
0.200 0.200 0.200 SCN
BT
-155.16824999999994 596.9459999999998 Td
+149.82374999999996 596.9459999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -5010,7 +5010,7 @@ ET
BT
552.021 596.9459999999998 Td
/F1.0 10.5 Tf
-<3135> Tj
+<3138> Tj
ET
0.000 0.000 0.000 SCN
@@ -5021,7 +5021,7 @@ ET
BT
60.24000000000001 578.4659999999998 Td
/F1.0 10.5 Tf
-<332e322e20436c647344696374696f6e6172794974656d> Tj
+[<332e392e20436c647354> 29.78515625 <6f7363614d6f64656c>] TJ
ET
0.000 0.000 0.000 SCN
@@ -5030,9 +5030,9 @@ ET
0.200 0.200 0.200 SCN
BT
-181.89074999999997 578.4659999999998 Td
+165.85724999999996 578.4659999999998 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -5050,7 +5050,7 @@ ET
BT
552.021 578.4659999999998 Td
/F1.0 10.5 Tf
-<3135> Tj
+<3139> Tj
ET
0.000 0.000 0.000 SCN
@@ -5061,7 +5061,7 @@ ET
BT
60.24000000000001 559.9859999999999 Td
/F1.0 10.5 Tf
-<332e332e20436c64734576656e74> Tj
+<332e31302e20446361654576656e74> Tj
ET
0.000 0.000 0.000 SCN
@@ -5070,9 +5070,9 @@ ET
0.200 0.200 0.200 SCN
BT
-133.79024999999996 559.9859999999999 Td
+144.47924999999998 559.9859999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -5090,7 +5090,7 @@ ET
BT
552.021 559.9859999999999 Td
/F1.0 10.5 Tf
-<3136> Tj
+<3139> Tj
ET
0.000 0.000 0.000 SCN
@@ -5101,7 +5101,7 @@ ET
BT
60.24000000000001 541.5059999999999 Td
/F1.0 10.5 Tf
-<332e342e20436c6473496e666f> Tj
+[<332e31312e2056> 60.05859375 <616c75654974656d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -5110,9 +5110,9 @@ ET
0.200 0.200 0.200 SCN
BT
-123.10125 541.5059999999999 Td
+139.13475 541.5059999999999 Td
/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
+<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
ET
0.000 0.000 0.000 SCN
@@ -5130,291 +5130,11 @@ ET
BT
552.021 541.5059999999999 Td
/F1.0 10.5 Tf
-<3136> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-60.24000000000001 523.0259999999998 Td
-/F1.0 10.5 Tf
-<332e352e20436c64734d6f64656c> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-133.79024999999996 523.0259999999998 Td
-/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-BT
-550.66125 523.0259999999998 Td
-/F1.0 5.25 Tf
-<ca> Tj
-ET
-
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-552.021 523.0259999999998 Td
-/F1.0 10.5 Tf
-<3137> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-60.24000000000001 504.54599999999976 Td
-/F1.0 10.5 Tf
-<332e362e20436c64734d6f64656c496e7374616e6365> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-176.54625 504.54599999999976 Td
-/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-BT
-550.66125 504.54599999999976 Td
-/F1.0 5.25 Tf
-<ca> Tj
-ET
-
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-552.021 504.54599999999976 Td
-/F1.0 10.5 Tf
-<3138> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-60.24000000000001 486.06599999999975 Td
-/F1.0 10.5 Tf
-<332e372e20436c64734d6f6e69746f72696e6744657461696c73> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-192.57975 486.06599999999975 Td
-/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-BT
-550.66125 486.06599999999975 Td
-/F1.0 5.25 Tf
-<ca> Tj
-ET
-
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-552.021 486.06599999999975 Td
-/F1.0 10.5 Tf
-<3138> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-60.24000000000001 467.58599999999973 Td
-/F1.0 10.5 Tf
-[<332e382e20436c647354> 29.78515625 <656d706c617465>] TJ
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-149.82374999999996 467.58599999999973 Td
-/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-BT
-550.66125 467.58599999999973 Td
-/F1.0 5.25 Tf
-<ca> Tj
-ET
-
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-552.021 467.58599999999973 Td
-/F1.0 10.5 Tf
-<3139> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-60.24000000000001 449.1059999999997 Td
-/F1.0 10.5 Tf
-[<332e392e20436c647354> 29.78515625 <6f7363614d6f64656c>] TJ
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-165.85724999999996 449.1059999999997 Td
-/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-BT
-550.66125 449.1059999999997 Td
-/F1.0 5.25 Tf
-<ca> Tj
-ET
-
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-552.021 449.1059999999997 Td
-/F1.0 10.5 Tf
<3230> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-60.24000000000001 430.6259999999997 Td
-/F1.0 10.5 Tf
-<332e31302e20446361654576656e74> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-144.47924999999998 430.6259999999997 Td
-/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-BT
-550.66125 430.6259999999997 Td
-/F1.0 5.25 Tf
-<ca> Tj
-ET
-
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-552.021 430.6259999999997 Td
-/F1.0 10.5 Tf
-<3230> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-60.24000000000001 412.1459999999997 Td
-/F1.0 10.5 Tf
-[<332e31312e2056> 60.05859375 <616c75654974656d>] TJ
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-139.13475 412.1459999999997 Td
-/F1.0 10.5 Tf
-<2e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e202e20> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-BT
-550.66125 412.1459999999997 Td
-/F1.0 5.25 Tf
-<ca> Tj
-ET
-
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-552.021 412.1459999999997 Td
-/F1.0 10.5 Tf
-<3231> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
Q
endstream
@@ -5428,7 +5148,7 @@ endobj
/Font << /F1.0 8 0 R
>>
>>
-/Annots [458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R]
+/Annots [448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R]
>>
endobj
17 0 obj
@@ -5477,7 +5197,7 @@ ET
BT
85.136384765625 660.036 Td
/F1.0 10.5 Tf
-[<203a20332e302e332d534e415053484f> 20.01953125 <54>] TJ
+[<203a20342e302e302d534e415053484f> 20.01953125 <54>] TJ
ET
0.000 0.000 0.000 SCN
@@ -5611,7 +5331,7 @@ endobj
/F3.0 24 0 R
/F1.0 8 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
>>
@@ -5625,18 +5345,18 @@ endobj
>>
endobj
21 0 obj
-<< /Kids [54 0 R 228 0 R 170 0 R 101 0 R 156 0 R 55 0 R 131 0 R 195 0 R 76 0 R 122 0 R 186 0 R]
+<< /Kids [54 0 R 217 0 R 177 0 R 102 0 R 152 0 R 55 0 R 135 0 R 76 0 R 124 0 R 223 0 R]
>>
endobj
22 0 obj
<< /Type /Font
/BaseFont /AAAAAB+NotoSerif-Bold
/Subtype /TrueType
-/FontDescriptor 637 0 R
+/FontDescriptor 606 0 R
/FirstChar 32
/LastChar 255
-/Widths 639 0 R
-/ToUnicode 638 0 R
+/Widths 608 0 R
+/ToUnicode 607 0 R
>>
endobj
23 0 obj
@@ -5646,11 +5366,11 @@ endobj
<< /Type /Font
/BaseFont /AAAAAC+NotoSerif-Italic
/Subtype /TrueType
-/FontDescriptor 641 0 R
+/FontDescriptor 610 0 R
/FirstChar 32
/LastChar 255
-/Widths 643 0 R
-/ToUnicode 642 0 R
+/Widths 612 0 R
+/ToUnicode 611 0 R
>>
endobj
25 0 obj
@@ -6807,7 +6527,7 @@ endobj
/F1.0 8 0 R
/F4.0 34 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
/Annots [31 0 R 38 0 R 39 0 R]
@@ -6840,11 +6560,11 @@ endobj
<< /Type /Font
/BaseFont /AAAAAD+mplus1mn-regular
/Subtype /TrueType
-/FontDescriptor 645 0 R
+/FontDescriptor 614 0 R
/FirstChar 32
/LastChar 255
-/Widths 647 0 R
-/ToUnicode 646 0 R
+/Widths 616 0 R
+/ToUnicode 615 0 R
>>
endobj
35 0 obj
@@ -8010,7 +7730,7 @@ endobj
/F4.0 34 0 R
/F3.0 24 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
/Annots [45 0 R 49 0 R]
@@ -8061,12 +7781,12 @@ endobj
endobj
54 0 obj
<< /Limits [(_cldsdictionary) (_consumes)]
-/Names [(_cldsdictionary) 206 0 R (_cldsdictionaryitem) 208 0 R (_cldsevent) 211 0 R (_cldsinfo) 212 0 R (_cldsmodel) 215 0 R (_cldsmodelinstance) 220 0 R (_cldsmonitoringdetails) 221 0 R (_cldstemplate) 224 0 R (_cldstoscamodel) 227 0 R (_consumes) 33 0 R]
+/Names [(_cldsdictionary) 195 0 R (_cldsdictionaryitem) 197 0 R (_cldsevent) 200 0 R (_cldsinfo) 201 0 R (_cldsmodel) 204 0 R (_cldsmodelinstance) 209 0 R (_cldsmonitoringdetails) 210 0 R (_cldstemplate) 213 0 R (_cldstoscamodel) 216 0 R (_consumes) 33 0 R]
>>
endobj
55 0 obj
<< /Limits [(_produces_5) (_responses_13)]
-/Names [(_produces_5) 62 0 R (_produces_6) 66 0 R (_produces_7) 72 0 R (_produces_8) 77 0 R (_produces_9) 82 0 R (_responses) 32 0 R (_responses_10) 88 0 R (_responses_11) 93 0 R (_responses_12) 99 0 R (_responses_13) 103 0 R]
+/Names [(_produces_5) 62 0 R (_produces_6) 66 0 R (_produces_7) 72 0 R (_produces_8) 77 0 R (_produces_9) 82 0 R (_responses) 32 0 R (_responses_10) 88 0 R (_responses_11) 93 0 R (_responses_12) 100 0 R (_responses_13) 105 0 R]
>>
endobj
56 0 obj
@@ -9352,7 +9072,7 @@ endobj
/F1.0 8 0 R
/F4.0 34 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
/Annots [59 0 R 65 0 R]
@@ -10528,7 +10248,7 @@ endobj
/F4.0 34 0 R
/F3.0 24 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
/Annots [81 0 R]
@@ -10547,8 +10267,8 @@ endobj
[71 0 R /XYZ 0 556.9200000000003 null]
endobj
76 0 obj
-<< /Limits [(_responses_8) (_route17)]
-/Names [(_responses_8) 75 0 R (_responses_9) 80 0 R (_route10) 29 0 R (_route11) 47 0 R (_route12) 102 0 R (_route13) 92 0 R (_route14) 95 0 R (_route15) 53 0 R (_route16) 105 0 R (_route17) 117 0 R]
+<< /Limits [(_responses_8) (_route66)]
+/Names [(_responses_8) 75 0 R (_responses_9) 80 0 R (_route58) 36 0 R (_route59) 43 0 R (_route60) 162 0 R (_route61) 67 0 R (_route62) 73 0 R (_route63) 78 0 R (_route64) 83 0 R (_route65) 63 0 R (_route66) 29 0 R]
>>
endobj
77 0 obj
@@ -10578,7 +10298,7 @@ endobj
[71 0 R /XYZ 0 103.20000000000039 null]
endobj
84 0 obj
-<< /Length 13744
+<< /Length 16627
>>
stream
q
@@ -11533,7 +11253,7 @@ ET
BT
48.24000000000001 187.416 Td
/F2.0 18 Tf
-<322e31322e20474554> Tj
+[<322e31322e20505554202f636c64732f756e6465706c6f> 20.01953125 <792f7b6d6f64656c4e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -11542,172 +11262,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 159.33599999999998 Td
-/F2.0 18 Tf
-<2f636c64732f70726f706572746965732f7b73657276696365496e76617269616e74555549447d3f726566726573683d7b726566726573> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 131.25599999999997 Td
-/F2.0 18 Tf
-<687d> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 97.01599999999999 Td
+48.24000000000001 153.176 Td
/F2.0 13 Tf
[<322e31322e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
-q
-0.000 0.000 0.000 scn
-0.000 0.000 0.000 SCN
-1 w
-0 J
-0 j
-[ ] 0 d
-/Stamp1 Do
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-49.24 14.388 Td
-/F1.0 9 Tf
-<36> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-Q
-Q
-
-endstream
-endobj
-85 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 612.0 792.0]
-/Contents 84 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F2.0 22 0 R
-/F3.0 24 0 R
-/F1.0 8 0 R
-/F4.0 34 0 R
->>
-/XObject << /Stamp1 496 0 R
->>
->>
-/Annots [87 0 R 89 0 R]
->>
-endobj
-86 0 obj
-[85 0 R /XYZ 0 792.0 null]
-endobj
-87 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmodel)
-/Subtype /Link
-/Rect [337.6397136 638.8270000000001 389.7092136 653.1070000000001]
-/Type /Annot
->>
-endobj
-88 0 obj
-[85 0 R /XYZ 0 615.72 null]
-endobj
-89 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmodel)
-/Subtype /Link
-/Rect [463.65600000000006 526.5670000000001 515.7255 540.8470000000001]
-/Type /Annot
->>
-endobj
-90 0 obj
-[85 0 R /XYZ 0 510.60000000000014 null]
-endobj
-91 0 obj
-[85 0 R /XYZ 0 454.3200000000001 null]
-endobj
-92 0 obj
-[85 0 R /XYZ 0 398.0400000000001 null]
-endobj
-93 0 obj
-[85 0 R /XYZ 0 357.96000000000004 null]
-endobj
-94 0 obj
-[85 0 R /XYZ 0 267.12 null]
-endobj
-95 0 obj
-[85 0 R /XYZ 0 210.84 null]
-endobj
-96 0 obj
-[85 0 R /XYZ 0 114.6 null]
-endobj
-97 0 obj
-<< /Length 17167
->>
-stream
-q
-/DeviceRGB cs
1.000 1.000 1.000 scn
-48.240 732.720 114.560 23.280 re
+48.240 115.200 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 732.720 171.840 23.280 re
+162.800 115.200 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 732.720 229.120 23.280 re
+334.640 115.200 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 680.880 114.560 51.840 re
+48.240 77.640 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 680.880 171.840 51.840 re
+162.800 77.640 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 680.880 229.120 51.840 re
+334.640 77.640 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
-/DeviceRGB CS
0.867 0.867 0.867 SCN
-48.240 756.000 m
-162.800 756.000 l
+48.240 138.480 m
+162.800 138.480 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 732.720 m
-162.800 732.720 l
+48.240 115.200 m
+162.800 115.200 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 756.250 m
-48.240 731.970 l
+48.240 138.730 m
+48.240 114.450 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 756.250 m
-162.800 731.970 l
+162.800 138.730 m
+162.800 114.450 l
S
[ ] 0 d
1 w
@@ -11715,7 +11322,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 740.2529999999999 Td
+51.24000000000001 122.73299999999998 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -11723,26 +11330,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 756.000 m
-334.640 756.000 l
+162.800 138.480 m
+334.640 138.480 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 732.720 m
-334.640 732.720 l
+162.800 115.200 m
+334.640 115.200 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 756.250 m
-162.800 731.970 l
+162.800 138.730 m
+162.800 114.450 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 756.250 m
-334.640 731.970 l
+334.640 138.730 m
+334.640 114.450 l
S
[ ] 0 d
1 w
@@ -11750,7 +11357,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544 740.2529999999999 Td
+165.79988544000003 122.73299999999998 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -11758,26 +11365,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 756.000 m
-563.760 756.000 l
+334.640 138.480 m
+563.760 138.480 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 732.720 m
-563.760 732.720 l
+334.640 115.200 m
+563.760 115.200 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 756.250 m
-334.640 731.970 l
+334.640 138.730 m
+334.640 114.450 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 756.250 m
-563.760 731.970 l
+563.760 138.730 m
+563.760 114.450 l
S
[ ] 0 d
1 w
@@ -11785,7 +11392,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 740.2529999999999 Td
+337.6397136 122.73299999999998 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -11793,26 +11400,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 732.720 m
-162.800 732.720 l
+48.240 115.200 m
+162.800 115.200 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 680.880 m
-162.800 680.880 l
+48.240 77.640 m
+162.800 77.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 732.970 m
-48.240 680.630 l
+48.240 115.450 m
+48.240 77.390 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 732.970 m
-162.800 680.630 l
+162.800 115.450 m
+162.800 77.390 l
S
[ ] 0 d
1 w
@@ -11820,7 +11427,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 702.193 Td
+51.24000000000001 91.81299999999996 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -11828,26 +11435,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 732.720 m
-334.640 732.720 l
+162.800 115.200 m
+334.640 115.200 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 680.880 m
-334.640 680.880 l
+162.800 77.640 m
+334.640 77.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 732.970 m
-162.800 680.630 l
+162.800 115.450 m
+162.800 77.390 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 732.970 m
-334.640 680.630 l
+334.640 115.450 m
+334.640 77.390 l
S
[ ] 0 d
1 w
@@ -11855,26 +11462,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544 716.473 Td
+165.79988544000003 98.95299999999996 Td
/F2.0 10.5 Tf
-<73657276696365496e76617269616e74555549447d3f72656672657368> Tj
-ET
-
-
-BT
-165.79988544 702.193 Td
-/F2.0 10.5 Tf
-<3d7b72656672657368> Tj
+<6d6f64656c4e616d65> Tj
ET
BT
-165.79988544 687.913 Td
+165.79988544000003 84.67299999999996 Td
ET
BT
-165.79988544 687.913 Td
+165.79988544000003 84.67299999999996 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -11882,26 +11482,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 732.720 m
-563.760 732.720 l
+334.640 115.200 m
+563.760 115.200 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 680.880 m
-563.760 680.880 l
+334.640 77.640 m
+563.760 77.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 732.970 m
-334.640 680.630 l
+334.640 115.450 m
+334.640 77.390 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 732.970 m
-563.760 680.630 l
+563.760 115.450 m
+563.760 77.390 l
S
[ ] 0 d
1 w
@@ -11909,511 +11509,149 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 702.193 Td
+337.6397136 91.81299999999996 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24 651.296 Td
-/F2.0 13 Tf
-<322e31322e322e20526573706f6e736573> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-48.240 613.320 171.840 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-220.080 613.320 343.680 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-48.240 590.040 171.840 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-220.080 590.040 343.680 23.280 re
-f
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 636.600 m
-220.080 636.600 l
-S
-[ ] 0 d
-1.5 w
-0.867 0.867 0.867 SCN
-48.240 613.320 m
-220.080 613.320 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 636.850 m
-48.240 612.570 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 636.850 m
-220.080 612.570 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-51.24 620.8530000000001 Td
-/F2.0 10.5 Tf
-<4854545020436f6465> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 636.600 m
-563.760 636.600 l
-S
-[ ] 0 d
-1.5 w
-0.867 0.867 0.867 SCN
-220.080 613.320 m
-563.760 613.320 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 636.850 m
-220.080 612.570 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-563.760 636.850 m
-563.760 612.570 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-223.07982816 620.8530000000001 Td
-/F2.0 10.5 Tf
-<536368656d61> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 613.320 m
-220.080 613.320 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 590.040 m
-220.080 590.040 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 613.570 m
-48.240 589.790 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 613.570 m
-220.080 589.790 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-51.24 597.0730000000001 Td
-/F2.0 10.5 Tf
-<323030> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 613.320 m
-563.760 613.320 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 590.040 m
-563.760 590.040 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 613.570 m
-220.080 589.790 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-563.760 613.570 m
-563.760 589.790 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-223.07982816 597.0730000000001 Td
-/F1.0 10.5 Tf
-<4e6f20436f6e74656e74> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24 560.4560000000002 Td
-/F2.0 13 Tf
-<322e31322e332e2050726f6475636573> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
--0.500 Tc
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-56.88050000000001 533.7960000000003 Td
-/F1.0 10.5 Tf
-<a5> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-0.000 Tc
-0.694 0.129 0.275 scn
-0.694 0.129 0.275 SCN
-
-BT
-66.24000000000001 535.9800000000004 Td
-/F4.0 10.5 Tf
-<6170706c69636174696f6e2f6a736f6e> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 498.3360000000004 Td
-/F2.0 18 Tf
-<322e31332e20474554202f636c64732f7364632f7365727669636573> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 464.09600000000034 Td
-/F2.0 13 Tf
-<322e31332e312e20526573706f6e736573> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-48.240 426.120 171.840 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-220.080 426.120 343.680 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-48.240 402.840 171.840 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-220.080 402.840 343.680 23.280 re
-f
+q
0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 449.400 m
-220.080 449.400 l
-S
-[ ] 0 d
-1.5 w
-0.867 0.867 0.867 SCN
-48.240 426.120 m
-220.080 426.120 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 449.650 m
-48.240 425.370 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 449.650 m
-220.080 425.370 l
-S
-[ ] 0 d
-1 w
0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-51.24000000000001 433.6530000000003 Td
-/F2.0 10.5 Tf
-<4854545020436f6465> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 449.400 m
-563.760 449.400 l
-S
-[ ] 0 d
-1.5 w
-0.867 0.867 0.867 SCN
-220.080 426.120 m
-563.760 426.120 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 449.650 m
-220.080 425.370 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-563.760 449.650 m
-563.760 425.370 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-223.07982816 433.6530000000003 Td
-/F2.0 10.5 Tf
-<536368656d61> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 426.120 m
-220.080 426.120 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 402.840 m
-220.080 402.840 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 426.370 m
-48.240 402.590 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 426.370 m
-220.080 402.590 l
-S
-[ ] 0 d
1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-51.24000000000001 409.87300000000033 Td
-/F2.0 10.5 Tf
-<323030> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 426.120 m
-563.760 426.120 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 402.840 m
-563.760 402.840 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-220.080 426.370 m
-220.080 402.590 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-563.760 426.370 m
-563.760 402.590 l
-S
+0 J
+0 j
[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-223.07982816 409.87300000000033 Td
-/F1.0 10.5 Tf
-<4e6f20436f6e74656e74> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 373.25600000000037 Td
-/F2.0 13 Tf
-<322e31332e322e2050726f6475636573> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
--0.500 Tc
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-56.88050000000001 346.59600000000034 Td
-/F1.0 10.5 Tf
-<a5> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-0.000 Tc
-0.694 0.129 0.275 scn
-0.694 0.129 0.275 SCN
-
-BT
-66.24000000000001 348.78000000000037 Td
-/F4.0 10.5 Tf
-<6170706c69636174696f6e2f6a736f6e> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
+/Stamp1 Do
0.200 0.200 0.200 scn
0.200 0.200 0.200 SCN
BT
-48.24000000000001 311.13600000000037 Td
-/F2.0 18 Tf
-[<322e31342e20505554202f636c64732f756e6465706c6f> 20.01953125 <792f7b6d6f64656c4e616d657d>] TJ
+49.24 14.388 Td
+/F1.0 9 Tf
+<36> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 276.8960000000003 Td
-/F2.0 13 Tf
-[<322e31342e312e20506172> 20.01953125 <616d6574657273>] TJ
-ET
+Q
+Q
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
+endstream
+endobj
+85 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612.0 792.0]
+/Contents 84 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F2.0 22 0 R
+/F3.0 24 0 R
+/F1.0 8 0 R
+/F4.0 34 0 R
+>>
+/XObject << /Stamp1 472 0 R
+>>
+>>
+/Annots [87 0 R 89 0 R]
+>>
+endobj
+86 0 obj
+[85 0 R /XYZ 0 792.0 null]
+endobj
+87 0 obj
+<< /Border [0 0 0]
+/Dest (_cldsmodel)
+/Subtype /Link
+/Rect [337.6397136 638.8270000000001 389.7092136 653.1070000000001]
+/Type /Annot
+>>
+endobj
+88 0 obj
+[85 0 R /XYZ 0 615.72 null]
+endobj
+89 0 obj
+<< /Border [0 0 0]
+/Dest (_cldsmodel)
+/Subtype /Link
+/Rect [463.65600000000006 526.5670000000001 515.7255 540.8470000000001]
+/Type /Annot
+>>
+endobj
+90 0 obj
+[85 0 R /XYZ 0 510.60000000000014 null]
+endobj
+91 0 obj
+[85 0 R /XYZ 0 454.3200000000001 null]
+endobj
+92 0 obj
+[85 0 R /XYZ 0 398.0400000000001 null]
+endobj
+93 0 obj
+[85 0 R /XYZ 0 357.96000000000004 null]
+endobj
+94 0 obj
+[85 0 R /XYZ 0 267.12 null]
+endobj
+95 0 obj
+[85 0 R /XYZ 0 210.84 null]
+endobj
+96 0 obj
+[85 0 R /XYZ 0 170.76 null]
+endobj
+97 0 obj
+<< /Length 17276
+>>
+stream
+q
+/DeviceRGB cs
1.000 1.000 1.000 scn
-48.240 238.920 114.560 23.280 re
+48.240 732.720 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 238.920 171.840 23.280 re
+162.800 732.720 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 238.920 229.120 23.280 re
+334.640 732.720 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 201.360 114.560 37.560 re
+48.240 695.160 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 201.360 171.840 37.560 re
+162.800 695.160 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 201.360 229.120 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
-48.240 163.800 114.560 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
-162.800 163.800 171.840 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
-334.640 163.800 229.120 37.560 re
+334.640 695.160 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
+/DeviceRGB CS
0.867 0.867 0.867 SCN
-48.240 262.200 m
-162.800 262.200 l
+48.240 756.000 m
+162.800 756.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 238.920 m
-162.800 238.920 l
+48.240 732.720 m
+162.800 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 262.450 m
-48.240 238.170 l
+48.240 756.250 m
+48.240 731.970 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 262.450 m
-162.800 238.170 l
+162.800 756.250 m
+162.800 731.970 l
S
[ ] 0 d
1 w
@@ -12421,7 +11659,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 246.45300000000026 Td
+51.24 740.2529999999999 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -12429,26 +11667,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 262.200 m
-334.640 262.200 l
+162.800 756.000 m
+334.640 756.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 238.920 m
-334.640 238.920 l
+162.800 732.720 m
+334.640 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 262.450 m
-162.800 238.170 l
+162.800 756.250 m
+162.800 731.970 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 262.450 m
-334.640 238.170 l
+334.640 756.250 m
+334.640 731.970 l
S
[ ] 0 d
1 w
@@ -12456,7 +11694,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 246.45300000000026 Td
+165.79988544 740.2529999999999 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -12464,26 +11702,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 262.200 m
-563.760 262.200 l
+334.640 756.000 m
+563.760 756.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 238.920 m
-563.760 238.920 l
+334.640 732.720 m
+563.760 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 262.450 m
-334.640 238.170 l
+334.640 756.250 m
+334.640 731.970 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 262.450 m
-563.760 238.170 l
+563.760 756.250 m
+563.760 731.970 l
S
[ ] 0 d
1 w
@@ -12491,7 +11729,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 246.45300000000026 Td
+337.6397136 740.2529999999999 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -12499,143 +11737,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 238.920 m
-162.800 238.920 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 201.360 m
-162.800 201.360 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 239.170 m
-48.240 201.110 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-162.800 239.170 m
-162.800 201.110 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-51.24000000000001 215.53300000000027 Td
-/F2.0 10.5 Tf
-<50617468> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-162.800 238.920 m
-334.640 238.920 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-162.800 201.360 m
-334.640 201.360 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-162.800 239.170 m
-162.800 201.110 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-334.640 239.170 m
-334.640 201.110 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-165.79988544000003 222.6730000000003 Td
-/F2.0 10.5 Tf
-<6d6f64656c4e616d65> Tj
-ET
-
-
-BT
-165.79988544000003 208.39300000000028 Td
-ET
-
-
-BT
-165.79988544000003 208.39300000000028 Td
-/F3.0 10.5 Tf
-<7265717569726564> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-334.640 238.920 m
-563.760 238.920 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-334.640 201.360 m
-563.760 201.360 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-334.640 239.170 m
-334.640 201.110 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-563.760 239.170 m
-563.760 201.110 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-337.6397136 215.53300000000027 Td
-/F1.0 10.5 Tf
-<737472696e67> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 201.360 m
-162.800 201.360 l
+48.240 732.720 m
+162.800 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 163.800 m
-162.800 163.800 l
+48.240 695.160 m
+162.800 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 201.610 m
-48.240 163.550 l
+48.240 732.970 m
+48.240 694.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 201.610 m
-162.800 163.550 l
+162.800 732.970 m
+162.800 694.910 l
S
[ ] 0 d
1 w
@@ -12643,7 +11764,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 177.97300000000027 Td
+51.24 709.333 Td
/F2.0 10.5 Tf
<426f6479> Tj
ET
@@ -12651,26 +11772,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 201.360 m
-334.640 201.360 l
+162.800 732.720 m
+334.640 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 163.800 m
-334.640 163.800 l
+162.800 695.160 m
+334.640 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 201.610 m
-162.800 163.550 l
+162.800 732.970 m
+162.800 694.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 201.610 m
-334.640 163.550 l
+334.640 732.970 m
+334.640 694.910 l
S
[ ] 0 d
1 w
@@ -12678,19 +11799,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 185.11300000000028 Td
+165.79988544 716.473 Td
/F2.0 10.5 Tf
<626f6479> Tj
ET
BT
-165.79988544000003 170.83300000000028 Td
+165.79988544 702.193 Td
ET
BT
-165.79988544000003 170.83300000000028 Td
+165.79988544 702.193 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -12698,26 +11819,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 201.360 m
-563.760 201.360 l
+334.640 732.720 m
+563.760 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 163.800 m
-563.760 163.800 l
+334.640 695.160 m
+563.760 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 201.610 m
-334.640 163.550 l
+334.640 732.970 m
+334.640 694.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 201.610 m
-563.760 163.550 l
+563.760 732.970 m
+563.760 694.910 l
S
[ ] 0 d
1 w
@@ -12731,7 +11852,7 @@ S
0.259 0.545 0.792 SCN
BT
-337.6397136 177.97300000000027 Td
+337.6397136 709.333 Td
/F1.0 10.5 Tf
<436c64734d6f64656c> Tj
ET
@@ -12743,51 +11864,51 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 134.21600000000024 Td
+48.24 665.5760000000001 Td
/F2.0 13 Tf
-<322e31342e322e20526573706f6e736573> Tj
+<322e31322e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 96.240 171.840 23.280 re
+48.240 627.600 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 96.240 343.680 23.280 re
+220.080 627.600 343.680 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 72.960 171.840 23.280 re
+48.240 604.320 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 72.960 343.680 23.280 re
+220.080 604.320 343.680 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 119.520 m
-220.080 119.520 l
+48.240 650.880 m
+220.080 650.880 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 96.240 m
-220.080 96.240 l
+48.240 627.600 m
+220.080 627.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 119.770 m
-48.240 95.490 l
+48.240 651.130 m
+48.240 626.850 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 119.770 m
-220.080 95.490 l
+220.080 651.130 m
+220.080 626.850 l
S
[ ] 0 d
1 w
@@ -12795,7 +11916,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 103.77300000000024 Td
+51.24 635.1330000000002 Td
/F2.0 10.5 Tf
<4854545020436f6465> Tj
ET
@@ -12803,26 +11924,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 119.520 m
-563.760 119.520 l
+220.080 650.880 m
+563.760 650.880 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-220.080 96.240 m
-563.760 96.240 l
+220.080 627.600 m
+563.760 627.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 119.770 m
-220.080 95.490 l
+220.080 651.130 m
+220.080 626.850 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 119.770 m
-563.760 95.490 l
+563.760 651.130 m
+563.760 626.850 l
S
[ ] 0 d
1 w
@@ -12830,7 +11951,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 103.77300000000024 Td
+223.07982816 635.1330000000002 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -12838,26 +11959,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 96.240 m
-220.080 96.240 l
+48.240 627.600 m
+220.080 627.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 72.960 m
-220.080 72.960 l
+48.240 604.320 m
+220.080 604.320 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 96.490 m
-48.240 72.710 l
+48.240 627.850 m
+48.240 604.070 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 96.490 m
-220.080 72.710 l
+220.080 627.850 m
+220.080 604.070 l
S
[ ] 0 d
1 w
@@ -12865,7 +11986,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 79.99300000000024 Td
+51.24 611.3530000000002 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -12873,26 +11994,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 96.240 m
-563.760 96.240 l
+220.080 627.600 m
+563.760 627.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 72.960 m
-563.760 72.960 l
+220.080 604.320 m
+563.760 604.320 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 96.490 m
-220.080 72.710 l
+220.080 627.850 m
+220.080 604.070 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 96.490 m
-563.760 72.710 l
+563.760 627.850 m
+563.760 604.070 l
S
[ ] 0 d
1 w
@@ -12900,104 +12021,19 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 79.99300000000024 Td
+223.07982816 611.3530000000002 Td
/F1.0 10.5 Tf
<4e6f20436f6e74656e74> Tj
ET
0.000 0.000 0.000 scn
-q
-0.000 0.000 0.000 scn
-0.000 0.000 0.000 SCN
-1 w
-0 J
-0 j
-[ ] 0 d
-/Stamp1 Do
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-557.7289999999999 14.388 Td
-/F1.0 9 Tf
-<37> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-Q
-Q
-
-endstream
-endobj
-98 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 612.0 792.0]
-/Contents 97 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F2.0 22 0 R
-/F3.0 24 0 R
-/F1.0 8 0 R
-/F4.0 34 0 R
->>
-/XObject << /Stamp1 496 0 R
->>
->>
-/Annots [107 0 R]
->>
-endobj
-99 0 obj
-[98 0 R /XYZ 0 668.88 null]
-endobj
-100 0 obj
-[98 0 R /XYZ 0 578.0400000000002 null]
-endobj
-101 0 obj
-<< /Limits [(_parameters_6) (_produces_13)]
-/Names [(_parameters_6) 79 0 R (_parameters_7) 86 0 R (_parameters_8) 96 0 R (_parameters_9) 106 0 R (_paths) 28 0 R (_produces) 35 0 R (_produces_10) 91 0 R (_produces_11) 94 0 R (_produces_12) 100 0 R (_produces_13) 104 0 R]
->>
-endobj
-102 0 obj
-[98 0 R /XYZ 0 521.7600000000003 null]
-endobj
-103 0 obj
-[98 0 R /XYZ 0 481.68000000000035 null]
-endobj
-104 0 obj
-[98 0 R /XYZ 0 390.8400000000004 null]
-endobj
-105 0 obj
-[98 0 R /XYZ 0 334.56000000000034 null]
-endobj
-106 0 obj
-[98 0 R /XYZ 0 294.4800000000003 null]
-endobj
-107 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmodel)
-/Subtype /Link
-/Rect [337.6397136 174.9070000000003 389.7092136 189.1870000000003]
-/Type /Annot
->>
-endobj
-108 0 obj
-[98 0 R /XYZ 0 151.80000000000027 null]
-endobj
-109 0 obj
-<< /Length 12732
->>
-stream
-q
-/DeviceRGB cs
0.200 0.200 0.200 scn
-/DeviceRGB CS
0.200 0.200 0.200 SCN
BT
-48.24 740.816 Td
+48.24 574.7360000000003 Td
/F2.0 13 Tf
-<322e31342e332e20436f6e73756d6573> Tj
+<322e31322e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -13008,7 +12044,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 714.1560000000001 Td
+56.88050000000001 548.0760000000004 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -13021,7 +12057,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 716.3400000000001 Td
+66.24000000000001 550.2600000000004 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -13032,9 +12068,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 684.5360000000002 Td
+48.24000000000001 518.4560000000005 Td
/F2.0 13 Tf
-<322e31342e342e2050726f6475636573> Tj
+<322e31322e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -13045,7 +12081,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 657.8760000000002 Td
+56.88050000000001 491.79600000000056 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -13058,7 +12094,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 660.0600000000003 Td
+66.24000000000001 493.9800000000006 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -13069,9 +12105,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 622.4160000000003 Td
+48.24000000000001 456.3360000000006 Td
/F2.0 18 Tf
-[<322e31352e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652d6e616d6573>] TJ
+[<322e31332e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652d6e616d6573>] TJ
ET
0.000 0.000 0.000 SCN
@@ -13080,59 +12116,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 588.1760000000004 Td
+48.24000000000001 422.0960000000005 Td
/F2.0 13 Tf
-<322e31352e312e20526573706f6e736573> Tj
+<322e31332e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 535.920 51.552 37.560 re
+48.240 369.840 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 535.920 360.864 37.560 re
+99.792 369.840 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 535.920 103.104 37.560 re
+460.656 369.840 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 512.640 51.552 23.280 re
+48.240 346.560 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 512.640 360.864 23.280 re
+99.792 346.560 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 512.640 103.104 23.280 re
+460.656 346.560 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 573.480 m
-99.792 573.480 l
+48.240 407.400 m
+99.792 407.400 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 535.920 m
-99.792 535.920 l
+48.240 369.840 m
+99.792 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 573.730 m
-48.240 535.170 l
+48.240 407.650 m
+48.240 369.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 573.730 m
-99.792 535.170 l
+99.792 407.650 m
+99.792 369.090 l
S
[ ] 0 d
1 w
@@ -13140,14 +12176,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 557.7330000000004 Td
+51.24000000000001 391.6530000000005 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24000000000001 543.4530000000004 Td
+51.24000000000001 377.3730000000005 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -13155,26 +12191,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 573.480 m
-460.656 573.480 l
+99.792 407.400 m
+460.656 407.400 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 535.920 m
-460.656 535.920 l
+99.792 369.840 m
+460.656 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 573.730 m
-99.792 535.170 l
+99.792 407.650 m
+99.792 369.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 573.730 m
-460.656 535.170 l
+460.656 407.650 m
+460.656 369.090 l
S
[ ] 0 d
1 w
@@ -13182,7 +12218,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 557.7330000000004 Td
+102.792 391.6530000000005 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -13190,26 +12226,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 573.480 m
-563.760 573.480 l
+460.656 407.400 m
+563.760 407.400 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 535.920 m
-563.760 535.920 l
+460.656 369.840 m
+563.760 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 573.730 m
-460.656 535.170 l
+460.656 407.650 m
+460.656 369.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 573.730 m
-563.760 535.170 l
+563.760 407.650 m
+563.760 369.090 l
S
[ ] 0 d
1 w
@@ -13217,7 +12253,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 557.7330000000004 Td
+463.65600000000006 391.6530000000005 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -13225,26 +12261,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 535.920 m
-99.792 535.920 l
+48.240 369.840 m
+99.792 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 512.640 m
-99.792 512.640 l
+48.240 346.560 m
+99.792 346.560 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 536.170 m
-48.240 512.390 l
+48.240 370.090 m
+48.240 346.310 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 536.170 m
-99.792 512.390 l
+99.792 370.090 m
+99.792 346.310 l
S
[ ] 0 d
1 w
@@ -13252,7 +12288,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 519.6730000000005 Td
+51.24000000000001 353.5930000000005 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -13260,26 +12296,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 535.920 m
-460.656 535.920 l
+99.792 369.840 m
+460.656 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 512.640 m
-460.656 512.640 l
+99.792 346.560 m
+460.656 346.560 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 536.170 m
-99.792 512.390 l
+99.792 370.090 m
+99.792 346.310 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 536.170 m
-460.656 512.390 l
+460.656 370.090 m
+460.656 346.310 l
S
[ ] 0 d
1 w
@@ -13287,7 +12323,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 519.6730000000005 Td
+102.792 353.5930000000005 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -13295,26 +12331,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 535.920 m
-563.760 535.920 l
+460.656 369.840 m
+563.760 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 512.640 m
-563.760 512.640 l
+460.656 346.560 m
+563.760 346.560 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 536.170 m
-460.656 512.390 l
+460.656 370.090 m
+460.656 346.310 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 536.170 m
-563.760 512.390 l
+563.760 370.090 m
+563.760 346.310 l
S
[ ] 0 d
1 w
@@ -13328,7 +12364,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 519.6730000000005 Td
+463.65600000000006 353.5930000000005 Td
/F1.0 10.5 Tf
[<56> 60.05859375 <616c75654974656d>] TJ
ET
@@ -13340,9 +12376,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 483.05600000000055 Td
+48.24000000000001 316.9760000000005 Td
/F2.0 13 Tf
-<322e31352e322e2050726f6475636573> Tj
+<322e31332e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -13353,7 +12389,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 456.3960000000005 Td
+56.88050000000001 290.3160000000005 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -13366,7 +12402,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 458.58000000000055 Td
+66.24000000000001 292.50000000000045 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -13377,9 +12413,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 420.93600000000055 Td
+48.24000000000001 254.8560000000005 Td
/F2.0 18 Tf
-[<322e31362e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f62706d6e2f7b74656d706c6174654e616d657d>] TJ
+[<322e31342e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f62706d6e2f7b74656d706c6174654e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -13388,59 +12424,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 386.6960000000005 Td
+48.24000000000001 220.6160000000005 Td
/F2.0 13 Tf
-[<322e31362e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e31342e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 348.720 114.560 23.280 re
+48.240 182.640 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 348.720 171.840 23.280 re
+162.800 182.640 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 348.720 229.120 23.280 re
+334.640 182.640 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 311.160 114.560 37.560 re
+48.240 145.080 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 311.160 171.840 37.560 re
+162.800 145.080 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 311.160 229.120 37.560 re
+334.640 145.080 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 372.000 m
-162.800 372.000 l
+48.240 205.920 m
+162.800 205.920 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 348.720 m
-162.800 348.720 l
+48.240 182.640 m
+162.800 182.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 372.250 m
-48.240 347.970 l
+48.240 206.170 m
+48.240 181.890 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 372.250 m
-162.800 347.970 l
+162.800 206.170 m
+162.800 181.890 l
S
[ ] 0 d
1 w
@@ -13448,7 +12484,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 356.25300000000044 Td
+51.24000000000001 190.17300000000048 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -13456,26 +12492,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 372.000 m
-334.640 372.000 l
+162.800 205.920 m
+334.640 205.920 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 348.720 m
-334.640 348.720 l
+162.800 182.640 m
+334.640 182.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 372.250 m
-162.800 347.970 l
+162.800 206.170 m
+162.800 181.890 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 372.250 m
-334.640 347.970 l
+334.640 206.170 m
+334.640 181.890 l
S
[ ] 0 d
1 w
@@ -13483,7 +12519,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 356.25300000000044 Td
+165.79988544000003 190.17300000000048 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -13491,26 +12527,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 372.000 m
-563.760 372.000 l
+334.640 205.920 m
+563.760 205.920 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 348.720 m
-563.760 348.720 l
+334.640 182.640 m
+563.760 182.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 372.250 m
-334.640 347.970 l
+334.640 206.170 m
+334.640 181.890 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 372.250 m
-563.760 347.970 l
+563.760 206.170 m
+563.760 181.890 l
S
[ ] 0 d
1 w
@@ -13518,7 +12554,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 356.25300000000044 Td
+337.6397136 190.17300000000048 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -13526,26 +12562,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 348.720 m
-162.800 348.720 l
+48.240 182.640 m
+162.800 182.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 311.160 m
-162.800 311.160 l
+48.240 145.080 m
+162.800 145.080 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 348.970 m
-48.240 310.910 l
+48.240 182.890 m
+48.240 144.830 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 348.970 m
-162.800 310.910 l
+162.800 182.890 m
+162.800 144.830 l
S
[ ] 0 d
1 w
@@ -13553,7 +12589,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 325.3330000000005 Td
+51.24000000000001 159.25300000000047 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -13561,26 +12597,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 348.720 m
-334.640 348.720 l
+162.800 182.640 m
+334.640 182.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 311.160 m
-334.640 311.160 l
+162.800 145.080 m
+334.640 145.080 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 348.970 m
-162.800 310.910 l
+162.800 182.890 m
+162.800 144.830 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 348.970 m
-334.640 310.910 l
+334.640 182.890 m
+334.640 144.830 l
S
[ ] 0 d
1 w
@@ -13588,19 +12624,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 332.47300000000047 Td
+165.79988544000003 166.39300000000048 Td
/F2.0 10.5 Tf
<74656d706c6174654e616d65> Tj
ET
BT
-165.79988544000003 318.19300000000044 Td
+165.79988544000003 152.11300000000048 Td
ET
BT
-165.79988544000003 318.19300000000044 Td
+165.79988544000003 152.11300000000048 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -13608,26 +12644,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 348.720 m
-563.760 348.720 l
+334.640 182.640 m
+563.760 182.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 311.160 m
-563.760 311.160 l
+334.640 145.080 m
+563.760 145.080 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 348.970 m
-334.640 310.910 l
+334.640 182.890 m
+334.640 144.830 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 348.970 m
-563.760 310.910 l
+563.760 182.890 m
+563.760 144.830 l
S
[ ] 0 d
1 w
@@ -13635,7 +12671,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 325.3330000000005 Td
+337.6397136 159.25300000000047 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -13645,51 +12681,51 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 281.5760000000005 Td
+48.24000000000001 115.49600000000045 Td
/F2.0 13 Tf
-<322e31362e322e20526573706f6e736573> Tj
+<322e31342e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 243.600 171.840 23.280 re
+48.240 77.520 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 243.600 343.680 23.280 re
+220.080 77.520 343.680 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 220.320 171.840 23.280 re
+48.240 54.240 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 220.320 343.680 23.280 re
+220.080 54.240 343.680 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 266.880 m
-220.080 266.880 l
+48.240 100.800 m
+220.080 100.800 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 243.600 m
-220.080 243.600 l
+48.240 77.520 m
+220.080 77.520 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 267.130 m
-48.240 242.850 l
+48.240 101.050 m
+48.240 76.770 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 267.130 m
-220.080 242.850 l
+220.080 101.050 m
+220.080 76.770 l
S
[ ] 0 d
1 w
@@ -13697,7 +12733,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 251.13300000000044 Td
+51.24000000000001 85.05300000000044 Td
/F2.0 10.5 Tf
<4854545020436f6465> Tj
ET
@@ -13705,26 +12741,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 266.880 m
-563.760 266.880 l
+220.080 100.800 m
+563.760 100.800 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-220.080 243.600 m
-563.760 243.600 l
+220.080 77.520 m
+563.760 77.520 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 267.130 m
-220.080 242.850 l
+220.080 101.050 m
+220.080 76.770 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 267.130 m
-563.760 242.850 l
+563.760 101.050 m
+563.760 76.770 l
S
[ ] 0 d
1 w
@@ -13732,7 +12768,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 251.13300000000044 Td
+223.07982816 85.05300000000044 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -13740,26 +12776,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 243.600 m
-220.080 243.600 l
+48.240 77.520 m
+220.080 77.520 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 220.320 m
-220.080 220.320 l
+48.240 54.240 m
+220.080 54.240 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 243.850 m
-48.240 220.070 l
+48.240 77.770 m
+48.240 53.990 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 243.850 m
-220.080 220.070 l
+220.080 77.770 m
+220.080 53.990 l
S
[ ] 0 d
1 w
@@ -13767,7 +12803,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 227.35300000000046 Td
+51.24000000000001 61.27300000000044 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -13775,26 +12811,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 243.600 m
-563.760 243.600 l
+220.080 77.520 m
+563.760 77.520 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 220.320 m
-563.760 220.320 l
+220.080 54.240 m
+563.760 54.240 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 243.850 m
-220.080 220.070 l
+220.080 77.770 m
+220.080 53.990 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 243.850 m
-563.760 220.070 l
+563.760 77.770 m
+563.760 53.990 l
S
[ ] 0 d
1 w
@@ -13802,71 +12838,12 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 227.35300000000046 Td
+223.07982816 61.27300000000044 Td
/F1.0 10.5 Tf
<4e6f20436f6e74656e74> Tj
ET
0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 190.73600000000044 Td
-/F2.0 13 Tf
-<322e31362e332e2050726f6475636573> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
--0.500 Tc
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-56.88050000000001 164.07600000000042 Td
-/F1.0 10.5 Tf
-<a5> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-
-0.000 Tc
-0.694 0.129 0.275 scn
-0.694 0.129 0.275 SCN
-
-BT
-66.24000000000001 166.26000000000042 Td
-/F4.0 10.5 Tf
-<746578742f786d6c> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 128.61600000000038 Td
-/F2.0 18 Tf
-[<322e31372e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f696d6167652f7b74656d706c6174654e616d657d>] TJ
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24000000000001 94.3760000000004 Td
-/F2.0 13 Tf
-[<322e31372e312e20506172> 20.01953125 <616d6574657273>] TJ
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
q
0.000 0.000 0.000 scn
0.000 0.000 0.000 SCN
@@ -13879,9 +12856,9 @@ q
0.200 0.200 0.200 SCN
BT
-49.24 14.388 Td
+557.7289999999999 14.388 Td
/F1.0 9 Tf
-<38> Tj
+<37> Tj
ET
0.000 0.000 0.000 SCN
@@ -13891,122 +12868,183 @@ Q
endstream
endobj
-110 0 obj
+98 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 109 0 R
+/Contents 97 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
+/F3.0 24 0 R
/F1.0 8 0 R
/F4.0 34 0 R
-/F3.0 24 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
-/Annots [115 0 R]
+/Annots [99 0 R 106 0 R]
>>
endobj
-111 0 obj
-[110 0 R /XYZ 0 792.0 null]
-endobj
-112 0 obj
-[110 0 R /XYZ 0 702.1200000000001 null]
-endobj
-113 0 obj
-[110 0 R /XYZ 0 645.8400000000003 null]
-endobj
-114 0 obj
-[110 0 R /XYZ 0 605.7600000000003 null]
-endobj
-115 0 obj
+99 0 obj
<< /Border [0 0 0]
-/Dest (_valueitem)
+/Dest (_cldsmodel)
/Subtype /Link
-/Rect [463.65600000000006 516.6070000000005 514.6118847656251 530.8870000000005]
+/Rect [337.6397136 706.267 389.7092136 720.547]
/Type /Annot
>>
endobj
-116 0 obj
-[110 0 R /XYZ 0 500.64000000000055 null]
+100 0 obj
+[98 0 R /XYZ 0 683.1600000000001 null]
endobj
-117 0 obj
-[110 0 R /XYZ 0 444.3600000000005 null]
+101 0 obj
+[98 0 R /XYZ 0 592.3200000000003 null]
endobj
-118 0 obj
-[110 0 R /XYZ 0 404.2800000000005 null]
+102 0 obj
+<< /Limits [(_parameters_5) (_produces_12)]
+/Names [(_parameters_5) 74 0 R (_parameters_6) 79 0 R (_parameters_7) 86 0 R (_parameters_8) 96 0 R (_parameters_9) 109 0 R (_paths) 28 0 R (_produces) 35 0 R (_produces_10) 91 0 R (_produces_11) 94 0 R (_produces_12) 103 0 R]
+>>
endobj
-119 0 obj
-[110 0 R /XYZ 0 299.1600000000005 null]
+103 0 obj
+[98 0 R /XYZ 0 536.0400000000004 null]
endobj
-120 0 obj
-[110 0 R /XYZ 0 208.32000000000045 null]
+104 0 obj
+[98 0 R /XYZ 0 479.76000000000056 null]
endobj
-121 0 obj
-[110 0 R /XYZ 0 152.04000000000042 null]
+105 0 obj
+[98 0 R /XYZ 0 439.6800000000005 null]
endobj
-122 0 obj
-<< /Limits [(_route18) (_route27)]
-/Names [(_route18) 121 0 R (_route19) 128 0 R (_route2) 36 0 R (_route20) 134 0 R (_route21) 113 0 R (_route22) 191 0 R (_route23) 179 0 R (_route24) 175 0 R (_route25) 185 0 R (_route26) 147 0 R (_route27) 143 0 R]
+106 0 obj
+<< /Border [0 0 0]
+/Dest (_valueitem)
+/Subtype /Link
+/Rect [463.65600000000006 350.5270000000005 514.6118847656251 364.80700000000047]
+/Type /Annot
>>
endobj
-123 0 obj
-[110 0 R /XYZ 0 111.9600000000004 null]
+107 0 obj
+[98 0 R /XYZ 0 334.5600000000005 null]
endobj
-124 0 obj
-<< /Length 19637
+108 0 obj
+[98 0 R /XYZ 0 278.2800000000005 null]
+endobj
+109 0 obj
+[98 0 R /XYZ 0 238.2000000000005 null]
+endobj
+110 0 obj
+[98 0 R /XYZ 0 133.08000000000047 null]
+endobj
+111 0 obj
+<< /Length 15439
>>
stream
q
/DeviceRGB cs
+0.200 0.200 0.200 scn
+/DeviceRGB CS
+0.200 0.200 0.200 SCN
+
+BT
+48.24 740.816 Td
+/F2.0 13 Tf
+<322e31342e332e2050726f6475636573> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+
+-0.500 Tc
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+56.88050000000001 714.1560000000001 Td
+/F1.0 10.5 Tf
+<a5> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+
+0.000 Tc
+0.694 0.129 0.275 scn
+0.694 0.129 0.275 SCN
+
+BT
+66.24000000000001 716.3400000000001 Td
+/F4.0 10.5 Tf
+<746578742f786d6c> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+48.24000000000001 678.6960000000001 Td
+/F2.0 18 Tf
+[<322e31352e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f696d6167652f7b74656d706c6174654e616d657d>] TJ
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+48.24000000000001 644.4560000000002 Td
+/F2.0 13 Tf
+[<322e31352e312e20506172> 20.01953125 <616d6574657273>] TJ
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 732.720 114.560 23.280 re
+48.240 606.480 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 732.720 171.840 23.280 re
+162.800 606.480 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 732.720 229.120 23.280 re
+334.640 606.480 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 695.160 114.560 37.560 re
+48.240 568.920 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 695.160 171.840 37.560 re
+162.800 568.920 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 695.160 229.120 37.560 re
+334.640 568.920 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
-/DeviceRGB CS
0.867 0.867 0.867 SCN
-48.240 756.000 m
-162.800 756.000 l
+48.240 629.760 m
+162.800 629.760 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 732.720 m
-162.800 732.720 l
+48.240 606.480 m
+162.800 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 756.250 m
-48.240 731.970 l
+48.240 630.010 m
+48.240 605.730 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 756.250 m
-162.800 731.970 l
+162.800 630.010 m
+162.800 605.730 l
S
[ ] 0 d
1 w
@@ -14014,7 +13052,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 740.2529999999999 Td
+51.24000000000001 614.0130000000003 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -14022,26 +13060,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 756.000 m
-334.640 756.000 l
+162.800 629.760 m
+334.640 629.760 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 732.720 m
-334.640 732.720 l
+162.800 606.480 m
+334.640 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 756.250 m
-162.800 731.970 l
+162.800 630.010 m
+162.800 605.730 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 756.250 m
-334.640 731.970 l
+334.640 630.010 m
+334.640 605.730 l
S
[ ] 0 d
1 w
@@ -14049,7 +13087,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544 740.2529999999999 Td
+165.79988544000003 614.0130000000003 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -14057,26 +13095,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 756.000 m
-563.760 756.000 l
+334.640 629.760 m
+563.760 629.760 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 732.720 m
-563.760 732.720 l
+334.640 606.480 m
+563.760 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 756.250 m
-334.640 731.970 l
+334.640 630.010 m
+334.640 605.730 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 756.250 m
-563.760 731.970 l
+563.760 630.010 m
+563.760 605.730 l
S
[ ] 0 d
1 w
@@ -14084,7 +13122,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 740.2529999999999 Td
+337.6397136 614.0130000000003 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -14092,26 +13130,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 732.720 m
-162.800 732.720 l
+48.240 606.480 m
+162.800 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 695.160 m
-162.800 695.160 l
+48.240 568.920 m
+162.800 568.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 732.970 m
-48.240 694.910 l
+48.240 606.730 m
+48.240 568.670 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 732.970 m
-162.800 694.910 l
+162.800 606.730 m
+162.800 568.670 l
S
[ ] 0 d
1 w
@@ -14119,7 +13157,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 709.333 Td
+51.24000000000001 583.0930000000003 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -14127,26 +13165,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 732.720 m
-334.640 732.720 l
+162.800 606.480 m
+334.640 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 695.160 m
-334.640 695.160 l
+162.800 568.920 m
+334.640 568.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 732.970 m
-162.800 694.910 l
+162.800 606.730 m
+162.800 568.670 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 732.970 m
-334.640 694.910 l
+334.640 606.730 m
+334.640 568.670 l
S
[ ] 0 d
1 w
@@ -14154,19 +13192,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544 716.473 Td
+165.79988544000003 590.2330000000004 Td
/F2.0 10.5 Tf
<74656d706c6174654e616d65> Tj
ET
BT
-165.79988544 702.193 Td
+165.79988544000003 575.9530000000003 Td
ET
BT
-165.79988544 702.193 Td
+165.79988544000003 575.9530000000003 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -14174,26 +13212,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 732.720 m
-563.760 732.720 l
+334.640 606.480 m
+563.760 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 695.160 m
-563.760 695.160 l
+334.640 568.920 m
+563.760 568.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 732.970 m
-334.640 694.910 l
+334.640 606.730 m
+334.640 568.670 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 732.970 m
-563.760 694.910 l
+563.760 606.730 m
+563.760 568.670 l
S
[ ] 0 d
1 w
@@ -14201,7 +13239,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 709.333 Td
+337.6397136 583.0930000000003 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -14211,51 +13249,51 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24 665.5760000000001 Td
+48.24000000000001 539.3360000000004 Td
/F2.0 13 Tf
-<322e31372e322e20526573706f6e736573> Tj
+<322e31352e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 627.600 171.840 23.280 re
+48.240 501.360 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 627.600 343.680 23.280 re
+220.080 501.360 343.680 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 604.320 171.840 23.280 re
+48.240 478.080 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 604.320 343.680 23.280 re
+220.080 478.080 343.680 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 650.880 m
-220.080 650.880 l
+48.240 524.640 m
+220.080 524.640 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 627.600 m
-220.080 627.600 l
+48.240 501.360 m
+220.080 501.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 651.130 m
-48.240 626.850 l
+48.240 524.890 m
+48.240 500.610 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 651.130 m
-220.080 626.850 l
+220.080 524.890 m
+220.080 500.610 l
S
[ ] 0 d
1 w
@@ -14263,7 +13301,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 635.1330000000002 Td
+51.24000000000001 508.8930000000004 Td
/F2.0 10.5 Tf
<4854545020436f6465> Tj
ET
@@ -14271,26 +13309,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 650.880 m
-563.760 650.880 l
+220.080 524.640 m
+563.760 524.640 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-220.080 627.600 m
-563.760 627.600 l
+220.080 501.360 m
+563.760 501.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 651.130 m
-220.080 626.850 l
+220.080 524.890 m
+220.080 500.610 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 651.130 m
-563.760 626.850 l
+563.760 524.890 m
+563.760 500.610 l
S
[ ] 0 d
1 w
@@ -14298,7 +13336,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 635.1330000000002 Td
+223.07982816 508.8930000000004 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -14306,26 +13344,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 627.600 m
-220.080 627.600 l
+48.240 501.360 m
+220.080 501.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 604.320 m
-220.080 604.320 l
+48.240 478.080 m
+220.080 478.080 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 627.850 m
-48.240 604.070 l
+48.240 501.610 m
+48.240 477.830 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 627.850 m
-220.080 604.070 l
+220.080 501.610 m
+220.080 477.830 l
S
[ ] 0 d
1 w
@@ -14333,7 +13371,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 611.3530000000002 Td
+51.24000000000001 485.11300000000045 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -14341,26 +13379,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 627.600 m
-563.760 627.600 l
+220.080 501.360 m
+563.760 501.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 604.320 m
-563.760 604.320 l
+220.080 478.080 m
+563.760 478.080 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 627.850 m
-220.080 604.070 l
+220.080 501.610 m
+220.080 477.830 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 627.850 m
-563.760 604.070 l
+563.760 501.610 m
+563.760 477.830 l
S
[ ] 0 d
1 w
@@ -14368,7 +13406,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 611.3530000000002 Td
+223.07982816 485.11300000000045 Td
/F1.0 10.5 Tf
<4e6f20436f6e74656e74> Tj
ET
@@ -14378,9 +13416,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24 574.7360000000003 Td
+48.24000000000001 448.4960000000005 Td
/F2.0 13 Tf
-<322e31372e332e2050726f6475636573> Tj
+<322e31352e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -14391,7 +13429,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 548.0760000000004 Td
+56.88050000000001 421.83600000000047 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -14404,7 +13442,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 550.2600000000004 Td
+66.24000000000001 424.0200000000005 Td
/F4.0 10.5 Tf
<746578742f786d6c> Tj
ET
@@ -14415,9 +13453,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 512.6160000000004 Td
+48.24000000000001 386.3760000000005 Td
/F2.0 18 Tf
-[<322e31382e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f7b74656d706c6174654e616d657d>] TJ
+[<322e31362e20474554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f7b74656d706c6174654e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
@@ -14426,59 +13464,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 478.37600000000043 Td
+48.24000000000001 352.1360000000004 Td
/F2.0 13 Tf
-[<322e31382e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e31362e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 440.400 114.560 23.280 re
+48.240 314.160 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 440.400 171.840 23.280 re
+162.800 314.160 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 440.400 229.120 23.280 re
+334.640 314.160 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 402.840 114.560 37.560 re
+48.240 276.600 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 402.840 171.840 37.560 re
+162.800 276.600 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 402.840 229.120 37.560 re
+334.640 276.600 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 463.680 m
-162.800 463.680 l
+48.240 337.440 m
+162.800 337.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 440.400 m
-162.800 440.400 l
+48.240 314.160 m
+162.800 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 463.930 m
-48.240 439.650 l
+48.240 337.690 m
+48.240 313.410 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 463.930 m
-162.800 439.650 l
+162.800 337.690 m
+162.800 313.410 l
S
[ ] 0 d
1 w
@@ -14486,7 +13524,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 447.9330000000004 Td
+51.24000000000001 321.6930000000004 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -14494,26 +13532,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 463.680 m
-334.640 463.680 l
+162.800 337.440 m
+334.640 337.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 440.400 m
-334.640 440.400 l
+162.800 314.160 m
+334.640 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 463.930 m
-162.800 439.650 l
+162.800 337.690 m
+162.800 313.410 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 463.930 m
-334.640 439.650 l
+334.640 337.690 m
+334.640 313.410 l
S
[ ] 0 d
1 w
@@ -14521,7 +13559,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 447.9330000000004 Td
+165.79988544000003 321.6930000000004 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -14529,26 +13567,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 463.680 m
-563.760 463.680 l
+334.640 337.440 m
+563.760 337.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 440.400 m
-563.760 440.400 l
+334.640 314.160 m
+563.760 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 463.930 m
-334.640 439.650 l
+334.640 337.690 m
+334.640 313.410 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 463.930 m
-563.760 439.650 l
+563.760 337.690 m
+563.760 313.410 l
S
[ ] 0 d
1 w
@@ -14556,7 +13594,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 447.9330000000004 Td
+337.6397136 321.6930000000004 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -14564,26 +13602,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 440.400 m
-162.800 440.400 l
+48.240 314.160 m
+162.800 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 402.840 m
-162.800 402.840 l
+48.240 276.600 m
+162.800 276.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 440.650 m
-48.240 402.590 l
+48.240 314.410 m
+48.240 276.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 440.650 m
-162.800 402.590 l
+162.800 314.410 m
+162.800 276.350 l
S
[ ] 0 d
1 w
@@ -14591,7 +13629,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 417.01300000000043 Td
+51.24000000000001 290.7730000000004 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -14599,26 +13637,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 440.400 m
-334.640 440.400 l
+162.800 314.160 m
+334.640 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 402.840 m
-334.640 402.840 l
+162.800 276.600 m
+334.640 276.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 440.650 m
-162.800 402.590 l
+162.800 314.410 m
+162.800 276.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 440.650 m
-334.640 402.590 l
+334.640 314.410 m
+334.640 276.350 l
S
[ ] 0 d
1 w
@@ -14626,19 +13664,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 424.1530000000004 Td
+165.79988544000003 297.9130000000004 Td
/F2.0 10.5 Tf
<74656d706c6174654e616d65> Tj
ET
BT
-165.79988544000003 409.8730000000004 Td
+165.79988544000003 283.6330000000004 Td
ET
BT
-165.79988544000003 409.8730000000004 Td
+165.79988544000003 283.6330000000004 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -14646,26 +13684,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 440.400 m
-563.760 440.400 l
+334.640 314.160 m
+563.760 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 402.840 m
-563.760 402.840 l
+334.640 276.600 m
+563.760 276.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 440.650 m
-334.640 402.590 l
+334.640 314.410 m
+334.640 276.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 440.650 m
-563.760 402.590 l
+563.760 314.410 m
+563.760 276.350 l
S
[ ] 0 d
1 w
@@ -14673,7 +13711,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 417.01300000000043 Td
+337.6397136 290.7730000000004 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -14683,59 +13721,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 373.2560000000004 Td
+48.24000000000001 247.01600000000042 Td
/F2.0 13 Tf
-<322e31382e322e20526573706f6e736573> Tj
+<322e31362e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 321.000 51.552 37.560 re
+48.240 194.760 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 321.000 360.864 37.560 re
+99.792 194.760 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 321.000 103.104 37.560 re
+460.656 194.760 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 297.720 51.552 23.280 re
+48.240 171.480 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 297.720 360.864 23.280 re
+99.792 171.480 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 297.720 103.104 23.280 re
+460.656 171.480 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 358.560 m
-99.792 358.560 l
+48.240 232.320 m
+99.792 232.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 321.000 m
-99.792 321.000 l
+48.240 194.760 m
+99.792 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 358.810 m
-48.240 320.250 l
+48.240 232.570 m
+48.240 194.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 358.810 m
-99.792 320.250 l
+99.792 232.570 m
+99.792 194.010 l
S
[ ] 0 d
1 w
@@ -14743,14 +13781,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 342.8130000000004 Td
+51.24000000000001 216.57300000000043 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24000000000001 328.53300000000036 Td
+51.24000000000001 202.29300000000043 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -14758,26 +13796,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 358.560 m
-460.656 358.560 l
+99.792 232.320 m
+460.656 232.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 321.000 m
-460.656 321.000 l
+99.792 194.760 m
+460.656 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 358.810 m
-99.792 320.250 l
+99.792 232.570 m
+99.792 194.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 358.810 m
-460.656 320.250 l
+460.656 232.570 m
+460.656 194.010 l
S
[ ] 0 d
1 w
@@ -14785,7 +13823,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 342.8130000000004 Td
+102.792 216.57300000000043 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -14793,26 +13831,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 358.560 m
-563.760 358.560 l
+460.656 232.320 m
+563.760 232.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 321.000 m
-563.760 321.000 l
+460.656 194.760 m
+563.760 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 358.810 m
-460.656 320.250 l
+460.656 232.570 m
+460.656 194.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 358.810 m
-563.760 320.250 l
+563.760 232.570 m
+563.760 194.010 l
S
[ ] 0 d
1 w
@@ -14820,7 +13858,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 342.8130000000004 Td
+463.65600000000006 216.57300000000043 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -14828,26 +13866,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 321.000 m
-99.792 321.000 l
+48.240 194.760 m
+99.792 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 297.720 m
-99.792 297.720 l
+48.240 171.480 m
+99.792 171.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 321.250 m
-48.240 297.470 l
+48.240 195.010 m
+48.240 171.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 321.250 m
-99.792 297.470 l
+99.792 195.010 m
+99.792 171.230 l
S
[ ] 0 d
1 w
@@ -14855,7 +13893,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 304.7530000000004 Td
+51.24000000000001 178.51300000000043 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -14863,26 +13901,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 321.000 m
-460.656 321.000 l
+99.792 194.760 m
+460.656 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 297.720 m
-460.656 297.720 l
+99.792 171.480 m
+460.656 171.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 321.250 m
-99.792 297.470 l
+99.792 195.010 m
+99.792 171.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 321.250 m
-460.656 297.470 l
+460.656 195.010 m
+460.656 171.230 l
S
[ ] 0 d
1 w
@@ -14890,7 +13928,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 304.7530000000004 Td
+102.792 178.51300000000043 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -14898,26 +13936,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 321.000 m
-563.760 321.000 l
+460.656 194.760 m
+563.760 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 297.720 m
-563.760 297.720 l
+460.656 171.480 m
+563.760 171.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 321.250 m
-460.656 297.470 l
+460.656 195.010 m
+460.656 171.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 321.250 m
-563.760 297.470 l
+563.760 195.010 m
+563.760 171.230 l
S
[ ] 0 d
1 w
@@ -14931,7 +13969,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 304.7530000000004 Td
+463.65600000000006 178.51300000000043 Td
/F1.0 10.5 Tf
[<436c647354> 29.78515625 <656d706c617465>] TJ
ET
@@ -14943,9 +13981,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 268.13600000000037 Td
+48.24000000000001 141.8960000000004 Td
/F2.0 13 Tf
-<322e31382e332e2050726f6475636573> Tj
+<322e31362e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -14956,7 +13994,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 241.47600000000037 Td
+56.88050000000001 115.23600000000039 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -14969,7 +14007,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 243.66000000000037 Td
+66.24000000000001 117.42000000000039 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -14980,82 +14018,173 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 206.01600000000036 Td
+48.24000000000001 79.77600000000038 Td
/F2.0 18 Tf
-[<322e31392e20505554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f7b74656d706c6174654e616d657d>] TJ
+[<322e31372e20505554202f636c647354> 29.78515625 <656d706174652f74656d706c6174652f7b74656d706c6174654e616d657d>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
+q
+0.000 0.000 0.000 scn
+0.000 0.000 0.000 SCN
+1 w
+0 J
+0 j
+[ ] 0 d
+/Stamp1 Do
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+49.24 14.388 Td
+/F1.0 9 Tf
+<38> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+Q
+Q
+
+endstream
+endobj
+112 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612.0 792.0]
+/Contents 111 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F2.0 22 0 R
+/F1.0 8 0 R
+/F4.0 34 0 R
+/F3.0 24 0 R
+>>
+/XObject << /Stamp1 472 0 R
+>>
+>>
+/Annots [121 0 R]
+>>
+endobj
+113 0 obj
+[112 0 R /XYZ 0 792.0 null]
+endobj
+114 0 obj
+[112 0 R /XYZ 0 702.1200000000001 null]
+endobj
+115 0 obj
+[112 0 R /XYZ 0 662.0400000000002 null]
+endobj
+116 0 obj
+[112 0 R /XYZ 0 556.9200000000003 null]
+endobj
+117 0 obj
+[112 0 R /XYZ 0 466.0800000000005 null]
+endobj
+118 0 obj
+[112 0 R /XYZ 0 409.80000000000047 null]
+endobj
+119 0 obj
+[112 0 R /XYZ 0 369.7200000000004 null]
+endobj
+120 0 obj
+[112 0 R /XYZ 0 264.6000000000004 null]
+endobj
+121 0 obj
+<< /Border [0 0 0]
+/Dest (_cldstemplate)
+/Subtype /Link
+/Rect [463.65600000000006 175.44700000000043 531.0682558593751 189.72700000000043]
+/Type /Annot
+>>
+endobj
+122 0 obj
+[112 0 R /XYZ 0 159.48000000000042 null]
+endobj
+123 0 obj
+[112 0 R /XYZ 0 103.20000000000039 null]
+endobj
+124 0 obj
+<< /Limits [(_route67) (_route76)]
+/Names [(_route67) 47 0 R (_route68) 92 0 R (_route69) 53 0 R (_route70) 95 0 R (_route71) 108 0 R (_route72) 114 0 R (_route73) 118 0 R (_route74) 123 0 R (_route75) 104 0 R (_route76) 181 0 R]
+>>
+endobj
+125 0 obj
+<< /Length 17950
+>>
+stream
+q
+/DeviceRGB cs
0.200 0.200 0.200 scn
+/DeviceRGB CS
0.200 0.200 0.200 SCN
BT
-48.24000000000001 171.77600000000035 Td
+48.24 740.816 Td
/F2.0 13 Tf
-[<322e31392e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e31372e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 133.800 114.560 23.280 re
+48.240 702.840 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 133.800 171.840 23.280 re
+162.800 702.840 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 133.800 229.120 23.280 re
+334.640 702.840 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 96.240 114.560 37.560 re
+48.240 665.280 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 96.240 171.840 37.560 re
+162.800 665.280 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 96.240 229.120 37.560 re
+334.640 665.280 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-48.240 58.680 114.560 37.560 re
+48.240 627.720 114.560 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-162.800 58.680 171.840 37.560 re
+162.800 627.720 171.840 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-334.640 58.680 229.120 37.560 re
+334.640 627.720 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 157.080 m
-162.800 157.080 l
+48.240 726.120 m
+162.800 726.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 133.800 m
-162.800 133.800 l
+48.240 702.840 m
+162.800 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 157.330 m
-48.240 133.050 l
+48.240 726.370 m
+48.240 702.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 157.330 m
-162.800 133.050 l
+162.800 726.370 m
+162.800 702.090 l
S
[ ] 0 d
1 w
@@ -15063,7 +14192,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 141.33300000000034 Td
+51.24 710.373 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -15071,26 +14200,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 157.080 m
-334.640 157.080 l
+162.800 726.120 m
+334.640 726.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 133.800 m
-334.640 133.800 l
+162.800 702.840 m
+334.640 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 157.330 m
-162.800 133.050 l
+162.800 726.370 m
+162.800 702.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 157.330 m
-334.640 133.050 l
+334.640 726.370 m
+334.640 702.090 l
S
[ ] 0 d
1 w
@@ -15098,7 +14227,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 141.33300000000034 Td
+165.79988544 710.373 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -15106,26 +14235,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 157.080 m
-563.760 157.080 l
+334.640 726.120 m
+563.760 726.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 133.800 m
-563.760 133.800 l
+334.640 702.840 m
+563.760 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 157.330 m
-334.640 133.050 l
+334.640 726.370 m
+334.640 702.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 157.330 m
-563.760 133.050 l
+563.760 726.370 m
+563.760 702.090 l
S
[ ] 0 d
1 w
@@ -15133,7 +14262,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 141.33300000000034 Td
+337.6397136 710.373 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -15141,26 +14270,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 133.800 m
-162.800 133.800 l
+48.240 702.840 m
+162.800 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 96.240 m
-162.800 96.240 l
+48.240 665.280 m
+162.800 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 134.050 m
-48.240 95.990 l
+48.240 703.090 m
+48.240 665.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 134.050 m
-162.800 95.990 l
+162.800 703.090 m
+162.800 665.030 l
S
[ ] 0 d
1 w
@@ -15168,7 +14297,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 110.41300000000034 Td
+51.24 679.4530000000001 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -15176,26 +14305,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 133.800 m
-334.640 133.800 l
+162.800 702.840 m
+334.640 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 96.240 m
-334.640 96.240 l
+162.800 665.280 m
+334.640 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 134.050 m
-162.800 95.990 l
+162.800 703.090 m
+162.800 665.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 134.050 m
-334.640 95.990 l
+334.640 703.090 m
+334.640 665.030 l
S
[ ] 0 d
1 w
@@ -15203,19 +14332,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 117.55300000000034 Td
+165.79988544 686.5930000000001 Td
/F2.0 10.5 Tf
<74656d706c6174654e616d65> Tj
ET
BT
-165.79988544000003 103.27300000000034 Td
+165.79988544 672.3130000000001 Td
ET
BT
-165.79988544000003 103.27300000000034 Td
+165.79988544 672.3130000000001 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -15223,26 +14352,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 133.800 m
-563.760 133.800 l
+334.640 702.840 m
+563.760 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 96.240 m
-563.760 96.240 l
+334.640 665.280 m
+563.760 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 134.050 m
-334.640 95.990 l
+334.640 703.090 m
+334.640 665.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 134.050 m
-563.760 95.990 l
+563.760 703.090 m
+563.760 665.030 l
S
[ ] 0 d
1 w
@@ -15250,7 +14379,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 110.41300000000034 Td
+337.6397136 679.4530000000001 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -15258,26 +14387,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 96.240 m
-162.800 96.240 l
+48.240 665.280 m
+162.800 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 58.680 m
-162.800 58.680 l
+48.240 627.720 m
+162.800 627.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 96.490 m
-48.240 58.430 l
+48.240 665.530 m
+48.240 627.470 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 96.490 m
-162.800 58.430 l
+162.800 665.530 m
+162.800 627.470 l
S
[ ] 0 d
1 w
@@ -15285,7 +14414,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 72.85300000000032 Td
+51.24 641.893 Td
/F2.0 10.5 Tf
<426f6479> Tj
ET
@@ -15293,26 +14422,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 96.240 m
-334.640 96.240 l
+162.800 665.280 m
+334.640 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 58.680 m
-334.640 58.680 l
+162.800 627.720 m
+334.640 627.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 96.490 m
-162.800 58.430 l
+162.800 665.530 m
+162.800 627.470 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 96.490 m
-334.640 58.430 l
+334.640 665.530 m
+334.640 627.470 l
S
[ ] 0 d
1 w
@@ -15320,19 +14449,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 79.99300000000032 Td
+165.79988544 649.0330000000001 Td
/F2.0 10.5 Tf
<626f6479> Tj
ET
BT
-165.79988544000003 65.71300000000032 Td
+165.79988544 634.753 Td
ET
BT
-165.79988544000003 65.71300000000032 Td
+165.79988544 634.753 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -15340,26 +14469,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 96.240 m
-563.760 96.240 l
+334.640 665.280 m
+563.760 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 58.680 m
-563.760 58.680 l
+334.640 627.720 m
+563.760 627.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 96.490 m
-334.640 58.430 l
+334.640 665.530 m
+334.640 627.470 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 96.490 m
-563.760 58.430 l
+563.760 665.530 m
+563.760 627.470 l
S
[ ] 0 d
1 w
@@ -15373,7 +14502,7 @@ S
0.259 0.545 0.792 SCN
BT
-337.6397136 72.85300000000032 Td
+337.6397136 641.893 Td
/F1.0 10.5 Tf
[<436c647354> 29.78515625 <656d706c617465>] TJ
ET
@@ -15381,156 +14510,63 @@ ET
0.000 0.000 0.000 SCN
0.200 0.200 0.200 scn
0.000 0.000 0.000 scn
-q
-0.000 0.000 0.000 scn
-0.000 0.000 0.000 SCN
-1 w
-0 J
-0 j
-[ ] 0 d
-/Stamp1 Do
0.200 0.200 0.200 scn
0.200 0.200 0.200 SCN
BT
-557.7289999999999 14.388 Td
-/F1.0 9 Tf
-<39> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-Q
-Q
-
-endstream
-endobj
-125 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 612.0 792.0]
-/Contents 124 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F2.0 22 0 R
-/F3.0 24 0 R
-/F1.0 8 0 R
-/F4.0 34 0 R
->>
-/XObject << /Stamp1 496 0 R
->>
->>
-/Annots [132 0 R 136 0 R]
->>
-endobj
-126 0 obj
-[125 0 R /XYZ 0 683.1600000000001 null]
-endobj
-127 0 obj
-[125 0 R /XYZ 0 592.3200000000003 null]
-endobj
-128 0 obj
-[125 0 R /XYZ 0 536.0400000000004 null]
-endobj
-129 0 obj
-[125 0 R /XYZ 0 495.96000000000043 null]
-endobj
-130 0 obj
-[125 0 R /XYZ 0 390.84000000000043 null]
-endobj
-131 0 obj
-<< /Limits [(_responses_14) (_responses_22)]
-/Names [(_responses_14) 108 0 R (_responses_15) 114 0 R (_responses_16) 119 0 R (_responses_17) 126 0 R (_responses_18) 130 0 R (_responses_19) 139 0 R (_responses_2) 37 0 R (_responses_20) 144 0 R (_responses_21) 150 0 R (_responses_22) 159 0 R]
->>
-endobj
-132 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstemplate)
-/Subtype /Link
-/Rect [463.65600000000006 301.6870000000004 531.0682558593751 315.9670000000004]
-/Type /Annot
->>
-endobj
-133 0 obj
-[125 0 R /XYZ 0 285.72000000000037 null]
-endobj
-134 0 obj
-[125 0 R /XYZ 0 229.44000000000037 null]
-endobj
-135 0 obj
-[125 0 R /XYZ 0 189.36000000000035 null]
-endobj
-136 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstemplate)
-/Subtype /Link
-/Rect [337.6397136 69.78700000000032 405.051969459375 84.06700000000032]
-/Type /Annot
->>
-endobj
-137 0 obj
-<< /Length 18259
->>
-stream
-q
-/DeviceRGB cs
-0.200 0.200 0.200 scn
-/DeviceRGB CS
-0.200 0.200 0.200 SCN
-
-BT
-48.24 740.816 Td
+48.24 598.1360000000001 Td
/F2.0 13 Tf
-<322e31392e322e20526573706f6e736573> Tj
+<322e31372e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 688.560 51.552 37.560 re
+48.240 545.880 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 688.560 360.864 37.560 re
+99.792 545.880 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 688.560 103.104 37.560 re
+460.656 545.880 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 665.280 51.552 23.280 re
+48.240 522.600 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 665.280 360.864 23.280 re
+99.792 522.600 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 665.280 103.104 23.280 re
+460.656 522.600 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 726.120 m
-99.792 726.120 l
+48.240 583.440 m
+99.792 583.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 688.560 m
-99.792 688.560 l
+48.240 545.880 m
+99.792 545.880 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 726.370 m
-48.240 687.810 l
+48.240 583.690 m
+48.240 545.130 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 726.370 m
-99.792 687.810 l
+99.792 583.690 m
+99.792 545.130 l
S
[ ] 0 d
1 w
@@ -15538,14 +14574,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24 710.373 Td
+51.24 567.6930000000002 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24 696.0930000000001 Td
+51.24 553.4130000000001 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -15553,26 +14589,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 726.120 m
-460.656 726.120 l
+99.792 583.440 m
+460.656 583.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 688.560 m
-460.656 688.560 l
+99.792 545.880 m
+460.656 545.880 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 726.370 m
-99.792 687.810 l
+99.792 583.690 m
+99.792 545.130 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 726.370 m
-460.656 687.810 l
+460.656 583.690 m
+460.656 545.130 l
S
[ ] 0 d
1 w
@@ -15580,7 +14616,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 710.373 Td
+102.792 567.6930000000002 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -15588,26 +14624,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 726.120 m
-563.760 726.120 l
+460.656 583.440 m
+563.760 583.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 688.560 m
-563.760 688.560 l
+460.656 545.880 m
+563.760 545.880 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 726.370 m
-460.656 687.810 l
+460.656 583.690 m
+460.656 545.130 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 726.370 m
-563.760 687.810 l
+563.760 583.690 m
+563.760 545.130 l
S
[ ] 0 d
1 w
@@ -15615,7 +14651,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 710.373 Td
+463.65600000000006 567.6930000000002 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -15623,26 +14659,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 688.560 m
-99.792 688.560 l
+48.240 545.880 m
+99.792 545.880 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 665.280 m
-99.792 665.280 l
+48.240 522.600 m
+99.792 522.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 688.810 m
-48.240 665.030 l
+48.240 546.130 m
+48.240 522.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 688.810 m
-99.792 665.030 l
+99.792 546.130 m
+99.792 522.350 l
S
[ ] 0 d
1 w
@@ -15650,7 +14686,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 672.3130000000001 Td
+51.24 529.633 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -15658,26 +14694,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 688.560 m
-460.656 688.560 l
+99.792 545.880 m
+460.656 545.880 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 665.280 m
-460.656 665.280 l
+99.792 522.600 m
+460.656 522.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 688.810 m
-99.792 665.030 l
+99.792 546.130 m
+99.792 522.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 688.810 m
-460.656 665.030 l
+460.656 546.130 m
+460.656 522.350 l
S
[ ] 0 d
1 w
@@ -15685,7 +14721,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 672.3130000000001 Td
+102.792 529.633 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -15693,26 +14729,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 688.560 m
-563.760 688.560 l
+460.656 545.880 m
+563.760 545.880 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 665.280 m
-563.760 665.280 l
+460.656 522.600 m
+563.760 522.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 688.810 m
-460.656 665.030 l
+460.656 546.130 m
+460.656 522.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 688.810 m
-563.760 665.030 l
+563.760 546.130 m
+563.760 522.350 l
S
[ ] 0 d
1 w
@@ -15726,7 +14762,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 672.3130000000001 Td
+463.65600000000006 529.633 Td
/F1.0 10.5 Tf
[<436c647354> 29.78515625 <656d706c617465>] TJ
ET
@@ -15738,9 +14774,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24 635.6960000000003 Td
+48.24 493.01600000000013 Td
/F2.0 13 Tf
-<322e31392e332e20436f6e73756d6573> Tj
+<322e31372e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -15751,7 +14787,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 609.0360000000003 Td
+56.88050000000001 466.3560000000001 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -15764,7 +14800,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 611.2200000000004 Td
+66.24000000000001 468.54000000000013 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -15775,9 +14811,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 579.4160000000004 Td
+48.24000000000001 436.7360000000001 Td
/F2.0 13 Tf
-<322e31392e342e2050726f6475636573> Tj
+<322e31372e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -15788,7 +14824,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 552.7560000000004 Td
+56.88050000000001 410.0760000000001 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -15801,7 +14837,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 554.9400000000005 Td
+66.24000000000001 412.2600000000001 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -15812,9 +14848,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 517.2960000000005 Td
+48.24000000000001 374.6160000000001 Td
/F2.0 18 Tf
-<322e32302e20474554202f64696374696f6e617279> Tj
+<322e31382e20474554202f64696374696f6e617279> Tj
ET
0.000 0.000 0.000 SCN
@@ -15823,59 +14859,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 483.0560000000005 Td
+48.24000000000001 340.37600000000003 Td
/F2.0 13 Tf
-<322e32302e312e20526573706f6e736573> Tj
+<322e31382e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 430.800 51.552 37.560 re
+48.240 288.120 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 430.800 360.864 37.560 re
+99.792 288.120 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 430.800 103.104 37.560 re
+460.656 288.120 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 407.520 51.552 23.280 re
+48.240 264.840 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 407.520 360.864 23.280 re
+99.792 264.840 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 407.520 103.104 23.280 re
+460.656 264.840 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 468.360 m
-99.792 468.360 l
+48.240 325.680 m
+99.792 325.680 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 430.800 m
-99.792 430.800 l
+48.240 288.120 m
+99.792 288.120 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 468.610 m
-48.240 430.050 l
+48.240 325.930 m
+48.240 287.370 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 468.610 m
-99.792 430.050 l
+99.792 325.930 m
+99.792 287.370 l
S
[ ] 0 d
1 w
@@ -15883,14 +14919,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 452.61300000000045 Td
+51.24000000000001 309.933 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24000000000001 438.3330000000004 Td
+51.24000000000001 295.653 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -15898,26 +14934,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 468.360 m
-460.656 468.360 l
+99.792 325.680 m
+460.656 325.680 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 430.800 m
-460.656 430.800 l
+99.792 288.120 m
+460.656 288.120 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 468.610 m
-99.792 430.050 l
+99.792 325.930 m
+99.792 287.370 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 468.610 m
-460.656 430.050 l
+460.656 325.930 m
+460.656 287.370 l
S
[ ] 0 d
1 w
@@ -15925,7 +14961,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 452.61300000000045 Td
+102.792 309.933 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -15933,26 +14969,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 468.360 m
-563.760 468.360 l
+460.656 325.680 m
+563.760 325.680 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 430.800 m
-563.760 430.800 l
+460.656 288.120 m
+563.760 288.120 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 468.610 m
-460.656 430.050 l
+460.656 325.930 m
+460.656 287.370 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 468.610 m
-563.760 430.050 l
+563.760 325.930 m
+563.760 287.370 l
S
[ ] 0 d
1 w
@@ -15960,7 +14996,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 452.61300000000045 Td
+463.65600000000006 309.933 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -15968,26 +15004,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 430.800 m
-99.792 430.800 l
+48.240 288.120 m
+99.792 288.120 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 407.520 m
-99.792 407.520 l
+48.240 264.840 m
+99.792 264.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 431.050 m
-48.240 407.270 l
+48.240 288.370 m
+48.240 264.590 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 431.050 m
-99.792 407.270 l
+99.792 288.370 m
+99.792 264.590 l
S
[ ] 0 d
1 w
@@ -15995,7 +15031,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 414.55300000000045 Td
+51.24000000000001 271.873 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -16003,26 +15039,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 430.800 m
-460.656 430.800 l
+99.792 288.120 m
+460.656 288.120 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 407.520 m
-460.656 407.520 l
+99.792 264.840 m
+460.656 264.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 431.050 m
-99.792 407.270 l
+99.792 288.370 m
+99.792 264.590 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 431.050 m
-460.656 407.270 l
+460.656 288.370 m
+460.656 264.590 l
S
[ ] 0 d
1 w
@@ -16030,7 +15066,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 414.55300000000045 Td
+102.792 271.873 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -16038,26 +15074,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 430.800 m
-563.760 430.800 l
+460.656 288.120 m
+563.760 288.120 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 407.520 m
-563.760 407.520 l
+460.656 264.840 m
+563.760 264.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 431.050 m
-460.656 407.270 l
+460.656 288.370 m
+460.656 264.590 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 431.050 m
-563.760 407.270 l
+563.760 288.370 m
+563.760 264.590 l
S
[ ] 0 d
1 w
@@ -16071,7 +15107,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 414.55300000000045 Td
+463.65600000000006 271.873 Td
/F1.0 10.5 Tf
<436c647344696374696f6e617279> Tj
ET
@@ -16083,9 +15119,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 377.93600000000043 Td
+48.24000000000001 235.25600000000003 Td
/F2.0 13 Tf
-<322e32302e322e2050726f6475636573> Tj
+<322e31382e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -16096,7 +15132,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 351.2760000000004 Td
+56.88050000000001 208.596 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -16109,7 +15145,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 353.46000000000043 Td
+66.24000000000001 210.78 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -16120,9 +15156,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 315.81600000000043 Td
+48.24000000000001 173.13599999999997 Td
/F2.0 18 Tf
-<322e32312e20505554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d> Tj
+<322e31392e20505554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d> Tj
ET
0.000 0.000 0.000 SCN
@@ -16131,71 +15167,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 281.57600000000036 Td
+48.24000000000001 138.89599999999996 Td
/F2.0 13 Tf
-[<322e32312e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e31392e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 243.600 114.560 23.280 re
+48.240 100.920 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 243.600 171.840 23.280 re
+162.800 100.920 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 243.600 229.120 23.280 re
+334.640 100.920 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 206.040 114.560 37.560 re
+48.240 63.360 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 206.040 171.840 37.560 re
+162.800 63.360 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 206.040 229.120 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
-48.240 168.480 114.560 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
-162.800 168.480 171.840 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
-334.640 168.480 229.120 37.560 re
+334.640 63.360 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 266.880 m
-162.800 266.880 l
+48.240 124.200 m
+162.800 124.200 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 243.600 m
-162.800 243.600 l
+48.240 100.920 m
+162.800 100.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 267.130 m
-48.240 242.850 l
+48.240 124.450 m
+48.240 100.170 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 267.130 m
-162.800 242.850 l
+162.800 124.450 m
+162.800 100.170 l
S
[ ] 0 d
1 w
@@ -16203,7 +15227,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 251.13300000000032 Td
+51.24000000000001 108.45299999999996 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -16211,26 +15235,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 266.880 m
-334.640 266.880 l
+162.800 124.200 m
+334.640 124.200 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 243.600 m
-334.640 243.600 l
+162.800 100.920 m
+334.640 100.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 267.130 m
-162.800 242.850 l
+162.800 124.450 m
+162.800 100.170 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 267.130 m
-334.640 242.850 l
+334.640 124.450 m
+334.640 100.170 l
S
[ ] 0 d
1 w
@@ -16238,7 +15262,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 251.13300000000032 Td
+165.79988544000003 108.45299999999996 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -16246,26 +15270,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 266.880 m
-563.760 266.880 l
+334.640 124.200 m
+563.760 124.200 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 243.600 m
-563.760 243.600 l
+334.640 100.920 m
+563.760 100.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 267.130 m
-334.640 242.850 l
+334.640 124.450 m
+334.640 100.170 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 267.130 m
-563.760 242.850 l
+563.760 124.450 m
+563.760 100.170 l
S
[ ] 0 d
1 w
@@ -16273,7 +15297,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 251.13300000000032 Td
+337.6397136 108.45299999999996 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -16281,26 +15305,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 243.600 m
-162.800 243.600 l
+48.240 100.920 m
+162.800 100.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 206.040 m
-162.800 206.040 l
+48.240 63.360 m
+162.800 63.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 243.850 m
-48.240 205.790 l
+48.240 101.170 m
+48.240 63.110 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 243.850 m
-162.800 205.790 l
+162.800 101.170 m
+162.800 63.110 l
S
[ ] 0 d
1 w
@@ -16308,7 +15332,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 220.21300000000033 Td
+51.24000000000001 77.53299999999996 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -16316,26 +15340,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 243.600 m
-334.640 243.600 l
+162.800 100.920 m
+334.640 100.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 206.040 m
-334.640 206.040 l
+162.800 63.360 m
+334.640 63.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 243.850 m
-162.800 205.790 l
+162.800 101.170 m
+162.800 63.110 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 243.850 m
-334.640 205.790 l
+334.640 101.170 m
+334.640 63.110 l
S
[ ] 0 d
1 w
@@ -16343,19 +15367,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 227.35300000000035 Td
+165.79988544000003 84.67299999999996 Td
/F2.0 10.5 Tf
<64696374696f6e6172794e616d65> Tj
ET
BT
-165.79988544000003 213.07300000000035 Td
+165.79988544000003 70.39299999999996 Td
ET
BT
-165.79988544000003 213.07300000000035 Td
+165.79988544000003 70.39299999999996 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -16363,26 +15387,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 243.600 m
-563.760 243.600 l
+334.640 100.920 m
+563.760 100.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 206.040 m
-563.760 206.040 l
+334.640 63.360 m
+563.760 63.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 243.850 m
-334.640 205.790 l
+334.640 101.170 m
+334.640 63.110 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 243.850 m
-563.760 205.790 l
+563.760 101.170 m
+563.760 63.110 l
S
[ ] 0 d
1 w
@@ -16390,34 +15414,232 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 220.21300000000033 Td
+337.6397136 77.53299999999996 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
0.000 0.000 0.000 scn
+q
+0.000 0.000 0.000 scn
+0.000 0.000 0.000 SCN
+1 w
+0 J
+0 j
+[ ] 0 d
+/Stamp1 Do
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+557.7289999999999 14.388 Td
+/F1.0 9 Tf
+<39> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+Q
+Q
+
+endstream
+endobj
+126 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612.0 792.0]
+/Contents 125 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F2.0 22 0 R
+/F3.0 24 0 R
+/F1.0 8 0 R
+/F4.0 34 0 R
+>>
+/XObject << /Stamp1 472 0 R
+>>
+>>
+/Annots [128 0 R 130 0 R 136 0 R]
+>>
+endobj
+127 0 obj
+[126 0 R /XYZ 0 792.0 null]
+endobj
+128 0 obj
+<< /Border [0 0 0]
+/Dest (_cldstemplate)
+/Subtype /Link
+/Rect [337.6397136 638.8270000000001 405.051969459375 653.1070000000001]
+/Type /Annot
+>>
+endobj
+129 0 obj
+[126 0 R /XYZ 0 615.72 null]
+endobj
+130 0 obj
+<< /Border [0 0 0]
+/Dest (_cldstemplate)
+/Subtype /Link
+/Rect [463.65600000000006 526.5670000000001 531.0682558593751 540.8470000000001]
+/Type /Annot
+>>
+endobj
+131 0 obj
+[126 0 R /XYZ 0 510.60000000000014 null]
+endobj
+132 0 obj
+[126 0 R /XYZ 0 454.3200000000001 null]
+endobj
+133 0 obj
+[126 0 R /XYZ 0 398.0400000000001 null]
+endobj
+134 0 obj
+[126 0 R /XYZ 0 357.96000000000004 null]
+endobj
+135 0 obj
+<< /Limits [(_responses_14) (_responses_7)]
+/Names [(_responses_14) 110 0 R (_responses_15) 116 0 R (_responses_16) 120 0 R (_responses_17) 129 0 R (_responses_18) 134 0 R (_responses_19) 143 0 R (_responses_2) 37 0 R (_responses_20) 149 0 R (_responses_21) 158 0 R (_responses_22) 163 0 R (_responses_23) 166 0 R (_responses_24) 173 0 R (_responses_25) 178 0 R (_responses_26) 186 0 R (_responses_27) 190 0 R (_responses_3) 44 0 R (_responses_4) 50 0 R (_responses_5) 60 0 R (_responses_6) 64 0 R (_responses_7) 69 0 R]
+>>
+endobj
+136 0 obj
+<< /Border [0 0 0]
+/Dest (_cldsdictionary)
+/Subtype /Link
+/Rect [463.65600000000006 268.807 537.3135000000001 283.087]
+/Type /Annot
+>>
+endobj
+137 0 obj
+[126 0 R /XYZ 0 252.84000000000003 null]
+endobj
+138 0 obj
+[126 0 R /XYZ 0 196.56 null]
+endobj
+139 0 obj
+[126 0 R /XYZ 0 156.48 null]
+endobj
+140 0 obj
+<< /Length 16475
+>>
+stream
+q
+/DeviceRGB cs
+1.000 1.000 1.000 scn
+48.240 732.720 114.560 23.280 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+162.800 732.720 171.840 23.280 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+334.640 732.720 229.120 23.280 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+48.240 695.160 114.560 37.560 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+162.800 695.160 171.840 37.560 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+334.640 695.160 229.120 37.560 re
+f
+0.000 0.000 0.000 scn
+0.5 w
+/DeviceRGB CS
+0.867 0.867 0.867 SCN
+48.240 756.000 m
+162.800 756.000 l
+S
+[ ] 0 d
+1.5 w
+0.867 0.867 0.867 SCN
+48.240 732.720 m
+162.800 732.720 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 756.250 m
+48.240 731.970 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+162.800 756.250 m
+162.800 731.970 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+51.24 740.2529999999999 Td
+/F2.0 10.5 Tf
+<54797065> Tj
+ET
+
+0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 206.040 m
-162.800 206.040 l
+162.800 756.000 m
+334.640 756.000 l
+S
+[ ] 0 d
+1.5 w
+0.867 0.867 0.867 SCN
+162.800 732.720 m
+334.640 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 168.480 m
-162.800 168.480 l
+162.800 756.250 m
+162.800 731.970 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 206.290 m
-48.240 168.230 l
+334.640 756.250 m
+334.640 731.970 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+165.79988544 740.2529999999999 Td
+/F2.0 10.5 Tf
+<4e616d65> Tj
+ET
+
+0.000 0.000 0.000 scn
+0.5 w
+0.867 0.867 0.867 SCN
+334.640 756.000 m
+563.760 756.000 l
+S
+[ ] 0 d
+1.5 w
+0.867 0.867 0.867 SCN
+334.640 732.720 m
+563.760 732.720 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+334.640 756.250 m
+334.640 731.970 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 206.290 m
-162.800 168.230 l
+563.760 756.250 m
+563.760 731.970 l
S
[ ] 0 d
1 w
@@ -16425,7 +15647,42 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 182.65300000000033 Td
+337.6397136 740.2529999999999 Td
+/F2.0 10.5 Tf
+<536368656d61> Tj
+ET
+
+0.000 0.000 0.000 scn
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 732.720 m
+162.800 732.720 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 695.160 m
+162.800 695.160 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 732.970 m
+48.240 694.910 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+162.800 732.970 m
+162.800 694.910 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+51.24 709.333 Td
/F2.0 10.5 Tf
<426f6479> Tj
ET
@@ -16433,26 +15690,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 206.040 m
-334.640 206.040 l
+162.800 732.720 m
+334.640 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 168.480 m
-334.640 168.480 l
+162.800 695.160 m
+334.640 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 206.290 m
-162.800 168.230 l
+162.800 732.970 m
+162.800 694.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 206.290 m
-334.640 168.230 l
+334.640 732.970 m
+334.640 694.910 l
S
[ ] 0 d
1 w
@@ -16460,19 +15717,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 189.79300000000035 Td
+165.79988544 716.473 Td
/F2.0 10.5 Tf
<626f6479> Tj
ET
BT
-165.79988544000003 175.51300000000035 Td
+165.79988544 702.193 Td
ET
BT
-165.79988544000003 175.51300000000035 Td
+165.79988544 702.193 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -16480,26 +15737,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 206.040 m
-563.760 206.040 l
+334.640 732.720 m
+563.760 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 168.480 m
-563.760 168.480 l
+334.640 695.160 m
+563.760 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 206.290 m
-334.640 168.230 l
+334.640 732.970 m
+334.640 694.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 206.290 m
-563.760 168.230 l
+563.760 732.970 m
+563.760 694.910 l
S
[ ] 0 d
1 w
@@ -16513,7 +15770,7 @@ S
0.259 0.545 0.792 SCN
BT
-337.6397136 182.65300000000033 Td
+337.6397136 709.333 Td
/F1.0 10.5 Tf
<436c647344696374696f6e617279> Tj
ET
@@ -16525,59 +15782,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 138.8960000000003 Td
+48.24 665.5760000000001 Td
/F2.0 13 Tf
-<322e32312e322e20526573706f6e736573> Tj
+<322e31392e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 86.640 51.552 37.560 re
+48.240 613.320 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 86.640 360.864 37.560 re
+99.792 613.320 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 86.640 103.104 37.560 re
+460.656 613.320 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 63.360 51.552 23.280 re
+48.240 590.040 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 63.360 360.864 23.280 re
+99.792 590.040 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 63.360 103.104 23.280 re
+460.656 590.040 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 124.200 m
-99.792 124.200 l
+48.240 650.880 m
+99.792 650.880 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 86.640 m
-99.792 86.640 l
+48.240 613.320 m
+99.792 613.320 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 124.450 m
-48.240 85.890 l
+48.240 651.130 m
+48.240 612.570 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 124.450 m
-99.792 85.890 l
+99.792 651.130 m
+99.792 612.570 l
S
[ ] 0 d
1 w
@@ -16585,14 +15842,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 108.4530000000003 Td
+51.24 635.1330000000003 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24000000000001 94.1730000000003 Td
+51.24 620.8530000000002 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -16600,26 +15857,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 124.200 m
-460.656 124.200 l
+99.792 650.880 m
+460.656 650.880 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 86.640 m
-460.656 86.640 l
+99.792 613.320 m
+460.656 613.320 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 124.450 m
-99.792 85.890 l
+99.792 651.130 m
+99.792 612.570 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 124.450 m
-460.656 85.890 l
+460.656 651.130 m
+460.656 612.570 l
S
[ ] 0 d
1 w
@@ -16627,7 +15884,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 108.4530000000003 Td
+102.792 635.1330000000003 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -16635,26 +15892,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 124.200 m
-563.760 124.200 l
+460.656 650.880 m
+563.760 650.880 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 86.640 m
-563.760 86.640 l
+460.656 613.320 m
+563.760 613.320 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 124.450 m
-460.656 85.890 l
+460.656 651.130 m
+460.656 612.570 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 124.450 m
-563.760 85.890 l
+563.760 651.130 m
+563.760 612.570 l
S
[ ] 0 d
1 w
@@ -16662,7 +15919,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 108.4530000000003 Td
+463.65600000000006 635.1330000000003 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -16670,26 +15927,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 86.640 m
-99.792 86.640 l
+48.240 613.320 m
+99.792 613.320 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 63.360 m
-99.792 63.360 l
+48.240 590.040 m
+99.792 590.040 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 86.890 m
-48.240 63.110 l
+48.240 613.570 m
+48.240 589.790 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 86.890 m
-99.792 63.110 l
+99.792 613.570 m
+99.792 589.790 l
S
[ ] 0 d
1 w
@@ -16697,7 +15954,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 70.3930000000003 Td
+51.24 597.0730000000001 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -16705,26 +15962,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 86.640 m
-460.656 86.640 l
+99.792 613.320 m
+460.656 613.320 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 63.360 m
-460.656 63.360 l
+99.792 590.040 m
+460.656 590.040 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 86.890 m
-99.792 63.110 l
+99.792 613.570 m
+99.792 589.790 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 86.890 m
-460.656 63.110 l
+460.656 613.570 m
+460.656 589.790 l
S
[ ] 0 d
1 w
@@ -16732,7 +15989,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 70.3930000000003 Td
+102.792 597.0730000000001 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -16740,26 +15997,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 86.640 m
-563.760 86.640 l
+460.656 613.320 m
+563.760 613.320 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 63.360 m
-563.760 63.360 l
+460.656 590.040 m
+563.760 590.040 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 86.890 m
-460.656 63.110 l
+460.656 613.570 m
+460.656 589.790 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 86.890 m
-563.760 63.110 l
+563.760 613.570 m
+563.760 589.790 l
S
[ ] 0 d
1 w
@@ -16773,7 +16030,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 70.3930000000003 Td
+463.65600000000006 597.0730000000001 Td
/F1.0 10.5 Tf
<436c647344696374696f6e617279> Tj
ET
@@ -16781,120 +16038,13 @@ ET
0.000 0.000 0.000 SCN
0.200 0.200 0.200 scn
0.000 0.000 0.000 scn
-q
-0.000 0.000 0.000 scn
-0.000 0.000 0.000 SCN
-1 w
-0 J
-0 j
-[ ] 0 d
-/Stamp1 Do
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-49.24 14.388 Td
-/F1.0 9 Tf
-<3130> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-Q
-Q
-
-endstream
-endobj
-138 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 612.0 792.0]
-/Contents 137 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F2.0 22 0 R
-/F1.0 8 0 R
-/F4.0 34 0 R
-/F3.0 24 0 R
->>
-/XObject << /Stamp1 496 0 R
->>
->>
-/Annots [140 0 R 145 0 R 149 0 R 151 0 R]
->>
-endobj
-139 0 obj
-[138 0 R /XYZ 0 792.0 null]
-endobj
-140 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstemplate)
-/Subtype /Link
-/Rect [463.65600000000006 669.2470000000002 531.0682558593751 683.5270000000002]
-/Type /Annot
->>
-endobj
-141 0 obj
-[138 0 R /XYZ 0 653.2800000000002 null]
-endobj
-142 0 obj
-[138 0 R /XYZ 0 597.0000000000003 null]
-endobj
-143 0 obj
-[138 0 R /XYZ 0 540.7200000000005 null]
-endobj
-144 0 obj
-[138 0 R /XYZ 0 500.6400000000005 null]
-endobj
-145 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionary)
-/Subtype /Link
-/Rect [463.65600000000006 411.4870000000005 537.3135000000001 425.76700000000045]
-/Type /Annot
->>
-endobj
-146 0 obj
-[138 0 R /XYZ 0 395.52000000000044 null]
-endobj
-147 0 obj
-[138 0 R /XYZ 0 339.2400000000004 null]
-endobj
-148 0 obj
-[138 0 R /XYZ 0 299.16000000000037 null]
-endobj
-149 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionary)
-/Subtype /Link
-/Rect [337.6397136 179.58700000000036 411.29721359999996 193.86700000000036]
-/Type /Annot
->>
-endobj
-150 0 obj
-[138 0 R /XYZ 0 156.48000000000033 null]
-endobj
-151 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionary)
-/Subtype /Link
-/Rect [463.65600000000006 67.3270000000003 537.3135000000001 81.6070000000003]
-/Type /Annot
->>
-endobj
-152 0 obj
-<< /Length 18308
->>
-stream
-q
-/DeviceRGB cs
0.200 0.200 0.200 scn
-/DeviceRGB CS
0.200 0.200 0.200 SCN
BT
-48.24 740.816 Td
+48.24 560.4560000000002 Td
/F2.0 13 Tf
-<322e32312e332e20436f6e73756d6573> Tj
+<322e31392e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -16905,7 +16055,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 714.1560000000001 Td
+56.88050000000001 533.7960000000003 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -16918,7 +16068,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 716.3400000000001 Td
+66.24000000000001 535.9800000000004 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -16929,9 +16079,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 684.5360000000002 Td
+48.24000000000001 504.1760000000004 Td
/F2.0 13 Tf
-<322e32312e342e2050726f6475636573> Tj
+<322e31392e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -16942,7 +16092,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 657.8760000000002 Td
+56.88050000000001 477.51600000000036 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -16955,7 +16105,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 660.0600000000003 Td
+66.24000000000001 479.7000000000004 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -16966,9 +16116,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 622.4160000000003 Td
+48.24000000000001 442.0560000000004 Td
/F2.0 18 Tf
-<322e32322e20474554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d2f6974656d73> Tj
+<322e32302e20474554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d2f6974656d73> Tj
ET
0.000 0.000 0.000 SCN
@@ -16977,59 +16127,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 588.1760000000004 Td
+48.24000000000001 407.8160000000003 Td
/F2.0 13 Tf
-[<322e32322e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e32302e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 550.200 114.560 23.280 re
+48.240 369.840 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 550.200 171.840 23.280 re
+162.800 369.840 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 550.200 229.120 23.280 re
+334.640 369.840 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 512.640 114.560 37.560 re
+48.240 332.280 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 512.640 171.840 37.560 re
+162.800 332.280 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 512.640 229.120 37.560 re
+334.640 332.280 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 573.480 m
-162.800 573.480 l
+48.240 393.120 m
+162.800 393.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 550.200 m
-162.800 550.200 l
+48.240 369.840 m
+162.800 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 573.730 m
-48.240 549.450 l
+48.240 393.370 m
+48.240 369.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 573.730 m
-162.800 549.450 l
+162.800 393.370 m
+162.800 369.090 l
S
[ ] 0 d
1 w
@@ -17037,7 +16187,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 557.7330000000004 Td
+51.24000000000001 377.3730000000003 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -17045,26 +16195,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 573.480 m
-334.640 573.480 l
+162.800 393.120 m
+334.640 393.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 550.200 m
-334.640 550.200 l
+162.800 369.840 m
+334.640 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 573.730 m
-162.800 549.450 l
+162.800 393.370 m
+162.800 369.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 573.730 m
-334.640 549.450 l
+334.640 393.370 m
+334.640 369.090 l
S
[ ] 0 d
1 w
@@ -17072,7 +16222,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 557.7330000000004 Td
+165.79988544000003 377.3730000000003 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -17080,26 +16230,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 573.480 m
-563.760 573.480 l
+334.640 393.120 m
+563.760 393.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 550.200 m
-563.760 550.200 l
+334.640 369.840 m
+563.760 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 573.730 m
-334.640 549.450 l
+334.640 393.370 m
+334.640 369.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 573.730 m
-563.760 549.450 l
+563.760 393.370 m
+563.760 369.090 l
S
[ ] 0 d
1 w
@@ -17107,7 +16257,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 557.7330000000004 Td
+337.6397136 377.3730000000003 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -17115,26 +16265,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 550.200 m
-162.800 550.200 l
+48.240 369.840 m
+162.800 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 512.640 m
-162.800 512.640 l
+48.240 332.280 m
+162.800 332.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 550.450 m
-48.240 512.390 l
+48.240 370.090 m
+48.240 332.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 550.450 m
-162.800 512.390 l
+162.800 370.090 m
+162.800 332.030 l
S
[ ] 0 d
1 w
@@ -17142,7 +16292,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 526.8130000000004 Td
+51.24000000000001 346.45300000000026 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -17150,26 +16300,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 550.200 m
-334.640 550.200 l
+162.800 369.840 m
+334.640 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 512.640 m
-334.640 512.640 l
+162.800 332.280 m
+334.640 332.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 550.450 m
-162.800 512.390 l
+162.800 370.090 m
+162.800 332.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 550.450 m
-334.640 512.390 l
+334.640 370.090 m
+334.640 332.030 l
S
[ ] 0 d
1 w
@@ -17177,19 +16327,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 533.9530000000004 Td
+165.79988544000003 353.59300000000025 Td
/F2.0 10.5 Tf
<64696374696f6e6172794e616d65> Tj
ET
BT
-165.79988544000003 519.6730000000005 Td
+165.79988544000003 339.3130000000002 Td
ET
BT
-165.79988544000003 519.6730000000005 Td
+165.79988544000003 339.3130000000002 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -17197,26 +16347,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 550.200 m
-563.760 550.200 l
+334.640 369.840 m
+563.760 369.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 512.640 m
-563.760 512.640 l
+334.640 332.280 m
+563.760 332.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 550.450 m
-334.640 512.390 l
+334.640 370.090 m
+334.640 332.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 550.450 m
-563.760 512.390 l
+563.760 370.090 m
+563.760 332.030 l
S
[ ] 0 d
1 w
@@ -17224,7 +16374,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 526.8130000000004 Td
+337.6397136 346.45300000000026 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -17234,59 +16384,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 483.05600000000055 Td
+48.24000000000001 302.69600000000025 Td
/F2.0 13 Tf
-<322e32322e322e20526573706f6e736573> Tj
+<322e32302e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 430.800 51.552 37.560 re
+48.240 250.440 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 430.800 360.864 37.560 re
+99.792 250.440 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 430.800 103.104 37.560 re
+460.656 250.440 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 407.520 51.552 23.280 re
+48.240 227.160 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 407.520 360.864 23.280 re
+99.792 227.160 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 407.520 103.104 23.280 re
+460.656 227.160 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 468.360 m
-99.792 468.360 l
+48.240 288.000 m
+99.792 288.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 430.800 m
-99.792 430.800 l
+48.240 250.440 m
+99.792 250.440 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 468.610 m
-48.240 430.050 l
+48.240 288.250 m
+48.240 249.690 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 468.610 m
-99.792 430.050 l
+99.792 288.250 m
+99.792 249.690 l
S
[ ] 0 d
1 w
@@ -17294,14 +16444,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 452.6130000000005 Td
+51.24000000000001 272.2530000000002 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24000000000001 438.33300000000054 Td
+51.24000000000001 257.9730000000002 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -17309,26 +16459,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 468.360 m
-460.656 468.360 l
+99.792 288.000 m
+460.656 288.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 430.800 m
-460.656 430.800 l
+99.792 250.440 m
+460.656 250.440 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 468.610 m
-99.792 430.050 l
+99.792 288.250 m
+99.792 249.690 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 468.610 m
-460.656 430.050 l
+460.656 288.250 m
+460.656 249.690 l
S
[ ] 0 d
1 w
@@ -17336,7 +16486,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 452.6130000000005 Td
+102.792 272.2530000000002 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -17344,26 +16494,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 468.360 m
-563.760 468.360 l
+460.656 288.000 m
+563.760 288.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 430.800 m
-563.760 430.800 l
+460.656 250.440 m
+563.760 250.440 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 468.610 m
-460.656 430.050 l
+460.656 288.250 m
+460.656 249.690 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 468.610 m
-563.760 430.050 l
+563.760 288.250 m
+563.760 249.690 l
S
[ ] 0 d
1 w
@@ -17371,7 +16521,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 452.6130000000005 Td
+463.65600000000006 272.2530000000002 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -17379,26 +16529,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 430.800 m
-99.792 430.800 l
+48.240 250.440 m
+99.792 250.440 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 407.520 m
-99.792 407.520 l
+48.240 227.160 m
+99.792 227.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 431.050 m
-48.240 407.270 l
+48.240 250.690 m
+48.240 226.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 431.050 m
-99.792 407.270 l
+99.792 250.690 m
+99.792 226.910 l
S
[ ] 0 d
1 w
@@ -17406,7 +16556,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 414.5530000000005 Td
+51.24000000000001 234.19300000000024 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -17414,26 +16564,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 430.800 m
-460.656 430.800 l
+99.792 250.440 m
+460.656 250.440 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 407.520 m
-460.656 407.520 l
+99.792 227.160 m
+460.656 227.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 431.050 m
-99.792 407.270 l
+99.792 250.690 m
+99.792 226.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 431.050 m
-460.656 407.270 l
+460.656 250.690 m
+460.656 226.910 l
S
[ ] 0 d
1 w
@@ -17441,7 +16591,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 414.5530000000005 Td
+102.792 234.19300000000024 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -17449,26 +16599,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 430.800 m
-563.760 430.800 l
+460.656 250.440 m
+563.760 250.440 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 407.520 m
-563.760 407.520 l
+460.656 227.160 m
+563.760 227.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 431.050 m
-460.656 407.270 l
+460.656 250.690 m
+460.656 226.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 431.050 m
-563.760 407.270 l
+563.760 250.690 m
+563.760 226.910 l
S
[ ] 0 d
1 w
@@ -17482,7 +16632,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 414.5530000000005 Td
+463.65600000000006 234.19300000000024 Td
/F1.0 10.5 Tf
<436c647344696374696f6e617279> Tj
ET
@@ -17494,9 +16644,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 377.93600000000055 Td
+48.24000000000001 197.5760000000002 Td
/F2.0 13 Tf
-<322e32322e332e2050726f6475636573> Tj
+<322e32302e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -17507,7 +16657,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 351.2760000000005 Td
+56.88050000000001 170.9160000000002 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -17520,7 +16670,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 353.46000000000055 Td
+66.24000000000001 173.1000000000002 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -17531,9 +16681,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 315.81600000000054 Td
+48.24000000000001 135.4560000000002 Td
/F2.0 18 Tf
-<322e32332e20505554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d2f6974656d73> Tj
+<322e32312e20505554202f64696374696f6e6172792f7b64696374696f6e6172794e616d657d2f6974656d73> Tj
ET
0.000 0.000 0.000 SCN
@@ -17542,71 +16692,175 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 281.5760000000005 Td
+48.24000000000001 101.21600000000018 Td
/F2.0 13 Tf
-[<322e32332e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e32312e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
+q
+0.000 0.000 0.000 scn
+0.000 0.000 0.000 SCN
+1 w
+0 J
+0 j
+[ ] 0 d
+/Stamp1 Do
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+49.24 14.388 Td
+/F1.0 9 Tf
+<3130> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+Q
+Q
+
+endstream
+endobj
+141 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612.0 792.0]
+/Contents 140 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F2.0 22 0 R
+/F3.0 24 0 R
+/F1.0 8 0 R
+/F4.0 34 0 R
+>>
+/XObject << /Stamp1 472 0 R
+>>
+>>
+/Annots [142 0 R 144 0 R 150 0 R]
+>>
+endobj
+142 0 obj
+<< /Border [0 0 0]
+/Dest (_cldsdictionary)
+/Subtype /Link
+/Rect [337.6397136 706.267 411.29721359999996 720.547]
+/Type /Annot
+>>
+endobj
+143 0 obj
+[141 0 R /XYZ 0 683.1600000000001 null]
+endobj
+144 0 obj
+<< /Border [0 0 0]
+/Dest (_cldsdictionary)
+/Subtype /Link
+/Rect [463.65600000000006 594.0070000000002 537.3135000000001 608.2870000000001]
+/Type /Annot
+>>
+endobj
+145 0 obj
+[141 0 R /XYZ 0 578.0400000000002 null]
+endobj
+146 0 obj
+[141 0 R /XYZ 0 521.7600000000003 null]
+endobj
+147 0 obj
+[141 0 R /XYZ 0 465.48000000000036 null]
+endobj
+148 0 obj
+[141 0 R /XYZ 0 425.4000000000003 null]
+endobj
+149 0 obj
+[141 0 R /XYZ 0 320.28000000000026 null]
+endobj
+150 0 obj
+<< /Border [0 0 0]
+/Dest (_cldsdictionary)
+/Subtype /Link
+/Rect [463.65600000000006 231.12700000000024 537.3135000000001 245.40700000000024]
+/Type /Annot
+>>
+endobj
+151 0 obj
+[141 0 R /XYZ 0 215.16000000000022 null]
+endobj
+152 0 obj
+<< /Limits [(_produces_13) (_produces_4)]
+/Names [(_produces_13) 107 0 R (_produces_14) 113 0 R (_produces_15) 117 0 R (_produces_16) 122 0 R (_produces_17) 132 0 R (_produces_18) 137 0 R (_produces_19) 146 0 R (_produces_2) 40 0 R (_produces_20) 151 0 R (_produces_21) 161 0 R (_produces_22) 164 0 R (_produces_23) 170 0 R (_produces_24) 174 0 R (_produces_25) 180 0 R (_produces_26) 188 0 R (_produces_27) 191 0 R (_produces_3) 46 0 R (_produces_4) 52 0 R]
+>>
+endobj
+153 0 obj
+[141 0 R /XYZ 0 158.8800000000002 null]
+endobj
+154 0 obj
+[141 0 R /XYZ 0 118.80000000000018 null]
+endobj
+155 0 obj
+<< /Length 16679
+>>
+stream
+q
+/DeviceRGB cs
1.000 1.000 1.000 scn
-48.240 243.600 114.560 23.280 re
+48.240 732.720 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 243.600 171.840 23.280 re
+162.800 732.720 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 243.600 229.120 23.280 re
+334.640 732.720 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 206.040 114.560 37.560 re
+48.240 695.160 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 206.040 171.840 37.560 re
+162.800 695.160 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 206.040 229.120 37.560 re
+334.640 695.160 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-48.240 168.480 114.560 37.560 re
+48.240 657.600 114.560 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-162.800 168.480 171.840 37.560 re
+162.800 657.600 171.840 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-334.640 168.480 229.120 37.560 re
+334.640 657.600 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
+/DeviceRGB CS
0.867 0.867 0.867 SCN
-48.240 266.880 m
-162.800 266.880 l
+48.240 756.000 m
+162.800 756.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 243.600 m
-162.800 243.600 l
+48.240 732.720 m
+162.800 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 267.130 m
-48.240 242.850 l
+48.240 756.250 m
+48.240 731.970 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 267.130 m
-162.800 242.850 l
+162.800 756.250 m
+162.800 731.970 l
S
[ ] 0 d
1 w
@@ -17614,7 +16868,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 251.13300000000044 Td
+51.24 740.2529999999999 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -17622,26 +16876,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 266.880 m
-334.640 266.880 l
+162.800 756.000 m
+334.640 756.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 243.600 m
-334.640 243.600 l
+162.800 732.720 m
+334.640 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 267.130 m
-162.800 242.850 l
+162.800 756.250 m
+162.800 731.970 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 267.130 m
-334.640 242.850 l
+334.640 756.250 m
+334.640 731.970 l
S
[ ] 0 d
1 w
@@ -17649,7 +16903,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 251.13300000000044 Td
+165.79988544 740.2529999999999 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -17657,26 +16911,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 266.880 m
-563.760 266.880 l
+334.640 756.000 m
+563.760 756.000 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 243.600 m
-563.760 243.600 l
+334.640 732.720 m
+563.760 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 267.130 m
-334.640 242.850 l
+334.640 756.250 m
+334.640 731.970 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 267.130 m
-563.760 242.850 l
+563.760 756.250 m
+563.760 731.970 l
S
[ ] 0 d
1 w
@@ -17684,7 +16938,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 251.13300000000044 Td
+337.6397136 740.2529999999999 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -17692,26 +16946,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 243.600 m
-162.800 243.600 l
+48.240 732.720 m
+162.800 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 206.040 m
-162.800 206.040 l
+48.240 695.160 m
+162.800 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 243.850 m
-48.240 205.790 l
+48.240 732.970 m
+48.240 694.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 243.850 m
-162.800 205.790 l
+162.800 732.970 m
+162.800 694.910 l
S
[ ] 0 d
1 w
@@ -17719,7 +16973,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 220.21300000000045 Td
+51.24 709.333 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -17727,26 +16981,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 243.600 m
-334.640 243.600 l
+162.800 732.720 m
+334.640 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 206.040 m
-334.640 206.040 l
+162.800 695.160 m
+334.640 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 243.850 m
-162.800 205.790 l
+162.800 732.970 m
+162.800 694.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 243.850 m
-334.640 205.790 l
+334.640 732.970 m
+334.640 694.910 l
S
[ ] 0 d
1 w
@@ -17754,19 +17008,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 227.35300000000046 Td
+165.79988544 716.473 Td
/F2.0 10.5 Tf
<64696374696f6e6172794e616d65> Tj
ET
BT
-165.79988544000003 213.07300000000046 Td
+165.79988544 702.193 Td
ET
BT
-165.79988544000003 213.07300000000046 Td
+165.79988544 702.193 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -17774,26 +17028,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 243.600 m
-563.760 243.600 l
+334.640 732.720 m
+563.760 732.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 206.040 m
-563.760 206.040 l
+334.640 695.160 m
+563.760 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 243.850 m
-334.640 205.790 l
+334.640 732.970 m
+334.640 694.910 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 243.850 m
-563.760 205.790 l
+563.760 732.970 m
+563.760 694.910 l
S
[ ] 0 d
1 w
@@ -17801,7 +17055,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 220.21300000000045 Td
+337.6397136 709.333 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -17809,26 +17063,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 206.040 m
-162.800 206.040 l
+48.240 695.160 m
+162.800 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 168.480 m
-162.800 168.480 l
+48.240 657.600 m
+162.800 657.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 206.290 m
-48.240 168.230 l
+48.240 695.410 m
+48.240 657.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 206.290 m
-162.800 168.230 l
+162.800 695.410 m
+162.800 657.350 l
S
[ ] 0 d
1 w
@@ -17836,7 +17090,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 182.65300000000045 Td
+51.24 671.7729999999999 Td
/F2.0 10.5 Tf
<426f6479> Tj
ET
@@ -17844,26 +17098,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 206.040 m
-334.640 206.040 l
+162.800 695.160 m
+334.640 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 168.480 m
-334.640 168.480 l
+162.800 657.600 m
+334.640 657.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 206.290 m
-162.800 168.230 l
+162.800 695.410 m
+162.800 657.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 206.290 m
-334.640 168.230 l
+334.640 695.410 m
+334.640 657.350 l
S
[ ] 0 d
1 w
@@ -17871,19 +17125,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 189.79300000000046 Td
+165.79988544 678.913 Td
/F2.0 10.5 Tf
<626f6479> Tj
ET
BT
-165.79988544000003 175.51300000000046 Td
+165.79988544 664.6329999999999 Td
ET
BT
-165.79988544000003 175.51300000000046 Td
+165.79988544 664.6329999999999 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -17891,26 +17145,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 206.040 m
-563.760 206.040 l
+334.640 695.160 m
+563.760 695.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 168.480 m
-563.760 168.480 l
+334.640 657.600 m
+563.760 657.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 206.290 m
-334.640 168.230 l
+334.640 695.410 m
+334.640 657.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 206.290 m
-563.760 168.230 l
+563.760 695.410 m
+563.760 657.350 l
S
[ ] 0 d
1 w
@@ -17924,7 +17178,7 @@ S
0.259 0.545 0.792 SCN
BT
-337.6397136 182.65300000000045 Td
+337.6397136 671.7729999999999 Td
/F1.0 10.5 Tf
<436c647344696374696f6e6172794974656d> Tj
ET
@@ -17936,59 +17190,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 138.8960000000004 Td
+48.24 628.016 Td
/F2.0 13 Tf
-<322e32332e322e20526573706f6e736573> Tj
+<322e32312e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 86.640 51.552 37.560 re
+48.240 575.760 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 86.640 360.864 37.560 re
+99.792 575.760 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 86.640 103.104 37.560 re
+460.656 575.760 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 63.360 51.552 23.280 re
+48.240 552.480 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 63.360 360.864 23.280 re
+99.792 552.480 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 63.360 103.104 23.280 re
+460.656 552.480 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 124.200 m
-99.792 124.200 l
+48.240 613.320 m
+99.792 613.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 86.640 m
-99.792 86.640 l
+48.240 575.760 m
+99.792 575.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 124.450 m
-48.240 85.890 l
+48.240 613.570 m
+48.240 575.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 124.450 m
-99.792 85.890 l
+99.792 613.570 m
+99.792 575.010 l
S
[ ] 0 d
1 w
@@ -17996,14 +17250,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 108.45300000000042 Td
+51.24 597.5730000000001 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24000000000001 94.17300000000041 Td
+51.24 583.293 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -18011,26 +17265,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 124.200 m
-460.656 124.200 l
+99.792 613.320 m
+460.656 613.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 86.640 m
-460.656 86.640 l
+99.792 575.760 m
+460.656 575.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 124.450 m
-99.792 85.890 l
+99.792 613.570 m
+99.792 575.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 124.450 m
-460.656 85.890 l
+460.656 613.570 m
+460.656 575.010 l
S
[ ] 0 d
1 w
@@ -18038,7 +17292,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 108.45300000000042 Td
+102.792 597.5730000000001 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -18046,26 +17300,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 124.200 m
-563.760 124.200 l
+460.656 613.320 m
+563.760 613.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 86.640 m
-563.760 86.640 l
+460.656 575.760 m
+563.760 575.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 124.450 m
-460.656 85.890 l
+460.656 613.570 m
+460.656 575.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 124.450 m
-563.760 85.890 l
+563.760 613.570 m
+563.760 575.010 l
S
[ ] 0 d
1 w
@@ -18073,7 +17327,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 108.45300000000042 Td
+463.65600000000006 597.5730000000001 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -18081,26 +17335,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 86.640 m
-99.792 86.640 l
+48.240 575.760 m
+99.792 575.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 63.360 m
-99.792 63.360 l
+48.240 552.480 m
+99.792 552.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 86.890 m
-48.240 63.110 l
+48.240 576.010 m
+48.240 552.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 86.890 m
-99.792 63.110 l
+99.792 576.010 m
+99.792 552.230 l
S
[ ] 0 d
1 w
@@ -18108,7 +17362,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 70.39300000000041 Td
+51.24 559.5129999999999 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -18116,26 +17370,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 86.640 m
-460.656 86.640 l
+99.792 575.760 m
+460.656 575.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 63.360 m
-460.656 63.360 l
+99.792 552.480 m
+460.656 552.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 86.890 m
-99.792 63.110 l
+99.792 576.010 m
+99.792 552.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 86.890 m
-460.656 63.110 l
+460.656 576.010 m
+460.656 552.230 l
S
[ ] 0 d
1 w
@@ -18143,7 +17397,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 70.39300000000041 Td
+102.792 559.5129999999999 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -18151,26 +17405,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 86.640 m
-563.760 86.640 l
+460.656 575.760 m
+563.760 575.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 63.360 m
-563.760 63.360 l
+460.656 552.480 m
+563.760 552.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 86.890 m
-460.656 63.110 l
+460.656 576.010 m
+460.656 552.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 86.890 m
-563.760 63.110 l
+563.760 576.010 m
+563.760 552.230 l
S
[ ] 0 d
1 w
@@ -18184,7 +17438,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 70.39300000000041 Td
+463.65600000000006 559.5129999999999 Td
/F1.0 10.5 Tf
<436c647344696374696f6e6172794974656d> Tj
ET
@@ -18192,117 +17446,13 @@ ET
0.000 0.000 0.000 SCN
0.200 0.200 0.200 scn
0.000 0.000 0.000 scn
-q
-0.000 0.000 0.000 scn
-0.000 0.000 0.000 SCN
-1 w
-0 J
-0 j
-[ ] 0 d
-/Stamp1 Do
0.200 0.200 0.200 scn
0.200 0.200 0.200 SCN
BT
-552.698 14.388 Td
-/F1.0 9 Tf
-<3131> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-Q
-Q
-
-endstream
-endobj
-153 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 612.0 792.0]
-/Contents 152 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F2.0 22 0 R
-/F1.0 8 0 R
-/F4.0 34 0 R
-/F3.0 24 0 R
->>
-/XObject << /Stamp1 496 0 R
->>
->>
-/Annots [160 0 R 164 0 R 166 0 R]
->>
-endobj
-154 0 obj
-[153 0 R /XYZ 0 792.0 null]
-endobj
-155 0 obj
-[153 0 R /XYZ 0 702.1200000000001 null]
-endobj
-156 0 obj
-<< /Limits [(_produces_14) (_produces_4)]
-/Names [(_produces_14) 112 0 R (_produces_15) 116 0 R (_produces_16) 120 0 R (_produces_17) 127 0 R (_produces_18) 133 0 R (_produces_19) 142 0 R (_produces_2) 40 0 R (_produces_20) 146 0 R (_produces_21) 155 0 R (_produces_22) 161 0 R (_produces_23) 171 0 R (_produces_24) 174 0 R (_produces_25) 178 0 R (_produces_26) 184 0 R (_produces_27) 190 0 R (_produces_28) 199 0 R (_produces_29) 202 0 R (_produces_3) 46 0 R (_produces_4) 52 0 R]
->>
-endobj
-157 0 obj
-[153 0 R /XYZ 0 645.8400000000003 null]
-endobj
-158 0 obj
-[153 0 R /XYZ 0 605.7600000000003 null]
-endobj
-159 0 obj
-[153 0 R /XYZ 0 500.64000000000055 null]
-endobj
-160 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionary)
-/Subtype /Link
-/Rect [463.65600000000006 411.48700000000053 537.3135000000001 425.7670000000005]
-/Type /Annot
->>
-endobj
-161 0 obj
-[153 0 R /XYZ 0 395.52000000000055 null]
-endobj
-162 0 obj
-[153 0 R /XYZ 0 339.2400000000005 null]
-endobj
-163 0 obj
-[153 0 R /XYZ 0 299.1600000000005 null]
-endobj
-164 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionaryitem)
-/Subtype /Link
-/Rect [337.6397136 179.58700000000047 434.3762136 193.86700000000047]
-/Type /Annot
->>
-endobj
-165 0 obj
-[153 0 R /XYZ 0 156.48000000000044 null]
-endobj
-166 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionaryitem)
-/Subtype /Link
-/Rect [463.65600000000006 67.32700000000041 560.3925 81.60700000000041]
-/Type /Annot
->>
-endobj
-167 0 obj
-<< /Length 12587
->>
-stream
-q
-/DeviceRGB cs
-0.200 0.200 0.200 scn
-/DeviceRGB CS
-0.200 0.200 0.200 SCN
-
-BT
-48.24 740.816 Td
+48.24 522.8960000000001 Td
/F2.0 13 Tf
-<322e32332e332e20436f6e73756d6573> Tj
+<322e32312e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -18313,7 +17463,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 714.1560000000001 Td
+56.88050000000001 496.23600000000016 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -18326,7 +17476,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 716.3400000000001 Td
+66.24000000000001 498.4200000000002 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -18337,9 +17487,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 684.5360000000002 Td
+48.24000000000001 466.61600000000016 Td
/F2.0 13 Tf
-<322e32332e342e2050726f6475636573> Tj
+<322e32312e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -18350,7 +17500,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 657.8760000000002 Td
+56.88050000000001 439.95600000000013 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -18363,7 +17513,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 660.0600000000003 Td
+66.24000000000001 442.14000000000016 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -18374,9 +17524,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 622.4160000000003 Td
+48.24000000000001 404.49600000000015 Td
/F2.0 18 Tf
-<322e32342e20474554202f6865616c7468636865636b> Tj
+<322e32322e20474554202f6865616c7468636865636b> Tj
ET
0.000 0.000 0.000 SCN
@@ -18385,51 +17535,51 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 588.1760000000004 Td
+48.24000000000001 370.2560000000001 Td
/F2.0 13 Tf
-<322e32342e312e20526573706f6e736573> Tj
+<322e32322e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 550.200 171.840 23.280 re
+48.240 332.280 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 550.200 343.680 23.280 re
+220.080 332.280 343.680 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 526.920 171.840 23.280 re
+48.240 309.000 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 526.920 343.680 23.280 re
+220.080 309.000 343.680 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 573.480 m
-220.080 573.480 l
+48.240 355.560 m
+220.080 355.560 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 550.200 m
-220.080 550.200 l
+48.240 332.280 m
+220.080 332.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 573.730 m
-48.240 549.450 l
+48.240 355.810 m
+48.240 331.530 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 573.730 m
-220.080 549.450 l
+220.080 355.810 m
+220.080 331.530 l
S
[ ] 0 d
1 w
@@ -18437,7 +17587,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 557.7330000000004 Td
+51.24000000000001 339.81300000000005 Td
/F2.0 10.5 Tf
<4854545020436f6465> Tj
ET
@@ -18445,26 +17595,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 573.480 m
-563.760 573.480 l
+220.080 355.560 m
+563.760 355.560 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-220.080 550.200 m
-563.760 550.200 l
+220.080 332.280 m
+563.760 332.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 573.730 m
-220.080 549.450 l
+220.080 355.810 m
+220.080 331.530 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 573.730 m
-563.760 549.450 l
+563.760 355.810 m
+563.760 331.530 l
S
[ ] 0 d
1 w
@@ -18472,7 +17622,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 557.7330000000004 Td
+223.07982816 339.81300000000005 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -18480,26 +17630,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 550.200 m
-220.080 550.200 l
+48.240 332.280 m
+220.080 332.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 526.920 m
-220.080 526.920 l
+48.240 309.000 m
+220.080 309.000 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 550.450 m
-48.240 526.670 l
+48.240 332.530 m
+48.240 308.750 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 550.450 m
-220.080 526.670 l
+220.080 332.530 m
+220.080 308.750 l
S
[ ] 0 d
1 w
@@ -18507,7 +17657,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 533.9530000000004 Td
+51.24000000000001 316.0330000000001 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -18515,26 +17665,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 550.200 m
-563.760 550.200 l
+220.080 332.280 m
+563.760 332.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 526.920 m
-563.760 526.920 l
+220.080 309.000 m
+563.760 309.000 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 550.450 m
-220.080 526.670 l
+220.080 332.530 m
+220.080 308.750 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 550.450 m
-563.760 526.670 l
+563.760 332.530 m
+563.760 308.750 l
S
[ ] 0 d
1 w
@@ -18542,7 +17692,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 533.9530000000004 Td
+223.07982816 316.0330000000001 Td
/F1.0 10.5 Tf
<4e6f20436f6e74656e74> Tj
ET
@@ -18552,9 +17702,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 497.3360000000005 Td
+48.24000000000001 279.4160000000001 Td
/F2.0 13 Tf
-<322e32342e322e2050726f6475636573> Tj
+<322e32322e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -18565,7 +17715,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 470.6760000000005 Td
+56.88050000000001 252.75600000000009 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -18578,7 +17728,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 472.8600000000005 Td
+66.24000000000001 254.94000000000008 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -18589,9 +17739,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 435.2160000000005 Td
+48.24000000000001 217.29600000000008 Td
/F2.0 18 Tf
-<322e32352e20474554202f746f7363612f6d6f64656c73> Tj
+<322e32332e20474554202f746f7363612f6d6f64656c73> Tj
ET
0.000 0.000 0.000 SCN
@@ -18600,59 +17750,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 400.97600000000045 Td
+48.24000000000001 183.05600000000004 Td
/F2.0 13 Tf
-<322e32352e312e20526573706f6e736573> Tj
+<322e32332e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 348.720 51.552 37.560 re
+48.240 130.800 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 348.720 360.864 37.560 re
+99.792 130.800 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 348.720 103.104 37.560 re
+460.656 130.800 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 325.440 51.552 23.280 re
+48.240 107.520 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 325.440 360.864 23.280 re
+99.792 107.520 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 325.440 103.104 23.280 re
+460.656 107.520 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 386.280 m
-99.792 386.280 l
+48.240 168.360 m
+99.792 168.360 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 348.720 m
-99.792 348.720 l
+48.240 130.800 m
+99.792 130.800 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 386.530 m
-48.240 347.970 l
+48.240 168.610 m
+48.240 130.050 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 386.530 m
-99.792 347.970 l
+99.792 168.610 m
+99.792 130.050 l
S
[ ] 0 d
1 w
@@ -18660,14 +17810,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 370.5330000000004 Td
+51.24000000000001 152.61300000000006 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24000000000001 356.2530000000004 Td
+51.24000000000001 138.33300000000006 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -18675,26 +17825,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 386.280 m
-460.656 386.280 l
+99.792 168.360 m
+460.656 168.360 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 348.720 m
-460.656 348.720 l
+99.792 130.800 m
+460.656 130.800 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 386.530 m
-99.792 347.970 l
+99.792 168.610 m
+99.792 130.050 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 386.530 m
-460.656 347.970 l
+460.656 168.610 m
+460.656 130.050 l
S
[ ] 0 d
1 w
@@ -18702,7 +17852,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 370.5330000000004 Td
+102.792 152.61300000000006 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -18710,26 +17860,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 386.280 m
-563.760 386.280 l
+460.656 168.360 m
+563.760 168.360 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 348.720 m
-563.760 348.720 l
+460.656 130.800 m
+563.760 130.800 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 386.530 m
-460.656 347.970 l
+460.656 168.610 m
+460.656 130.050 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 386.530 m
-563.760 347.970 l
+563.760 168.610 m
+563.760 130.050 l
S
[ ] 0 d
1 w
@@ -18737,7 +17887,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 370.5330000000004 Td
+463.65600000000006 152.61300000000006 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -18745,26 +17895,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 348.720 m
-99.792 348.720 l
+48.240 130.800 m
+99.792 130.800 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 325.440 m
-99.792 325.440 l
+48.240 107.520 m
+99.792 107.520 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 348.970 m
-48.240 325.190 l
+48.240 131.050 m
+48.240 107.270 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 348.970 m
-99.792 325.190 l
+99.792 131.050 m
+99.792 107.270 l
S
[ ] 0 d
1 w
@@ -18772,7 +17922,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 332.4730000000004 Td
+51.24000000000001 114.55300000000004 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -18780,26 +17930,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 348.720 m
-460.656 348.720 l
+99.792 130.800 m
+460.656 130.800 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 325.440 m
-460.656 325.440 l
+99.792 107.520 m
+460.656 107.520 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 348.970 m
-99.792 325.190 l
+99.792 131.050 m
+99.792 107.270 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 348.970 m
-460.656 325.190 l
+460.656 131.050 m
+460.656 107.270 l
S
[ ] 0 d
1 w
@@ -18807,7 +17957,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 332.4730000000004 Td
+102.792 114.55300000000004 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -18815,26 +17965,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 348.720 m
-563.760 348.720 l
+460.656 130.800 m
+563.760 130.800 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 325.440 m
-563.760 325.440 l
+460.656 107.520 m
+563.760 107.520 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 348.970 m
-460.656 325.190 l
+460.656 131.050 m
+460.656 107.270 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 348.970 m
-563.760 325.190 l
+563.760 131.050 m
+563.760 107.270 l
S
[ ] 0 d
1 w
@@ -18848,7 +17998,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 332.4730000000004 Td
+463.65600000000006 114.55300000000004 Td
/F1.0 10.5 Tf
[<436c647354> 29.78515625 <6f7363614d6f64656c>] TJ
ET
@@ -18856,13 +18006,109 @@ ET
0.000 0.000 0.000 SCN
0.200 0.200 0.200 scn
0.000 0.000 0.000 scn
+q
+0.000 0.000 0.000 scn
+0.000 0.000 0.000 SCN
+1 w
+0 J
+0 j
+[ ] 0 d
+/Stamp1 Do
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+552.698 14.388 Td
+/F1.0 9 Tf
+<3131> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+Q
+Q
+
+endstream
+endobj
+156 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612.0 792.0]
+/Contents 155 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F2.0 22 0 R
+/F3.0 24 0 R
+/F1.0 8 0 R
+/F4.0 34 0 R
+>>
+/XObject << /Stamp1 472 0 R
+>>
+>>
+/Annots [157 0 R 159 0 R 167 0 R]
+>>
+endobj
+157 0 obj
+<< /Border [0 0 0]
+/Dest (_cldsdictionaryitem)
+/Subtype /Link
+/Rect [337.6397136 668.707 434.3762136 682.987]
+/Type /Annot
+>>
+endobj
+158 0 obj
+[156 0 R /XYZ 0 645.5999999999999 null]
+endobj
+159 0 obj
+<< /Border [0 0 0]
+/Dest (_cldsdictionaryitem)
+/Subtype /Link
+/Rect [463.65600000000006 556.447 560.3925 570.727]
+/Type /Annot
+>>
+endobj
+160 0 obj
+[156 0 R /XYZ 0 540.48 null]
+endobj
+161 0 obj
+[156 0 R /XYZ 0 484.20000000000016 null]
+endobj
+162 0 obj
+[156 0 R /XYZ 0 427.92000000000013 null]
+endobj
+163 0 obj
+[156 0 R /XYZ 0 387.8400000000001 null]
+endobj
+164 0 obj
+[156 0 R /XYZ 0 297.0000000000001 null]
+endobj
+165 0 obj
+[156 0 R /XYZ 0 240.72000000000008 null]
+endobj
+166 0 obj
+[156 0 R /XYZ 0 200.64000000000007 null]
+endobj
+167 0 obj
+<< /Border [0 0 0]
+/Dest (_cldstoscamodel)
+/Subtype /Link
+/Rect [463.65600000000006 111.48700000000004 543.699755859375 125.76700000000004]
+/Type /Annot
+>>
+endobj
+168 0 obj
+<< /Length 15392
+>>
+stream
+q
+/DeviceRGB cs
0.200 0.200 0.200 scn
+/DeviceRGB CS
0.200 0.200 0.200 SCN
BT
-48.24000000000001 295.8560000000004 Td
+48.24 740.816 Td
/F2.0 13 Tf
-<322e32352e322e2050726f6475636573> Tj
+<322e32332e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -18873,7 +18119,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 269.19600000000037 Td
+56.88050000000001 714.1560000000001 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -18886,7 +18132,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 271.38000000000034 Td
+66.24000000000001 716.3400000000001 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -18897,9 +18143,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 233.73600000000036 Td
+48.24000000000001 678.6960000000001 Td
/F2.0 18 Tf
-<322e32362e20474554202f746f7363612f6d6f64656c732f706f6c696379547970652f7b706f6c696379547970657d> Tj
+<322e32342e20474554202f746f7363612f6d6f64656c732f706f6c696379547970652f7b706f6c696379547970657d> Tj
ET
0.000 0.000 0.000 SCN
@@ -18908,59 +18154,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 199.49600000000032 Td
+48.24000000000001 644.4560000000002 Td
/F2.0 13 Tf
-[<322e32362e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e32342e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 161.520 114.560 23.280 re
+48.240 606.480 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 161.520 171.840 23.280 re
+162.800 606.480 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 161.520 229.120 23.280 re
+334.640 606.480 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 123.960 114.560 37.560 re
+48.240 568.920 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 123.960 171.840 37.560 re
+162.800 568.920 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 123.960 229.120 37.560 re
+334.640 568.920 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 184.800 m
-162.800 184.800 l
+48.240 629.760 m
+162.800 629.760 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 161.520 m
-162.800 161.520 l
+48.240 606.480 m
+162.800 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 185.050 m
-48.240 160.770 l
+48.240 630.010 m
+48.240 605.730 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 185.050 m
-162.800 160.770 l
+162.800 630.010 m
+162.800 605.730 l
S
[ ] 0 d
1 w
@@ -18968,7 +18214,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 169.05300000000034 Td
+51.24000000000001 614.0130000000003 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -18976,26 +18222,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 184.800 m
-334.640 184.800 l
+162.800 629.760 m
+334.640 629.760 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 161.520 m
-334.640 161.520 l
+162.800 606.480 m
+334.640 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 185.050 m
-162.800 160.770 l
+162.800 630.010 m
+162.800 605.730 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 185.050 m
-334.640 160.770 l
+334.640 630.010 m
+334.640 605.730 l
S
[ ] 0 d
1 w
@@ -19003,7 +18249,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 169.05300000000034 Td
+165.79988544000003 614.0130000000003 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -19011,26 +18257,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 184.800 m
-563.760 184.800 l
+334.640 629.760 m
+563.760 629.760 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 161.520 m
-563.760 161.520 l
+334.640 606.480 m
+563.760 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 185.050 m
-334.640 160.770 l
+334.640 630.010 m
+334.640 605.730 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 185.050 m
-563.760 160.770 l
+563.760 630.010 m
+563.760 605.730 l
S
[ ] 0 d
1 w
@@ -19038,7 +18284,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 169.05300000000034 Td
+337.6397136 614.0130000000003 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -19046,26 +18292,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 161.520 m
-162.800 161.520 l
+48.240 606.480 m
+162.800 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 123.960 m
-162.800 123.960 l
+48.240 568.920 m
+162.800 568.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 161.770 m
-48.240 123.710 l
+48.240 606.730 m
+48.240 568.670 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 161.770 m
-162.800 123.710 l
+162.800 606.730 m
+162.800 568.670 l
S
[ ] 0 d
1 w
@@ -19073,7 +18319,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 138.13300000000032 Td
+51.24000000000001 583.0930000000003 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -19081,26 +18327,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 161.520 m
-334.640 161.520 l
+162.800 606.480 m
+334.640 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 123.960 m
-334.640 123.960 l
+162.800 568.920 m
+334.640 568.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 161.770 m
-162.800 123.710 l
+162.800 606.730 m
+162.800 568.670 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 161.770 m
-334.640 123.710 l
+334.640 606.730 m
+334.640 568.670 l
S
[ ] 0 d
1 w
@@ -19108,19 +18354,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 145.27300000000034 Td
+165.79988544000003 590.2330000000004 Td
/F2.0 10.5 Tf
<706f6c69637954797065> Tj
ET
BT
-165.79988544000003 130.99300000000034 Td
+165.79988544000003 575.9530000000003 Td
ET
BT
-165.79988544000003 130.99300000000034 Td
+165.79988544000003 575.9530000000003 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -19128,26 +18374,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 161.520 m
-563.760 161.520 l
+334.640 606.480 m
+563.760 606.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 123.960 m
-563.760 123.960 l
+334.640 568.920 m
+563.760 568.920 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 161.770 m
-334.640 123.710 l
+334.640 606.730 m
+334.640 568.670 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 161.770 m
-563.760 123.710 l
+563.760 606.730 m
+563.760 568.670 l
S
[ ] 0 d
1 w
@@ -19155,7 +18401,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 138.13300000000032 Td
+337.6397136 583.0930000000003 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -19165,145 +18411,51 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 94.37600000000032 Td
+48.24000000000001 539.3360000000004 Td
/F2.0 13 Tf
-<322e32362e322e20526573706f6e736573> Tj
+<322e32342e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
-q
-0.000 0.000 0.000 scn
-0.000 0.000 0.000 SCN
-1 w
-0 J
-0 j
-[ ] 0 d
-/Stamp1 Do
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-49.24 14.388 Td
-/F1.0 9 Tf
-<3132> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-Q
-Q
-
-endstream
-endobj
-168 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 612.0 792.0]
-/Contents 167 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F2.0 22 0 R
-/F1.0 8 0 R
-/F4.0 34 0 R
-/F3.0 24 0 R
->>
-/XObject << /Stamp1 496 0 R
->>
->>
-/Annots [177 0 R]
->>
-endobj
-169 0 obj
-[168 0 R /XYZ 0 792.0 null]
-endobj
-170 0 obj
-<< /Limits [(_parameters_10) (_parameters_5)]
-/Names [(_parameters_10) 118 0 R (_parameters_11) 123 0 R (_parameters_12) 129 0 R (_parameters_13) 135 0 R (_parameters_14) 148 0 R (_parameters_15) 158 0 R (_parameters_16) 163 0 R (_parameters_17) 180 0 R (_parameters_18) 187 0 R (_parameters_19) 192 0 R (_parameters_2) 48 0 R (_parameters_3) 56 0 R (_parameters_4) 68 0 R (_parameters_5) 74 0 R]
->>
-endobj
-171 0 obj
-[168 0 R /XYZ 0 702.1200000000001 null]
-endobj
-172 0 obj
-[168 0 R /XYZ 0 645.8400000000003 null]
-endobj
-173 0 obj
-[168 0 R /XYZ 0 605.7600000000003 null]
-endobj
-174 0 obj
-[168 0 R /XYZ 0 514.9200000000005 null]
-endobj
-175 0 obj
-[168 0 R /XYZ 0 458.6400000000005 null]
-endobj
-176 0 obj
-[168 0 R /XYZ 0 418.56000000000046 null]
-endobj
-177 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstoscamodel)
-/Subtype /Link
-/Rect [463.65600000000006 329.40700000000044 543.699755859375 343.6870000000004]
-/Type /Annot
->>
-endobj
-178 0 obj
-[168 0 R /XYZ 0 313.4400000000004 null]
-endobj
-179 0 obj
-[168 0 R /XYZ 0 257.16000000000037 null]
-endobj
-180 0 obj
-[168 0 R /XYZ 0 217.08000000000035 null]
-endobj
-181 0 obj
-[168 0 R /XYZ 0 111.96000000000032 null]
-endobj
-182 0 obj
-<< /Length 18537
->>
-stream
-q
-/DeviceRGB cs
1.000 1.000 1.000 scn
-48.240 732.720 171.840 23.280 re
+48.240 501.360 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 732.720 343.680 23.280 re
+220.080 501.360 343.680 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 709.440 171.840 23.280 re
+48.240 478.080 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 709.440 343.680 23.280 re
+220.080 478.080 343.680 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
-/DeviceRGB CS
0.867 0.867 0.867 SCN
-48.240 756.000 m
-220.080 756.000 l
+48.240 524.640 m
+220.080 524.640 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 732.720 m
-220.080 732.720 l
+48.240 501.360 m
+220.080 501.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 756.250 m
-48.240 731.970 l
+48.240 524.890 m
+48.240 500.610 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 756.250 m
-220.080 731.970 l
+220.080 524.890 m
+220.080 500.610 l
S
[ ] 0 d
1 w
@@ -19311,7 +18463,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 740.2529999999999 Td
+51.24000000000001 508.8930000000004 Td
/F2.0 10.5 Tf
<4854545020436f6465> Tj
ET
@@ -19319,26 +18471,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 756.000 m
-563.760 756.000 l
+220.080 524.640 m
+563.760 524.640 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-220.080 732.720 m
-563.760 732.720 l
+220.080 501.360 m
+563.760 501.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 756.250 m
-220.080 731.970 l
+220.080 524.890 m
+220.080 500.610 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 756.250 m
-563.760 731.970 l
+563.760 524.890 m
+563.760 500.610 l
S
[ ] 0 d
1 w
@@ -19346,7 +18498,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 740.2529999999999 Td
+223.07982816 508.8930000000004 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -19354,26 +18506,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 732.720 m
-220.080 732.720 l
+48.240 501.360 m
+220.080 501.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 709.440 m
-220.080 709.440 l
+48.240 478.080 m
+220.080 478.080 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 732.970 m
-48.240 709.190 l
+48.240 501.610 m
+48.240 477.830 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 732.970 m
-220.080 709.190 l
+220.080 501.610 m
+220.080 477.830 l
S
[ ] 0 d
1 w
@@ -19381,7 +18533,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 716.473 Td
+51.24000000000001 485.11300000000045 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -19389,26 +18541,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 732.720 m
-563.760 732.720 l
+220.080 501.360 m
+563.760 501.360 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 709.440 m
-563.760 709.440 l
+220.080 478.080 m
+563.760 478.080 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 732.970 m
-220.080 709.190 l
+220.080 501.610 m
+220.080 477.830 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 732.970 m
-563.760 709.190 l
+563.760 501.610 m
+563.760 477.830 l
S
[ ] 0 d
1 w
@@ -19416,7 +18568,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 716.473 Td
+223.07982816 485.11300000000045 Td
/F1.0 10.5 Tf
<4e6f20436f6e74656e74> Tj
ET
@@ -19426,9 +18578,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24 679.8560000000001 Td
+48.24000000000001 448.4960000000005 Td
/F2.0 13 Tf
-<322e32362e332e2050726f6475636573> Tj
+<322e32342e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -19439,7 +18591,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 653.1960000000001 Td
+56.88050000000001 421.83600000000047 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -19452,7 +18604,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 655.3800000000002 Td
+66.24000000000001 424.0200000000005 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -19463,9 +18615,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 617.7360000000002 Td
+48.24000000000001 386.3760000000005 Td
/F2.0 18 Tf
-<322e32372e20474554202f746f7363612f6d6f64656c732f7b746f7363614d6f64656c4e616d657d> Tj
+<322e32352e20474554202f746f7363612f6d6f64656c732f7b746f7363614d6f64656c4e616d657d> Tj
ET
0.000 0.000 0.000 SCN
@@ -19474,59 +18626,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 583.4960000000003 Td
+48.24000000000001 352.1360000000004 Td
/F2.0 13 Tf
-[<322e32372e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e32352e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 545.520 114.560 23.280 re
+48.240 314.160 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 545.520 171.840 23.280 re
+162.800 314.160 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 545.520 229.120 23.280 re
+334.640 314.160 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 507.960 114.560 37.560 re
+48.240 276.600 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 507.960 171.840 37.560 re
+162.800 276.600 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 507.960 229.120 37.560 re
+334.640 276.600 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 568.800 m
-162.800 568.800 l
+48.240 337.440 m
+162.800 337.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 545.520 m
-162.800 545.520 l
+48.240 314.160 m
+162.800 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 569.050 m
-48.240 544.770 l
+48.240 337.690 m
+48.240 313.410 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 569.050 m
-162.800 544.770 l
+162.800 337.690 m
+162.800 313.410 l
S
[ ] 0 d
1 w
@@ -19534,7 +18686,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 553.0530000000003 Td
+51.24000000000001 321.6930000000004 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -19542,26 +18694,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 568.800 m
-334.640 568.800 l
+162.800 337.440 m
+334.640 337.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 545.520 m
-334.640 545.520 l
+162.800 314.160 m
+334.640 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 569.050 m
-162.800 544.770 l
+162.800 337.690 m
+162.800 313.410 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 569.050 m
-334.640 544.770 l
+334.640 337.690 m
+334.640 313.410 l
S
[ ] 0 d
1 w
@@ -19569,7 +18721,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 553.0530000000003 Td
+165.79988544000003 321.6930000000004 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -19577,26 +18729,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 568.800 m
-563.760 568.800 l
+334.640 337.440 m
+563.760 337.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 545.520 m
-563.760 545.520 l
+334.640 314.160 m
+563.760 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 569.050 m
-334.640 544.770 l
+334.640 337.690 m
+334.640 313.410 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 569.050 m
-563.760 544.770 l
+563.760 337.690 m
+563.760 313.410 l
S
[ ] 0 d
1 w
@@ -19604,7 +18756,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 553.0530000000003 Td
+337.6397136 321.6930000000004 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -19612,26 +18764,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 545.520 m
-162.800 545.520 l
+48.240 314.160 m
+162.800 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 507.960 m
-162.800 507.960 l
+48.240 276.600 m
+162.800 276.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 545.770 m
-48.240 507.710 l
+48.240 314.410 m
+48.240 276.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 545.770 m
-162.800 507.710 l
+162.800 314.410 m
+162.800 276.350 l
S
[ ] 0 d
1 w
@@ -19639,7 +18791,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 522.1330000000004 Td
+51.24000000000001 290.7730000000004 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -19647,26 +18799,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 545.520 m
-334.640 545.520 l
+162.800 314.160 m
+334.640 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 507.960 m
-334.640 507.960 l
+162.800 276.600 m
+334.640 276.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 545.770 m
-162.800 507.710 l
+162.800 314.410 m
+162.800 276.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 545.770 m
-334.640 507.710 l
+334.640 314.410 m
+334.640 276.350 l
S
[ ] 0 d
1 w
@@ -19674,19 +18826,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 529.2730000000004 Td
+165.79988544000003 297.9130000000004 Td
/F2.0 10.5 Tf
<746f7363614d6f64656c4e616d65> Tj
ET
BT
-165.79988544000003 514.9930000000004 Td
+165.79988544000003 283.6330000000004 Td
ET
BT
-165.79988544000003 514.9930000000004 Td
+165.79988544000003 283.6330000000004 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -19694,26 +18846,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 545.520 m
-563.760 545.520 l
+334.640 314.160 m
+563.760 314.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 507.960 m
-563.760 507.960 l
+334.640 276.600 m
+563.760 276.600 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 545.770 m
-334.640 507.710 l
+334.640 314.410 m
+334.640 276.350 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 545.770 m
-563.760 507.710 l
+563.760 314.410 m
+563.760 276.350 l
S
[ ] 0 d
1 w
@@ -19721,7 +18873,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 522.1330000000004 Td
+337.6397136 290.7730000000004 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -19731,59 +18883,59 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 478.37600000000043 Td
+48.24000000000001 247.01600000000042 Td
/F2.0 13 Tf
-<322e32372e322e20526573706f6e736573> Tj
+<322e32352e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 426.120 51.552 37.560 re
+48.240 194.760 51.552 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 426.120 360.864 37.560 re
+99.792 194.760 360.864 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 426.120 103.104 37.560 re
+460.656 194.760 103.104 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 402.840 51.552 23.280 re
+48.240 171.480 51.552 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-99.792 402.840 360.864 23.280 re
+99.792 171.480 360.864 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-460.656 402.840 103.104 23.280 re
+460.656 171.480 103.104 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 463.680 m
-99.792 463.680 l
+48.240 232.320 m
+99.792 232.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 426.120 m
-99.792 426.120 l
+48.240 194.760 m
+99.792 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 463.930 m
-48.240 425.370 l
+48.240 232.570 m
+48.240 194.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 463.930 m
-99.792 425.370 l
+99.792 232.570 m
+99.792 194.010 l
S
[ ] 0 d
1 w
@@ -19791,14 +18943,14 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 447.9330000000004 Td
+51.24000000000001 216.57300000000043 Td
/F2.0 10.5 Tf
<48545450> Tj
ET
BT
-51.24000000000001 433.65300000000036 Td
+51.24000000000001 202.29300000000043 Td
/F2.0 10.5 Tf
<436f6465> Tj
ET
@@ -19806,26 +18958,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 463.680 m
-460.656 463.680 l
+99.792 232.320 m
+460.656 232.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-99.792 426.120 m
-460.656 426.120 l
+99.792 194.760 m
+460.656 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 463.930 m
-99.792 425.370 l
+99.792 232.570 m
+99.792 194.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 463.930 m
-460.656 425.370 l
+460.656 232.570 m
+460.656 194.010 l
S
[ ] 0 d
1 w
@@ -19833,7 +18985,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 447.9330000000004 Td
+102.792 216.57300000000043 Td
/F2.0 10.5 Tf
<4465736372697074696f6e> Tj
ET
@@ -19841,26 +18993,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 463.680 m
-563.760 463.680 l
+460.656 232.320 m
+563.760 232.320 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-460.656 426.120 m
-563.760 426.120 l
+460.656 194.760 m
+563.760 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 463.930 m
-460.656 425.370 l
+460.656 232.570 m
+460.656 194.010 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 463.930 m
-563.760 425.370 l
+563.760 232.570 m
+563.760 194.010 l
S
[ ] 0 d
1 w
@@ -19868,7 +19020,7 @@ S
0.200 0.200 0.200 scn
BT
-463.65600000000006 447.9330000000004 Td
+463.65600000000006 216.57300000000043 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -19876,26 +19028,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 426.120 m
-99.792 426.120 l
+48.240 194.760 m
+99.792 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 402.840 m
-99.792 402.840 l
+48.240 171.480 m
+99.792 171.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 426.370 m
-48.240 402.590 l
+48.240 195.010 m
+48.240 171.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 426.370 m
-99.792 402.590 l
+99.792 195.010 m
+99.792 171.230 l
S
[ ] 0 d
1 w
@@ -19903,7 +19055,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 409.8730000000004 Td
+51.24000000000001 178.51300000000043 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -19911,26 +19063,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-99.792 426.120 m
-460.656 426.120 l
+99.792 194.760 m
+460.656 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 402.840 m
-460.656 402.840 l
+99.792 171.480 m
+460.656 171.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-99.792 426.370 m
-99.792 402.590 l
+99.792 195.010 m
+99.792 171.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 426.370 m
-460.656 402.590 l
+460.656 195.010 m
+460.656 171.230 l
S
[ ] 0 d
1 w
@@ -19938,7 +19090,7 @@ S
0.200 0.200 0.200 scn
BT
-102.792 409.8730000000004 Td
+102.792 178.51300000000043 Td
/F1.0 10.5 Tf
<4f75747075742074797065> Tj
ET
@@ -19946,26 +19098,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-460.656 426.120 m
-563.760 426.120 l
+460.656 194.760 m
+563.760 194.760 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 402.840 m
-563.760 402.840 l
+460.656 171.480 m
+563.760 171.480 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-460.656 426.370 m
-460.656 402.590 l
+460.656 195.010 m
+460.656 171.230 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 426.370 m
-563.760 402.590 l
+563.760 195.010 m
+563.760 171.230 l
S
[ ] 0 d
1 w
@@ -19979,7 +19131,7 @@ S
0.259 0.545 0.792 SCN
BT
-463.65600000000006 409.8730000000004 Td
+463.65600000000006 178.51300000000043 Td
/F1.0 10.5 Tf
[<436c647354> 29.78515625 <6f7363614d6f64656c>] TJ
ET
@@ -19991,9 +19143,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 373.25600000000037 Td
+48.24000000000001 141.8960000000004 Td
/F2.0 13 Tf
-<322e32372e332e2050726f6475636573> Tj
+<322e32352e332e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -20004,7 +19156,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 346.59600000000034 Td
+56.88050000000001 115.23600000000039 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -20017,7 +19169,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 348.78000000000037 Td
+66.24000000000001 117.42000000000039 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -20028,82 +19180,173 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 311.13600000000037 Td
+48.24000000000001 79.77600000000038 Td
/F2.0 18 Tf
-<322e32382e20505554202f746f7363612f6d6f64656c732f7b746f7363614d6f64656c4e616d657d> Tj
+<322e32362e20505554202f746f7363612f6d6f64656c732f7b746f7363614d6f64656c4e616d657d> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
+q
+0.000 0.000 0.000 scn
+0.000 0.000 0.000 SCN
+1 w
+0 J
+0 j
+[ ] 0 d
+/Stamp1 Do
0.200 0.200 0.200 scn
0.200 0.200 0.200 SCN
BT
-48.24000000000001 276.8960000000003 Td
+49.24 14.388 Td
+/F1.0 9 Tf
+<3132> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+Q
+Q
+
+endstream
+endobj
+169 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612.0 792.0]
+/Contents 168 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F2.0 22 0 R
+/F1.0 8 0 R
+/F4.0 34 0 R
+/F3.0 24 0 R
+>>
+/XObject << /Stamp1 472 0 R
+>>
+>>
+/Annots [179 0 R]
+>>
+endobj
+170 0 obj
+[169 0 R /XYZ 0 792.0 null]
+endobj
+171 0 obj
+[169 0 R /XYZ 0 702.1200000000001 null]
+endobj
+172 0 obj
+[169 0 R /XYZ 0 662.0400000000002 null]
+endobj
+173 0 obj
+[169 0 R /XYZ 0 556.9200000000003 null]
+endobj
+174 0 obj
+[169 0 R /XYZ 0 466.0800000000005 null]
+endobj
+175 0 obj
+[169 0 R /XYZ 0 409.80000000000047 null]
+endobj
+176 0 obj
+[169 0 R /XYZ 0 369.7200000000004 null]
+endobj
+177 0 obj
+<< /Limits [(_parameters_10) (_parameters_4)]
+/Names [(_parameters_10) 115 0 R (_parameters_11) 119 0 R (_parameters_12) 127 0 R (_parameters_13) 139 0 R (_parameters_14) 148 0 R (_parameters_15) 154 0 R (_parameters_16) 172 0 R (_parameters_17) 176 0 R (_parameters_18) 184 0 R (_parameters_2) 48 0 R (_parameters_3) 56 0 R (_parameters_4) 68 0 R]
+>>
+endobj
+178 0 obj
+[169 0 R /XYZ 0 264.6000000000004 null]
+endobj
+179 0 obj
+<< /Border [0 0 0]
+/Dest (_cldstoscamodel)
+/Subtype /Link
+/Rect [463.65600000000006 175.44700000000043 543.699755859375 189.72700000000043]
+/Type /Annot
+>>
+endobj
+180 0 obj
+[169 0 R /XYZ 0 159.48000000000042 null]
+endobj
+181 0 obj
+[169 0 R /XYZ 0 103.20000000000039 null]
+endobj
+182 0 obj
+<< /Length 11793
+>>
+stream
+q
+/DeviceRGB cs
+0.200 0.200 0.200 scn
+/DeviceRGB CS
+0.200 0.200 0.200 SCN
+
+BT
+48.24 740.816 Td
/F2.0 13 Tf
-[<322e32382e312e20506172> 20.01953125 <616d6574657273>] TJ
+[<322e32362e312e20506172> 20.01953125 <616d6574657273>] TJ
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 238.920 114.560 23.280 re
+48.240 702.840 114.560 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 238.920 171.840 23.280 re
+162.800 702.840 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 238.920 229.120 23.280 re
+334.640 702.840 229.120 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 201.360 114.560 37.560 re
+48.240 665.280 114.560 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-162.800 201.360 171.840 37.560 re
+162.800 665.280 171.840 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-334.640 201.360 229.120 37.560 re
+334.640 665.280 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-48.240 163.800 114.560 37.560 re
+48.240 627.720 114.560 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-162.800 163.800 171.840 37.560 re
+162.800 627.720 171.840 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-334.640 163.800 229.120 37.560 re
+334.640 627.720 229.120 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 262.200 m
-162.800 262.200 l
+48.240 726.120 m
+162.800 726.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 238.920 m
-162.800 238.920 l
+48.240 702.840 m
+162.800 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 262.450 m
-48.240 238.170 l
+48.240 726.370 m
+48.240 702.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 262.450 m
-162.800 238.170 l
+162.800 726.370 m
+162.800 702.090 l
S
[ ] 0 d
1 w
@@ -20111,7 +19354,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 246.45300000000026 Td
+51.24 710.373 Td
/F2.0 10.5 Tf
<54797065> Tj
ET
@@ -20119,26 +19362,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 262.200 m
-334.640 262.200 l
+162.800 726.120 m
+334.640 726.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-162.800 238.920 m
-334.640 238.920 l
+162.800 702.840 m
+334.640 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 262.450 m
-162.800 238.170 l
+162.800 726.370 m
+162.800 702.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 262.450 m
-334.640 238.170 l
+334.640 726.370 m
+334.640 702.090 l
S
[ ] 0 d
1 w
@@ -20146,7 +19389,7 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 246.45300000000026 Td
+165.79988544 710.373 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -20154,26 +19397,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 262.200 m
-563.760 262.200 l
+334.640 726.120 m
+563.760 726.120 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-334.640 238.920 m
-563.760 238.920 l
+334.640 702.840 m
+563.760 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 262.450 m
-334.640 238.170 l
+334.640 726.370 m
+334.640 702.090 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 262.450 m
-563.760 238.170 l
+563.760 726.370 m
+563.760 702.090 l
S
[ ] 0 d
1 w
@@ -20181,7 +19424,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 246.45300000000026 Td
+337.6397136 710.373 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -20189,26 +19432,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 238.920 m
-162.800 238.920 l
+48.240 702.840 m
+162.800 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 201.360 m
-162.800 201.360 l
+48.240 665.280 m
+162.800 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 239.170 m
-48.240 201.110 l
+48.240 703.090 m
+48.240 665.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 239.170 m
-162.800 201.110 l
+162.800 703.090 m
+162.800 665.030 l
S
[ ] 0 d
1 w
@@ -20216,7 +19459,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 215.53300000000027 Td
+51.24 679.4530000000001 Td
/F2.0 10.5 Tf
<50617468> Tj
ET
@@ -20224,26 +19467,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 238.920 m
-334.640 238.920 l
+162.800 702.840 m
+334.640 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 201.360 m
-334.640 201.360 l
+162.800 665.280 m
+334.640 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 239.170 m
-162.800 201.110 l
+162.800 703.090 m
+162.800 665.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 239.170 m
-334.640 201.110 l
+334.640 703.090 m
+334.640 665.030 l
S
[ ] 0 d
1 w
@@ -20251,19 +19494,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 222.6730000000003 Td
+165.79988544 686.5930000000001 Td
/F2.0 10.5 Tf
<746f7363614d6f64656c4e616d65> Tj
ET
BT
-165.79988544000003 208.39300000000028 Td
+165.79988544 672.3130000000001 Td
ET
BT
-165.79988544000003 208.39300000000028 Td
+165.79988544 672.3130000000001 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -20271,26 +19514,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 238.920 m
-563.760 238.920 l
+334.640 702.840 m
+563.760 702.840 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 201.360 m
-563.760 201.360 l
+334.640 665.280 m
+563.760 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 239.170 m
-334.640 201.110 l
+334.640 703.090 m
+334.640 665.030 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 239.170 m
-563.760 201.110 l
+563.760 703.090 m
+563.760 665.030 l
S
[ ] 0 d
1 w
@@ -20298,7 +19541,7 @@ S
0.200 0.200 0.200 scn
BT
-337.6397136 215.53300000000027 Td
+337.6397136 679.4530000000001 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -20306,26 +19549,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 201.360 m
-162.800 201.360 l
+48.240 665.280 m
+162.800 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 163.800 m
-162.800 163.800 l
+48.240 627.720 m
+162.800 627.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 201.610 m
-48.240 163.550 l
+48.240 665.530 m
+48.240 627.470 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 201.610 m
-162.800 163.550 l
+162.800 665.530 m
+162.800 627.470 l
S
[ ] 0 d
1 w
@@ -20333,7 +19576,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 177.97300000000027 Td
+51.24 641.893 Td
/F2.0 10.5 Tf
<426f6479> Tj
ET
@@ -20341,26 +19584,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-162.800 201.360 m
-334.640 201.360 l
+162.800 665.280 m
+334.640 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 163.800 m
-334.640 163.800 l
+162.800 627.720 m
+334.640 627.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-162.800 201.610 m
-162.800 163.550 l
+162.800 665.530 m
+162.800 627.470 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 201.610 m
-334.640 163.550 l
+334.640 665.530 m
+334.640 627.470 l
S
[ ] 0 d
1 w
@@ -20368,19 +19611,19 @@ S
0.200 0.200 0.200 scn
BT
-165.79988544000003 185.11300000000028 Td
+165.79988544 649.0330000000001 Td
/F2.0 10.5 Tf
<626f6479> Tj
ET
BT
-165.79988544000003 170.83300000000028 Td
+165.79988544 634.753 Td
ET
BT
-165.79988544000003 170.83300000000028 Td
+165.79988544 634.753 Td
/F3.0 10.5 Tf
<7265717569726564> Tj
ET
@@ -20388,26 +19631,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-334.640 201.360 m
-563.760 201.360 l
+334.640 665.280 m
+563.760 665.280 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 163.800 m
-563.760 163.800 l
+334.640 627.720 m
+563.760 627.720 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-334.640 201.610 m
-334.640 163.550 l
+334.640 665.530 m
+334.640 627.470 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 201.610 m
-563.760 163.550 l
+563.760 665.530 m
+563.760 627.470 l
S
[ ] 0 d
1 w
@@ -20421,7 +19664,7 @@ S
0.259 0.545 0.792 SCN
BT
-337.6397136 177.97300000000027 Td
+337.6397136 641.893 Td
/F1.0 10.5 Tf
[<436c647354> 29.78515625 <6f7363614d6f64656c>] TJ
ET
@@ -20433,51 +19676,51 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 134.21600000000024 Td
+48.24 598.1360000000001 Td
/F2.0 13 Tf
-<322e32382e322e20526573706f6e736573> Tj
+<322e32362e322e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 96.240 171.840 23.280 re
+48.240 560.160 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 96.240 343.680 23.280 re
+220.080 560.160 343.680 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 72.960 171.840 23.280 re
+48.240 536.880 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 72.960 343.680 23.280 re
+220.080 536.880 343.680 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 119.520 m
-220.080 119.520 l
+48.240 583.440 m
+220.080 583.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 96.240 m
-220.080 96.240 l
+48.240 560.160 m
+220.080 560.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 119.770 m
-48.240 95.490 l
+48.240 583.690 m
+48.240 559.410 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 119.770 m
-220.080 95.490 l
+220.080 583.690 m
+220.080 559.410 l
S
[ ] 0 d
1 w
@@ -20485,7 +19728,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 103.77300000000024 Td
+51.24 567.6930000000001 Td
/F2.0 10.5 Tf
<4854545020436f6465> Tj
ET
@@ -20493,26 +19736,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 119.520 m
-563.760 119.520 l
+220.080 583.440 m
+563.760 583.440 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-220.080 96.240 m
-563.760 96.240 l
+220.080 560.160 m
+563.760 560.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 119.770 m
-220.080 95.490 l
+220.080 583.690 m
+220.080 559.410 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 119.770 m
-563.760 95.490 l
+563.760 583.690 m
+563.760 559.410 l
S
[ ] 0 d
1 w
@@ -20520,7 +19763,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 103.77300000000024 Td
+223.07982816 567.6930000000001 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -20528,26 +19771,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 96.240 m
-220.080 96.240 l
+48.240 560.160 m
+220.080 560.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 72.960 m
-220.080 72.960 l
+48.240 536.880 m
+220.080 536.880 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 96.490 m
-48.240 72.710 l
+48.240 560.410 m
+48.240 536.630 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 96.490 m
-220.080 72.710 l
+220.080 560.410 m
+220.080 536.630 l
S
[ ] 0 d
1 w
@@ -20555,7 +19798,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 79.99300000000024 Td
+51.24 543.9130000000001 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -20563,26 +19806,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 96.240 m
-563.760 96.240 l
+220.080 560.160 m
+563.760 560.160 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 72.960 m
-563.760 72.960 l
+220.080 536.880 m
+563.760 536.880 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 96.490 m
-220.080 72.710 l
+220.080 560.410 m
+220.080 536.630 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 96.490 m
-563.760 72.710 l
+563.760 560.410 m
+563.760 536.630 l
S
[ ] 0 d
1 w
@@ -20590,117 +19833,19 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 79.99300000000024 Td
+223.07982816 543.9130000000001 Td
/F1.0 10.5 Tf
<4e6f20436f6e74656e74> Tj
ET
0.000 0.000 0.000 scn
-q
-0.000 0.000 0.000 scn
-0.000 0.000 0.000 SCN
-1 w
-0 J
-0 j
-[ ] 0 d
-/Stamp1 Do
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-552.698 14.388 Td
-/F1.0 9 Tf
-<3133> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-Q
-Q
-
-endstream
-endobj
-183 0 obj
-<< /Type /Page
-/Parent 3 0 R
-/MediaBox [0 0 612.0 792.0]
-/Contents 182 0 R
-/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
-/Font << /F2.0 22 0 R
-/F1.0 8 0 R
-/F4.0 34 0 R
-/F3.0 24 0 R
->>
-/XObject << /Stamp1 496 0 R
->>
->>
-/Annots [189 0 R 193 0 R]
->>
-endobj
-184 0 obj
-[183 0 R /XYZ 0 697.44 null]
-endobj
-185 0 obj
-[183 0 R /XYZ 0 641.1600000000002 null]
-endobj
-186 0 obj
-<< /Limits [(_route28) (_version_information)]
-/Names [(_route28) 162 0 R (_route29) 157 0 R (_route3) 43 0 R (_route30) 200 0 R (_route4) 172 0 R (_route5) 67 0 R (_route6) 73 0 R (_route7) 78 0 R (_route8) 83 0 R (_route9) 63 0 R (_uri_scheme) 25 0 R (_valueitem) 233 0 R (_version_information) 23 0 R]
->>
-endobj
-187 0 obj
-[183 0 R /XYZ 0 601.0800000000003 null]
-endobj
-188 0 obj
-[183 0 R /XYZ 0 495.96000000000043 null]
-endobj
-189 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstoscamodel)
-/Subtype /Link
-/Rect [463.65600000000006 406.8070000000004 543.699755859375 421.0870000000004]
-/Type /Annot
->>
-endobj
-190 0 obj
-[183 0 R /XYZ 0 390.8400000000004 null]
-endobj
-191 0 obj
-[183 0 R /XYZ 0 334.56000000000034 null]
-endobj
-192 0 obj
-[183 0 R /XYZ 0 294.4800000000003 null]
-endobj
-193 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstoscamodel)
-/Subtype /Link
-/Rect [337.6397136 174.9070000000003 417.68346945937503 189.1870000000003]
-/Type /Annot
->>
-endobj
-194 0 obj
-[183 0 R /XYZ 0 151.80000000000027 null]
-endobj
-195 0 obj
-<< /Limits [(_responses_23) (_responses_7)]
-/Names [(_responses_23) 165 0 R (_responses_24) 173 0 R (_responses_25) 176 0 R (_responses_26) 181 0 R (_responses_27) 188 0 R (_responses_28) 194 0 R (_responses_29) 201 0 R (_responses_3) 44 0 R (_responses_4) 50 0 R (_responses_5) 60 0 R (_responses_6) 64 0 R (_responses_7) 69 0 R]
->>
-endobj
-196 0 obj
-<< /Length 4334
->>
-stream
-q
-/DeviceRGB cs
0.200 0.200 0.200 scn
-/DeviceRGB CS
0.200 0.200 0.200 SCN
BT
-48.24 740.816 Td
+48.24 507.2960000000003 Td
/F2.0 13 Tf
-<322e32382e332e20436f6e73756d6573> Tj
+<322e32362e332e20436f6e73756d6573> Tj
ET
0.000 0.000 0.000 SCN
@@ -20711,7 +19856,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 714.1560000000001 Td
+56.88050000000001 480.63600000000025 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -20724,7 +19869,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 716.3400000000001 Td
+66.24000000000001 482.8200000000003 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -20735,9 +19880,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 684.5360000000002 Td
+48.24000000000001 451.01600000000025 Td
/F2.0 13 Tf
-<322e32382e342e2050726f6475636573> Tj
+<322e32362e342e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -20748,7 +19893,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 657.8760000000002 Td
+56.88050000000001 424.3560000000002 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -20761,7 +19906,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 660.0600000000003 Td
+66.24000000000001 426.54000000000025 Td
/F4.0 10.5 Tf
<6170706c69636174696f6e2f6a736f6e> Tj
ET
@@ -20772,9 +19917,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 622.4160000000003 Td
+48.24000000000001 388.89600000000024 Td
/F2.0 18 Tf
-<322e32392e20474554202f757365722f67657455736572> Tj
+<322e32372e20474554202f757365722f67657455736572> Tj
ET
0.000 0.000 0.000 SCN
@@ -20783,51 +19928,51 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 588.1760000000004 Td
+48.24000000000001 354.6560000000002 Td
/F2.0 13 Tf
-<322e32392e312e20526573706f6e736573> Tj
+<322e32372e312e20526573706f6e736573> Tj
ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 550.200 171.840 23.280 re
+48.240 316.680 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 550.200 343.680 23.280 re
+220.080 316.680 343.680 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 526.920 171.840 23.280 re
+48.240 293.400 171.840 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-220.080 526.920 343.680 23.280 re
+220.080 293.400 343.680 23.280 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 573.480 m
-220.080 573.480 l
+48.240 339.960 m
+220.080 339.960 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 550.200 m
-220.080 550.200 l
+48.240 316.680 m
+220.080 316.680 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 573.730 m
-48.240 549.450 l
+48.240 340.210 m
+48.240 315.930 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 573.730 m
-220.080 549.450 l
+220.080 340.210 m
+220.080 315.930 l
S
[ ] 0 d
1 w
@@ -20835,7 +19980,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 557.7330000000004 Td
+51.24000000000001 324.21300000000014 Td
/F2.0 10.5 Tf
<4854545020436f6465> Tj
ET
@@ -20843,26 +19988,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 573.480 m
-563.760 573.480 l
+220.080 339.960 m
+563.760 339.960 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-220.080 550.200 m
-563.760 550.200 l
+220.080 316.680 m
+563.760 316.680 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 573.730 m
-220.080 549.450 l
+220.080 340.210 m
+220.080 315.930 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 573.730 m
-563.760 549.450 l
+563.760 340.210 m
+563.760 315.930 l
S
[ ] 0 d
1 w
@@ -20870,7 +20015,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 557.7330000000004 Td
+223.07982816 324.21300000000014 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -20878,26 +20023,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 550.200 m
-220.080 550.200 l
+48.240 316.680 m
+220.080 316.680 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 526.920 m
-220.080 526.920 l
+48.240 293.400 m
+220.080 293.400 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 550.450 m
-48.240 526.670 l
+48.240 316.930 m
+48.240 293.150 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 550.450 m
-220.080 526.670 l
+220.080 316.930 m
+220.080 293.150 l
S
[ ] 0 d
1 w
@@ -20905,7 +20050,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24000000000001 533.9530000000004 Td
+51.24000000000001 300.43300000000016 Td
/F2.0 10.5 Tf
<323030> Tj
ET
@@ -20913,26 +20058,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-220.080 550.200 m
-563.760 550.200 l
+220.080 316.680 m
+563.760 316.680 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 526.920 m
-563.760 526.920 l
+220.080 293.400 m
+563.760 293.400 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-220.080 550.450 m
-220.080 526.670 l
+220.080 316.930 m
+220.080 293.150 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 550.450 m
-563.760 526.670 l
+563.760 316.930 m
+563.760 293.150 l
S
[ ] 0 d
1 w
@@ -20940,7 +20085,7 @@ S
0.200 0.200 0.200 scn
BT
-223.07982816 533.9530000000004 Td
+223.07982816 300.43300000000016 Td
/F1.0 10.5 Tf
<4e6f20436f6e74656e74> Tj
ET
@@ -20950,9 +20095,9 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24000000000001 497.3360000000005 Td
+48.24000000000001 263.8160000000002 Td
/F2.0 13 Tf
-<322e32392e322e2050726f6475636573> Tj
+<322e32372e322e2050726f6475636573> Tj
ET
0.000 0.000 0.000 SCN
@@ -20963,7 +20108,7 @@ ET
0.200 0.200 0.200 SCN
BT
-56.88050000000001 470.6760000000005 Td
+56.88050000000001 237.1560000000002 Td
/F1.0 10.5 Tf
<a5> Tj
ET
@@ -20976,7 +20121,7 @@ ET
0.694 0.129 0.275 SCN
BT
-66.24000000000001 472.8600000000005 Td
+66.24000000000001 239.3400000000002 Td
/F4.0 10.5 Tf
<746578742f706c61696e> Tj
ET
@@ -20995,9 +20140,9 @@ q
0.200 0.200 0.200 SCN
BT
-49.24 14.388 Td
+552.698 14.388 Td
/F1.0 9 Tf
-<3134> Tj
+<3133> Tj
ET
0.000 0.000 0.000 SCN
@@ -21007,38 +20152,54 @@ Q
endstream
endobj
-197 0 obj
+183 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 196 0 R
+/Contents 182 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
+/F3.0 24 0 R
/F1.0 8 0 R
/F4.0 34 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
+/Annots [185 0 R]
>>
endobj
-198 0 obj
-[197 0 R /XYZ 0 792.0 null]
+184 0 obj
+[183 0 R /XYZ 0 792.0 null]
endobj
-199 0 obj
-[197 0 R /XYZ 0 702.1200000000001 null]
+185 0 obj
+<< /Border [0 0 0]
+/Dest (_cldstoscamodel)
+/Subtype /Link
+/Rect [337.6397136 638.8270000000001 417.68346945937503 653.1070000000001]
+/Type /Annot
+>>
endobj
-200 0 obj
-[197 0 R /XYZ 0 645.8400000000003 null]
+186 0 obj
+[183 0 R /XYZ 0 615.72 null]
endobj
-201 0 obj
-[197 0 R /XYZ 0 605.7600000000003 null]
+187 0 obj
+[183 0 R /XYZ 0 524.8800000000002 null]
endobj
-202 0 obj
-[197 0 R /XYZ 0 514.9200000000005 null]
+188 0 obj
+[183 0 R /XYZ 0 468.60000000000025 null]
endobj
-203 0 obj
-<< /Length 18148
+189 0 obj
+[183 0 R /XYZ 0 412.3200000000002 null]
+endobj
+190 0 obj
+[183 0 R /XYZ 0 372.2400000000002 null]
+endobj
+191 0 obj
+[183 0 R /XYZ 0 281.4000000000002 null]
+endobj
+192 0 obj
+<< /Length 18146
>>
stream
q
@@ -22437,9 +21598,9 @@ q
0.200 0.200 0.200 SCN
BT
-552.698 14.388 Td
+49.24 14.388 Td
/F1.0 9 Tf
-<3135> Tj
+<3134> Tj
ET
0.000 0.000 0.000 SCN
@@ -22449,29 +21610,29 @@ Q
endstream
endobj
-204 0 obj
+193 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 203 0 R
+/Contents 192 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
/F3.0 24 0 R
/F1.0 8 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
-/Annots [207 0 R]
+/Annots [196 0 R]
>>
endobj
-205 0 obj
-[204 0 R /XYZ 0 792.0 null]
+194 0 obj
+[193 0 R /XYZ 0 792.0 null]
endobj
-206 0 obj
-[204 0 R /XYZ 0 712.0799999999999 null]
+195 0 obj
+[193 0 R /XYZ 0 712.0799999999999 null]
endobj
-207 0 obj
+196 0 obj
<< /Border [0 0 0]
/Dest (_cldsdictionaryitem)
/Subtype /Link
@@ -22479,11 +21640,11 @@ endobj
/Type /Annot
>>
endobj
-208 0 obj
-[204 0 R /XYZ 0 411.35999999999996 null]
+197 0 obj
+[193 0 R /XYZ 0 411.35999999999996 null]
endobj
-209 0 obj
-<< /Length 19886
+198 0 obj
+<< /Length 19888
>>
stream
q
@@ -24017,9 +23178,9 @@ q
0.200 0.200 0.200 SCN
BT
-49.24 14.388 Td
+552.698 14.388 Td
/F1.0 9 Tf
-<3136> Tj
+<3135> Tj
ET
0.000 0.000 0.000 SCN
@@ -24029,29 +23190,29 @@ Q
endstream
endobj
-210 0 obj
+199 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 209 0 R
+/Contents 198 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
/F3.0 24 0 R
/F1.0 8 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
>>
endobj
-211 0 obj
-[210 0 R /XYZ 0 645.6000000000001 null]
+200 0 obj
+[199 0 R /XYZ 0 645.6000000000001 null]
endobj
-212 0 obj
-[210 0 R /XYZ 0 382.4400000000002 null]
+201 0 obj
+[199 0 R /XYZ 0 382.4400000000002 null]
endobj
-213 0 obj
-<< /Length 21595
+202 0 obj
+<< /Length 21593
>>
stream
q
@@ -25706,9 +24867,9 @@ q
0.200 0.200 0.200 SCN
BT
-552.698 14.388 Td
+49.24 14.388 Td
/F1.0 9 Tf
-<3137> Tj
+<3136> Tj
ET
0.000 0.000 0.000 SCN
@@ -25718,26 +24879,26 @@ Q
endstream
endobj
-214 0 obj
+203 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 213 0 R
+/Contents 202 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
/F3.0 24 0 R
/F1.0 8 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
-/Annots [216 0 R 217 0 R]
+/Annots [205 0 R 206 0 R]
>>
endobj
-215 0 obj
-[214 0 R /XYZ 0 683.1600000000001 null]
+204 0 obj
+[203 0 R /XYZ 0 683.1600000000001 null]
endobj
-216 0 obj
+205 0 obj
<< /Border [0 0 0]
/Dest (_cldsmodelinstance)
/Subtype /Link
@@ -25745,7 +24906,7 @@ endobj
/Type /Annot
>>
endobj
-217 0 obj
+206 0 obj
<< /Border [0 0 0]
/Dest (_cldsevent)
/Subtype /Link
@@ -25753,8 +24914,8 @@ endobj
/Type /Annot
>>
endobj
-218 0 obj
-<< /Length 19709
+207 0 obj
+<< /Length 19699
>>
stream
q
@@ -27143,7 +26304,7 @@ S
BT
51.24 115.03300000000017 Td
/F2.0 10.5 Tf
-<6d6f64656c4e616d65> Tj
+<6d6f64656c4964> Tj
ET
@@ -27225,7 +26386,7 @@ S
BT
51.24 77.47300000000017 Td
/F2.0 10.5 Tf
-<73657276696365547970654964> Tj
+<6d6f64656c4e616d65> Tj
ET
@@ -27288,9 +26449,9 @@ q
0.200 0.200 0.200 SCN
BT
-49.24 14.388 Td
+552.698 14.388 Td
/F1.0 9 Tf
-<3138> Tj
+<3137> Tj
ET
0.000 0.000 0.000 SCN
@@ -27300,29 +26461,29 @@ Q
endstream
endobj
-219 0 obj
+208 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 218 0 R
+/Contents 207 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
/F3.0 24 0 R
/F1.0 8 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
>>
endobj
-220 0 obj
-[219 0 R /XYZ 0 495.3600000000003 null]
+209 0 obj
+[208 0 R /XYZ 0 495.3600000000003 null]
endobj
-221 0 obj
-[219 0 R /XYZ 0 307.3200000000002 null]
+210 0 obj
+[208 0 R /XYZ 0 307.3200000000002 null]
endobj
-222 0 obj
-<< /Length 20438
+211 0 obj
+<< /Length 20681
>>
stream
q
@@ -27359,6 +26520,14 @@ f
269.177 620.040 294.583 37.560 re
f
0.000 0.000 0.000 scn
+0.976 0.976 0.976 scn
+48.240 582.480 220.937 37.560 re
+f
+0.000 0.000 0.000 scn
+0.976 0.976 0.976 scn
+269.177 582.480 294.583 37.560 re
+f
+0.000 0.000 0.000 scn
0.5 w
/DeviceRGB CS
0.867 0.867 0.867 SCN
@@ -27461,7 +26630,7 @@ S
BT
51.24 716.473 Td
/F2.0 10.5 Tf
-<74656d706c6174654e616d65> Tj
+<73657276696365547970654964> Tj
ET
@@ -27543,7 +26712,7 @@ S
BT
51.24 678.913 Td
/F2.0 10.5 Tf
-<74696d657374616d70> Tj
+<74656d706c6174654e616d65> Tj
ET
@@ -27625,7 +26794,7 @@ S
BT
51.24 641.3530000000001 Td
/F2.0 10.5 Tf
-<757365726964> Tj
+<74696d657374616d70> Tj
ET
@@ -27676,11 +26845,93 @@ BT
ET
0.000 0.000 0.000 scn
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 620.040 m
+269.177 620.040 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 582.480 m
+269.177 582.480 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 620.290 m
+48.240 582.230 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 620.290 m
+269.177 582.230 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+51.24 603.7929999999999 Td
+/F2.0 10.5 Tf
+<757365726964> Tj
+ET
+
+
+BT
+51.24 589.5129999999999 Td
+ET
+
+
+BT
+51.24 589.5129999999999 Td
+/F3.0 10.5 Tf
+<6f7074696f6e616c> Tj
+ET
+
+0.000 0.000 0.000 scn
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 620.040 m
+563.760 620.040 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 582.480 m
+563.760 582.480 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 620.290 m
+269.177 582.230 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+563.760 620.290 m
+563.760 582.230 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+272.17692192000004 596.6529999999999 Td
+/F1.0 10.5 Tf
+<737472696e67> Tj
+ET
+
+0.000 0.000 0.000 scn
0.200 0.200 0.200 scn
0.200 0.200 0.200 SCN
BT
-48.24 584.616 Td
+48.24 547.056 Td
/F2.0 18 Tf
[<332e382e20436c647354> 29.78515625 <656d706c617465>] TJ
ET
@@ -27688,209 +26939,131 @@ ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 544.680 220.937 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-269.177 544.680 294.583 23.280 re
+48.240 507.120 220.937 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 507.120 220.937 37.560 re
+269.177 507.120 294.583 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 507.120 294.583 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
48.240 469.560 220.937 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
269.177 469.560 294.583 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
48.240 432.000 220.937 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
269.177 432.000 294.583 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
48.240 394.440 220.937 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
269.177 394.440 294.583 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
48.240 356.880 220.937 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
269.177 356.880 294.583 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
48.240 319.320 220.937 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
269.177 319.320 294.583 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
48.240 281.760 220.937 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
269.177 281.760 294.583 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
48.240 244.200 220.937 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
269.177 244.200 294.583 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
48.240 206.640 220.937 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
269.177 206.640 294.583 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
48.240 169.080 220.937 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
269.177 169.080 294.583 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
48.240 131.520 220.937 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
269.177 131.520 294.583 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
48.240 93.960 220.937 37.560 re
f
0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
+1.000 1.000 1.000 scn
269.177 93.960 294.583 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
48.240 56.400 220.937 37.560 re
f
0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
+0.976 0.976 0.976 scn
269.177 56.400 294.583 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 567.960 m
-269.177 567.960 l
-S
-[ ] 0 d
-1.5 w
-0.867 0.867 0.867 SCN
-48.240 544.680 m
-269.177 544.680 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 568.210 m
-48.240 543.930 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-269.177 568.210 m
-269.177 543.930 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-51.24 552.213 Td
-/F2.0 10.5 Tf
-<4e616d65> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-269.177 567.960 m
-563.760 567.960 l
+48.240 530.400 m
+269.177 530.400 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-269.177 544.680 m
-563.760 544.680 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-269.177 568.210 m
-269.177 543.930 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-563.760 568.210 m
-563.760 543.930 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-272.17692192000004 552.213 Td
-/F2.0 10.5 Tf
-<536368656d61> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 544.680 m
-269.177 544.680 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
48.240 507.120 m
269.177 507.120 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 544.930 m
-48.240 506.870 l
+48.240 530.650 m
+48.240 506.370 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 544.930 m
-269.177 506.870 l
+269.177 530.650 m
+269.177 506.370 l
S
[ ] 0 d
1 w
@@ -27898,31 +27071,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 528.433 Td
+51.24 514.653 Td
/F2.0 10.5 Tf
-<62706d6e4964> Tj
-ET
-
-
-BT
-51.24 514.153 Td
-ET
-
-
-BT
-51.24 514.153 Td
-/F3.0 10.5 Tf
-<6f7074696f6e616c> Tj
+<4e616d65> Tj
ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-269.177 544.680 m
-563.760 544.680 l
+269.177 530.400 m
+563.760 530.400 l
S
[ ] 0 d
-0.5 w
+1.5 w
0.867 0.867 0.867 SCN
269.177 507.120 m
563.760 507.120 l
@@ -27930,14 +27091,14 @@ S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 544.930 m
-269.177 506.870 l
+269.177 530.650 m
+269.177 506.370 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 544.930 m
-563.760 506.870 l
+563.760 530.650 m
+563.760 506.370 l
S
[ ] 0 d
1 w
@@ -27945,9 +27106,9 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 521.293 Td
-/F1.0 10.5 Tf
-<737472696e67> Tj
+272.17692192000004 514.653 Td
+/F2.0 10.5 Tf
+<536368656d61> Tj
ET
0.000 0.000 0.000 scn
@@ -27980,19 +27141,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 490.873 Td
+51.24 490.8730000000001 Td
/F2.0 10.5 Tf
-[<62706d6e54> 29.78515625 <657874>] TJ
+<62706d6e4964> Tj
ET
BT
-51.24 476.59299999999996 Td
+51.24 476.5930000000001 Td
ET
BT
-51.24 476.59299999999996 Td
+51.24 476.5930000000001 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28027,7 +27188,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 483.733 Td
+272.17692192000004 483.7330000000001 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28064,7 +27225,7 @@ S
BT
51.24 453.31300000000005 Td
/F2.0 10.5 Tf
-<62706d6e557365726964> Tj
+[<62706d6e54> 29.78515625 <657874>] TJ
ET
@@ -28144,19 +27305,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 415.753 Td
+51.24 415.7530000000001 Td
/F2.0 10.5 Tf
-<636f6e74726f6c4e616d65507265666978> Tj
+<62706d6e557365726964> Tj
ET
BT
-51.24 401.47299999999996 Td
+51.24 401.47300000000007 Td
ET
BT
-51.24 401.47299999999996 Td
+51.24 401.47300000000007 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28191,7 +27352,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 408.613 Td
+272.17692192000004 408.6130000000001 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28228,7 +27389,7 @@ S
BT
51.24 378.19300000000004 Td
/F2.0 10.5 Tf
-<636f6e74726f6c4e616d6555756964> Tj
+<636f6e74726f6c4e616d65507265666978> Tj
ET
@@ -28308,19 +27469,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 340.633 Td
+51.24 340.6330000000001 Td
/F2.0 10.5 Tf
-<6964> Tj
+<636f6e74726f6c4e616d6555756964> Tj
ET
BT
-51.24 326.35299999999995 Td
+51.24 326.35300000000007 Td
ET
BT
-51.24 326.35299999999995 Td
+51.24 326.35300000000007 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28355,7 +27516,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 333.493 Td
+272.17692192000004 333.4930000000001 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28392,7 +27553,7 @@ S
BT
51.24 303.07300000000004 Td
/F2.0 10.5 Tf
-<696d6167654964> Tj
+<6964> Tj
ET
@@ -28472,19 +27633,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 265.513 Td
+51.24 265.5130000000001 Td
/F2.0 10.5 Tf
-[<696d61676554> 29.78515625 <657874>] TJ
+<696d6167654964> Tj
ET
BT
-51.24 251.23299999999998 Td
+51.24 251.2330000000001 Td
ET
BT
-51.24 251.23299999999998 Td
+51.24 251.2330000000001 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28519,7 +27680,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 258.373 Td
+272.17692192000004 258.3730000000001 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28554,19 +27715,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 227.953 Td
+51.24 227.95300000000006 Td
/F2.0 10.5 Tf
-<696d616765557365726964> Tj
+[<696d61676554> 29.78515625 <657874>] TJ
ET
BT
-51.24 213.673 Td
+51.24 213.67300000000006 Td
ET
BT
-51.24 213.673 Td
+51.24 213.67300000000006 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28601,7 +27762,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 220.813 Td
+272.17692192000004 220.81300000000005 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28636,19 +27797,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 190.393 Td
+51.24 190.39300000000006 Td
/F2.0 10.5 Tf
-<6e616d65> Tj
+<696d616765557365726964> Tj
ET
BT
-51.24 176.113 Td
+51.24 176.11300000000006 Td
ET
BT
-51.24 176.113 Td
+51.24 176.11300000000006 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28683,7 +27844,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 183.253 Td
+272.17692192000004 183.25300000000004 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28718,19 +27879,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 152.833 Td
+51.24 152.83300000000006 Td
/F2.0 10.5 Tf
-<70726f704964> Tj
+<6e616d65> Tj
ET
BT
-51.24 138.553 Td
+51.24 138.55300000000005 Td
ET
BT
-51.24 138.553 Td
+51.24 138.55300000000005 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28765,7 +27926,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 145.69299999999998 Td
+272.17692192000004 145.69300000000004 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28800,19 +27961,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 115.27299999999998 Td
+51.24 115.27300000000004 Td
/F2.0 10.5 Tf
-[<70726f7054> 29.78515625 <657874>] TJ
+<70726f704964> Tj
ET
BT
-51.24 100.99299999999998 Td
+51.24 100.99300000000004 Td
ET
BT
-51.24 100.99299999999998 Td
+51.24 100.99300000000004 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28847,7 +28008,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 108.13299999999998 Td
+272.17692192000004 108.13300000000004 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28882,19 +28043,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 77.71299999999998 Td
+51.24 77.71300000000004 Td
/F2.0 10.5 Tf
-<70726f70557365726964> Tj
+[<70726f7054> 29.78515625 <657874>] TJ
ET
BT
-51.24 63.43299999999998 Td
+51.24 63.433000000000035 Td
ET
BT
-51.24 63.43299999999998 Td
+51.24 63.433000000000035 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -28929,7 +28090,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 70.57299999999998 Td
+272.17692192000004 70.57300000000004 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -28947,9 +28108,9 @@ q
0.200 0.200 0.200 SCN
BT
-552.698 14.388 Td
+49.24 14.388 Td
/F1.0 9 Tf
-<3139> Tj
+<3138> Tj
ET
0.000 0.000 0.000 SCN
@@ -28959,26 +28120,26 @@ Q
endstream
endobj
-223 0 obj
+212 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 222 0 R
+/Contents 211 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
/F3.0 24 0 R
/F1.0 8 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
>>
endobj
-224 0 obj
-[223 0 R /XYZ 0 608.04 null]
+213 0 obj
+[212 0 R /XYZ 0 570.48 null]
endobj
-225 0 obj
-<< /Length 19878
+214 0 obj
+<< /Length 19744
>>
stream
q
@@ -28999,6 +28160,14 @@ f
269.177 695.160 294.583 37.560 re
f
0.000 0.000 0.000 scn
+0.976 0.976 0.976 scn
+48.240 657.600 220.937 37.560 re
+f
+0.000 0.000 0.000 scn
+0.976 0.976 0.976 scn
+269.177 657.600 294.583 37.560 re
+f
+0.000 0.000 0.000 scn
0.5 w
/DeviceRGB CS
0.867 0.867 0.867 SCN
@@ -29101,17 +28270,17 @@ S
BT
51.24 716.473 Td
/F2.0 10.5 Tf
-[<7573657241> 20.01953125 <7574686f72697a656454> 29.78515625 <6f557064617465>] TJ
+<70726f70557365726964> Tj
ET
BT
-51.24 702.1929999999999 Td
+51.24 702.193 Td
ET
BT
-51.24 702.1929999999999 Td
+51.24 702.193 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -29146,7 +28315,89 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 709.3329999999999 Td
+272.17692192000004 709.333 Td
+/F1.0 10.5 Tf
+<737472696e67> Tj
+ET
+
+0.000 0.000 0.000 scn
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 695.160 m
+269.177 695.160 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 657.600 m
+269.177 657.600 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 695.410 m
+48.240 657.350 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 695.410 m
+269.177 657.350 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+51.24 678.913 Td
+/F2.0 10.5 Tf
+[<7573657241> 20.01953125 <7574686f72697a656454> 29.78515625 <6f557064617465>] TJ
+ET
+
+
+BT
+51.24 664.6329999999999 Td
+ET
+
+
+BT
+51.24 664.6329999999999 Td
+/F3.0 10.5 Tf
+<6f7074696f6e616c> Tj
+ET
+
+0.000 0.000 0.000 scn
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 695.160 m
+563.760 695.160 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 657.600 m
+563.760 657.600 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 695.410 m
+269.177 657.350 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+563.760 695.410 m
+563.760 657.350 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+272.17692192000004 671.7729999999999 Td
/F1.0 10.5 Tf
<626f6f6c65616e> Tj
ET
@@ -29156,7 +28407,7 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24 659.7359999999999 Td
+48.24 622.1759999999999 Td
/F2.0 18 Tf
[<332e392e20436c647354> 29.78515625 <6f7363614d6f64656c>] TJ
ET
@@ -29164,185 +28415,115 @@ ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 619.800 220.937 23.280 re
+48.240 582.240 220.937 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 619.800 294.583 23.280 re
+269.177 582.240 294.583 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 582.240 220.937 37.560 re
+48.240 544.680 220.937 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 582.240 294.583 37.560 re
+269.177 544.680 294.583 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-48.240 544.680 220.937 37.560 re
+48.240 507.120 220.937 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-269.177 544.680 294.583 37.560 re
+269.177 507.120 294.583 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 507.120 220.937 37.560 re
+48.240 469.560 220.937 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 507.120 294.583 37.560 re
+269.177 469.560 294.583 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-48.240 469.560 220.937 37.560 re
+48.240 432.000 220.937 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-269.177 469.560 294.583 37.560 re
+269.177 432.000 294.583 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 432.000 220.937 37.560 re
+48.240 394.440 220.937 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 432.000 294.583 37.560 re
+269.177 394.440 294.583 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-48.240 394.440 220.937 37.560 re
+48.240 356.880 220.937 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-269.177 394.440 294.583 37.560 re
+269.177 356.880 294.583 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 356.880 220.937 37.560 re
+48.240 319.320 220.937 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 356.880 294.583 37.560 re
+269.177 319.320 294.583 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-48.240 319.320 220.937 37.560 re
+48.240 281.760 220.937 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-269.177 319.320 294.583 37.560 re
+269.177 281.760 294.583 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 281.760 220.937 37.560 re
+48.240 244.200 220.937 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 281.760 294.583 37.560 re
+269.177 244.200 294.583 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-48.240 244.200 220.937 37.560 re
+48.240 206.640 220.937 37.560 re
f
0.000 0.000 0.000 scn
0.976 0.976 0.976 scn
-269.177 244.200 294.583 37.560 re
+269.177 206.640 294.583 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 643.080 m
-269.177 643.080 l
-S
-[ ] 0 d
-1.5 w
-0.867 0.867 0.867 SCN
-48.240 619.800 m
-269.177 619.800 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 643.330 m
-48.240 619.050 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-269.177 643.330 m
-269.177 619.050 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-51.24 627.3329999999999 Td
-/F2.0 10.5 Tf
-<4e616d65> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-269.177 643.080 m
-563.760 643.080 l
+48.240 605.520 m
+269.177 605.520 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-269.177 619.800 m
-563.760 619.800 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-269.177 643.330 m
-269.177 619.050 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
-563.760 643.330 m
-563.760 619.050 l
-S
-[ ] 0 d
-1 w
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-272.17692192000004 627.3329999999999 Td
-/F2.0 10.5 Tf
-<536368656d61> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.5 w
-0.867 0.867 0.867 SCN
-48.240 619.800 m
-269.177 619.800 l
-S
-[ ] 0 d
-0.5 w
-0.867 0.867 0.867 SCN
48.240 582.240 m
269.177 582.240 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 620.050 m
-48.240 581.990 l
+48.240 605.770 m
+48.240 581.490 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 620.050 m
-269.177 581.990 l
+269.177 605.770 m
+269.177 581.490 l
S
[ ] 0 d
1 w
@@ -29350,31 +28531,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 603.5529999999999 Td
+51.24 589.7729999999999 Td
/F2.0 10.5 Tf
-<6372656174656444617465> Tj
-ET
-
-
-BT
-51.24 589.2729999999999 Td
-ET
-
-
-BT
-51.24 589.2729999999999 Td
-/F3.0 10.5 Tf
-<6f7074696f6e616c> Tj
+<4e616d65> Tj
ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-269.177 619.800 m
-563.760 619.800 l
+269.177 605.520 m
+563.760 605.520 l
S
[ ] 0 d
-0.5 w
+1.5 w
0.867 0.867 0.867 SCN
269.177 582.240 m
563.760 582.240 l
@@ -29382,14 +28551,14 @@ S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 620.050 m
-269.177 581.990 l
+269.177 605.770 m
+269.177 581.490 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 620.050 m
-563.760 581.990 l
+563.760 605.770 m
+563.760 581.490 l
S
[ ] 0 d
1 w
@@ -29397,9 +28566,9 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 596.4129999999999 Td
-/F1.0 10.5 Tf
-<737472696e67> Tj
+272.17692192000004 589.7729999999999 Td
+/F2.0 10.5 Tf
+<536368656d61> Tj
ET
0.000 0.000 0.000 scn
@@ -29434,17 +28603,17 @@ S
BT
51.24 565.9929999999999 Td
/F2.0 10.5 Tf
-<6964> Tj
+<6372656174656444617465> Tj
ET
BT
-51.24 551.7129999999999 Td
+51.24 551.713 Td
ET
BT
-51.24 551.7129999999999 Td
+51.24 551.713 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -29479,7 +28648,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 558.8529999999998 Td
+272.17692192000004 558.853 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -29516,7 +28685,7 @@ S
BT
51.24 528.433 Td
/F2.0 10.5 Tf
-<6c6173745570646174656444617465> Tj
+<6964> Tj
ET
@@ -29596,19 +28765,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 490.8729999999999 Td
+51.24 490.873 Td
/F2.0 10.5 Tf
-<706f6c69637954797065> Tj
+<6c6173745570646174656444617465> Tj
ET
BT
-51.24 476.59299999999985 Td
+51.24 476.59299999999996 Td
ET
BT
-51.24 476.59299999999985 Td
+51.24 476.59299999999996 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -29643,7 +28812,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 483.7329999999999 Td
+272.17692192000004 483.733 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -29680,7 +28849,7 @@ S
BT
51.24 453.31299999999993 Td
/F2.0 10.5 Tf
-<7265766973696f6e4964> Tj
+<706f6c69637954797065> Tj
ET
@@ -29760,19 +28929,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 415.7529999999999 Td
+51.24 415.753 Td
/F2.0 10.5 Tf
-<746f7363614d6f64656c4a736f6e> Tj
+<7265766973696f6e4964> Tj
ET
BT
-51.24 401.47299999999984 Td
+51.24 401.47299999999996 Td
ET
BT
-51.24 401.47299999999984 Td
+51.24 401.47299999999996 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -29807,7 +28976,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 408.6129999999999 Td
+272.17692192000004 408.613 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -29844,7 +29013,7 @@ S
BT
51.24 378.1929999999999 Td
/F2.0 10.5 Tf
-<746f7363614d6f64656c4e616d65> Tj
+<746f7363614d6f64656c4a736f6e> Tj
ET
@@ -29924,19 +29093,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 340.63299999999987 Td
+51.24 340.633 Td
/F2.0 10.5 Tf
-[<746f7363614d6f64656c59> 60.05859375 <616d6c>] TJ
+<746f7363614d6f64656c4e616d65> Tj
ET
BT
-51.24 326.35299999999984 Td
+51.24 326.35299999999995 Td
ET
BT
-51.24 326.35299999999984 Td
+51.24 326.35299999999995 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -29971,7 +29140,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 333.4929999999999 Td
+272.17692192000004 333.493 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -30006,9 +29175,9 @@ S
0.200 0.200 0.200 scn
BT
-51.24 303.07299999999987 Td
+51.24 303.0729999999999 Td
/F2.0 10.5 Tf
-<757365724964> Tj
+[<746f7363614d6f64656c59> 60.05859375 <616d6c>] TJ
ET
@@ -30053,7 +29222,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 295.9329999999999 Td
+272.17692192000004 295.93299999999994 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -30088,19 +29257,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 265.51299999999986 Td
+51.24 265.5129999999999 Td
/F2.0 10.5 Tf
-<76657273696f6e> Tj
+<757365724964> Tj
ET
BT
-51.24 251.23299999999986 Td
+51.24 251.23299999999992 Td
ET
BT
-51.24 251.23299999999986 Td
+51.24 251.23299999999992 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -30135,77 +29304,34 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 258.3729999999999 Td
+272.17692192000004 258.37299999999993 Td
/F1.0 10.5 Tf
-<6e756d6265722028646f75626c6529> Tj
-ET
-
-0.000 0.000 0.000 scn
-0.200 0.200 0.200 scn
-0.200 0.200 0.200 SCN
-
-BT
-48.24 208.77599999999987 Td
-/F2.0 18 Tf
-<332e31302e20446361654576656e74> Tj
+<737472696e67> Tj
ET
-0.000 0.000 0.000 SCN
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-48.240 168.840 220.937 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-269.177 168.840 294.583 23.280 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-48.240 131.280 220.937 37.560 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-269.177 131.280 294.583 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
-48.240 93.720 220.937 37.560 re
-f
-0.000 0.000 0.000 scn
-0.976 0.976 0.976 scn
-269.177 93.720 294.583 37.560 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-48.240 56.160 220.937 37.560 re
-f
-0.000 0.000 0.000 scn
-1.000 1.000 1.000 scn
-269.177 56.160 294.583 37.560 re
-f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 192.120 m
-269.177 192.120 l
+48.240 244.200 m
+269.177 244.200 l
S
[ ] 0 d
-1.5 w
+0.5 w
0.867 0.867 0.867 SCN
-48.240 168.840 m
-269.177 168.840 l
+48.240 206.640 m
+269.177 206.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 192.370 m
-48.240 168.090 l
+48.240 244.450 m
+48.240 206.390 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 192.370 m
-269.177 168.090 l
+269.177 244.450 m
+269.177 206.390 l
S
[ ] 0 d
1 w
@@ -30213,34 +29339,46 @@ S
0.200 0.200 0.200 scn
BT
-51.24 176.37299999999988 Td
+51.24 227.95299999999995 Td
/F2.0 10.5 Tf
-<4e616d65> Tj
+<76657273696f6e> Tj
+ET
+
+
+BT
+51.24 213.67299999999994 Td
+ET
+
+
+BT
+51.24 213.67299999999994 Td
+/F3.0 10.5 Tf
+<6f7074696f6e616c> Tj
ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-269.177 192.120 m
-563.760 192.120 l
+269.177 244.200 m
+563.760 244.200 l
S
[ ] 0 d
-1.5 w
+0.5 w
0.867 0.867 0.867 SCN
-269.177 168.840 m
-563.760 168.840 l
+269.177 206.640 m
+563.760 206.640 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 192.370 m
-269.177 168.090 l
+269.177 244.450 m
+269.177 206.390 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 192.370 m
-563.760 168.090 l
+563.760 244.450 m
+563.760 206.390 l
S
[ ] 0 d
1 w
@@ -30248,19 +29386,54 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 176.37299999999988 Td
-/F2.0 10.5 Tf
-<536368656d61> Tj
+272.17692192000004 220.81299999999993 Td
+/F1.0 10.5 Tf
+<6e756d6265722028646f75626c6529> Tj
+ET
+
+0.000 0.000 0.000 scn
+0.200 0.200 0.200 scn
+0.200 0.200 0.200 SCN
+
+BT
+48.24 171.2159999999999 Td
+/F2.0 18 Tf
+<332e31302e20446361654576656e74> Tj
ET
+0.000 0.000 0.000 SCN
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+48.240 131.280 220.937 23.280 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+269.177 131.280 294.583 23.280 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+48.240 93.720 220.937 37.560 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+269.177 93.720 294.583 37.560 re
+f
+0.000 0.000 0.000 scn
+0.976 0.976 0.976 scn
+48.240 56.160 220.937 37.560 re
+f
+0.000 0.000 0.000 scn
+0.976 0.976 0.976 scn
+269.177 56.160 294.583 37.560 re
+f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 168.840 m
-269.177 168.840 l
+48.240 154.560 m
+269.177 154.560 l
S
[ ] 0 d
-0.5 w
+1.5 w
0.867 0.867 0.867 SCN
48.240 131.280 m
269.177 131.280 l
@@ -30268,14 +29441,14 @@ S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 169.090 m
-48.240 131.030 l
+48.240 154.810 m
+48.240 130.530 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 169.090 m
-269.177 131.030 l
+269.177 154.810 m
+269.177 130.530 l
S
[ ] 0 d
1 w
@@ -30283,31 +29456,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 152.59299999999988 Td
+51.24 138.81299999999993 Td
/F2.0 10.5 Tf
-<61727469666163744e616d65> Tj
-ET
-
-
-BT
-51.24 138.31299999999987 Td
-ET
-
-
-BT
-51.24 138.31299999999987 Td
-/F3.0 10.5 Tf
-<6f7074696f6e616c> Tj
+<4e616d65> Tj
ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-269.177 168.840 m
-563.760 168.840 l
+269.177 154.560 m
+563.760 154.560 l
S
[ ] 0 d
-0.5 w
+1.5 w
0.867 0.867 0.867 SCN
269.177 131.280 m
563.760 131.280 l
@@ -30315,14 +29476,14 @@ S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 169.090 m
-269.177 131.030 l
+269.177 154.810 m
+269.177 130.530 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 169.090 m
-563.760 131.030 l
+563.760 154.810 m
+563.760 130.530 l
S
[ ] 0 d
1 w
@@ -30330,9 +29491,9 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 145.45299999999986 Td
-/F1.0 10.5 Tf
-<737472696e67> Tj
+272.17692192000004 138.81299999999993 Td
+/F2.0 10.5 Tf
+<536368656d61> Tj
ET
0.000 0.000 0.000 scn
@@ -30365,19 +29526,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 115.03299999999986 Td
+51.24 115.03299999999992 Td
/F2.0 10.5 Tf
-[<636c647341> 20.01953125 <6374696f6e4364>] TJ
+<61727469666163744e616d65> Tj
ET
BT
-51.24 100.75299999999986 Td
+51.24 100.75299999999991 Td
ET
BT
-51.24 100.75299999999986 Td
+51.24 100.75299999999991 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -30412,7 +29573,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 107.89299999999986 Td
+272.17692192000004 107.89299999999992 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -30447,19 +29608,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 77.47299999999986 Td
+51.24 77.47299999999991 Td
/F2.0 10.5 Tf
-<636f6e74726f6c4e616d65> Tj
+[<636c647341> 20.01953125 <6374696f6e4364>] TJ
ET
BT
-51.24 63.192999999999856 Td
+51.24 63.19299999999991 Td
ET
BT
-51.24 63.192999999999856 Td
+51.24 63.19299999999991 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -30494,7 +29655,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 70.33299999999986 Td
+272.17692192000004 70.33299999999991 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -30512,9 +29673,9 @@ q
0.200 0.200 0.200 SCN
BT
-49.24 14.388 Td
+552.698 14.388 Td
/F1.0 9 Tf
-<3230> Tj
+<3139> Tj
ET
0.000 0.000 0.000 SCN
@@ -30524,34 +29685,34 @@ Q
endstream
endobj
-226 0 obj
+215 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 225 0 R
+/Contents 214 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
/F3.0 24 0 R
/F1.0 8 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
>>
endobj
-227 0 obj
-[226 0 R /XYZ 0 683.1599999999999 null]
+216 0 obj
+[215 0 R /XYZ 0 645.5999999999999 null]
endobj
-228 0 obj
+217 0 obj
<< /Limits [(_consumes_2) (_parameters)]
-/Names [(_consumes_2) 51 0 R (_consumes_3) 61 0 R (_consumes_4) 90 0 R (_consumes_5) 111 0 R (_consumes_6) 141 0 R (_consumes_7) 154 0 R (_consumes_8) 169 0 R (_consumes_9) 198 0 R (_dcaeevent) 229 0 R (_definitions) 205 0 R (_overview) 19 0 R (_parameters) 30 0 R]
+/Names [(_consumes_2) 51 0 R (_consumes_3) 61 0 R (_consumes_4) 90 0 R (_consumes_5) 101 0 R (_consumes_6) 131 0 R (_consumes_7) 145 0 R (_consumes_8) 160 0 R (_consumes_9) 187 0 R (_dcaeevent) 218 0 R (_definitions) 194 0 R (_overview) 19 0 R (_parameters) 30 0 R]
>>
endobj
-229 0 obj
-[226 0 R /XYZ 0 232.19999999999987 null]
+218 0 obj
+[215 0 R /XYZ 0 194.63999999999993 null]
endobj
-230 0 obj
-<< /Length 8414
+219 0 obj
+<< /Length 9595
>>
stream
q
@@ -30596,6 +29757,14 @@ f
269.177 582.480 294.583 37.560 re
f
0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+48.240 544.920 220.937 37.560 re
+f
+0.000 0.000 0.000 scn
+1.000 1.000 1.000 scn
+269.177 544.920 294.583 37.560 re
+f
+0.000 0.000 0.000 scn
0.5 w
/DeviceRGB CS
0.867 0.867 0.867 SCN
@@ -30698,7 +29867,7 @@ S
BT
51.24 716.473 Td
/F2.0 10.5 Tf
-<6576656e74> Tj
+<636f6e74726f6c4e616d65> Tj
ET
@@ -30780,17 +29949,17 @@ S
BT
51.24 678.913 Td
/F2.0 10.5 Tf
-<696e7374616e636573> Tj
+<6576656e74> Tj
ET
BT
-51.24 664.633 Td
+51.24 664.6329999999999 Td
ET
BT
-51.24 664.633 Td
+51.24 664.6329999999999 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -30823,33 +29992,11 @@ S
1 w
0.000 0.000 0.000 SCN
0.200 0.200 0.200 scn
-0.259 0.545 0.792 scn
-0.259 0.545 0.792 SCN
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-272.17692192000004 671.773 Td
-/F1.0 10.5 Tf
-<3c20> Tj
-ET
-
-0.259 0.545 0.792 scn
-0.259 0.545 0.792 SCN
BT
-280.76592192000004 671.773 Td
+272.17692192000004 671.7729999999999 Td
/F1.0 10.5 Tf
-<436c64734d6f64656c496e7374616e6365> Tj
-ET
-
-0.000 0.000 0.000 SCN
-0.200 0.200 0.200 scn
-
-BT
-375.34992192000004 671.773 Td
-/F1.0 10.5 Tf
-[<203e20617272> 20.01953125 <61> 20.01953125 <79>] TJ
+<737472696e67> Tj
ET
0.000 0.000 0.000 scn
@@ -30884,7 +30031,7 @@ S
BT
51.24 641.3530000000001 Td
/F2.0 10.5 Tf
-<7265736f7572636555554944> Tj
+<696e7374616e636573> Tj
ET
@@ -30927,11 +30074,33 @@ S
1 w
0.000 0.000 0.000 SCN
0.200 0.200 0.200 scn
+0.259 0.545 0.792 scn
+0.259 0.545 0.792 SCN
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
BT
272.17692192000004 634.213 Td
/F1.0 10.5 Tf
-<737472696e67> Tj
+<3c20> Tj
+ET
+
+0.259 0.545 0.792 scn
+0.259 0.545 0.792 SCN
+
+BT
+280.76592192000004 634.213 Td
+/F1.0 10.5 Tf
+<436c64734d6f64656c496e7374616e6365> Tj
+ET
+
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+375.34992192000004 634.213 Td
+/F1.0 10.5 Tf
+[<203e20617272> 20.01953125 <61> 20.01953125 <79>] TJ
ET
0.000 0.000 0.000 scn
@@ -30964,19 +30133,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 603.7930000000001 Td
+51.24 603.7929999999999 Td
/F2.0 10.5 Tf
-<7365727669636555554944> Tj
+<7265736f7572636555554944> Tj
ET
BT
-51.24 589.513 Td
+51.24 589.5129999999999 Td
ET
BT
-51.24 589.513 Td
+51.24 589.5129999999999 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -31011,7 +30180,89 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 596.653 Td
+272.17692192000004 596.6529999999999 Td
+/F1.0 10.5 Tf
+<737472696e67> Tj
+ET
+
+0.000 0.000 0.000 scn
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 582.480 m
+269.177 582.480 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 544.920 m
+269.177 544.920 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+48.240 582.730 m
+48.240 544.670 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 582.730 m
+269.177 544.670 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+51.24 566.233 Td
+/F2.0 10.5 Tf
+<7365727669636555554944> Tj
+ET
+
+
+BT
+51.24 551.953 Td
+ET
+
+
+BT
+51.24 551.953 Td
+/F3.0 10.5 Tf
+<6f7074696f6e616c> Tj
+ET
+
+0.000 0.000 0.000 scn
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 582.480 m
+563.760 582.480 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 544.920 m
+563.760 544.920 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+269.177 582.730 m
+269.177 544.670 l
+S
+[ ] 0 d
+0.5 w
+0.867 0.867 0.867 SCN
+563.760 582.730 m
+563.760 544.670 l
+S
+[ ] 0 d
+1 w
+0.000 0.000 0.000 SCN
+0.200 0.200 0.200 scn
+
+BT
+272.17692192000004 559.093 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -31021,7 +30272,7 @@ ET
0.200 0.200 0.200 SCN
BT
-48.24 547.056 Td
+48.24 509.49600000000015 Td
/F2.0 18 Tf
[<332e31312e2056> 60.05859375 <616c75654974656d>] TJ
ET
@@ -31029,43 +30280,43 @@ ET
0.000 0.000 0.000 SCN
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 507.120 220.937 23.280 re
+48.240 469.560 220.937 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 507.120 294.583 23.280 re
+269.177 469.560 294.583 23.280 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-48.240 469.560 220.937 37.560 re
+48.240 432.000 220.937 37.560 re
f
0.000 0.000 0.000 scn
1.000 1.000 1.000 scn
-269.177 469.560 294.583 37.560 re
+269.177 432.000 294.583 37.560 re
f
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 530.400 m
-269.177 530.400 l
+48.240 492.840 m
+269.177 492.840 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-48.240 507.120 m
-269.177 507.120 l
+48.240 469.560 m
+269.177 469.560 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 530.650 m
-48.240 506.370 l
+48.240 493.090 m
+48.240 468.810 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 530.650 m
-269.177 506.370 l
+269.177 493.090 m
+269.177 468.810 l
S
[ ] 0 d
1 w
@@ -31073,7 +30324,7 @@ S
0.200 0.200 0.200 scn
BT
-51.24 514.653 Td
+51.24 477.0930000000001 Td
/F2.0 10.5 Tf
<4e616d65> Tj
ET
@@ -31081,26 +30332,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-269.177 530.400 m
-563.760 530.400 l
+269.177 492.840 m
+563.760 492.840 l
S
[ ] 0 d
1.5 w
0.867 0.867 0.867 SCN
-269.177 507.120 m
-563.760 507.120 l
+269.177 469.560 m
+563.760 469.560 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 530.650 m
-269.177 506.370 l
+269.177 493.090 m
+269.177 468.810 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 530.650 m
-563.760 506.370 l
+563.760 493.090 m
+563.760 468.810 l
S
[ ] 0 d
1 w
@@ -31108,7 +30359,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 514.653 Td
+272.17692192000004 477.0930000000001 Td
/F2.0 10.5 Tf
<536368656d61> Tj
ET
@@ -31116,26 +30367,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-48.240 507.120 m
-269.177 507.120 l
+48.240 469.560 m
+269.177 469.560 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 469.560 m
-269.177 469.560 l
+48.240 432.000 m
+269.177 432.000 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-48.240 507.370 m
-48.240 469.310 l
+48.240 469.810 m
+48.240 431.750 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 507.370 m
-269.177 469.310 l
+269.177 469.810 m
+269.177 431.750 l
S
[ ] 0 d
1 w
@@ -31143,19 +30394,19 @@ S
0.200 0.200 0.200 scn
BT
-51.24 490.8730000000001 Td
+51.24 453.31300000000005 Td
/F2.0 10.5 Tf
<76616c7565> Tj
ET
BT
-51.24 476.5930000000001 Td
+51.24 439.033 Td
ET
BT
-51.24 476.5930000000001 Td
+51.24 439.033 Td
/F3.0 10.5 Tf
<6f7074696f6e616c> Tj
ET
@@ -31163,26 +30414,26 @@ ET
0.000 0.000 0.000 scn
0.5 w
0.867 0.867 0.867 SCN
-269.177 507.120 m
-563.760 507.120 l
+269.177 469.560 m
+563.760 469.560 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 469.560 m
-563.760 469.560 l
+269.177 432.000 m
+563.760 432.000 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-269.177 507.370 m
-269.177 469.310 l
+269.177 469.810 m
+269.177 431.750 l
S
[ ] 0 d
0.5 w
0.867 0.867 0.867 SCN
-563.760 507.370 m
-563.760 469.310 l
+563.760 469.810 m
+563.760 431.750 l
S
[ ] 0 d
1 w
@@ -31190,7 +30441,7 @@ S
0.200 0.200 0.200 scn
BT
-272.17692192000004 483.7330000000001 Td
+272.17692192000004 446.17300000000006 Td
/F1.0 10.5 Tf
<737472696e67> Tj
ET
@@ -31208,9 +30459,9 @@ q
0.200 0.200 0.200 SCN
BT
-552.698 14.388 Td
+49.24 14.388 Td
/F1.0 9 Tf
-<3231> Tj
+<3230> Tj
ET
0.000 0.000 0.000 SCN
@@ -31220,34 +30471,39 @@ Q
endstream
endobj
-231 0 obj
+220 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [0 0 612.0 792.0]
-/Contents 230 0 R
+/Contents 219 0 R
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font << /F2.0 22 0 R
/F3.0 24 0 R
/F1.0 8 0 R
>>
-/XObject << /Stamp1 496 0 R
+/XObject << /Stamp1 472 0 R
>>
>>
-/Annots [232 0 R]
+/Annots [221 0 R]
>>
endobj
-232 0 obj
+221 0 obj
<< /Border [0 0 0]
/Dest (_cldsmodelinstance)
/Subtype /Link
-/Rect [280.76592192000004 668.7070000000001 375.34992192000004 682.9870000000001]
+/Rect [280.76592192000004 631.147 375.34992192000004 645.427]
/Type /Annot
>>
endobj
-233 0 obj
-[231 0 R /XYZ 0 570.48 null]
+222 0 obj
+[220 0 R /XYZ 0 532.9200000000001 null]
endobj
-234 0 obj
+223 0 obj
+<< /Limits [(_route77) (_version_information)]
+/Names [(_route77) 171 0 R (_route78) 165 0 R (_route79) 175 0 R (_route80) 138 0 R (_route81) 133 0 R (_route82) 153 0 R (_route83) 147 0 R (_route84) 189 0 R (_uri_scheme) 25 0 R (_valueitem) 222 0 R (_version_information) 23 0 R]
+>>
+endobj
+224 0 obj
<< /Border [0 0 0]
/Dest (_overview)
/Subtype /Link
@@ -31255,7 +30511,7 @@ endobj
/Type /Annot
>>
endobj
-235 0 obj
+225 0 obj
<< /Border [0 0 0]
/Dest (_overview)
/Subtype /Link
@@ -31263,7 +30519,7 @@ endobj
/Type /Annot
>>
endobj
-236 0 obj
+226 0 obj
<< /Border [0 0 0]
/Dest (_version_information)
/Subtype /Link
@@ -31271,7 +30527,7 @@ endobj
/Type /Annot
>>
endobj
-237 0 obj
+227 0 obj
<< /Border [0 0 0]
/Dest (_version_information)
/Subtype /Link
@@ -31279,7 +30535,7 @@ endobj
/Type /Annot
>>
endobj
-238 0 obj
+228 0 obj
<< /Border [0 0 0]
/Dest (_uri_scheme)
/Subtype /Link
@@ -31287,7 +30543,7 @@ endobj
/Type /Annot
>>
endobj
-239 0 obj
+229 0 obj
<< /Border [0 0 0]
/Dest (_uri_scheme)
/Subtype /Link
@@ -31295,7 +30551,7 @@ endobj
/Type /Annot
>>
endobj
-240 0 obj
+230 0 obj
<< /Border [0 0 0]
/Dest (_paths)
/Subtype /Link
@@ -31303,7 +30559,7 @@ endobj
/Type /Annot
>>
endobj
-241 0 obj
+231 0 obj
<< /Border [0 0 0]
/Dest (_paths)
/Subtype /Link
@@ -31311,23 +30567,23 @@ endobj
/Type /Annot
>>
endobj
-242 0 obj
+232 0 obj
<< /Border [0 0 0]
-/Dest (_route10)
+/Dest (_route66)
/Subtype /Link
/Rect [60.24000000000001 621.7799999999997 330.82500000000005 636.0599999999998]
/Type /Annot
>>
endobj
-243 0 obj
+233 0 obj
<< /Border [0 0 0]
-/Dest (_route10)
+/Dest (_route66)
/Subtype /Link
/Rect [557.8905 621.7799999999997 563.76 636.0599999999998]
/Type /Annot
>>
endobj
-244 0 obj
+234 0 obj
<< /Border [0 0 0]
/Dest (_parameters)
/Subtype /Link
@@ -31335,7 +30591,7 @@ endobj
/Type /Annot
>>
endobj
-245 0 obj
+235 0 obj
<< /Border [0 0 0]
/Dest (_parameters)
/Subtype /Link
@@ -31343,7 +30599,7 @@ endobj
/Type /Annot
>>
endobj
-246 0 obj
+236 0 obj
<< /Border [0 0 0]
/Dest (_responses)
/Subtype /Link
@@ -31351,7 +30607,7 @@ endobj
/Type /Annot
>>
endobj
-247 0 obj
+237 0 obj
<< /Border [0 0 0]
/Dest (_responses)
/Subtype /Link
@@ -31359,7 +30615,7 @@ endobj
/Type /Annot
>>
endobj
-248 0 obj
+238 0 obj
<< /Border [0 0 0]
/Dest (_consumes)
/Subtype /Link
@@ -31367,7 +30623,7 @@ endobj
/Type /Annot
>>
endobj
-249 0 obj
+239 0 obj
<< /Border [0 0 0]
/Dest (_consumes)
/Subtype /Link
@@ -31375,7 +30631,7 @@ endobj
/Type /Annot
>>
endobj
-250 0 obj
+240 0 obj
<< /Border [0 0 0]
/Dest (_produces)
/Subtype /Link
@@ -31383,7 +30639,7 @@ endobj
/Type /Annot
>>
endobj
-251 0 obj
+241 0 obj
<< /Border [0 0 0]
/Dest (_produces)
/Subtype /Link
@@ -31391,23 +30647,23 @@ endobj
/Type /Annot
>>
endobj
-252 0 obj
+242 0 obj
<< /Border [0 0 0]
-/Dest (_route2)
+/Dest (_route58)
/Subtype /Link
/Rect [60.24000000000001 529.3799999999998 182.544 543.6599999999997]
/Type /Annot
>>
endobj
-253 0 obj
+243 0 obj
<< /Border [0 0 0]
-/Dest (_route2)
+/Dest (_route58)
/Subtype /Link
/Rect [557.8905 529.3799999999998 563.76 543.6599999999997]
/Type /Annot
>>
endobj
-254 0 obj
+244 0 obj
<< /Border [0 0 0]
/Dest (_responses_2)
/Subtype /Link
@@ -31415,7 +30671,7 @@ endobj
/Type /Annot
>>
endobj
-255 0 obj
+245 0 obj
<< /Border [0 0 0]
/Dest (_responses_2)
/Subtype /Link
@@ -31423,7 +30679,7 @@ endobj
/Type /Annot
>>
endobj
-256 0 obj
+246 0 obj
<< /Border [0 0 0]
/Dest (_produces_2)
/Subtype /Link
@@ -31431,7 +30687,7 @@ endobj
/Type /Annot
>>
endobj
-257 0 obj
+247 0 obj
<< /Border [0 0 0]
/Dest (_produces_2)
/Subtype /Link
@@ -31439,23 +30695,23 @@ endobj
/Type /Annot
>>
endobj
-258 0 obj
+248 0 obj
<< /Border [0 0 0]
-/Dest (_route3)
+/Dest (_route59)
/Subtype /Link
/Rect [60.24000000000001 473.9399999999997 168.91500000000002 488.2199999999997]
/Type /Annot
>>
endobj
-259 0 obj
+249 0 obj
<< /Border [0 0 0]
-/Dest (_route3)
+/Dest (_route59)
/Subtype /Link
/Rect [557.8905 473.9399999999997 563.76 488.2199999999997]
/Type /Annot
>>
endobj
-260 0 obj
+250 0 obj
<< /Border [0 0 0]
/Dest (_responses_3)
/Subtype /Link
@@ -31463,7 +30719,7 @@ endobj
/Type /Annot
>>
endobj
-261 0 obj
+251 0 obj
<< /Border [0 0 0]
/Dest (_responses_3)
/Subtype /Link
@@ -31471,7 +30727,7 @@ endobj
/Type /Annot
>>
endobj
-262 0 obj
+252 0 obj
<< /Border [0 0 0]
/Dest (_produces_3)
/Subtype /Link
@@ -31479,7 +30735,7 @@ endobj
/Type /Annot
>>
endobj
-263 0 obj
+253 0 obj
<< /Border [0 0 0]
/Dest (_produces_3)
/Subtype /Link
@@ -31487,23 +30743,23 @@ endobj
/Type /Annot
>>
endobj
-264 0 obj
+254 0 obj
<< /Border [0 0 0]
-/Dest (_route11)
+/Dest (_route67)
/Subtype /Link
/Rect [60.24000000000001 418.49999999999966 243.88479492187503 432.77999999999963]
/Type /Annot
>>
endobj
-265 0 obj
+255 0 obj
<< /Border [0 0 0]
-/Dest (_route11)
+/Dest (_route67)
/Subtype /Link
/Rect [557.8905 418.49999999999966 563.76 432.77999999999963]
/Type /Annot
>>
endobj
-266 0 obj
+256 0 obj
<< /Border [0 0 0]
/Dest (_parameters_2)
/Subtype /Link
@@ -31511,7 +30767,7 @@ endobj
/Type /Annot
>>
endobj
-267 0 obj
+257 0 obj
<< /Border [0 0 0]
/Dest (_parameters_2)
/Subtype /Link
@@ -31519,7 +30775,7 @@ endobj
/Type /Annot
>>
endobj
-268 0 obj
+258 0 obj
<< /Border [0 0 0]
/Dest (_responses_4)
/Subtype /Link
@@ -31527,7 +30783,7 @@ endobj
/Type /Annot
>>
endobj
-269 0 obj
+259 0 obj
<< /Border [0 0 0]
/Dest (_responses_4)
/Subtype /Link
@@ -31535,7 +30791,7 @@ endobj
/Type /Annot
>>
endobj
-270 0 obj
+260 0 obj
<< /Border [0 0 0]
/Dest (_consumes_2)
/Subtype /Link
@@ -31543,7 +30799,7 @@ endobj
/Type /Annot
>>
endobj
-271 0 obj
+261 0 obj
<< /Border [0 0 0]
/Dest (_consumes_2)
/Subtype /Link
@@ -31551,7 +30807,7 @@ endobj
/Type /Annot
>>
endobj
-272 0 obj
+262 0 obj
<< /Border [0 0 0]
/Dest (_produces_4)
/Subtype /Link
@@ -31559,7 +30815,7 @@ endobj
/Type /Annot
>>
endobj
-273 0 obj
+263 0 obj
<< /Border [0 0 0]
/Dest (_produces_4)
/Subtype /Link
@@ -31567,23 +30823,23 @@ endobj
/Type /Annot
>>
endobj
-274 0 obj
+264 0 obj
<< /Border [0 0 0]
-/Dest (_route15)
+/Dest (_route69)
/Subtype /Link
/Rect [60.24000000000001 326.09999999999957 234.84429492187502 340.37999999999954]
/Type /Annot
>>
endobj
-275 0 obj
+265 0 obj
<< /Border [0 0 0]
-/Dest (_route15)
+/Dest (_route69)
/Subtype /Link
/Rect [557.8905 326.09999999999957 563.76 340.37999999999954]
/Type /Annot
>>
endobj
-276 0 obj
+266 0 obj
<< /Border [0 0 0]
/Dest (_parameters_3)
/Subtype /Link
@@ -31591,7 +30847,7 @@ endobj
/Type /Annot
>>
endobj
-277 0 obj
+267 0 obj
<< /Border [0 0 0]
/Dest (_parameters_3)
/Subtype /Link
@@ -31599,7 +30855,7 @@ endobj
/Type /Annot
>>
endobj
-278 0 obj
+268 0 obj
<< /Border [0 0 0]
/Dest (_responses_5)
/Subtype /Link
@@ -31607,7 +30863,7 @@ endobj
/Type /Annot
>>
endobj
-279 0 obj
+269 0 obj
<< /Border [0 0 0]
/Dest (_responses_5)
/Subtype /Link
@@ -31615,7 +30871,7 @@ endobj
/Type /Annot
>>
endobj
-280 0 obj
+270 0 obj
<< /Border [0 0 0]
/Dest (_consumes_3)
/Subtype /Link
@@ -31623,7 +30879,7 @@ endobj
/Type /Annot
>>
endobj
-281 0 obj
+271 0 obj
<< /Border [0 0 0]
/Dest (_consumes_3)
/Subtype /Link
@@ -31631,7 +30887,7 @@ endobj
/Type /Annot
>>
endobj
-282 0 obj
+272 0 obj
<< /Border [0 0 0]
/Dest (_produces_5)
/Subtype /Link
@@ -31639,7 +30895,7 @@ endobj
/Type /Annot
>>
endobj
-283 0 obj
+273 0 obj
<< /Border [0 0 0]
/Dest (_produces_5)
/Subtype /Link
@@ -31647,23 +30903,23 @@ endobj
/Type /Annot
>>
endobj
-284 0 obj
+274 0 obj
<< /Border [0 0 0]
-/Dest (_route9)
+/Dest (_route65)
/Subtype /Link
/Rect [60.24000000000001 233.69999999999948 196.23600000000002 247.97999999999948]
/Type /Annot
>>
endobj
-285 0 obj
+275 0 obj
<< /Border [0 0 0]
-/Dest (_route9)
+/Dest (_route65)
/Subtype /Link
/Rect [557.8905 233.69999999999948 563.76 247.97999999999948]
/Type /Annot
>>
endobj
-286 0 obj
+276 0 obj
<< /Border [0 0 0]
/Dest (_responses_6)
/Subtype /Link
@@ -31671,7 +30927,7 @@ endobj
/Type /Annot
>>
endobj
-287 0 obj
+277 0 obj
<< /Border [0 0 0]
/Dest (_responses_6)
/Subtype /Link
@@ -31679,7 +30935,7 @@ endobj
/Type /Annot
>>
endobj
-288 0 obj
+278 0 obj
<< /Border [0 0 0]
/Dest (_produces_6)
/Subtype /Link
@@ -31687,7 +30943,7 @@ endobj
/Type /Annot
>>
endobj
-289 0 obj
+279 0 obj
<< /Border [0 0 0]
/Dest (_produces_6)
/Subtype /Link
@@ -31695,23 +30951,23 @@ endobj
/Type /Annot
>>
endobj
-290 0 obj
+280 0 obj
<< /Border [0 0 0]
-/Dest (_route5)
+/Dest (_route61)
/Subtype /Link
/Rect [60.24000000000001 178.2599999999995 265.3575 192.5399999999995]
/Type /Annot
>>
endobj
-291 0 obj
+281 0 obj
<< /Border [0 0 0]
-/Dest (_route5)
+/Dest (_route61)
/Subtype /Link
/Rect [557.8905 178.2599999999995 563.76 192.5399999999995]
/Type /Annot
>>
endobj
-292 0 obj
+282 0 obj
<< /Border [0 0 0]
/Dest (_parameters_4)
/Subtype /Link
@@ -31719,7 +30975,7 @@ endobj
/Type /Annot
>>
endobj
-293 0 obj
+283 0 obj
<< /Border [0 0 0]
/Dest (_parameters_4)
/Subtype /Link
@@ -31727,7 +30983,7 @@ endobj
/Type /Annot
>>
endobj
-294 0 obj
+284 0 obj
<< /Border [0 0 0]
/Dest (_responses_7)
/Subtype /Link
@@ -31735,7 +30991,7 @@ endobj
/Type /Annot
>>
endobj
-295 0 obj
+285 0 obj
<< /Border [0 0 0]
/Dest (_responses_7)
/Subtype /Link
@@ -31743,7 +30999,7 @@ endobj
/Type /Annot
>>
endobj
-296 0 obj
+286 0 obj
<< /Border [0 0 0]
/Dest (_produces_7)
/Subtype /Link
@@ -31751,7 +31007,7 @@ endobj
/Type /Annot
>>
endobj
-297 0 obj
+287 0 obj
<< /Border [0 0 0]
/Dest (_produces_7)
/Subtype /Link
@@ -31759,23 +31015,23 @@ endobj
/Type /Annot
>>
endobj
-298 0 obj
+288 0 obj
<< /Border [0 0 0]
-/Dest (_route6)
+/Dest (_route62)
/Subtype /Link
/Rect [60.24000000000001 104.33999999999955 266.22900000000004 118.61999999999955]
/Type /Annot
>>
endobj
-299 0 obj
+289 0 obj
<< /Border [0 0 0]
-/Dest (_route6)
+/Dest (_route62)
/Subtype /Link
/Rect [557.8905 104.33999999999955 563.76 118.61999999999955]
/Type /Annot
>>
endobj
-300 0 obj
+290 0 obj
<< /Border [0 0 0]
/Dest (_parameters_5)
/Subtype /Link
@@ -31783,7 +31039,7 @@ endobj
/Type /Annot
>>
endobj
-301 0 obj
+291 0 obj
<< /Border [0 0 0]
/Dest (_parameters_5)
/Subtype /Link
@@ -31791,7 +31047,7 @@ endobj
/Type /Annot
>>
endobj
-302 0 obj
+292 0 obj
<< /Border [0 0 0]
/Dest (_responses_8)
/Subtype /Link
@@ -31799,7 +31055,7 @@ endobj
/Type /Annot
>>
endobj
-303 0 obj
+293 0 obj
<< /Border [0 0 0]
/Dest (_responses_8)
/Subtype /Link
@@ -31807,7 +31063,7 @@ endobj
/Type /Annot
>>
endobj
-304 0 obj
+294 0 obj
<< /Border [0 0 0]
/Dest (_produces_8)
/Subtype /Link
@@ -31815,7 +31071,7 @@ endobj
/Type /Annot
>>
endobj
-305 0 obj
+295 0 obj
<< /Border [0 0 0]
/Dest (_produces_8)
/Subtype /Link
@@ -31823,23 +31079,23 @@ endobj
/Type /Annot
>>
endobj
-306 0 obj
+296 0 obj
<< /Border [0 0 0]
-/Dest (_route7)
+/Dest (_route63)
/Subtype /Link
/Rect [60.24 741.7199999999999 232.776 756.0]
/Type /Annot
>>
endobj
-307 0 obj
+297 0 obj
<< /Border [0 0 0]
-/Dest (_route7)
+/Dest (_route63)
/Subtype /Link
/Rect [557.8905 741.7199999999999 563.76 756.0]
/Type /Annot
>>
endobj
-308 0 obj
+298 0 obj
<< /Border [0 0 0]
/Dest (_parameters_6)
/Subtype /Link
@@ -31847,7 +31103,7 @@ endobj
/Type /Annot
>>
endobj
-309 0 obj
+299 0 obj
<< /Border [0 0 0]
/Dest (_parameters_6)
/Subtype /Link
@@ -31855,7 +31111,7 @@ endobj
/Type /Annot
>>
endobj
-310 0 obj
+300 0 obj
<< /Border [0 0 0]
/Dest (_responses_9)
/Subtype /Link
@@ -31863,7 +31119,7 @@ endobj
/Type /Annot
>>
endobj
-311 0 obj
+301 0 obj
<< /Border [0 0 0]
/Dest (_responses_9)
/Subtype /Link
@@ -31871,7 +31127,7 @@ endobj
/Type /Annot
>>
endobj
-312 0 obj
+302 0 obj
<< /Border [0 0 0]
/Dest (_produces_9)
/Subtype /Link
@@ -31879,7 +31135,7 @@ endobj
/Type /Annot
>>
endobj
-313 0 obj
+303 0 obj
<< /Border [0 0 0]
/Dest (_produces_9)
/Subtype /Link
@@ -31887,23 +31143,23 @@ endobj
/Type /Annot
>>
endobj
-314 0 obj
+304 0 obj
<< /Border [0 0 0]
-/Dest (_route8)
+/Dest (_route64)
/Subtype /Link
/Rect [60.24000000000001 667.7999999999998 238.47750000000002 682.0799999999999]
/Type /Annot
>>
endobj
-315 0 obj
+305 0 obj
<< /Border [0 0 0]
-/Dest (_route8)
+/Dest (_route64)
/Subtype /Link
/Rect [557.8905 667.7999999999998 563.76 682.0799999999999]
/Type /Annot
>>
endobj
-316 0 obj
+306 0 obj
<< /Border [0 0 0]
/Dest (_parameters_7)
/Subtype /Link
@@ -31911,7 +31167,7 @@ endobj
/Type /Annot
>>
endobj
-317 0 obj
+307 0 obj
<< /Border [0 0 0]
/Dest (_parameters_7)
/Subtype /Link
@@ -31919,7 +31175,7 @@ endobj
/Type /Annot
>>
endobj
-318 0 obj
+308 0 obj
<< /Border [0 0 0]
/Dest (_responses_10)
/Subtype /Link
@@ -31927,7 +31183,7 @@ endobj
/Type /Annot
>>
endobj
-319 0 obj
+309 0 obj
<< /Border [0 0 0]
/Dest (_responses_10)
/Subtype /Link
@@ -31935,7 +31191,7 @@ endobj
/Type /Annot
>>
endobj
-320 0 obj
+310 0 obj
<< /Border [0 0 0]
/Dest (_consumes_4)
/Subtype /Link
@@ -31943,7 +31199,7 @@ endobj
/Type /Annot
>>
endobj
-321 0 obj
+311 0 obj
<< /Border [0 0 0]
/Dest (_consumes_4)
/Subtype /Link
@@ -31951,7 +31207,7 @@ endobj
/Type /Annot
>>
endobj
-322 0 obj
+312 0 obj
<< /Border [0 0 0]
/Dest (_produces_10)
/Subtype /Link
@@ -31959,7 +31215,7 @@ endobj
/Type /Annot
>>
endobj
-323 0 obj
+313 0 obj
<< /Border [0 0 0]
/Dest (_produces_10)
/Subtype /Link
@@ -31967,23 +31223,23 @@ endobj
/Type /Annot
>>
endobj
-324 0 obj
+314 0 obj
<< /Border [0 0 0]
-/Dest (_route13)
+/Dest (_route68)
/Subtype /Link
/Rect [60.24000000000001 575.3999999999997 186.471 589.6799999999998]
/Type /Annot
>>
endobj
-325 0 obj
+315 0 obj
<< /Border [0 0 0]
-/Dest (_route13)
+/Dest (_route68)
/Subtype /Link
/Rect [557.8905 575.3999999999997 563.76 589.6799999999998]
/Type /Annot
>>
endobj
-326 0 obj
+316 0 obj
<< /Border [0 0 0]
/Dest (_responses_11)
/Subtype /Link
@@ -31991,7 +31247,7 @@ endobj
/Type /Annot
>>
endobj
-327 0 obj
+317 0 obj
<< /Border [0 0 0]
/Dest (_responses_11)
/Subtype /Link
@@ -31999,7 +31255,7 @@ endobj
/Type /Annot
>>
endobj
-328 0 obj
+318 0 obj
<< /Border [0 0 0]
/Dest (_produces_11)
/Subtype /Link
@@ -32007,7 +31263,7 @@ endobj
/Type /Annot
>>
endobj
-329 0 obj
+319 0 obj
<< /Border [0 0 0]
/Dest (_produces_11)
/Subtype /Link
@@ -32015,23 +31271,23 @@ endobj
/Type /Annot
>>
endobj
-330 0 obj
+320 0 obj
<< /Border [0 0 0]
-/Dest (_route14)
+/Dest (_route70)
/Subtype /Link
-/Rect [60.24000000000001 519.9599999999998 400.6815 534.2399999999998]
+/Rect [60.24000000000001 519.9599999999998 254.14329492187503 534.2399999999998]
/Type /Annot
>>
endobj
-331 0 obj
+321 0 obj
<< /Border [0 0 0]
-/Dest (_route14)
+/Dest (_route70)
/Subtype /Link
/Rect [557.8905 519.9599999999998 563.76 534.2399999999998]
/Type /Annot
>>
endobj
-332 0 obj
+322 0 obj
<< /Border [0 0 0]
/Dest (_parameters_8)
/Subtype /Link
@@ -32039,7 +31295,7 @@ endobj
/Type /Annot
>>
endobj
-333 0 obj
+323 0 obj
<< /Border [0 0 0]
/Dest (_parameters_8)
/Subtype /Link
@@ -32047,7 +31303,7 @@ endobj
/Type /Annot
>>
endobj
-334 0 obj
+324 0 obj
<< /Border [0 0 0]
/Dest (_responses_12)
/Subtype /Link
@@ -32055,7 +31311,7 @@ endobj
/Type /Annot
>>
endobj
-335 0 obj
+325 0 obj
<< /Border [0 0 0]
/Dest (_responses_12)
/Subtype /Link
@@ -32063,2517 +31319,2342 @@ endobj
/Type /Annot
>>
endobj
-336 0 obj
+326 0 obj
+<< /Border [0 0 0]
+/Dest (_consumes_5)
+/Subtype /Link
+/Rect [72.24000000000001 464.51999999999975 157.2375 478.7999999999997]
+/Type /Annot
+>>
+endobj
+327 0 obj
+<< /Border [0 0 0]
+/Dest (_consumes_5)
+/Subtype /Link
+/Rect [557.8905 464.51999999999975 563.76 478.7999999999997]
+/Type /Annot
+>>
+endobj
+328 0 obj
<< /Border [0 0 0]
/Dest (_produces_12)
/Subtype /Link
-/Rect [72.24000000000001 464.51999999999975 152.27100000000002 478.7999999999997]
+/Rect [72.24000000000001 446.03999999999974 152.27100000000002 460.3199999999997]
/Type /Annot
>>
endobj
-337 0 obj
+329 0 obj
<< /Border [0 0 0]
/Dest (_produces_12)
/Subtype /Link
-/Rect [557.8905 464.51999999999975 563.76 478.7999999999997]
+/Rect [557.8905 446.03999999999974 563.76 460.3199999999997]
+/Type /Annot
+>>
+endobj
+330 0 obj
+<< /Border [0 0 0]
+/Dest (_route75)
+/Subtype /Link
+/Rect [60.24000000000001 427.5599999999997 258.251255859375 441.8399999999997]
+/Type /Annot
+>>
+endobj
+331 0 obj
+<< /Border [0 0 0]
+/Dest (_route75)
+/Subtype /Link
+/Rect [557.8905 427.5599999999997 563.76 441.8399999999997]
+/Type /Annot
+>>
+endobj
+332 0 obj
+<< /Border [0 0 0]
+/Dest (_responses_13)
+/Subtype /Link
+/Rect [72.24000000000001 409.0799999999997 157.899 423.3599999999997]
+/Type /Annot
+>>
+endobj
+333 0 obj
+<< /Border [0 0 0]
+/Dest (_responses_13)
+/Subtype /Link
+/Rect [557.8905 409.0799999999997 563.76 423.3599999999997]
+/Type /Annot
+>>
+endobj
+334 0 obj
+<< /Border [0 0 0]
+/Dest (_produces_13)
+/Subtype /Link
+/Rect [72.24000000000001 390.5999999999997 152.27100000000002 404.87999999999965]
+/Type /Annot
+>>
+endobj
+335 0 obj
+<< /Border [0 0 0]
+/Dest (_produces_13)
+/Subtype /Link
+/Rect [557.8905 390.5999999999997 563.76 404.87999999999965]
+/Type /Annot
+>>
+endobj
+336 0 obj
+<< /Border [0 0 0]
+/Dest (_route71)
+/Subtype /Link
+/Rect [60.24000000000001 372.11999999999966 340.224755859375 386.39999999999964]
+/Type /Annot
+>>
+endobj
+337 0 obj
+<< /Border [0 0 0]
+/Dest (_route71)
+/Subtype /Link
+/Rect [557.8905 372.11999999999966 563.76 386.39999999999964]
/Type /Annot
>>
endobj
338 0 obj
<< /Border [0 0 0]
-/Dest (_route12)
+/Dest (_parameters_9)
/Subtype /Link
-/Rect [60.24000000000001 446.03999999999974 194.241 460.3199999999997]
+/Rect [72.24000000000001 353.63999999999965 163.71579492187502 367.9199999999996]
/Type /Annot
>>
endobj
339 0 obj
<< /Border [0 0 0]
-/Dest (_route12)
+/Dest (_parameters_9)
/Subtype /Link
-/Rect [557.8905 446.03999999999974 563.76 460.3199999999997]
+/Rect [557.8905 353.63999999999965 563.76 367.9199999999996]
/Type /Annot
>>
endobj
340 0 obj
<< /Border [0 0 0]
-/Dest (_responses_13)
+/Dest (_responses_14)
/Subtype /Link
-/Rect [72.24000000000001 427.5599999999997 157.899 441.8399999999997]
+/Rect [72.24000000000001 335.1599999999996 157.899 349.4399999999996]
/Type /Annot
>>
endobj
341 0 obj
<< /Border [0 0 0]
-/Dest (_responses_13)
+/Dest (_responses_14)
/Subtype /Link
-/Rect [557.8905 427.5599999999997 563.76 441.8399999999997]
+/Rect [557.8905 335.1599999999996 563.76 349.4399999999996]
/Type /Annot
>>
endobj
342 0 obj
<< /Border [0 0 0]
-/Dest (_produces_13)
+/Dest (_produces_14)
/Subtype /Link
-/Rect [72.24000000000001 409.0799999999997 152.27100000000002 423.3599999999997]
+/Rect [72.24000000000001 316.6799999999996 152.27100000000002 330.9599999999996]
/Type /Annot
>>
endobj
343 0 obj
<< /Border [0 0 0]
-/Dest (_produces_13)
+/Dest (_produces_14)
/Subtype /Link
-/Rect [557.8905 409.0799999999997 563.76 423.3599999999997]
+/Rect [557.8905 316.6799999999996 563.76 330.9599999999996]
/Type /Annot
>>
endobj
344 0 obj
<< /Border [0 0 0]
-/Dest (_route16)
+/Dest (_route72)
/Subtype /Link
-/Rect [60.24000000000001 390.5999999999997 254.14329492187503 404.87999999999965]
+/Rect [60.24000000000001 298.1999999999996 341.09625585937505 312.47999999999956]
/Type /Annot
>>
endobj
345 0 obj
<< /Border [0 0 0]
-/Dest (_route16)
+/Dest (_route72)
/Subtype /Link
-/Rect [557.8905 390.5999999999997 563.76 404.87999999999965]
+/Rect [557.8905 298.1999999999996 563.76 312.47999999999956]
/Type /Annot
>>
endobj
346 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_9)
+/Dest (_parameters_10)
/Subtype /Link
-/Rect [72.24000000000001 372.11999999999966 163.71579492187502 386.39999999999964]
+/Rect [72.24000000000001 279.7199999999996 163.71579492187502 293.99999999999955]
/Type /Annot
>>
endobj
347 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_9)
+/Dest (_parameters_10)
/Subtype /Link
-/Rect [557.8905 372.11999999999966 563.76 386.39999999999964]
+/Rect [557.8905 279.7199999999996 563.76 293.99999999999955]
/Type /Annot
>>
endobj
348 0 obj
<< /Border [0 0 0]
-/Dest (_responses_14)
+/Dest (_responses_15)
/Subtype /Link
-/Rect [72.24000000000001 353.63999999999965 157.899 367.9199999999996]
+/Rect [72.24000000000001 261.23999999999955 157.899 275.5199999999995]
/Type /Annot
>>
endobj
349 0 obj
<< /Border [0 0 0]
-/Dest (_responses_14)
+/Dest (_responses_15)
/Subtype /Link
-/Rect [557.8905 353.63999999999965 563.76 367.9199999999996]
+/Rect [557.8905 261.23999999999955 563.76 275.5199999999995]
/Type /Annot
>>
endobj
350 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_5)
+/Dest (_produces_15)
/Subtype /Link
-/Rect [72.24000000000001 335.1599999999996 157.2375 349.4399999999996]
+/Rect [72.24000000000001 242.7599999999995 152.27100000000002 257.0399999999995]
/Type /Annot
>>
endobj
351 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_5)
+/Dest (_produces_15)
/Subtype /Link
-/Rect [557.8905 335.1599999999996 563.76 349.4399999999996]
+/Rect [557.8905 242.7599999999995 563.76 257.0399999999995]
/Type /Annot
>>
endobj
352 0 obj
<< /Border [0 0 0]
-/Dest (_produces_14)
+/Dest (_route73)
/Subtype /Link
-/Rect [72.24000000000001 316.6799999999996 152.27100000000002 330.9599999999996]
+/Rect [60.24000000000001 224.27999999999952 307.643255859375 238.55999999999952]
/Type /Annot
>>
endobj
353 0 obj
<< /Border [0 0 0]
-/Dest (_produces_14)
+/Dest (_route73)
/Subtype /Link
-/Rect [557.8905 316.6799999999996 563.76 330.9599999999996]
+/Rect [557.8905 224.27999999999952 563.76 238.55999999999952]
/Type /Annot
>>
endobj
354 0 obj
<< /Border [0 0 0]
-/Dest (_route21)
+/Dest (_parameters_11)
/Subtype /Link
-/Rect [60.24000000000001 298.1999999999996 258.251255859375 312.47999999999956]
+/Rect [72.24000000000001 205.79999999999953 163.71579492187502 220.07999999999953]
/Type /Annot
>>
endobj
355 0 obj
<< /Border [0 0 0]
-/Dest (_route21)
+/Dest (_parameters_11)
/Subtype /Link
-/Rect [557.8905 298.1999999999996 563.76 312.47999999999956]
+/Rect [557.8905 205.79999999999953 563.76 220.07999999999953]
/Type /Annot
>>
endobj
356 0 obj
<< /Border [0 0 0]
-/Dest (_responses_15)
+/Dest (_responses_16)
/Subtype /Link
-/Rect [72.24000000000001 279.7199999999996 157.899 293.99999999999955]
+/Rect [72.24000000000001 187.31999999999954 157.899 201.59999999999954]
/Type /Annot
>>
endobj
357 0 obj
<< /Border [0 0 0]
-/Dest (_responses_15)
+/Dest (_responses_16)
/Subtype /Link
-/Rect [557.8905 279.7199999999996 563.76 293.99999999999955]
+/Rect [557.8905 187.31999999999954 563.76 201.59999999999954]
/Type /Annot
>>
endobj
358 0 obj
<< /Border [0 0 0]
-/Dest (_produces_15)
+/Dest (_produces_16)
/Subtype /Link
-/Rect [72.24000000000001 261.23999999999955 152.27100000000002 275.5199999999995]
+/Rect [72.24000000000001 168.83999999999955 152.27100000000002 183.11999999999955]
/Type /Annot
>>
endobj
359 0 obj
<< /Border [0 0 0]
-/Dest (_produces_15)
+/Dest (_produces_16)
/Subtype /Link
-/Rect [557.8905 261.23999999999955 563.76 275.5199999999995]
+/Rect [557.8905 168.83999999999955 563.76 183.11999999999955]
/Type /Annot
>>
endobj
360 0 obj
<< /Border [0 0 0]
-/Dest (_route17)
+/Dest (_route74)
/Subtype /Link
-/Rect [60.24000000000001 242.7599999999995 340.224755859375 257.0399999999995]
+/Rect [60.24000000000001 150.35999999999956 307.475255859375 164.63999999999956]
/Type /Annot
>>
endobj
361 0 obj
<< /Border [0 0 0]
-/Dest (_route17)
+/Dest (_route74)
/Subtype /Link
-/Rect [557.8905 242.7599999999995 563.76 257.0399999999995]
+/Rect [557.8905 150.35999999999956 563.76 164.63999999999956]
/Type /Annot
>>
endobj
362 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_10)
+/Dest (_parameters_12)
/Subtype /Link
-/Rect [72.24000000000001 224.27999999999952 163.71579492187502 238.55999999999952]
+/Rect [72.24000000000001 131.87999999999957 163.71579492187502 146.15999999999957]
/Type /Annot
>>
endobj
363 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_10)
+/Dest (_parameters_12)
/Subtype /Link
-/Rect [557.8905 224.27999999999952 563.76 238.55999999999952]
+/Rect [557.8905 131.87999999999957 563.76 146.15999999999957]
/Type /Annot
>>
endobj
364 0 obj
<< /Border [0 0 0]
-/Dest (_responses_16)
+/Dest (_responses_17)
/Subtype /Link
-/Rect [72.24000000000001 205.79999999999953 157.899 220.07999999999953]
+/Rect [72.24000000000001 113.39999999999958 157.899 127.67999999999958]
/Type /Annot
>>
endobj
365 0 obj
<< /Border [0 0 0]
-/Dest (_responses_16)
+/Dest (_responses_17)
/Subtype /Link
-/Rect [557.8905 205.79999999999953 563.76 220.07999999999953]
+/Rect [557.8905 113.39999999999958 563.76 127.67999999999958]
/Type /Annot
>>
endobj
366 0 obj
<< /Border [0 0 0]
-/Dest (_produces_16)
+/Dest (_consumes_6)
/Subtype /Link
-/Rect [72.24000000000001 187.31999999999954 152.27100000000002 201.59999999999954]
+/Rect [72.24000000000001 94.91999999999959 157.2375 109.19999999999959]
/Type /Annot
>>
endobj
367 0 obj
<< /Border [0 0 0]
-/Dest (_produces_16)
+/Dest (_consumes_6)
/Subtype /Link
-/Rect [557.8905 187.31999999999954 563.76 201.59999999999954]
+/Rect [557.8905 94.91999999999959 563.76 109.19999999999959]
/Type /Annot
>>
endobj
368 0 obj
<< /Border [0 0 0]
-/Dest (_route18)
+/Dest (_produces_17)
/Subtype /Link
-/Rect [60.24000000000001 168.83999999999955 341.09625585937505 183.11999999999955]
+/Rect [72.24000000000001 76.4399999999996 152.27100000000002 90.7199999999996]
/Type /Annot
>>
endobj
369 0 obj
<< /Border [0 0 0]
-/Dest (_route18)
+/Dest (_produces_17)
/Subtype /Link
-/Rect [557.8905 168.83999999999955 563.76 183.11999999999955]
+/Rect [557.8905 76.4399999999996 563.76 90.7199999999996]
/Type /Annot
>>
endobj
370 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_11)
+/Dest (_route81)
/Subtype /Link
-/Rect [72.24000000000001 150.35999999999956 163.71579492187502 164.63999999999956]
+/Rect [60.24000000000001 57.95999999999961 163.6125 72.23999999999961]
/Type /Annot
>>
endobj
371 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_11)
+/Dest (_route81)
/Subtype /Link
-/Rect [557.8905 150.35999999999956 563.76 164.63999999999956]
+/Rect [557.8905 57.95999999999961 563.76 72.23999999999961]
/Type /Annot
>>
endobj
372 0 obj
<< /Border [0 0 0]
-/Dest (_responses_17)
+/Dest (_responses_18)
/Subtype /Link
-/Rect [72.24000000000001 131.87999999999957 157.899 146.15999999999957]
+/Rect [72.24000000000001 741.7199999999999 157.899 756.0]
/Type /Annot
>>
endobj
373 0 obj
<< /Border [0 0 0]
-/Dest (_responses_17)
+/Dest (_responses_18)
/Subtype /Link
-/Rect [557.8905 131.87999999999957 563.76 146.15999999999957]
+/Rect [557.8905 741.7199999999999 563.76 756.0]
/Type /Annot
>>
endobj
374 0 obj
<< /Border [0 0 0]
-/Dest (_produces_17)
+/Dest (_produces_18)
/Subtype /Link
-/Rect [72.24000000000001 113.39999999999958 152.27100000000002 127.67999999999958]
+/Rect [72.24000000000001 723.2399999999999 152.27100000000002 737.52]
/Type /Annot
>>
endobj
375 0 obj
<< /Border [0 0 0]
-/Dest (_produces_17)
+/Dest (_produces_18)
/Subtype /Link
-/Rect [557.8905 113.39999999999958 563.76 127.67999999999958]
+/Rect [557.8905 723.2399999999999 563.76 737.52]
/Type /Annot
>>
endobj
376 0 obj
<< /Border [0 0 0]
-/Dest (_route19)
+/Dest (_route80)
/Subtype /Link
-/Rect [60.24000000000001 94.91999999999959 307.643255859375 109.19999999999959]
+/Rect [60.24000000000001 704.7599999999999 256.4955 719.04]
/Type /Annot
>>
endobj
377 0 obj
<< /Border [0 0 0]
-/Dest (_route19)
+/Dest (_route80)
/Subtype /Link
-/Rect [557.8905 94.91999999999959 563.76 109.19999999999959]
+/Rect [557.8905 704.7599999999999 563.76 719.04]
/Type /Annot
>>
endobj
378 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_12)
+/Dest (_parameters_13)
/Subtype /Link
-/Rect [72.24000000000001 76.4399999999996 163.71579492187502 90.7199999999996]
+/Rect [72.24000000000001 686.2799999999999 163.71579492187502 700.56]
/Type /Annot
>>
endobj
379 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_12)
+/Dest (_parameters_13)
/Subtype /Link
-/Rect [557.8905 76.4399999999996 563.76 90.7199999999996]
+/Rect [557.8905 686.2799999999999 563.76 700.56]
/Type /Annot
>>
endobj
380 0 obj
<< /Border [0 0 0]
-/Dest (_responses_18)
+/Dest (_responses_19)
/Subtype /Link
-/Rect [72.24000000000001 57.95999999999961 157.899 72.23999999999961]
+/Rect [72.24000000000001 667.7999999999998 157.899 682.0799999999999]
/Type /Annot
>>
endobj
381 0 obj
<< /Border [0 0 0]
-/Dest (_responses_18)
+/Dest (_responses_19)
/Subtype /Link
-/Rect [557.8905 57.95999999999961 563.76 72.23999999999961]
+/Rect [552.021 667.7999999999998 563.76 682.0799999999999]
/Type /Annot
>>
endobj
382 0 obj
<< /Border [0 0 0]
-/Dest (_produces_18)
+/Dest (_consumes_7)
/Subtype /Link
-/Rect [72.24000000000001 741.7199999999999 152.27100000000002 756.0]
+/Rect [72.24000000000001 649.3199999999998 157.2375 663.5999999999999]
/Type /Annot
>>
endobj
383 0 obj
<< /Border [0 0 0]
-/Dest (_produces_18)
+/Dest (_consumes_7)
/Subtype /Link
-/Rect [557.8905 741.7199999999999 563.76 756.0]
+/Rect [552.021 649.3199999999998 563.76 663.5999999999999]
/Type /Annot
>>
endobj
384 0 obj
<< /Border [0 0 0]
-/Dest (_route20)
+/Dest (_produces_19)
/Subtype /Link
-/Rect [60.24000000000001 723.2399999999999 307.475255859375 737.52]
+/Rect [72.24000000000001 630.8399999999998 152.27100000000002 645.1199999999999]
/Type /Annot
>>
endobj
385 0 obj
<< /Border [0 0 0]
-/Dest (_route20)
+/Dest (_produces_19)
/Subtype /Link
-/Rect [557.8905 723.2399999999999 563.76 737.52]
+/Rect [552.021 630.8399999999998 563.76 645.1199999999999]
/Type /Annot
>>
endobj
386 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_13)
+/Dest (_route83)
/Subtype /Link
-/Rect [72.24000000000001 704.7599999999999 163.71579492187502 719.04]
+/Rect [60.24000000000001 612.3599999999998 286.99800000000005 626.6399999999999]
/Type /Annot
>>
endobj
387 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_13)
+/Dest (_route83)
/Subtype /Link
-/Rect [557.8905 704.7599999999999 563.76 719.04]
+/Rect [552.021 612.3599999999998 563.76 626.6399999999999]
/Type /Annot
>>
endobj
388 0 obj
<< /Border [0 0 0]
-/Dest (_responses_19)
+/Dest (_parameters_14)
/Subtype /Link
-/Rect [72.24000000000001 686.2799999999999 157.899 700.56]
+/Rect [72.24000000000001 593.8799999999998 163.71579492187502 608.1599999999999]
/Type /Annot
>>
endobj
389 0 obj
<< /Border [0 0 0]
-/Dest (_responses_19)
+/Dest (_parameters_14)
/Subtype /Link
-/Rect [552.021 686.2799999999999 563.76 700.56]
+/Rect [552.021 593.8799999999998 563.76 608.1599999999999]
/Type /Annot
>>
endobj
390 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_6)
+/Dest (_responses_20)
/Subtype /Link
-/Rect [72.24000000000001 667.7999999999998 157.2375 682.0799999999999]
+/Rect [72.24000000000001 575.3999999999997 157.899 589.6799999999998]
/Type /Annot
>>
endobj
391 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_6)
+/Dest (_responses_20)
/Subtype /Link
-/Rect [552.021 667.7999999999998 563.76 682.0799999999999]
+/Rect [552.021 575.3999999999997 563.76 589.6799999999998]
/Type /Annot
>>
endobj
392 0 obj
<< /Border [0 0 0]
-/Dest (_produces_19)
+/Dest (_produces_20)
/Subtype /Link
-/Rect [72.24000000000001 649.3199999999998 152.27100000000002 663.5999999999999]
+/Rect [72.24000000000001 556.9199999999998 152.27100000000002 571.1999999999998]
/Type /Annot
>>
endobj
393 0 obj
<< /Border [0 0 0]
-/Dest (_produces_19)
+/Dest (_produces_20)
/Subtype /Link
-/Rect [552.021 649.3199999999998 563.76 663.5999999999999]
+/Rect [552.021 556.9199999999998 563.76 571.1999999999998]
/Type /Annot
>>
endobj
394 0 obj
<< /Border [0 0 0]
-/Dest (_route27)
+/Dest (_route82)
/Subtype /Link
-/Rect [60.24000000000001 630.8399999999998 163.6125 645.1199999999999]
+/Rect [60.24000000000001 538.4399999999998 286.83000000000004 552.7199999999998]
/Type /Annot
>>
endobj
395 0 obj
<< /Border [0 0 0]
-/Dest (_route27)
+/Dest (_route82)
/Subtype /Link
-/Rect [552.021 630.8399999999998 563.76 645.1199999999999]
+/Rect [552.021 538.4399999999998 563.76 552.7199999999998]
/Type /Annot
>>
endobj
396 0 obj
<< /Border [0 0 0]
-/Dest (_responses_20)
+/Dest (_parameters_15)
/Subtype /Link
-/Rect [72.24000000000001 612.3599999999998 157.899 626.6399999999999]
+/Rect [72.24000000000001 519.9599999999998 163.71579492187502 534.2399999999998]
/Type /Annot
>>
endobj
397 0 obj
<< /Border [0 0 0]
-/Dest (_responses_20)
+/Dest (_parameters_15)
/Subtype /Link
-/Rect [552.021 612.3599999999998 563.76 626.6399999999999]
+/Rect [552.021 519.9599999999998 563.76 534.2399999999998]
/Type /Annot
>>
endobj
398 0 obj
<< /Border [0 0 0]
-/Dest (_produces_20)
+/Dest (_responses_21)
/Subtype /Link
-/Rect [72.24000000000001 593.8799999999998 152.27100000000002 608.1599999999999]
+/Rect [72.24000000000001 501.4799999999998 157.899 515.7599999999998]
/Type /Annot
>>
endobj
399 0 obj
<< /Border [0 0 0]
-/Dest (_produces_20)
+/Dest (_responses_21)
/Subtype /Link
-/Rect [552.021 593.8799999999998 563.76 608.1599999999999]
+/Rect [552.021 501.4799999999998 563.76 515.7599999999998]
/Type /Annot
>>
endobj
400 0 obj
<< /Border [0 0 0]
-/Dest (_route26)
+/Dest (_consumes_8)
/Subtype /Link
-/Rect [60.24000000000001 575.3999999999997 256.4955 589.6799999999998]
+/Rect [72.24000000000001 482.9999999999998 157.2375 497.27999999999975]
/Type /Annot
>>
endobj
401 0 obj
<< /Border [0 0 0]
-/Dest (_route26)
+/Dest (_consumes_8)
/Subtype /Link
-/Rect [552.021 575.3999999999997 563.76 589.6799999999998]
+/Rect [552.021 482.9999999999998 563.76 497.27999999999975]
/Type /Annot
>>
endobj
402 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_14)
+/Dest (_produces_21)
/Subtype /Link
-/Rect [72.24000000000001 556.9199999999998 163.71579492187502 571.1999999999998]
+/Rect [72.24000000000001 464.51999999999975 152.27100000000002 478.7999999999997]
/Type /Annot
>>
endobj
403 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_14)
+/Dest (_produces_21)
/Subtype /Link
-/Rect [552.021 556.9199999999998 563.76 571.1999999999998]
+/Rect [552.021 464.51999999999975 563.76 478.7999999999997]
/Type /Annot
>>
endobj
404 0 obj
<< /Border [0 0 0]
-/Dest (_responses_21)
+/Dest (_route60)
/Subtype /Link
-/Rect [72.24000000000001 538.4399999999998 157.899 552.7199999999998]
+/Rect [60.24000000000001 446.03999999999974 172.53750000000002 460.3199999999997]
/Type /Annot
>>
endobj
405 0 obj
<< /Border [0 0 0]
-/Dest (_responses_21)
+/Dest (_route60)
/Subtype /Link
-/Rect [552.021 538.4399999999998 563.76 552.7199999999998]
+/Rect [552.021 446.03999999999974 563.76 460.3199999999997]
/Type /Annot
>>
endobj
406 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_7)
+/Dest (_responses_22)
/Subtype /Link
-/Rect [72.24000000000001 519.9599999999998 157.2375 534.2399999999998]
+/Rect [72.24000000000001 427.5599999999997 157.899 441.8399999999997]
/Type /Annot
>>
endobj
407 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_7)
+/Dest (_responses_22)
/Subtype /Link
-/Rect [552.021 519.9599999999998 563.76 534.2399999999998]
+/Rect [552.021 427.5599999999997 563.76 441.8399999999997]
/Type /Annot
>>
endobj
408 0 obj
<< /Border [0 0 0]
-/Dest (_produces_21)
+/Dest (_produces_22)
/Subtype /Link
-/Rect [72.24000000000001 501.4799999999998 152.27100000000002 515.7599999999998]
+/Rect [72.24000000000001 409.0799999999997 152.27100000000002 423.3599999999997]
/Type /Annot
>>
endobj
409 0 obj
<< /Border [0 0 0]
-/Dest (_produces_21)
+/Dest (_produces_22)
/Subtype /Link
-/Rect [552.021 501.4799999999998 563.76 515.7599999999998]
+/Rect [552.021 409.0799999999997 563.76 423.3599999999997]
/Type /Annot
>>
endobj
410 0 obj
<< /Border [0 0 0]
-/Dest (_route29)
+/Dest (_route78)
/Subtype /Link
-/Rect [60.24000000000001 482.9999999999998 286.99800000000005 497.27999999999975]
+/Rect [60.24000000000001 390.5999999999997 176.61150000000004 404.87999999999965]
/Type /Annot
>>
endobj
411 0 obj
<< /Border [0 0 0]
-/Dest (_route29)
+/Dest (_route78)
/Subtype /Link
-/Rect [552.021 482.9999999999998 563.76 497.27999999999975]
+/Rect [552.021 390.5999999999997 563.76 404.87999999999965]
/Type /Annot
>>
endobj
412 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_15)
+/Dest (_responses_23)
/Subtype /Link
-/Rect [72.24000000000001 464.51999999999975 163.71579492187502 478.7999999999997]
+/Rect [72.24000000000001 372.11999999999966 157.899 386.39999999999964]
/Type /Annot
>>
endobj
413 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_15)
+/Dest (_responses_23)
/Subtype /Link
-/Rect [552.021 464.51999999999975 563.76 478.7999999999997]
+/Rect [552.021 372.11999999999966 563.76 386.39999999999964]
/Type /Annot
>>
endobj
414 0 obj
<< /Border [0 0 0]
-/Dest (_responses_22)
+/Dest (_produces_23)
/Subtype /Link
-/Rect [72.24000000000001 446.03999999999974 157.899 460.3199999999997]
+/Rect [72.24000000000001 353.63999999999965 152.27100000000002 367.9199999999996]
/Type /Annot
>>
endobj
415 0 obj
<< /Border [0 0 0]
-/Dest (_responses_22)
+/Dest (_produces_23)
/Subtype /Link
-/Rect [552.021 446.03999999999974 563.76 460.3199999999997]
+/Rect [552.021 353.63999999999965 563.76 367.9199999999996]
/Type /Annot
>>
endobj
416 0 obj
<< /Border [0 0 0]
-/Dest (_produces_22)
+/Dest (_route77)
/Subtype /Link
-/Rect [72.24000000000001 427.5599999999997 152.27100000000002 441.8399999999997]
+/Rect [60.24000000000001 335.1599999999996 300.8265 349.4399999999996]
/Type /Annot
>>
endobj
417 0 obj
<< /Border [0 0 0]
-/Dest (_produces_22)
+/Dest (_route77)
/Subtype /Link
-/Rect [552.021 427.5599999999997 563.76 441.8399999999997]
+/Rect [552.021 335.1599999999996 563.76 349.4399999999996]
/Type /Annot
>>
endobj
418 0 obj
<< /Border [0 0 0]
-/Dest (_route28)
+/Dest (_parameters_16)
/Subtype /Link
-/Rect [60.24000000000001 409.0799999999997 286.83000000000004 423.3599999999997]
+/Rect [72.24000000000001 316.6799999999996 163.71579492187502 330.9599999999996]
/Type /Annot
>>
endobj
419 0 obj
<< /Border [0 0 0]
-/Dest (_route28)
+/Dest (_parameters_16)
/Subtype /Link
-/Rect [552.021 409.0799999999997 563.76 423.3599999999997]
+/Rect [552.021 316.6799999999996 563.76 330.9599999999996]
/Type /Annot
>>
endobj
420 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_16)
+/Dest (_responses_24)
/Subtype /Link
-/Rect [72.24000000000001 390.5999999999997 163.71579492187502 404.87999999999965]
+/Rect [72.24000000000001 298.1999999999996 157.899 312.47999999999956]
/Type /Annot
>>
endobj
421 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_16)
+/Dest (_responses_24)
/Subtype /Link
-/Rect [552.021 390.5999999999997 563.76 404.87999999999965]
+/Rect [552.021 298.1999999999996 563.76 312.47999999999956]
/Type /Annot
>>
endobj
422 0 obj
<< /Border [0 0 0]
-/Dest (_responses_23)
+/Dest (_produces_24)
/Subtype /Link
-/Rect [72.24000000000001 372.11999999999966 157.899 386.39999999999964]
+/Rect [72.24000000000001 279.7199999999996 152.27100000000002 293.99999999999955]
/Type /Annot
>>
endobj
423 0 obj
<< /Border [0 0 0]
-/Dest (_responses_23)
+/Dest (_produces_24)
/Subtype /Link
-/Rect [552.021 372.11999999999966 563.76 386.39999999999964]
+/Rect [552.021 279.7199999999996 563.76 293.99999999999955]
/Type /Annot
>>
endobj
424 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_8)
+/Dest (_route79)
/Subtype /Link
-/Rect [72.24000000000001 353.63999999999965 157.2375 367.9199999999996]
+/Rect [60.24000000000001 261.23999999999955 274.8285 275.5199999999995]
/Type /Annot
>>
endobj
425 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_8)
+/Dest (_route79)
/Subtype /Link
-/Rect [552.021 353.63999999999965 563.76 367.9199999999996]
+/Rect [552.021 261.23999999999955 563.76 275.5199999999995]
/Type /Annot
>>
endobj
426 0 obj
<< /Border [0 0 0]
-/Dest (_produces_23)
+/Dest (_parameters_17)
/Subtype /Link
-/Rect [72.24000000000001 335.1599999999996 152.27100000000002 349.4399999999996]
+/Rect [72.24000000000001 242.7599999999995 163.71579492187502 257.0399999999995]
/Type /Annot
>>
endobj
427 0 obj
<< /Border [0 0 0]
-/Dest (_produces_23)
+/Dest (_parameters_17)
/Subtype /Link
-/Rect [552.021 335.1599999999996 563.76 349.4399999999996]
+/Rect [552.021 242.7599999999995 563.76 257.0399999999995]
/Type /Annot
>>
endobj
428 0 obj
<< /Border [0 0 0]
-/Dest (_route4)
+/Dest (_responses_25)
/Subtype /Link
-/Rect [60.24000000000001 316.6799999999996 172.53750000000002 330.9599999999996]
+/Rect [72.24000000000001 224.27999999999952 157.899 238.55999999999952]
/Type /Annot
>>
endobj
429 0 obj
<< /Border [0 0 0]
-/Dest (_route4)
+/Dest (_responses_25)
/Subtype /Link
-/Rect [552.021 316.6799999999996 563.76 330.9599999999996]
+/Rect [552.021 224.27999999999952 563.76 238.55999999999952]
/Type /Annot
>>
endobj
430 0 obj
<< /Border [0 0 0]
-/Dest (_responses_24)
+/Dest (_produces_25)
/Subtype /Link
-/Rect [72.24000000000001 298.1999999999996 157.899 312.47999999999956]
+/Rect [72.24000000000001 205.79999999999953 152.27100000000002 220.07999999999953]
/Type /Annot
>>
endobj
431 0 obj
<< /Border [0 0 0]
-/Dest (_responses_24)
+/Dest (_produces_25)
/Subtype /Link
-/Rect [552.021 298.1999999999996 563.76 312.47999999999956]
+/Rect [552.021 205.79999999999953 563.76 220.07999999999953]
/Type /Annot
>>
endobj
432 0 obj
<< /Border [0 0 0]
-/Dest (_produces_24)
+/Dest (_route76)
/Subtype /Link
-/Rect [72.24000000000001 279.7199999999996 152.27100000000002 293.99999999999955]
+/Rect [60.24000000000001 187.31999999999954 274.6605 201.59999999999954]
/Type /Annot
>>
endobj
433 0 obj
<< /Border [0 0 0]
-/Dest (_produces_24)
+/Dest (_route76)
/Subtype /Link
-/Rect [552.021 279.7199999999996 563.76 293.99999999999955]
+/Rect [552.021 187.31999999999954 563.76 201.59999999999954]
/Type /Annot
>>
endobj
434 0 obj
<< /Border [0 0 0]
-/Dest (_route24)
+/Dest (_parameters_18)
/Subtype /Link
-/Rect [60.24000000000001 261.23999999999955 176.61150000000004 275.5199999999995]
+/Rect [72.24000000000001 168.83999999999955 163.71579492187502 183.11999999999955]
/Type /Annot
>>
endobj
435 0 obj
<< /Border [0 0 0]
-/Dest (_route24)
+/Dest (_parameters_18)
/Subtype /Link
-/Rect [552.021 261.23999999999955 563.76 275.5199999999995]
+/Rect [552.021 168.83999999999955 563.76 183.11999999999955]
/Type /Annot
>>
endobj
436 0 obj
<< /Border [0 0 0]
-/Dest (_responses_25)
+/Dest (_responses_26)
/Subtype /Link
-/Rect [72.24000000000001 242.7599999999995 157.899 257.0399999999995]
+/Rect [72.24000000000001 150.35999999999956 157.899 164.63999999999956]
/Type /Annot
>>
endobj
437 0 obj
<< /Border [0 0 0]
-/Dest (_responses_25)
+/Dest (_responses_26)
/Subtype /Link
-/Rect [552.021 242.7599999999995 563.76 257.0399999999995]
+/Rect [552.021 150.35999999999956 563.76 164.63999999999956]
/Type /Annot
>>
endobj
438 0 obj
<< /Border [0 0 0]
-/Dest (_produces_25)
+/Dest (_consumes_9)
/Subtype /Link
-/Rect [72.24000000000001 224.27999999999952 152.27100000000002 238.55999999999952]
+/Rect [72.24000000000001 131.87999999999957 157.2375 146.15999999999957]
/Type /Annot
>>
endobj
439 0 obj
<< /Border [0 0 0]
-/Dest (_produces_25)
+/Dest (_consumes_9)
/Subtype /Link
-/Rect [552.021 224.27999999999952 563.76 238.55999999999952]
+/Rect [552.021 131.87999999999957 563.76 146.15999999999957]
/Type /Annot
>>
endobj
440 0 obj
<< /Border [0 0 0]
-/Dest (_route23)
+/Dest (_produces_26)
/Subtype /Link
-/Rect [60.24000000000001 205.79999999999953 300.8265 220.07999999999953]
+/Rect [72.24000000000001 113.39999999999958 152.27100000000002 127.67999999999958]
/Type /Annot
>>
endobj
441 0 obj
<< /Border [0 0 0]
-/Dest (_route23)
+/Dest (_produces_26)
/Subtype /Link
-/Rect [552.021 205.79999999999953 563.76 220.07999999999953]
+/Rect [552.021 113.39999999999958 563.76 127.67999999999958]
/Type /Annot
>>
endobj
442 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_17)
+/Dest (_route84)
/Subtype /Link
-/Rect [72.24000000000001 187.31999999999954 163.71579492187502 201.59999999999954]
+/Rect [60.24000000000001 94.91999999999959 174.774 109.19999999999959]
/Type /Annot
>>
endobj
443 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_17)
+/Dest (_route84)
/Subtype /Link
-/Rect [552.021 187.31999999999954 563.76 201.59999999999954]
+/Rect [552.021 94.91999999999959 563.76 109.19999999999959]
/Type /Annot
>>
endobj
444 0 obj
<< /Border [0 0 0]
-/Dest (_responses_26)
+/Dest (_responses_27)
/Subtype /Link
-/Rect [72.24000000000001 168.83999999999955 157.899 183.11999999999955]
+/Rect [72.24000000000001 76.4399999999996 157.899 90.7199999999996]
/Type /Annot
>>
endobj
445 0 obj
<< /Border [0 0 0]
-/Dest (_responses_26)
+/Dest (_responses_27)
/Subtype /Link
-/Rect [552.021 168.83999999999955 563.76 183.11999999999955]
+/Rect [552.021 76.4399999999996 563.76 90.7199999999996]
/Type /Annot
>>
endobj
446 0 obj
<< /Border [0 0 0]
-/Dest (_produces_26)
+/Dest (_produces_27)
/Subtype /Link
-/Rect [72.24000000000001 150.35999999999956 152.27100000000002 164.63999999999956]
+/Rect [72.24000000000001 57.95999999999961 152.27100000000002 72.23999999999961]
/Type /Annot
>>
endobj
447 0 obj
<< /Border [0 0 0]
-/Dest (_produces_26)
+/Dest (_produces_27)
/Subtype /Link
-/Rect [552.021 150.35999999999956 563.76 164.63999999999956]
+/Rect [552.021 57.95999999999961 563.76 72.23999999999961]
/Type /Annot
>>
endobj
448 0 obj
<< /Border [0 0 0]
-/Dest (_route25)
+/Dest (_definitions)
/Subtype /Link
-/Rect [60.24000000000001 131.87999999999957 274.8285 146.15999999999957]
+/Rect [48.24 741.7199999999999 114.66300000000001 756.0]
/Type /Annot
>>
endobj
449 0 obj
<< /Border [0 0 0]
-/Dest (_route25)
+/Dest (_definitions)
/Subtype /Link
-/Rect [552.021 131.87999999999957 563.76 146.15999999999957]
+/Rect [552.021 741.7199999999999 563.76 756.0]
/Type /Annot
>>
endobj
450 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_18)
+/Dest (_cldsdictionary)
/Subtype /Link
-/Rect [72.24000000000001 113.39999999999958 163.71579492187502 127.67999999999958]
+/Rect [60.24 723.2399999999999 153.606 737.52]
/Type /Annot
>>
endobj
451 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_18)
+/Dest (_cldsdictionary)
/Subtype /Link
-/Rect [552.021 113.39999999999958 563.76 127.67999999999958]
+/Rect [552.021 723.2399999999999 563.76 737.52]
/Type /Annot
>>
endobj
452 0 obj
<< /Border [0 0 0]
-/Dest (_responses_27)
+/Dest (_cldsdictionaryitem)
/Subtype /Link
-/Rect [72.24000000000001 94.91999999999959 157.899 109.19999999999959]
+/Rect [60.24000000000001 704.7599999999999 176.685 719.04]
/Type /Annot
>>
endobj
453 0 obj
<< /Border [0 0 0]
-/Dest (_responses_27)
+/Dest (_cldsdictionaryitem)
/Subtype /Link
-/Rect [552.021 94.91999999999959 563.76 109.19999999999959]
+/Rect [552.021 704.7599999999999 563.76 719.04]
/Type /Annot
>>
endobj
454 0 obj
<< /Border [0 0 0]
-/Dest (_produces_27)
+/Dest (_cldsevent)
/Subtype /Link
-/Rect [72.24000000000001 76.4399999999996 152.27100000000002 90.7199999999996]
+/Rect [60.24000000000001 686.2799999999999 129.519 700.56]
/Type /Annot
>>
endobj
455 0 obj
<< /Border [0 0 0]
-/Dest (_produces_27)
+/Dest (_cldsevent)
/Subtype /Link
-/Rect [552.021 76.4399999999996 563.76 90.7199999999996]
+/Rect [552.021 686.2799999999999 563.76 700.56]
/Type /Annot
>>
endobj
456 0 obj
<< /Border [0 0 0]
-/Dest (_route22)
+/Dest (_cldsinfo)
/Subtype /Link
-/Rect [60.24000000000001 57.95999999999961 274.6605 72.23999999999961]
+/Rect [60.24000000000001 667.7999999999998 121.37100000000001 682.0799999999999]
/Type /Annot
>>
endobj
457 0 obj
<< /Border [0 0 0]
-/Dest (_route22)
+/Dest (_cldsinfo)
/Subtype /Link
-/Rect [552.021 57.95999999999961 563.76 72.23999999999961]
+/Rect [552.021 667.7999999999998 563.76 682.0799999999999]
/Type /Annot
>>
endobj
458 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_19)
+/Dest (_cldsmodel)
/Subtype /Link
-/Rect [72.24000000000001 741.7199999999999 163.71579492187502 756.0]
+/Rect [60.24000000000001 649.3199999999998 132.01800000000003 663.5999999999999]
/Type /Annot
>>
endobj
459 0 obj
<< /Border [0 0 0]
-/Dest (_parameters_19)
+/Dest (_cldsmodel)
/Subtype /Link
-/Rect [552.021 741.7199999999999 563.76 756.0]
+/Rect [552.021 649.3199999999998 563.76 663.5999999999999]
/Type /Annot
>>
endobj
460 0 obj
<< /Border [0 0 0]
-/Dest (_responses_28)
+/Dest (_cldsmodelinstance)
/Subtype /Link
-/Rect [72.24000000000001 723.2399999999999 157.899 737.52]
+/Rect [60.24000000000001 630.8399999999998 174.53250000000003 645.1199999999999]
/Type /Annot
>>
endobj
461 0 obj
<< /Border [0 0 0]
-/Dest (_responses_28)
+/Dest (_cldsmodelinstance)
/Subtype /Link
-/Rect [552.021 723.2399999999999 563.76 737.52]
+/Rect [552.021 630.8399999999998 563.76 645.1199999999999]
/Type /Annot
>>
endobj
462 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_9)
+/Dest (_cldsmonitoringdetails)
/Subtype /Link
-/Rect [72.24000000000001 704.7599999999999 157.2375 719.04]
+/Rect [60.24000000000001 612.3599999999998 191.49 626.6399999999999]
/Type /Annot
>>
endobj
463 0 obj
<< /Border [0 0 0]
-/Dest (_consumes_9)
+/Dest (_cldsmonitoringdetails)
/Subtype /Link
-/Rect [552.021 704.7599999999999 563.76 719.04]
+/Rect [552.021 612.3599999999998 563.76 626.6399999999999]
/Type /Annot
>>
endobj
464 0 obj
<< /Border [0 0 0]
-/Dest (_produces_28)
+/Dest (_cldstemplate)
/Subtype /Link
-/Rect [72.24000000000001 686.2799999999999 152.27100000000002 700.56]
+/Rect [60.24000000000001 593.8799999999998 147.36075585937502 608.1599999999999]
/Type /Annot
>>
endobj
465 0 obj
<< /Border [0 0 0]
-/Dest (_produces_28)
+/Dest (_cldstemplate)
/Subtype /Link
-/Rect [552.021 686.2799999999999 563.76 700.56]
+/Rect [552.021 593.8799999999998 563.76 608.1599999999999]
/Type /Annot
>>
endobj
466 0 obj
<< /Border [0 0 0]
-/Dest (_route30)
+/Dest (_cldstoscamodel)
/Subtype /Link
-/Rect [60.24000000000001 667.7999999999998 174.774 682.0799999999999]
+/Rect [60.24000000000001 575.3999999999997 159.992255859375 589.6799999999998]
/Type /Annot
>>
endobj
467 0 obj
<< /Border [0 0 0]
-/Dest (_route30)
+/Dest (_cldstoscamodel)
/Subtype /Link
-/Rect [552.021 667.7999999999998 563.76 682.0799999999999]
+/Rect [552.021 575.3999999999997 563.76 589.6799999999998]
/Type /Annot
>>
endobj
468 0 obj
<< /Border [0 0 0]
-/Dest (_responses_29)
+/Dest (_dcaeevent)
/Subtype /Link
-/Rect [72.24000000000001 649.3199999999998 157.899 663.5999999999999]
+/Rect [60.24000000000001 556.9199999999998 138.84300000000002 571.1999999999998]
/Type /Annot
>>
endobj
469 0 obj
<< /Border [0 0 0]
-/Dest (_responses_29)
+/Dest (_dcaeevent)
/Subtype /Link
-/Rect [552.021 649.3199999999998 563.76 663.5999999999999]
+/Rect [552.021 556.9199999999998 563.76 571.1999999999998]
/Type /Annot
>>
endobj
470 0 obj
<< /Border [0 0 0]
-/Dest (_produces_29)
+/Dest (_valueitem)
/Subtype /Link
-/Rect [72.24000000000001 630.8399999999998 152.27100000000002 645.1199999999999]
+/Rect [60.24000000000001 538.4399999999998 136.773884765625 552.7199999999998]
/Type /Annot
>>
endobj
471 0 obj
<< /Border [0 0 0]
-/Dest (_produces_29)
+/Dest (_valueitem)
/Subtype /Link
-/Rect [552.021 630.8399999999998 563.76 645.1199999999999]
+/Rect [552.021 538.4399999999998 563.76 552.7199999999998]
/Type /Annot
>>
endobj
472 0 obj
-<< /Border [0 0 0]
-/Dest (_definitions)
-/Subtype /Link
-/Rect [48.24000000000001 612.3599999999998 114.66300000000001 626.6399999999999]
-/Type /Annot
+<< /Type /XObject
+/Subtype /Form
+/BBox [0 0 612.0 792.0]
+/Length 178
>>
+stream
+q
+/DeviceRGB cs
+0.000 0.000 0.000 scn
+/DeviceRGB CS
+0.000 0.000 0.000 SCN
+1 w
+0 J
+0 j
+[ ] 0 d
+q
+0.25 w
+/DeviceRGB CS
+0.867 0.867 0.867 SCN
+48.240 30.000 m
+563.760 30.000 l
+S
+Q
+Q
+
+endstream
endobj
473 0 obj
-<< /Border [0 0 0]
-/Dest (_definitions)
-/Subtype /Link
-/Rect [552.021 612.3599999999998 563.76 626.6399999999999]
-/Type /Annot
+<< /Type /Outlines
+/Count 126
+/First 474 0 R
+/Last 588 0 R
>>
endobj
474 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionary)
-/Subtype /Link
-/Rect [60.24000000000001 593.8799999999998 153.606 608.1599999999999]
-/Type /Annot
+<< /Title <feff0043006c0061006d0070002000520065007300740020004100500049>
+/Parent 473 0 R
+/Count 0
+/Next 475 0 R
+/Dest [7 0 R /XYZ 0 792.0 null]
>>
endobj
475 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionary)
-/Subtype /Link
-/Rect [552.021 593.8799999999998 563.76 608.1599999999999]
-/Type /Annot
+<< /Title <feff005400610062006c00650020006f006600200043006f006e00740065006e00740073>
+/Parent 473 0 R
+/Count 0
+/Next 476 0 R
+/Prev 474 0 R
+/Dest [10 0 R /XYZ 0 792.0 null]
>>
endobj
476 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionaryitem)
-/Subtype /Link
-/Rect [60.24000000000001 575.3999999999997 176.685 589.6799999999998]
-/Type /Annot
+<< /Title <feff004300680061007000740065007200200031002e0020004f0076006500720076006900650077>
+/Parent 473 0 R
+/Count 2
+/First 477 0 R
+/Last 478 0 R
+/Next 479 0 R
+/Prev 475 0 R
+/Dest [18 0 R /XYZ 0 792.0 null]
>>
endobj
477 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsdictionaryitem)
-/Subtype /Link
-/Rect [552.021 575.3999999999997 563.76 589.6799999999998]
-/Type /Annot
+<< /Title <feff0031002e0031002e002000560065007200730069006f006e00200069006e0066006f0072006d006100740069006f006e>
+/Parent 476 0 R
+/Count 0
+/Next 478 0 R
+/Dest [18 0 R /XYZ 0 712.0799999999999 null]
>>
endobj
478 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsevent)
-/Subtype /Link
-/Rect [60.24000000000001 556.9199999999998 129.519 571.1999999999998]
-/Type /Annot
+<< /Title <feff0031002e0032002e002000550052004900200073006300680065006d0065>
+/Parent 476 0 R
+/Count 0
+/Prev 477 0 R
+/Dest [18 0 R /XYZ 0 644.22 null]
>>
endobj
479 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsevent)
-/Subtype /Link
-/Rect [552.021 556.9199999999998 563.76 571.1999999999998]
-/Type /Annot
+<< /Title <feff004300680061007000740065007200200032002e002000500061007400680073>
+/Parent 473 0 R
+/Count 108
+/First 480 0 R
+/Last 585 0 R
+/Next 588 0 R
+/Prev 476 0 R
+/Dest [27 0 R /XYZ 0 792.0 null]
>>
endobj
480 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsinfo)
-/Subtype /Link
-/Rect [60.24000000000001 538.4399999999998 121.37100000000001 552.7199999999998]
-/Type /Annot
+<< /Title <feff0032002e0031002e00200050005500540020002f0063006c00640073002f0061006300740069006f006e002f007b0061006300740069006f006e007d002f007b006d006f00640065006c004e0061006d0065007d003f0074006500730074003d007b0074006500730074007d>
+/Parent 479 0 R
+/Count 4
+/First 481 0 R
+/Last 484 0 R
+/Next 485 0 R
+/Dest [27 0 R /XYZ 0 712.0799999999999 null]
>>
endobj
481 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsinfo)
-/Subtype /Link
-/Rect [552.021 538.4399999999998 563.76 552.7199999999998]
-/Type /Annot
+<< /Title <feff0032002e0031002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 480 0 R
+/Count 0
+/Next 482 0 R
+/Dest [27 0 R /XYZ 0 672.0 null]
>>
endobj
482 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmodel)
-/Subtype /Link
-/Rect [60.24000000000001 519.9599999999998 132.01800000000003 534.2399999999998]
-/Type /Annot
+<< /Title <feff0032002e0031002e0032002e00200052006500730070006f006e007300650073>
+/Parent 480 0 R
+/Count 0
+/Next 483 0 R
+/Prev 481 0 R
+/Dest [27 0 R /XYZ 0 491.76000000000016 null]
>>
endobj
483 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmodel)
-/Subtype /Link
-/Rect [552.021 519.9599999999998 563.76 534.2399999999998]
-/Type /Annot
+<< /Title <feff0032002e0031002e0033002e00200043006f006e00730075006d00650073>
+/Parent 480 0 R
+/Count 0
+/Next 484 0 R
+/Prev 482 0 R
+/Dest [27 0 R /XYZ 0 400.9200000000002 null]
>>
endobj
484 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmodelinstance)
-/Subtype /Link
-/Rect [60.24000000000001 501.4799999999998 174.53250000000003 515.7599999999998]
-/Type /Annot
+<< /Title <feff0032002e0031002e0034002e002000500072006f00640075006300650073>
+/Parent 480 0 R
+/Count 0
+/Prev 483 0 R
+/Dest [27 0 R /XYZ 0 344.64000000000016 null]
>>
endobj
485 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmodelinstance)
-/Subtype /Link
-/Rect [552.021 501.4799999999998 563.76 515.7599999999998]
-/Type /Annot
+<< /Title <feff0032002e0032002e00200047004500540020002f0063006c00640073002f0063006c0064007300440065007400610069006c0073>
+/Parent 479 0 R
+/Count 2
+/First 486 0 R
+/Last 487 0 R
+/Next 488 0 R
+/Prev 480 0 R
+/Dest [27 0 R /XYZ 0 288.3600000000001 null]
>>
endobj
486 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmonitoringdetails)
-/Subtype /Link
-/Rect [60.24000000000001 482.9999999999998 191.49 497.27999999999975]
-/Type /Annot
+<< /Title <feff0032002e0032002e0031002e00200052006500730070006f006e007300650073>
+/Parent 485 0 R
+/Count 0
+/Next 487 0 R
+/Dest [27 0 R /XYZ 0 248.28000000000011 null]
>>
endobj
487 0 obj
-<< /Border [0 0 0]
-/Dest (_cldsmonitoringdetails)
-/Subtype /Link
-/Rect [552.021 482.9999999999998 563.76 497.27999999999975]
-/Type /Annot
+<< /Title <feff0032002e0032002e0032002e002000500072006f00640075006300650073>
+/Parent 485 0 R
+/Count 0
+/Prev 486 0 R
+/Dest [27 0 R /XYZ 0 128.88000000000008 null]
>>
endobj
488 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstemplate)
-/Subtype /Link
-/Rect [60.24000000000001 464.51999999999975 147.36075585937502 478.7999999999997]
-/Type /Annot
+<< /Title <feff0032002e0033002e00200047004500540020002f0063006c00640073002f0063006c006400730049006e0066006f>
+/Parent 479 0 R
+/Count 2
+/First 489 0 R
+/Last 490 0 R
+/Next 491 0 R
+/Prev 485 0 R
+/Dest [42 0 R /XYZ 0 792.0 null]
>>
endobj
489 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstemplate)
-/Subtype /Link
-/Rect [552.021 464.51999999999975 563.76 478.7999999999997]
-/Type /Annot
+<< /Title <feff0032002e0033002e0031002e00200052006500730070006f006e007300650073>
+/Parent 488 0 R
+/Count 0
+/Next 490 0 R
+/Dest [42 0 R /XYZ 0 718.32 null]
>>
endobj
490 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstoscamodel)
-/Subtype /Link
-/Rect [60.24000000000001 446.03999999999974 159.992255859375 460.3199999999997]
-/Type /Annot
+<< /Title <feff0032002e0033002e0032002e002000500072006f00640075006300650073>
+/Parent 488 0 R
+/Count 0
+/Prev 489 0 R
+/Dest [42 0 R /XYZ 0 613.2000000000003 null]
>>
endobj
491 0 obj
-<< /Border [0 0 0]
-/Dest (_cldstoscamodel)
-/Subtype /Link
-/Rect [552.021 446.03999999999974 563.76 460.3199999999997]
-/Type /Annot
+<< /Title <feff0032002e0034002e00200050004f005300540020002f0063006c00640073002f0064006300610065002f006500760065006e0074003f0074006500730074003d007b0074006500730074007d>
+/Parent 479 0 R
+/Count 4
+/First 492 0 R
+/Last 495 0 R
+/Next 496 0 R
+/Prev 488 0 R
+/Dest [42 0 R /XYZ 0 556.9200000000004 null]
>>
endobj
492 0 obj
-<< /Border [0 0 0]
-/Dest (_dcaeevent)
-/Subtype /Link
-/Rect [60.24000000000001 427.5599999999997 138.84300000000002 441.8399999999997]
-/Type /Annot
+<< /Title <feff0032002e0034002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 491 0 R
+/Count 0
+/Next 493 0 R
+/Dest [42 0 R /XYZ 0 516.8400000000005 null]
>>
endobj
493 0 obj
-<< /Border [0 0 0]
-/Dest (_dcaeevent)
-/Subtype /Link
-/Rect [552.021 427.5599999999997 563.76 441.8399999999997]
-/Type /Annot
+<< /Title <feff0032002e0034002e0032002e00200052006500730070006f006e007300650073>
+/Parent 491 0 R
+/Count 0
+/Next 494 0 R
+/Prev 492 0 R
+/Dest [42 0 R /XYZ 0 411.72000000000054 null]
>>
endobj
494 0 obj
-<< /Border [0 0 0]
-/Dest (_valueitem)
-/Subtype /Link
-/Rect [60.24000000000001 409.0799999999997 136.773884765625 423.3599999999997]
-/Type /Annot
+<< /Title <feff0032002e0034002e0033002e00200043006f006e00730075006d00650073>
+/Parent 491 0 R
+/Count 0
+/Next 495 0 R
+/Prev 493 0 R
+/Dest [42 0 R /XYZ 0 320.88000000000056 null]
>>
endobj
495 0 obj
-<< /Border [0 0 0]
-/Dest (_valueitem)
-/Subtype /Link
-/Rect [552.021 409.0799999999997 563.76 423.3599999999997]
-/Type /Annot
+<< /Title <feff0032002e0034002e0034002e002000500072006f00640075006300650073>
+/Parent 491 0 R
+/Count 0
+/Prev 494 0 R
+/Dest [42 0 R /XYZ 0 264.60000000000053 null]
>>
endobj
496 0 obj
-<< /Type /XObject
-/Subtype /Form
-/BBox [0 0 612.0 792.0]
-/Length 178
+<< /Title <feff0032002e0035002e00200050005500540020002f0063006c00640073002f006400650070006c006f0079002f007b006d006f00640065006c004e0061006d0065007d>
+/Parent 479 0 R
+/Count 4
+/First 497 0 R
+/Last 500 0 R
+/Next 501 0 R
+/Prev 491 0 R
+/Dest [42 0 R /XYZ 0 208.32000000000053 null]
>>
-stream
-q
-/DeviceRGB cs
-0.000 0.000 0.000 scn
-/DeviceRGB CS
-0.000 0.000 0.000 SCN
-1 w
-0 J
-0 j
-[ ] 0 d
-q
-0.25 w
-/DeviceRGB CS
-0.867 0.867 0.867 SCN
-48.240 30.000 m
-563.760 30.000 l
-S
-Q
-Q
-
-endstream
endobj
497 0 obj
-<< /Type /Outlines
-/Count 133
-/First 498 0 R
-/Last 619 0 R
+<< /Title <feff0032002e0035002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 496 0 R
+/Count 0
+/Next 498 0 R
+/Dest [42 0 R /XYZ 0 168.24000000000052 null]
>>
endobj
498 0 obj
-<< /Title <feff0043006c0061006d0070002000520065007300740020004100500049>
-/Parent 497 0 R
+<< /Title <feff0032002e0035002e0032002e00200052006500730070006f006e007300650073>
+/Parent 496 0 R
/Count 0
/Next 499 0 R
-/Dest [7 0 R /XYZ 0 792.0 null]
+/Prev 497 0 R
+/Dest [58 0 R /XYZ 0 683.1600000000001 null]
>>
endobj
499 0 obj
-<< /Title <feff005400610062006c00650020006f006600200043006f006e00740065006e00740073>
-/Parent 497 0 R
+<< /Title <feff0032002e0035002e0033002e00200043006f006e00730075006d00650073>
+/Parent 496 0 R
/Count 0
/Next 500 0 R
/Prev 498 0 R
-/Dest [10 0 R /XYZ 0 792.0 null]
+/Dest [58 0 R /XYZ 0 592.3200000000003 null]
>>
endobj
500 0 obj
-<< /Title <feff004300680061007000740065007200200031002e0020004f0076006500720076006900650077>
-/Parent 497 0 R
-/Count 2
-/First 501 0 R
-/Last 502 0 R
-/Next 503 0 R
+<< /Title <feff0032002e0035002e0034002e002000500072006f00640075006300650073>
+/Parent 496 0 R
+/Count 0
/Prev 499 0 R
-/Dest [18 0 R /XYZ 0 792.0 null]
+/Dest [58 0 R /XYZ 0 536.0400000000004 null]
>>
endobj
501 0 obj
-<< /Title <feff0031002e0031002e002000560065007200730069006f006e00200069006e0066006f0072006d006100740069006f006e>
-/Parent 500 0 R
-/Count 0
-/Next 502 0 R
-/Dest [18 0 R /XYZ 0 712.0799999999999 null]
+<< /Title <feff0032002e0036002e00200047004500540020002f0063006c00640073002f006d006f00640065006c002d006e0061006d00650073>
+/Parent 479 0 R
+/Count 2
+/First 502 0 R
+/Last 503 0 R
+/Next 504 0 R
+/Prev 496 0 R
+/Dest [58 0 R /XYZ 0 479.76000000000056 null]
>>
endobj
502 0 obj
-<< /Title <feff0031002e0032002e002000550052004900200073006300680065006d0065>
-/Parent 500 0 R
+<< /Title <feff0032002e0036002e0031002e00200052006500730070006f006e007300650073>
+/Parent 501 0 R
/Count 0
-/Prev 501 0 R
-/Dest [18 0 R /XYZ 0 644.22 null]
+/Next 503 0 R
+/Dest [58 0 R /XYZ 0 439.6800000000005 null]
>>
endobj
503 0 obj
-<< /Title <feff004300680061007000740065007200200032002e002000500061007400680073>
-/Parent 497 0 R
-/Count 115
-/First 504 0 R
-/Last 616 0 R
-/Next 619 0 R
-/Prev 500 0 R
-/Dest [27 0 R /XYZ 0 792.0 null]
+<< /Title <feff0032002e0036002e0032002e002000500072006f00640075006300650073>
+/Parent 501 0 R
+/Count 0
+/Prev 502 0 R
+/Dest [58 0 R /XYZ 0 334.5600000000005 null]
>>
endobj
504 0 obj
-<< /Title <feff0032002e0031002e00200050005500540020002f0063006c00640073002f0061006300740069006f006e002f007b0061006300740069006f006e007d002f007b006d006f00640065006c004e0061006d0065007d003f0074006500730074003d007b0074006500730074007d>
-/Parent 503 0 R
-/Count 4
+<< /Title <feff0032002e0037002e00200047004500540020002f0063006c00640073002f006d006f00640065006c002f00620070006d006e002f007b006d006f00640065006c004e0061006d0065007d>
+/Parent 479 0 R
+/Count 3
/First 505 0 R
-/Last 508 0 R
-/Next 509 0 R
-/Dest [27 0 R /XYZ 0 712.0799999999999 null]
+/Last 507 0 R
+/Next 508 0 R
+/Prev 501 0 R
+/Dest [58 0 R /XYZ 0 278.2800000000005 null]
>>
endobj
505 0 obj
-<< /Title <feff0032002e0031002e0031002e00200050006100720061006d00650074006500720073>
+<< /Title <feff0032002e0037002e0031002e00200050006100720061006d00650074006500720073>
/Parent 504 0 R
/Count 0
/Next 506 0 R
-/Dest [27 0 R /XYZ 0 672.0 null]
+/Dest [58 0 R /XYZ 0 238.2000000000005 null]
>>
endobj
506 0 obj
-<< /Title <feff0032002e0031002e0032002e00200052006500730070006f006e007300650073>
+<< /Title <feff0032002e0037002e0032002e00200052006500730070006f006e007300650073>
/Parent 504 0 R
/Count 0
/Next 507 0 R
/Prev 505 0 R
-/Dest [27 0 R /XYZ 0 491.76000000000016 null]
+/Dest [58 0 R /XYZ 0 133.08000000000047 null]
>>
endobj
507 0 obj
-<< /Title <feff0032002e0031002e0033002e00200043006f006e00730075006d00650073>
+<< /Title <feff0032002e0037002e0033002e002000500072006f00640075006300650073>
/Parent 504 0 R
/Count 0
-/Next 508 0 R
/Prev 506 0 R
-/Dest [27 0 R /XYZ 0 400.9200000000002 null]
+/Dest [71 0 R /XYZ 0 792.0 null]
>>
endobj
508 0 obj
-<< /Title <feff0032002e0031002e0034002e002000500072006f00640075006300650073>
-/Parent 504 0 R
-/Count 0
-/Prev 507 0 R
-/Dest [27 0 R /XYZ 0 344.64000000000016 null]
->>
-endobj
-509 0 obj
-<< /Title <feff0032002e0032002e00200047004500540020002f0063006c00640073002f0063006c0064007300440065007400610069006c0073>
-/Parent 503 0 R
-/Count 2
-/First 510 0 R
+<< /Title <feff0032002e0038002e00200047004500540020002f0063006c00640073002f006d006f00640065006c002f0069006d006100670065002f007b006d006f00640065006c004e0061006d0065007d>
+/Parent 479 0 R
+/Count 3
+/First 509 0 R
/Last 511 0 R
/Next 512 0 R
/Prev 504 0 R
-/Dest [27 0 R /XYZ 0 288.3600000000001 null]
+/Dest [71 0 R /XYZ 0 702.1200000000001 null]
+>>
+endobj
+509 0 obj
+<< /Title <feff0032002e0038002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 508 0 R
+/Count 0
+/Next 510 0 R
+/Dest [71 0 R /XYZ 0 662.0400000000002 null]
>>
endobj
510 0 obj
-<< /Title <feff0032002e0032002e0031002e00200052006500730070006f006e007300650073>
-/Parent 509 0 R
+<< /Title <feff0032002e0038002e0032002e00200052006500730070006f006e007300650073>
+/Parent 508 0 R
/Count 0
/Next 511 0 R
-/Dest [27 0 R /XYZ 0 248.28000000000011 null]
+/Prev 509 0 R
+/Dest [71 0 R /XYZ 0 556.9200000000003 null]
>>
endobj
511 0 obj
-<< /Title <feff0032002e0032002e0032002e002000500072006f00640075006300650073>
-/Parent 509 0 R
+<< /Title <feff0032002e0038002e0033002e002000500072006f00640075006300650073>
+/Parent 508 0 R
/Count 0
/Prev 510 0 R
-/Dest [27 0 R /XYZ 0 128.88000000000008 null]
+/Dest [71 0 R /XYZ 0 466.0800000000005 null]
>>
endobj
512 0 obj
-<< /Title <feff0032002e0033002e00200047004500540020002f0063006c00640073002f0063006c006400730049006e0066006f>
-/Parent 503 0 R
-/Count 2
+<< /Title <feff0032002e0039002e00200047004500540020002f0063006c00640073002f006d006f00640065006c002f007b006d006f00640065006c004e0061006d0065007d>
+/Parent 479 0 R
+/Count 3
/First 513 0 R
-/Last 514 0 R
-/Next 515 0 R
-/Prev 509 0 R
-/Dest [42 0 R /XYZ 0 792.0 null]
+/Last 515 0 R
+/Next 516 0 R
+/Prev 508 0 R
+/Dest [71 0 R /XYZ 0 409.80000000000047 null]
>>
endobj
513 0 obj
-<< /Title <feff0032002e0033002e0031002e00200052006500730070006f006e007300650073>
+<< /Title <feff0032002e0039002e0031002e00200050006100720061006d00650074006500720073>
/Parent 512 0 R
/Count 0
/Next 514 0 R
-/Dest [42 0 R /XYZ 0 718.32 null]
+/Dest [71 0 R /XYZ 0 369.7200000000004 null]
>>
endobj
514 0 obj
-<< /Title <feff0032002e0033002e0032002e002000500072006f00640075006300650073>
+<< /Title <feff0032002e0039002e0032002e00200052006500730070006f006e007300650073>
/Parent 512 0 R
/Count 0
+/Next 515 0 R
/Prev 513 0 R
-/Dest [42 0 R /XYZ 0 613.2000000000003 null]
+/Dest [71 0 R /XYZ 0 264.6000000000004 null]
>>
endobj
515 0 obj
-<< /Title <feff0032002e0034002e00200050004f005300540020002f0063006c00640073002f0064006300610065002f006500760065006e0074003f0074006500730074003d007b0074006500730074007d>
-/Parent 503 0 R
-/Count 4
-/First 516 0 R
-/Last 519 0 R
-/Next 520 0 R
-/Prev 512 0 R
-/Dest [42 0 R /XYZ 0 556.9200000000004 null]
+<< /Title <feff0032002e0039002e0033002e002000500072006f00640075006300650073>
+/Parent 512 0 R
+/Count 0
+/Prev 514 0 R
+/Dest [71 0 R /XYZ 0 159.48000000000042 null]
>>
endobj
516 0 obj
-<< /Title <feff0032002e0034002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 515 0 R
-/Count 0
-/Next 517 0 R
-/Dest [42 0 R /XYZ 0 516.8400000000005 null]
+<< /Title <feff0032002e00310030002e00200050005500540020002f0063006c00640073002f006d006f00640065006c002f007b006d006f00640065006c004e0061006d0065007d>
+/Parent 479 0 R
+/Count 4
+/First 517 0 R
+/Last 520 0 R
+/Next 521 0 R
+/Prev 512 0 R
+/Dest [71 0 R /XYZ 0 103.20000000000039 null]
>>
endobj
517 0 obj
-<< /Title <feff0032002e0034002e0032002e00200052006500730070006f006e007300650073>
-/Parent 515 0 R
+<< /Title <feff0032002e00310030002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 516 0 R
/Count 0
/Next 518 0 R
-/Prev 516 0 R
-/Dest [42 0 R /XYZ 0 411.72000000000054 null]
+/Dest [85 0 R /XYZ 0 792.0 null]
>>
endobj
518 0 obj
-<< /Title <feff0032002e0034002e0033002e00200043006f006e00730075006d00650073>
-/Parent 515 0 R
+<< /Title <feff0032002e00310030002e0032002e00200052006500730070006f006e007300650073>
+/Parent 516 0 R
/Count 0
/Next 519 0 R
/Prev 517 0 R
-/Dest [42 0 R /XYZ 0 320.88000000000056 null]
+/Dest [85 0 R /XYZ 0 615.72 null]
>>
endobj
519 0 obj
-<< /Title <feff0032002e0034002e0034002e002000500072006f00640075006300650073>
-/Parent 515 0 R
+<< /Title <feff0032002e00310030002e0033002e00200043006f006e00730075006d00650073>
+/Parent 516 0 R
/Count 0
+/Next 520 0 R
/Prev 518 0 R
-/Dest [42 0 R /XYZ 0 264.60000000000053 null]
+/Dest [85 0 R /XYZ 0 510.60000000000014 null]
>>
endobj
520 0 obj
-<< /Title <feff0032002e0035002e00200050005500540020002f0063006c00640073002f006400650070006c006f0079002f007b006d006f00640065006c004e0061006d0065007d>
-/Parent 503 0 R
-/Count 4
-/First 521 0 R
-/Last 524 0 R
-/Next 525 0 R
-/Prev 515 0 R
-/Dest [42 0 R /XYZ 0 208.32000000000053 null]
+<< /Title <feff0032002e00310030002e0034002e002000500072006f00640075006300650073>
+/Parent 516 0 R
+/Count 0
+/Prev 519 0 R
+/Dest [85 0 R /XYZ 0 454.3200000000001 null]
>>
endobj
521 0 obj
-<< /Title <feff0032002e0035002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 520 0 R
-/Count 0
-/Next 522 0 R
-/Dest [42 0 R /XYZ 0 168.24000000000052 null]
+<< /Title <feff0032002e00310031002e00200047004500540020002f0063006c00640073002f00700072006f0070006500720074006900650073>
+/Parent 479 0 R
+/Count 2
+/First 522 0 R
+/Last 523 0 R
+/Next 524 0 R
+/Prev 516 0 R
+/Dest [85 0 R /XYZ 0 398.0400000000001 null]
>>
endobj
522 0 obj
-<< /Title <feff0032002e0035002e0032002e00200052006500730070006f006e007300650073>
-/Parent 520 0 R
+<< /Title <feff0032002e00310031002e0031002e00200052006500730070006f006e007300650073>
+/Parent 521 0 R
/Count 0
/Next 523 0 R
-/Prev 521 0 R
-/Dest [58 0 R /XYZ 0 683.1600000000001 null]
+/Dest [85 0 R /XYZ 0 357.96000000000004 null]
>>
endobj
523 0 obj
-<< /Title <feff0032002e0035002e0033002e00200043006f006e00730075006d00650073>
-/Parent 520 0 R
+<< /Title <feff0032002e00310031002e0032002e002000500072006f00640075006300650073>
+/Parent 521 0 R
/Count 0
-/Next 524 0 R
/Prev 522 0 R
-/Dest [58 0 R /XYZ 0 592.3200000000003 null]
+/Dest [85 0 R /XYZ 0 267.12 null]
>>
endobj
524 0 obj
-<< /Title <feff0032002e0035002e0034002e002000500072006f00640075006300650073>
-/Parent 520 0 R
-/Count 0
-/Prev 523 0 R
-/Dest [58 0 R /XYZ 0 536.0400000000004 null]
+<< /Title <feff0032002e00310032002e00200050005500540020002f0063006c00640073002f0075006e006400650070006c006f0079002f007b006d006f00640065006c004e0061006d0065007d>
+/Parent 479 0 R
+/Count 4
+/First 525 0 R
+/Last 528 0 R
+/Next 529 0 R
+/Prev 521 0 R
+/Dest [85 0 R /XYZ 0 210.84 null]
>>
endobj
525 0 obj
-<< /Title <feff0032002e0036002e00200047004500540020002f0063006c00640073002f006d006f00640065006c002d006e0061006d00650073>
-/Parent 503 0 R
-/Count 2
-/First 526 0 R
-/Last 527 0 R
-/Next 528 0 R
-/Prev 520 0 R
-/Dest [58 0 R /XYZ 0 479.76000000000056 null]
+<< /Title <feff0032002e00310032002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 524 0 R
+/Count 0
+/Next 526 0 R
+/Dest [85 0 R /XYZ 0 170.76 null]
>>
endobj
526 0 obj
-<< /Title <feff0032002e0036002e0031002e00200052006500730070006f006e007300650073>
-/Parent 525 0 R
+<< /Title <feff0032002e00310032002e0032002e00200052006500730070006f006e007300650073>
+/Parent 524 0 R
/Count 0
/Next 527 0 R
-/Dest [58 0 R /XYZ 0 439.6800000000005 null]
+/Prev 525 0 R
+/Dest [98 0 R /XYZ 0 683.1600000000001 null]
>>
endobj
527 0 obj
-<< /Title <feff0032002e0036002e0032002e002000500072006f00640075006300650073>
-/Parent 525 0 R
+<< /Title <feff0032002e00310032002e0033002e00200043006f006e00730075006d00650073>
+/Parent 524 0 R
/Count 0
+/Next 528 0 R
/Prev 526 0 R
-/Dest [58 0 R /XYZ 0 334.5600000000005 null]
+/Dest [98 0 R /XYZ 0 592.3200000000003 null]
>>
endobj
528 0 obj
-<< /Title <feff0032002e0037002e00200047004500540020002f0063006c00640073002f006d006f00640065006c002f00620070006d006e002f007b006d006f00640065006c004e0061006d0065007d>
-/Parent 503 0 R
-/Count 3
-/First 529 0 R
-/Last 531 0 R
-/Next 532 0 R
-/Prev 525 0 R
-/Dest [58 0 R /XYZ 0 278.2800000000005 null]
+<< /Title <feff0032002e00310032002e0034002e002000500072006f00640075006300650073>
+/Parent 524 0 R
+/Count 0
+/Prev 527 0 R
+/Dest [98 0 R /XYZ 0 536.0400000000004 null]
>>
endobj
529 0 obj
-<< /Title <feff0032002e0037002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 528 0 R
-/Count 0
-/Next 530 0 R
-/Dest [58 0 R /XYZ 0 238.2000000000005 null]
+<< /Title <feff0032002e00310033002e00200047004500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002d006e0061006d00650073>
+/Parent 479 0 R
+/Count 2
+/First 530 0 R
+/Last 531 0 R
+/Next 532 0 R
+/Prev 524 0 R
+/Dest [98 0 R /XYZ 0 479.76000000000056 null]
>>
endobj
530 0 obj
-<< /Title <feff0032002e0037002e0032002e00200052006500730070006f006e007300650073>
-/Parent 528 0 R
+<< /Title <feff0032002e00310033002e0031002e00200052006500730070006f006e007300650073>
+/Parent 529 0 R
/Count 0
/Next 531 0 R
-/Prev 529 0 R
-/Dest [58 0 R /XYZ 0 133.08000000000047 null]
+/Dest [98 0 R /XYZ 0 439.6800000000005 null]
>>
endobj
531 0 obj
-<< /Title <feff0032002e0037002e0033002e002000500072006f00640075006300650073>
-/Parent 528 0 R
+<< /Title <feff0032002e00310033002e0032002e002000500072006f00640075006300650073>
+/Parent 529 0 R
/Count 0
/Prev 530 0 R
-/Dest [71 0 R /XYZ 0 792.0 null]
+/Dest [98 0 R /XYZ 0 334.5600000000005 null]
>>
endobj
532 0 obj
-<< /Title <feff0032002e0038002e00200047004500540020002f0063006c00640073002f006d006f00640065006c002f0069006d006100670065002f007b006d006f00640065006c004e0061006d0065007d>
-/Parent 503 0 R
+<< /Title <feff0032002e00310034002e00200047004500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002f00620070006d006e002f007b00740065006d0070006c006100740065004e0061006d0065007d>
+/Parent 479 0 R
/Count 3
/First 533 0 R
/Last 535 0 R
/Next 536 0 R
-/Prev 528 0 R
-/Dest [71 0 R /XYZ 0 702.1200000000001 null]
+/Prev 529 0 R
+/Dest [98 0 R /XYZ 0 278.2800000000005 null]
>>
endobj
533 0 obj
-<< /Title <feff0032002e0038002e0031002e00200050006100720061006d00650074006500720073>
+<< /Title <feff0032002e00310034002e0031002e00200050006100720061006d00650074006500720073>
/Parent 532 0 R
/Count 0
/Next 534 0 R
-/Dest [71 0 R /XYZ 0 662.0400000000002 null]
+/Dest [98 0 R /XYZ 0 238.2000000000005 null]
>>
endobj
534 0 obj
-<< /Title <feff0032002e0038002e0032002e00200052006500730070006f006e007300650073>
+<< /Title <feff0032002e00310034002e0032002e00200052006500730070006f006e007300650073>
/Parent 532 0 R
/Count 0
/Next 535 0 R
/Prev 533 0 R
-/Dest [71 0 R /XYZ 0 556.9200000000003 null]
+/Dest [98 0 R /XYZ 0 133.08000000000047 null]
>>
endobj
535 0 obj
-<< /Title <feff0032002e0038002e0033002e002000500072006f00640075006300650073>
+<< /Title <feff0032002e00310034002e0033002e002000500072006f00640075006300650073>
/Parent 532 0 R
/Count 0
/Prev 534 0 R
-/Dest [71 0 R /XYZ 0 466.0800000000005 null]
+/Dest [112 0 R /XYZ 0 792.0 null]
>>
endobj
536 0 obj
-<< /Title <feff0032002e0039002e00200047004500540020002f0063006c00640073002f006d006f00640065006c002f007b006d006f00640065006c004e0061006d0065007d>
-/Parent 503 0 R
+<< /Title <feff0032002e00310035002e00200047004500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002f0069006d006100670065002f007b00740065006d0070006c006100740065004e0061006d0065007d>
+/Parent 479 0 R
/Count 3
/First 537 0 R
/Last 539 0 R
/Next 540 0 R
/Prev 532 0 R
-/Dest [71 0 R /XYZ 0 409.80000000000047 null]
+/Dest [112 0 R /XYZ 0 702.1200000000001 null]
>>
endobj
537 0 obj
-<< /Title <feff0032002e0039002e0031002e00200050006100720061006d00650074006500720073>
+<< /Title <feff0032002e00310035002e0031002e00200050006100720061006d00650074006500720073>
/Parent 536 0 R
/Count 0
/Next 538 0 R
-/Dest [71 0 R /XYZ 0 369.7200000000004 null]
+/Dest [112 0 R /XYZ 0 662.0400000000002 null]
>>
endobj
538 0 obj
-<< /Title <feff0032002e0039002e0032002e00200052006500730070006f006e007300650073>
+<< /Title <feff0032002e00310035002e0032002e00200052006500730070006f006e007300650073>
/Parent 536 0 R
/Count 0
/Next 539 0 R
/Prev 537 0 R
-/Dest [71 0 R /XYZ 0 264.6000000000004 null]
+/Dest [112 0 R /XYZ 0 556.9200000000003 null]
>>
endobj
539 0 obj
-<< /Title <feff0032002e0039002e0033002e002000500072006f00640075006300650073>
+<< /Title <feff0032002e00310035002e0033002e002000500072006f00640075006300650073>
/Parent 536 0 R
/Count 0
/Prev 538 0 R
-/Dest [71 0 R /XYZ 0 159.48000000000042 null]
+/Dest [112 0 R /XYZ 0 466.0800000000005 null]
>>
endobj
540 0 obj
-<< /Title <feff0032002e00310030002e00200050005500540020002f0063006c00640073002f006d006f00640065006c002f007b006d006f00640065006c004e0061006d0065007d>
-/Parent 503 0 R
-/Count 4
+<< /Title <feff0032002e00310036002e00200047004500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002f007b00740065006d0070006c006100740065004e0061006d0065007d>
+/Parent 479 0 R
+/Count 3
/First 541 0 R
-/Last 544 0 R
-/Next 545 0 R
+/Last 543 0 R
+/Next 544 0 R
/Prev 536 0 R
-/Dest [71 0 R /XYZ 0 103.20000000000039 null]
+/Dest [112 0 R /XYZ 0 409.80000000000047 null]
>>
endobj
541 0 obj
-<< /Title <feff0032002e00310030002e0031002e00200050006100720061006d00650074006500720073>
+<< /Title <feff0032002e00310036002e0031002e00200050006100720061006d00650074006500720073>
/Parent 540 0 R
/Count 0
/Next 542 0 R
-/Dest [85 0 R /XYZ 0 792.0 null]
+/Dest [112 0 R /XYZ 0 369.7200000000004 null]
>>
endobj
542 0 obj
-<< /Title <feff0032002e00310030002e0032002e00200052006500730070006f006e007300650073>
+<< /Title <feff0032002e00310036002e0032002e00200052006500730070006f006e007300650073>
/Parent 540 0 R
/Count 0
/Next 543 0 R
/Prev 541 0 R
-/Dest [85 0 R /XYZ 0 615.72 null]
+/Dest [112 0 R /XYZ 0 264.6000000000004 null]
>>
endobj
543 0 obj
-<< /Title <feff0032002e00310030002e0033002e00200043006f006e00730075006d00650073>
+<< /Title <feff0032002e00310036002e0033002e002000500072006f00640075006300650073>
/Parent 540 0 R
/Count 0
-/Next 544 0 R
/Prev 542 0 R
-/Dest [85 0 R /XYZ 0 510.60000000000014 null]
+/Dest [112 0 R /XYZ 0 159.48000000000042 null]
>>
endobj
544 0 obj
-<< /Title <feff0032002e00310030002e0034002e002000500072006f00640075006300650073>
-/Parent 540 0 R
-/Count 0
-/Prev 543 0 R
-/Dest [85 0 R /XYZ 0 454.3200000000001 null]
+<< /Title <feff0032002e00310037002e00200050005500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002f007b00740065006d0070006c006100740065004e0061006d0065007d>
+/Parent 479 0 R
+/Count 4
+/First 545 0 R
+/Last 548 0 R
+/Next 549 0 R
+/Prev 540 0 R
+/Dest [112 0 R /XYZ 0 103.20000000000039 null]
>>
endobj
545 0 obj
-<< /Title <feff0032002e00310031002e00200047004500540020002f0063006c00640073002f00700072006f0070006500720074006900650073>
-/Parent 503 0 R
-/Count 2
-/First 546 0 R
-/Last 547 0 R
-/Next 548 0 R
-/Prev 540 0 R
-/Dest [85 0 R /XYZ 0 398.0400000000001 null]
+<< /Title <feff0032002e00310037002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 544 0 R
+/Count 0
+/Next 546 0 R
+/Dest [126 0 R /XYZ 0 792.0 null]
>>
endobj
546 0 obj
-<< /Title <feff0032002e00310031002e0031002e00200052006500730070006f006e007300650073>
-/Parent 545 0 R
+<< /Title <feff0032002e00310037002e0032002e00200052006500730070006f006e007300650073>
+/Parent 544 0 R
/Count 0
/Next 547 0 R
-/Dest [85 0 R /XYZ 0 357.96000000000004 null]
+/Prev 545 0 R
+/Dest [126 0 R /XYZ 0 615.72 null]
>>
endobj
547 0 obj
-<< /Title <feff0032002e00310031002e0032002e002000500072006f00640075006300650073>
-/Parent 545 0 R
+<< /Title <feff0032002e00310037002e0033002e00200043006f006e00730075006d00650073>
+/Parent 544 0 R
/Count 0
+/Next 548 0 R
/Prev 546 0 R
-/Dest [85 0 R /XYZ 0 267.12 null]
+/Dest [126 0 R /XYZ 0 510.60000000000014 null]
>>
endobj
548 0 obj
-<< /Title <feff0032002e00310032002e00200047004500540020002f0063006c00640073002f00700072006f0070006500720074006900650073002f007b00730065007200760069006300650049006e00760061007200690061006e00740055005500490044007d003f0072006500660072006500730068003d007b0072006500660072006500730068007d>
-/Parent 503 0 R
-/Count 3
-/First 549 0 R
-/Last 551 0 R
-/Next 552 0 R
-/Prev 545 0 R
-/Dest [85 0 R /XYZ 0 210.84 null]
+<< /Title <feff0032002e00310037002e0034002e002000500072006f00640075006300650073>
+/Parent 544 0 R
+/Count 0
+/Prev 547 0 R
+/Dest [126 0 R /XYZ 0 454.3200000000001 null]
>>
endobj
549 0 obj
-<< /Title <feff0032002e00310032002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 548 0 R
-/Count 0
-/Next 550 0 R
-/Dest [85 0 R /XYZ 0 114.6 null]
+<< /Title <feff0032002e00310038002e00200047004500540020002f00640069006300740069006f006e006100720079>
+/Parent 479 0 R
+/Count 2
+/First 550 0 R
+/Last 551 0 R
+/Next 552 0 R
+/Prev 544 0 R
+/Dest [126 0 R /XYZ 0 398.0400000000001 null]
>>
endobj
550 0 obj
-<< /Title <feff0032002e00310032002e0032002e00200052006500730070006f006e007300650073>
-/Parent 548 0 R
+<< /Title <feff0032002e00310038002e0031002e00200052006500730070006f006e007300650073>
+/Parent 549 0 R
/Count 0
/Next 551 0 R
-/Prev 549 0 R
-/Dest [98 0 R /XYZ 0 668.88 null]
+/Dest [126 0 R /XYZ 0 357.96000000000004 null]
>>
endobj
551 0 obj
-<< /Title <feff0032002e00310032002e0033002e002000500072006f00640075006300650073>
-/Parent 548 0 R
+<< /Title <feff0032002e00310038002e0032002e002000500072006f00640075006300650073>
+/Parent 549 0 R
/Count 0
/Prev 550 0 R
-/Dest [98 0 R /XYZ 0 578.0400000000002 null]
+/Dest [126 0 R /XYZ 0 252.84000000000003 null]
>>
endobj
552 0 obj
-<< /Title <feff0032002e00310033002e00200047004500540020002f0063006c00640073002f007300640063002f00730065007200760069006300650073>
-/Parent 503 0 R
-/Count 2
+<< /Title <feff0032002e00310039002e00200050005500540020002f00640069006300740069006f006e006100720079002f007b00640069006300740069006f006e006100720079004e0061006d0065007d>
+/Parent 479 0 R
+/Count 4
/First 553 0 R
-/Last 554 0 R
-/Next 555 0 R
-/Prev 548 0 R
-/Dest [98 0 R /XYZ 0 521.7600000000003 null]
+/Last 556 0 R
+/Next 557 0 R
+/Prev 549 0 R
+/Dest [126 0 R /XYZ 0 196.56 null]
>>
endobj
553 0 obj
-<< /Title <feff0032002e00310033002e0031002e00200052006500730070006f006e007300650073>
+<< /Title <feff0032002e00310039002e0031002e00200050006100720061006d00650074006500720073>
/Parent 552 0 R
/Count 0
/Next 554 0 R
-/Dest [98 0 R /XYZ 0 481.68000000000035 null]
+/Dest [126 0 R /XYZ 0 156.48 null]
>>
endobj
554 0 obj
-<< /Title <feff0032002e00310033002e0032002e002000500072006f00640075006300650073>
+<< /Title <feff0032002e00310039002e0032002e00200052006500730070006f006e007300650073>
/Parent 552 0 R
/Count 0
+/Next 555 0 R
/Prev 553 0 R
-/Dest [98 0 R /XYZ 0 390.8400000000004 null]
+/Dest [141 0 R /XYZ 0 683.1600000000001 null]
>>
endobj
555 0 obj
-<< /Title <feff0032002e00310034002e00200050005500540020002f0063006c00640073002f0075006e006400650070006c006f0079002f007b006d006f00640065006c004e0061006d0065007d>
-/Parent 503 0 R
-/Count 4
-/First 556 0 R
-/Last 559 0 R
-/Next 560 0 R
-/Prev 552 0 R
-/Dest [98 0 R /XYZ 0 334.56000000000034 null]
+<< /Title <feff0032002e00310039002e0033002e00200043006f006e00730075006d00650073>
+/Parent 552 0 R
+/Count 0
+/Next 556 0 R
+/Prev 554 0 R
+/Dest [141 0 R /XYZ 0 578.0400000000002 null]
>>
endobj
556 0 obj
-<< /Title <feff0032002e00310034002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 555 0 R
+<< /Title <feff0032002e00310039002e0034002e002000500072006f00640075006300650073>
+/Parent 552 0 R
/Count 0
-/Next 557 0 R
-/Dest [98 0 R /XYZ 0 294.4800000000003 null]
+/Prev 555 0 R
+/Dest [141 0 R /XYZ 0 521.7600000000003 null]
>>
endobj
557 0 obj
-<< /Title <feff0032002e00310034002e0032002e00200052006500730070006f006e007300650073>
-/Parent 555 0 R
-/Count 0
-/Next 558 0 R
-/Prev 556 0 R
-/Dest [98 0 R /XYZ 0 151.80000000000027 null]
+<< /Title <feff0032002e00320030002e00200047004500540020002f00640069006300740069006f006e006100720079002f007b00640069006300740069006f006e006100720079004e0061006d0065007d002f006900740065006d0073>
+/Parent 479 0 R
+/Count 3
+/First 558 0 R
+/Last 560 0 R
+/Next 561 0 R
+/Prev 552 0 R
+/Dest [141 0 R /XYZ 0 465.48000000000036 null]
>>
endobj
558 0 obj
-<< /Title <feff0032002e00310034002e0033002e00200043006f006e00730075006d00650073>
-/Parent 555 0 R
+<< /Title <feff0032002e00320030002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 557 0 R
/Count 0
/Next 559 0 R
-/Prev 557 0 R
-/Dest [110 0 R /XYZ 0 792.0 null]
+/Dest [141 0 R /XYZ 0 425.4000000000003 null]
>>
endobj
559 0 obj
-<< /Title <feff0032002e00310034002e0034002e002000500072006f00640075006300650073>
-/Parent 555 0 R
+<< /Title <feff0032002e00320030002e0032002e00200052006500730070006f006e007300650073>
+/Parent 557 0 R
/Count 0
+/Next 560 0 R
/Prev 558 0 R
-/Dest [110 0 R /XYZ 0 702.1200000000001 null]
+/Dest [141 0 R /XYZ 0 320.28000000000026 null]
>>
endobj
560 0 obj
-<< /Title <feff0032002e00310035002e00200047004500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002d006e0061006d00650073>
-/Parent 503 0 R
-/Count 2
-/First 561 0 R
-/Last 562 0 R
-/Next 563 0 R
-/Prev 555 0 R
-/Dest [110 0 R /XYZ 0 645.8400000000003 null]
+<< /Title <feff0032002e00320030002e0033002e002000500072006f00640075006300650073>
+/Parent 557 0 R
+/Count 0
+/Prev 559 0 R
+/Dest [141 0 R /XYZ 0 215.16000000000022 null]
>>
endobj
561 0 obj
-<< /Title <feff0032002e00310035002e0031002e00200052006500730070006f006e007300650073>
-/Parent 560 0 R
-/Count 0
-/Next 562 0 R
-/Dest [110 0 R /XYZ 0 605.7600000000003 null]
+<< /Title <feff0032002e00320031002e00200050005500540020002f00640069006300740069006f006e006100720079002f007b00640069006300740069006f006e006100720079004e0061006d0065007d002f006900740065006d0073>
+/Parent 479 0 R
+/Count 4
+/First 562 0 R
+/Last 565 0 R
+/Next 566 0 R
+/Prev 557 0 R
+/Dest [141 0 R /XYZ 0 158.8800000000002 null]
>>
endobj
562 0 obj
-<< /Title <feff0032002e00310035002e0032002e002000500072006f00640075006300650073>
-/Parent 560 0 R
+<< /Title <feff0032002e00320031002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 561 0 R
/Count 0
-/Prev 561 0 R
-/Dest [110 0 R /XYZ 0 500.64000000000055 null]
+/Next 563 0 R
+/Dest [141 0 R /XYZ 0 118.80000000000018 null]
>>
endobj
563 0 obj
-<< /Title <feff0032002e00310036002e00200047004500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002f00620070006d006e002f007b00740065006d0070006c006100740065004e0061006d0065007d>
-/Parent 503 0 R
-/Count 3
-/First 564 0 R
-/Last 566 0 R
-/Next 567 0 R
-/Prev 560 0 R
-/Dest [110 0 R /XYZ 0 444.3600000000005 null]
+<< /Title <feff0032002e00320031002e0032002e00200052006500730070006f006e007300650073>
+/Parent 561 0 R
+/Count 0
+/Next 564 0 R
+/Prev 562 0 R
+/Dest [156 0 R /XYZ 0 645.5999999999999 null]
>>
endobj
564 0 obj
-<< /Title <feff0032002e00310036002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 563 0 R
+<< /Title <feff0032002e00320031002e0033002e00200043006f006e00730075006d00650073>
+/Parent 561 0 R
/Count 0
/Next 565 0 R
-/Dest [110 0 R /XYZ 0 404.2800000000005 null]
+/Prev 563 0 R
+/Dest [156 0 R /XYZ 0 540.48 null]
>>
endobj
565 0 obj
-<< /Title <feff0032002e00310036002e0032002e00200052006500730070006f006e007300650073>
-/Parent 563 0 R
+<< /Title <feff0032002e00320031002e0034002e002000500072006f00640075006300650073>
+/Parent 561 0 R
/Count 0
-/Next 566 0 R
/Prev 564 0 R
-/Dest [110 0 R /XYZ 0 299.1600000000005 null]
+/Dest [156 0 R /XYZ 0 484.20000000000016 null]
>>
endobj
566 0 obj
-<< /Title <feff0032002e00310036002e0033002e002000500072006f00640075006300650073>
-/Parent 563 0 R
-/Count 0
-/Prev 565 0 R
-/Dest [110 0 R /XYZ 0 208.32000000000045 null]
+<< /Title <feff0032002e00320032002e00200047004500540020002f006800650061006c007400680063006800650063006b>
+/Parent 479 0 R
+/Count 2
+/First 567 0 R
+/Last 568 0 R
+/Next 569 0 R
+/Prev 561 0 R
+/Dest [156 0 R /XYZ 0 427.92000000000013 null]
>>
endobj
567 0 obj
-<< /Title <feff0032002e00310037002e00200047004500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002f0069006d006100670065002f007b00740065006d0070006c006100740065004e0061006d0065007d>
-/Parent 503 0 R
-/Count 3
-/First 568 0 R
-/Last 570 0 R
-/Next 571 0 R
-/Prev 563 0 R
-/Dest [110 0 R /XYZ 0 152.04000000000042 null]
+<< /Title <feff0032002e00320032002e0031002e00200052006500730070006f006e007300650073>
+/Parent 566 0 R
+/Count 0
+/Next 568 0 R
+/Dest [156 0 R /XYZ 0 387.8400000000001 null]
>>
endobj
568 0 obj
-<< /Title <feff0032002e00310037002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 567 0 R
+<< /Title <feff0032002e00320032002e0032002e002000500072006f00640075006300650073>
+/Parent 566 0 R
/Count 0
-/Next 569 0 R
-/Dest [110 0 R /XYZ 0 111.9600000000004 null]
+/Prev 567 0 R
+/Dest [156 0 R /XYZ 0 297.0000000000001 null]
>>
endobj
569 0 obj
-<< /Title <feff0032002e00310037002e0032002e00200052006500730070006f006e007300650073>
-/Parent 567 0 R
-/Count 0
-/Next 570 0 R
-/Prev 568 0 R
-/Dest [125 0 R /XYZ 0 683.1600000000001 null]
+<< /Title <feff0032002e00320033002e00200047004500540020002f0074006f007300630061002f006d006f00640065006c0073>
+/Parent 479 0 R
+/Count 2
+/First 570 0 R
+/Last 571 0 R
+/Next 572 0 R
+/Prev 566 0 R
+/Dest [156 0 R /XYZ 0 240.72000000000008 null]
>>
endobj
570 0 obj
-<< /Title <feff0032002e00310037002e0033002e002000500072006f00640075006300650073>
-/Parent 567 0 R
+<< /Title <feff0032002e00320033002e0031002e00200052006500730070006f006e007300650073>
+/Parent 569 0 R
/Count 0
-/Prev 569 0 R
-/Dest [125 0 R /XYZ 0 592.3200000000003 null]
+/Next 571 0 R
+/Dest [156 0 R /XYZ 0 200.64000000000007 null]
>>
endobj
571 0 obj
-<< /Title <feff0032002e00310038002e00200047004500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002f007b00740065006d0070006c006100740065004e0061006d0065007d>
-/Parent 503 0 R
-/Count 3
-/First 572 0 R
-/Last 574 0 R
-/Next 575 0 R
-/Prev 567 0 R
-/Dest [125 0 R /XYZ 0 536.0400000000004 null]
+<< /Title <feff0032002e00320033002e0032002e002000500072006f00640075006300650073>
+/Parent 569 0 R
+/Count 0
+/Prev 570 0 R
+/Dest [169 0 R /XYZ 0 792.0 null]
>>
endobj
572 0 obj
-<< /Title <feff0032002e00310038002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 571 0 R
-/Count 0
-/Next 573 0 R
-/Dest [125 0 R /XYZ 0 495.96000000000043 null]
+<< /Title <feff0032002e00320034002e00200047004500540020002f0074006f007300630061002f006d006f00640065006c0073002f0070006f006c0069006300790054007900700065002f007b0070006f006c0069006300790054007900700065007d>
+/Parent 479 0 R
+/Count 3
+/First 573 0 R
+/Last 575 0 R
+/Next 576 0 R
+/Prev 569 0 R
+/Dest [169 0 R /XYZ 0 702.1200000000001 null]
>>
endobj
573 0 obj
-<< /Title <feff0032002e00310038002e0032002e00200052006500730070006f006e007300650073>
-/Parent 571 0 R
+<< /Title <feff0032002e00320034002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 572 0 R
/Count 0
/Next 574 0 R
-/Prev 572 0 R
-/Dest [125 0 R /XYZ 0 390.84000000000043 null]
+/Dest [169 0 R /XYZ 0 662.0400000000002 null]
>>
endobj
574 0 obj
-<< /Title <feff0032002e00310038002e0033002e002000500072006f00640075006300650073>
-/Parent 571 0 R
+<< /Title <feff0032002e00320034002e0032002e00200052006500730070006f006e007300650073>
+/Parent 572 0 R
/Count 0
+/Next 575 0 R
/Prev 573 0 R
-/Dest [125 0 R /XYZ 0 285.72000000000037 null]
+/Dest [169 0 R /XYZ 0 556.9200000000003 null]
>>
endobj
575 0 obj
-<< /Title <feff0032002e00310039002e00200050005500540020002f0063006c0064007300540065006d0070006100740065002f00740065006d0070006c006100740065002f007b00740065006d0070006c006100740065004e0061006d0065007d>
-/Parent 503 0 R
-/Count 4
-/First 576 0 R
-/Last 579 0 R
-/Next 580 0 R
-/Prev 571 0 R
-/Dest [125 0 R /XYZ 0 229.44000000000037 null]
+<< /Title <feff0032002e00320034002e0033002e002000500072006f00640075006300650073>
+/Parent 572 0 R
+/Count 0
+/Prev 574 0 R
+/Dest [169 0 R /XYZ 0 466.0800000000005 null]
>>
endobj
576 0 obj
-<< /Title <feff0032002e00310039002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 575 0 R
-/Count 0
-/Next 577 0 R
-/Dest [125 0 R /XYZ 0 189.36000000000035 null]
+<< /Title <feff0032002e00320035002e00200047004500540020002f0074006f007300630061002f006d006f00640065006c0073002f007b0074006f007300630061004d006f00640065006c004e0061006d0065007d>
+/Parent 479 0 R
+/Count 3
+/First 577 0 R
+/Last 579 0 R
+/Next 580 0 R
+/Prev 572 0 R
+/Dest [169 0 R /XYZ 0 409.80000000000047 null]
>>
endobj
577 0 obj
-<< /Title <feff0032002e00310039002e0032002e00200052006500730070006f006e007300650073>
-/Parent 575 0 R
+<< /Title <feff0032002e00320035002e0031002e00200050006100720061006d00650074006500720073>
+/Parent 576 0 R
/Count 0
/Next 578 0 R
-/Prev 576 0 R
-/Dest [138 0 R /XYZ 0 792.0 null]
+/Dest [169 0 R /XYZ 0 369.7200000000004 null]
>>
endobj
578 0 obj
-<< /Title <feff0032002e00310039002e0033002e00200043006f006e00730075006d00650073>
-/Parent 575 0 R
+<< /Title <feff0032002e00320035002e0032002e00200052006500730070006f006e007300650073>
+/Parent 576 0 R
/Count 0
/Next 579 0 R
/Prev 577 0 R
-/Dest [138 0 R /XYZ 0 653.2800000000002 null]
+/Dest [169 0 R /XYZ 0 264.6000000000004 null]
>>
endobj
579 0 obj
-<< /Title <feff0032002e00310039002e0034002e002000500072006f00640075006300650073>
-/Parent 575 0 R
+<< /Title <feff0032002e00320035002e0033002e002000500072006f00640075006300650073>
+/Parent 576 0 R
/Count 0
/Prev 578 0 R
-/Dest [138 0 R /XYZ 0 597.0000000000003 null]
+/Dest [169 0 R /XYZ 0 159.48000000000042 null]
>>
endobj
580 0 obj
-<< /Title <feff0032002e00320030002e00200047004500540020002f00640069006300740069006f006e006100720079>
-/Parent 503 0 R
-/Count 2
+<< /Title <feff0032002e00320036002e00200050005500540020002f0074006f007300630061002f006d006f00640065006c0073002f007b0074006f007300630061004d006f00640065006c004e0061006d0065007d>
+/Parent 479 0 R
+/Count 4
/First 581 0 R
-/Last 582 0 R
-/Next 583 0 R
-/Prev 575 0 R
-/Dest [138 0 R /XYZ 0 540.7200000000005 null]
+/Last 584 0 R
+/Next 585 0 R
+/Prev 576 0 R
+/Dest [169 0 R /XYZ 0 103.20000000000039 null]
>>
endobj
581 0 obj
-<< /Title <feff0032002e00320030002e0031002e00200052006500730070006f006e007300650073>
+<< /Title <feff0032002e00320036002e0031002e00200050006100720061006d00650074006500720073>
/Parent 580 0 R
/Count 0
/Next 582 0 R
-/Dest [138 0 R /XYZ 0 500.6400000000005 null]
+/Dest [183 0 R /XYZ 0 792.0 null]
>>
endobj
582 0 obj
-<< /Title <feff0032002e00320030002e0032002e002000500072006f00640075006300650073>
+<< /Title <feff0032002e00320036002e0032002e00200052006500730070006f006e007300650073>
/Parent 580 0 R
/Count 0
+/Next 583 0 R
/Prev 581 0 R
-/Dest [138 0 R /XYZ 0 395.52000000000044 null]
+/Dest [183 0 R /XYZ 0 615.72 null]
>>
endobj
583 0 obj
-<< /Title <feff0032002e00320031002e00200050005500540020002f00640069006300740069006f006e006100720079002f007b00640069006300740069006f006e006100720079004e0061006d0065007d>
-/Parent 503 0 R
-/Count 4
-/First 584 0 R
-/Last 587 0 R
-/Next 588 0 R
-/Prev 580 0 R
-/Dest [138 0 R /XYZ 0 339.2400000000004 null]
+<< /Title <feff0032002e00320036002e0033002e00200043006f006e00730075006d00650073>
+/Parent 580 0 R
+/Count 0
+/Next 584 0 R
+/Prev 582 0 R
+/Dest [183 0 R /XYZ 0 524.8800000000002 null]
>>
endobj
584 0 obj
-<< /Title <feff0032002e00320031002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 583 0 R
+<< /Title <feff0032002e00320036002e0034002e002000500072006f00640075006300650073>
+/Parent 580 0 R
/Count 0
-/Next 585 0 R
-/Dest [138 0 R /XYZ 0 299.16000000000037 null]
+/Prev 583 0 R
+/Dest [183 0 R /XYZ 0 468.60000000000025 null]
>>
endobj
585 0 obj
-<< /Title <feff0032002e00320031002e0032002e00200052006500730070006f006e007300650073>
-/Parent 583 0 R
-/Count 0
-/Next 586 0 R
-/Prev 584 0 R
-/Dest [138 0 R /XYZ 0 156.48000000000033 null]
+<< /Title <feff0032002e00320037002e00200047004500540020002f0075007300650072002f0067006500740055007300650072>
+/Parent 479 0 R
+/Count 2
+/First 586 0 R
+/Last 587 0 R
+/Prev 580 0 R
+/Dest [183 0 R /XYZ 0 412.3200000000002 null]
>>
endobj
586 0 obj
-<< /Title <feff0032002e00320031002e0033002e00200043006f006e00730075006d00650073>
-/Parent 583 0 R
+<< /Title <feff0032002e00320037002e0031002e00200052006500730070006f006e007300650073>
+/Parent 585 0 R
/Count 0
/Next 587 0 R
-/Prev 585 0 R
-/Dest [153 0 R /XYZ 0 792.0 null]
+/Dest [183 0 R /XYZ 0 372.2400000000002 null]
>>
endobj
587 0 obj
-<< /Title <feff0032002e00320031002e0034002e002000500072006f00640075006300650073>
-/Parent 583 0 R
+<< /Title <feff0032002e00320037002e0032002e002000500072006f00640075006300650073>
+/Parent 585 0 R
/Count 0
/Prev 586 0 R
-/Dest [153 0 R /XYZ 0 702.1200000000001 null]
+/Dest [183 0 R /XYZ 0 281.4000000000002 null]
>>
endobj
588 0 obj
-<< /Title <feff0032002e00320032002e00200047004500540020002f00640069006300740069006f006e006100720079002f007b00640069006300740069006f006e006100720079004e0061006d0065007d002f006900740065006d0073>
-/Parent 503 0 R
-/Count 3
+<< /Title <feff004300680061007000740065007200200033002e00200044006500660069006e006900740069006f006e0073>
+/Parent 473 0 R
+/Count 11
/First 589 0 R
-/Last 591 0 R
-/Next 592 0 R
-/Prev 583 0 R
-/Dest [153 0 R /XYZ 0 645.8400000000003 null]
+/Last 599 0 R
+/Prev 479 0 R
+/Dest [193 0 R /XYZ 0 792.0 null]
>>
endobj
589 0 obj
-<< /Title <feff0032002e00320032002e0031002e00200050006100720061006d00650074006500720073>
+<< /Title <feff0033002e0031002e00200043006c0064007300440069006300740069006f006e006100720079>
/Parent 588 0 R
/Count 0
/Next 590 0 R
-/Dest [153 0 R /XYZ 0 605.7600000000003 null]
+/Dest [193 0 R /XYZ 0 712.0799999999999 null]
>>
endobj
590 0 obj
-<< /Title <feff0032002e00320032002e0032002e00200052006500730070006f006e007300650073>
+<< /Title <feff0033002e0032002e00200043006c0064007300440069006300740069006f006e006100720079004900740065006d>
/Parent 588 0 R
/Count 0
/Next 591 0 R
/Prev 589 0 R
-/Dest [153 0 R /XYZ 0 500.64000000000055 null]
+/Dest [193 0 R /XYZ 0 411.35999999999996 null]
>>
endobj
591 0 obj
-<< /Title <feff0032002e00320032002e0033002e002000500072006f00640075006300650073>
+<< /Title <feff0033002e0033002e00200043006c00640073004500760065006e0074>
/Parent 588 0 R
/Count 0
+/Next 592 0 R
/Prev 590 0 R
-/Dest [153 0 R /XYZ 0 395.52000000000055 null]
+/Dest [199 0 R /XYZ 0 645.6000000000001 null]
>>
endobj
592 0 obj
-<< /Title <feff0032002e00320033002e00200050005500540020002f00640069006300740069006f006e006100720079002f007b00640069006300740069006f006e006100720079004e0061006d0065007d002f006900740065006d0073>
-/Parent 503 0 R
-/Count 4
-/First 593 0 R
-/Last 596 0 R
-/Next 597 0 R
-/Prev 588 0 R
-/Dest [153 0 R /XYZ 0 339.2400000000005 null]
+<< /Title <feff0033002e0034002e00200043006c006400730049006e0066006f>
+/Parent 588 0 R
+/Count 0
+/Next 593 0 R
+/Prev 591 0 R
+/Dest [199 0 R /XYZ 0 382.4400000000002 null]
>>
endobj
593 0 obj
-<< /Title <feff0032002e00320033002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 592 0 R
+<< /Title <feff0033002e0035002e00200043006c00640073004d006f00640065006c>
+/Parent 588 0 R
/Count 0
/Next 594 0 R
-/Dest [153 0 R /XYZ 0 299.1600000000005 null]
+/Prev 592 0 R
+/Dest [203 0 R /XYZ 0 683.1600000000001 null]
>>
endobj
594 0 obj
-<< /Title <feff0032002e00320033002e0032002e00200052006500730070006f006e007300650073>
-/Parent 592 0 R
+<< /Title <feff0033002e0036002e00200043006c00640073004d006f00640065006c0049006e007300740061006e00630065>
+/Parent 588 0 R
/Count 0
/Next 595 0 R
/Prev 593 0 R
-/Dest [153 0 R /XYZ 0 156.48000000000044 null]
+/Dest [208 0 R /XYZ 0 495.3600000000003 null]
>>
endobj
595 0 obj
-<< /Title <feff0032002e00320033002e0033002e00200043006f006e00730075006d00650073>
-/Parent 592 0 R
+<< /Title <feff0033002e0037002e00200043006c00640073004d006f006e00690074006f00720069006e006700440065007400610069006c0073>
+/Parent 588 0 R
/Count 0
/Next 596 0 R
/Prev 594 0 R
-/Dest [168 0 R /XYZ 0 792.0 null]
+/Dest [208 0 R /XYZ 0 307.3200000000002 null]
>>
endobj
596 0 obj
-<< /Title <feff0032002e00320033002e0034002e002000500072006f00640075006300650073>
-/Parent 592 0 R
+<< /Title <feff0033002e0038002e00200043006c0064007300540065006d0070006c006100740065>
+/Parent 588 0 R
/Count 0
+/Next 597 0 R
/Prev 595 0 R
-/Dest [168 0 R /XYZ 0 702.1200000000001 null]
+/Dest [212 0 R /XYZ 0 570.48 null]
>>
endobj
597 0 obj
-<< /Title <feff0032002e00320034002e00200047004500540020002f006800650061006c007400680063006800650063006b>
-/Parent 503 0 R
-/Count 2
-/First 598 0 R
-/Last 599 0 R
-/Next 600 0 R
-/Prev 592 0 R
-/Dest [168 0 R /XYZ 0 645.8400000000003 null]
+<< /Title <feff0033002e0039002e00200043006c006400730054006f007300630061004d006f00640065006c>
+/Parent 588 0 R
+/Count 0
+/Next 598 0 R
+/Prev 596 0 R
+/Dest [215 0 R /XYZ 0 645.5999999999999 null]
>>
endobj
598 0 obj
-<< /Title <feff0032002e00320034002e0031002e00200052006500730070006f006e007300650073>
-/Parent 597 0 R
+<< /Title <feff0033002e00310030002e00200044006300610065004500760065006e0074>
+/Parent 588 0 R
/Count 0
/Next 599 0 R
-/Dest [168 0 R /XYZ 0 605.7600000000003 null]
+/Prev 597 0 R
+/Dest [215 0 R /XYZ 0 194.63999999999993 null]
>>
endobj
599 0 obj
-<< /Title <feff0032002e00320034002e0032002e002000500072006f00640075006300650073>
-/Parent 597 0 R
+<< /Title <feff0033002e00310031002e002000560061006c00750065004900740065006d>
+/Parent 588 0 R
/Count 0
/Prev 598 0 R
-/Dest [168 0 R /XYZ 0 514.9200000000005 null]
+/Dest [220 0 R /XYZ 0 532.9200000000001 null]
>>
endobj
600 0 obj
-<< /Title <feff0032002e00320035002e00200047004500540020002f0074006f007300630061002f006d006f00640065006c0073>
-/Parent 503 0 R
-/Count 2
-/First 601 0 R
-/Last 602 0 R
-/Next 603 0 R
-/Prev 597 0 R
-/Dest [168 0 R /XYZ 0 458.6400000000005 null]
->>
-endobj
-601 0 obj
-<< /Title <feff0032002e00320035002e0031002e00200052006500730070006f006e007300650073>
-/Parent 600 0 R
-/Count 0
-/Next 602 0 R
-/Dest [168 0 R /XYZ 0 418.56000000000046 null]
->>
-endobj
-602 0 obj
-<< /Title <feff0032002e00320035002e0032002e002000500072006f00640075006300650073>
-/Parent 600 0 R
-/Count 0
-/Prev 601 0 R
-/Dest [168 0 R /XYZ 0 313.4400000000004 null]
->>
-endobj
-603 0 obj
-<< /Title <feff0032002e00320036002e00200047004500540020002f0074006f007300630061002f006d006f00640065006c0073002f0070006f006c0069006300790054007900700065002f007b0070006f006c0069006300790054007900700065007d>
-/Parent 503 0 R
-/Count 3
-/First 604 0 R
-/Last 606 0 R
-/Next 607 0 R
-/Prev 600 0 R
-/Dest [168 0 R /XYZ 0 257.16000000000037 null]
->>
-endobj
-604 0 obj
-<< /Title <feff0032002e00320036002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 603 0 R
-/Count 0
-/Next 605 0 R
-/Dest [168 0 R /XYZ 0 217.08000000000035 null]
->>
-endobj
-605 0 obj
-<< /Title <feff0032002e00320036002e0032002e00200052006500730070006f006e007300650073>
-/Parent 603 0 R
-/Count 0
-/Next 606 0 R
-/Prev 604 0 R
-/Dest [168 0 R /XYZ 0 111.96000000000032 null]
->>
-endobj
-606 0 obj
-<< /Title <feff0032002e00320036002e0033002e002000500072006f00640075006300650073>
-/Parent 603 0 R
-/Count 0
-/Prev 605 0 R
-/Dest [183 0 R /XYZ 0 697.44 null]
->>
-endobj
-607 0 obj
-<< /Title <feff0032002e00320037002e00200047004500540020002f0074006f007300630061002f006d006f00640065006c0073002f007b0074006f007300630061004d006f00640065006c004e0061006d0065007d>
-/Parent 503 0 R
-/Count 3
-/First 608 0 R
-/Last 610 0 R
-/Next 611 0 R
-/Prev 603 0 R
-/Dest [183 0 R /XYZ 0 641.1600000000002 null]
->>
-endobj
-608 0 obj
-<< /Title <feff0032002e00320037002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 607 0 R
-/Count 0
-/Next 609 0 R
-/Dest [183 0 R /XYZ 0 601.0800000000003 null]
->>
-endobj
-609 0 obj
-<< /Title <feff0032002e00320037002e0032002e00200052006500730070006f006e007300650073>
-/Parent 607 0 R
-/Count 0
-/Next 610 0 R
-/Prev 608 0 R
-/Dest [183 0 R /XYZ 0 495.96000000000043 null]
->>
-endobj
-610 0 obj
-<< /Title <feff0032002e00320037002e0033002e002000500072006f00640075006300650073>
-/Parent 607 0 R
-/Count 0
-/Prev 609 0 R
-/Dest [183 0 R /XYZ 0 390.8400000000004 null]
->>
-endobj
-611 0 obj
-<< /Title <feff0032002e00320038002e00200050005500540020002f0074006f007300630061002f006d006f00640065006c0073002f007b0074006f007300630061004d006f00640065006c004e0061006d0065007d>
-/Parent 503 0 R
-/Count 4
-/First 612 0 R
-/Last 615 0 R
-/Next 616 0 R
-/Prev 607 0 R
-/Dest [183 0 R /XYZ 0 334.56000000000034 null]
->>
-endobj
-612 0 obj
-<< /Title <feff0032002e00320038002e0031002e00200050006100720061006d00650074006500720073>
-/Parent 611 0 R
-/Count 0
-/Next 613 0 R
-/Dest [183 0 R /XYZ 0 294.4800000000003 null]
->>
-endobj
-613 0 obj
-<< /Title <feff0032002e00320038002e0032002e00200052006500730070006f006e007300650073>
-/Parent 611 0 R
-/Count 0
-/Next 614 0 R
-/Prev 612 0 R
-/Dest [183 0 R /XYZ 0 151.80000000000027 null]
->>
-endobj
-614 0 obj
-<< /Title <feff0032002e00320038002e0033002e00200043006f006e00730075006d00650073>
-/Parent 611 0 R
-/Count 0
-/Next 615 0 R
-/Prev 613 0 R
-/Dest [197 0 R /XYZ 0 792.0 null]
->>
-endobj
-615 0 obj
-<< /Title <feff0032002e00320038002e0034002e002000500072006f00640075006300650073>
-/Parent 611 0 R
-/Count 0
-/Prev 614 0 R
-/Dest [197 0 R /XYZ 0 702.1200000000001 null]
->>
-endobj
-616 0 obj
-<< /Title <feff0032002e00320039002e00200047004500540020002f0075007300650072002f0067006500740055007300650072>
-/Parent 503 0 R
-/Count 2
-/First 617 0 R
-/Last 618 0 R
-/Prev 611 0 R
-/Dest [197 0 R /XYZ 0 645.8400000000003 null]
->>
-endobj
-617 0 obj
-<< /Title <feff0032002e00320039002e0031002e00200052006500730070006f006e007300650073>
-/Parent 616 0 R
-/Count 0
-/Next 618 0 R
-/Dest [197 0 R /XYZ 0 605.7600000000003 null]
->>
-endobj
-618 0 obj
-<< /Title <feff0032002e00320039002e0032002e002000500072006f00640075006300650073>
-/Parent 616 0 R
-/Count 0
-/Prev 617 0 R
-/Dest [197 0 R /XYZ 0 514.9200000000005 null]
->>
-endobj
-619 0 obj
-<< /Title <feff004300680061007000740065007200200033002e00200044006500660069006e006900740069006f006e0073>
-/Parent 497 0 R
-/Count 11
-/First 620 0 R
-/Last 630 0 R
-/Prev 503 0 R
-/Dest [204 0 R /XYZ 0 792.0 null]
->>
-endobj
-620 0 obj
-<< /Title <feff0033002e0031002e00200043006c0064007300440069006300740069006f006e006100720079>
-/Parent 619 0 R
-/Count 0
-/Next 621 0 R
-/Dest [204 0 R /XYZ 0 712.0799999999999 null]
->>
-endobj
-621 0 obj
-<< /Title <feff0033002e0032002e00200043006c0064007300440069006300740069006f006e006100720079004900740065006d>
-/Parent 619 0 R
-/Count 0
-/Next 622 0 R
-/Prev 620 0 R
-/Dest [204 0 R /XYZ 0 411.35999999999996 null]
->>
-endobj
-622 0 obj
-<< /Title <feff0033002e0033002e00200043006c00640073004500760065006e0074>
-/Parent 619 0 R
-/Count 0
-/Next 623 0 R
-/Prev 621 0 R
-/Dest [210 0 R /XYZ 0 645.6000000000001 null]
->>
-endobj
-623 0 obj
-<< /Title <feff0033002e0034002e00200043006c006400730049006e0066006f>
-/Parent 619 0 R
-/Count 0
-/Next 624 0 R
-/Prev 622 0 R
-/Dest [210 0 R /XYZ 0 382.4400000000002 null]
->>
-endobj
-624 0 obj
-<< /Title <feff0033002e0035002e00200043006c00640073004d006f00640065006c>
-/Parent 619 0 R
-/Count 0
-/Next 625 0 R
-/Prev 623 0 R
-/Dest [214 0 R /XYZ 0 683.1600000000001 null]
->>
-endobj
-625 0 obj
-<< /Title <feff0033002e0036002e00200043006c00640073004d006f00640065006c0049006e007300740061006e00630065>
-/Parent 619 0 R
-/Count 0
-/Next 626 0 R
-/Prev 624 0 R
-/Dest [219 0 R /XYZ 0 495.3600000000003 null]
->>
-endobj
-626 0 obj
-<< /Title <feff0033002e0037002e00200043006c00640073004d006f006e00690074006f00720069006e006700440065007400610069006c0073>
-/Parent 619 0 R
-/Count 0
-/Next 627 0 R
-/Prev 625 0 R
-/Dest [219 0 R /XYZ 0 307.3200000000002 null]
->>
-endobj
-627 0 obj
-<< /Title <feff0033002e0038002e00200043006c0064007300540065006d0070006c006100740065>
-/Parent 619 0 R
-/Count 0
-/Next 628 0 R
-/Prev 626 0 R
-/Dest [223 0 R /XYZ 0 608.04 null]
->>
-endobj
-628 0 obj
-<< /Title <feff0033002e0039002e00200043006c006400730054006f007300630061004d006f00640065006c>
-/Parent 619 0 R
-/Count 0
-/Next 629 0 R
-/Prev 627 0 R
-/Dest [226 0 R /XYZ 0 683.1599999999999 null]
->>
-endobj
-629 0 obj
-<< /Title <feff0033002e00310030002e00200044006300610065004500760065006e0074>
-/Parent 619 0 R
-/Count 0
-/Next 630 0 R
-/Prev 628 0 R
-/Dest [226 0 R /XYZ 0 232.19999999999987 null]
->>
-endobj
-630 0 obj
-<< /Title <feff0033002e00310031002e002000560061006c00750065004900740065006d>
-/Parent 619 0 R
-/Count 0
-/Prev 629 0 R
-/Dest [231 0 R /XYZ 0 570.48 null]
->>
-endobj
-631 0 obj
<< /Nums [0 << /P (i)
>> 1 << /P (ii)
>> 2 << /P (iii)
@@ -34599,11 +33680,10 @@ endobj
>> 22 << /P (18)
>> 23 << /P (19)
>> 24 << /P (20)
->> 25 << /P (21)
>>]
>>
endobj
-632 0 obj
+601 0 obj
<< /Length1 10988
/Length 7072
/Filter [/FlateDecode]
@@ -34628,10 +33708,10 @@ P¯S·8fÎÃœ_sNq?áÉyÞÏy4¿š˜ÿïΈ=ÿ"ˆx·#ë"Fþ6Jµ/êESÑ;¢/
ÎÉmL!Í»ví2N„†Åªžž™õoм‹ý3‚–{Q¯ëžÙ,ô>T7:049 ŒÍN”3#CJ÷”w
endstream
endobj
-633 0 obj
+602 0 obj
<< /Type /FontDescriptor
/FontName /AAAAAA+NotoSerif
-/FontFile2 632 0 R
+/FontFile2 601 0 R
/FontBBox [-212 -250 1246 1047]
/Flags 6
/StemV 0
@@ -34642,7 +33722,7 @@ endobj
/XHeight 1098
>>
endobj
-634 0 obj
+603 0 obj
<< /Length 1286
/Filter [/FlateDecode]
>>
@@ -34652,10 +33732,10 @@ xœe×ËnÛF†á½®BËtHs&Ã@‘n¼èu{stÔ’ + ß}ù½¤i Æ/‰œy¾_Ã!uøôôÓÓùtß~»]ês¿ïÇéÜnýí
¿âíJ¼âíJ¼â특âíâ¬x»¯x»¯x‡+Þ!Êw¹âB®x‡b®x‡+ÞïrÅ;àà2äÍkçÎœñJ¼Y³e¼Y†Œ7+|œÆx‹ oSŠŒ7+[Æ›ețךyÞ¢oVûòæµ– -ã­Œ‹·é€"¯åþR¦W*–Ó4Xq”êC™^Jú[(£à®^ƒ1»¢y]•¡Èk¹}¼YM-x ¥úëÈVæz·ÌþÊ[YEãV¼Y³ÕÙ_}/7×*¯Y%«ê¯eã­Ó«q+ýÝ:÷Ý.â¿7™Jã‹ÈÛE¡/‰3Y(Y™*AˆW RõÝVJSƒª‚¶á:(u@c¡ðD±]a*Õíf)¤9J­ñæ)¥o,#Ú\ØZ>MU¡Û\ØjPSã {HSãçMª•ôj»ˆ·’{fk”Œ°yGá‰m[z*EïsaëÝ>Š&îÓ«Óúôj%u¼Üî; ¥2^ÆWÃ[Õßήòvú[¾Ïþ2î쯲uú[•¢³Pš:ÙçÂVÌ¡§Õ…> ¼M†ÁBi2 .Ħ‰ÇÜèÔ‡!¯áñdÈk¹`†¼–=oÌ ‘qWÞ•wdJF(”L164ÞU Ñ)™x0Eú~êñZ?
endstream
endobj
-635 0 obj
+604 0 obj
[259 1000 1000 1000 1000 1000 1000 1000 346 346 1000 1000 1000 310 250 288 559 559 559 559 559 559 559 559 559 559 286 1000 559 559 559 500 1000 705 1000 613 727 623 1000 713 792 367 1000 1000 1000 937 763 742 604 1000 655 543 612 716 674 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 562 613 492 613 535 369 538 634 319 1000 584 310 944 645 577 613 1000 471 451 352 634 579 861 1000 564 1000 428 1000 428 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 361 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 259 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000]
endobj
-636 0 obj
+605 0 obj
<< /Length1 11504
/Length 7677
/Filter [/FlateDecode]
@@ -34692,10 +33772,10 @@ l-·P^ód5îÕ剉„(¯.ˆ{Ž~;ªt7¸è³›¶«ÄÙ;6Ñg\ eìkÒ—B·?àsà¥ÀÀDoF¸ÂS|Ó$ÌÊÛ¶}”•yé{/-
m‚EvWs|Mu,ãoÖÖê×+¦G†Æµ3½±»¼]ÉÚ–±ö8 q
endstream
endobj
-637 0 obj
+606 0 obj
<< /Type /FontDescriptor
/FontName /AAAAAB+NotoSerif-Bold
-/FontFile2 636 0 R
+/FontFile2 605 0 R
/FontBBox [-212 -250 1306 1058]
/Flags 6
/StemV 0
@@ -34706,7 +33786,7 @@ endobj
/XHeight 1098
>>
endobj
-638 0 obj
+607 0 obj
<< /Length 1286
/Filter [/FlateDecode]
>>
@@ -34716,10 +33796,10 @@ xœe×ËnÛF†á½®BËtHs&Ã@‘n¼èu{stÔ’ + ß}ù½¤i Æ/‰œy¾_Ã!uøôôÓÓùtß~»]ês¿ïÇéÜnýí
¿âíJ¼âíJ¼â특âíâ¬x»¯x»¯x‡+Þ!Êw¹âB®x‡b®x‡+ÞïrÅ;àà2äÍkçÎœñJ¼Y³e¼Y†Œ7+|œÆx‹ oSŠŒ7+[Æ›ețךyÞ¢oVûòæµ– -ã­Œ‹·é€"¯åþR¦W*–Ó4Xq”êC™^Jú[(£à®^ƒ1»¢y]•¡Èk¹}¼YM-x ¥úëÈVæz·ÌþÊ[YEãV¼Y³ÕÙ_}/7×*¯Y%«ê¯eã­Ó«q+ýÝ:÷Ý.â¿7™Jã‹ÈÛE¡/‰3Y(Y™*AˆW RõÝVJSƒª‚¶á:(u@c¡ðD±]a*Õíf)¤9J­ñæ)¥o,#Ú\ØZ>MU¡Û\ØjPSã {HSãçMª•ôj»ˆ·’{fk”Œ°yGá‰m[z*EïsaëÝ>Š&îÓ«Óúôj%u¼Üî; ¥2^ÆWÃ[Õßήòvú[¾Ïþ2î쯲uú[•¢³Pš:ÙçÂVÌ¡§Õ…> ¼M†ÁBi2 .Ħ‰ÇÜèÔ‡!¯áñdÈk¹`†¼–=oÌ ‘qWÞ•wdJF(”L164ÞU Ñ)™x0Eú~êñZ?
endstream
endobj
-639 0 obj
+608 0 obj
[259 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 310 293 288 559 559 559 559 559 559 559 559 559 559 1000 1000 1000 559 1000 549 1000 752 671 667 767 652 621 769 818 400 368 1000 653 952 788 787 638 1000 707 585 652 747 698 1000 1000 692 1000 1000 1000 1000 1000 1000 1000 599 648 526 648 570 407 560 666 352 1000 636 352 985 666 612 645 1000 522 487 404 666 605 855 645 579 528 441 1000 441 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000]
endobj
-640 0 obj
+609 0 obj
<< /Length1 4904
/Length 3003
/Filter [/FlateDecode]
@@ -34737,10 +33817,10 @@ I”€(tãä
…üÓ ‡ÏÉéëEŠõŸÇà7 ŸA,ÜΟ†{÷‰Vôhã6§zQïÁçÂH¼Rn ’ååË—ë=RX¢é`¨Ñéö °¼\üÓ£•þ¨oÛ¢®½c)•¹œ7ˆŒ5z\€ ¹86ÏowàEz2‰¢Q?wZ¬L´å—žSâÑ)–¦ÀƒKd'ýÙq\Dê?gj–²Q(å>1ÚEz_ ÞÐA4”•äÎ-/ÌP ¯½W=Z §†ÈZêõDM^>bå—ãofÄ»¸Ã‘ؼ*Á\=,÷ßÔ¥¸å:ýlBô¾ÁCÌEe-žÊè‘ô_ô؆
endstream
endobj
-641 0 obj
+610 0 obj
<< /Type /FontDescriptor
/FontName /AAAAAC+NotoSerif-Italic
-/FontFile2 640 0 R
+/FontFile2 609 0 R
/FontBBox [-254 -250 1238 1047]
/Flags 70
/StemV 0
@@ -34751,7 +33831,7 @@ endobj
/XHeight 1098
>>
endobj
-642 0 obj
+611 0 obj
<< /Length 1286
/Filter [/FlateDecode]
>>
@@ -34761,10 +33841,10 @@ xœe×ËnÛF†á½®BËtHs&Ã@‘n¼èu{stÔ’ + ß}ù½¤i Æ/‰œy¾_Ã!uøôôÓÓùtß~»]ês¿ïÇéÜnýí
¿âíJ¼âíJ¼â특âíâ¬x»¯x»¯x‡+Þ!Êw¹âB®x‡b®x‡+ÞïrÅ;àà2äÍkçÎœñJ¼Y³e¼Y†Œ7+|œÆx‹ oSŠŒ7+[Æ›ețךyÞ¢oVûòæµ– -ã­Œ‹·é€"¯åþR¦W*–Ó4Xq”êC™^Jú[(£à®^ƒ1»¢y]•¡Èk¹}¼YM-x ¥úëÈVæz·ÌþÊ[YEãV¼Y³ÕÙ_}/7×*¯Y%«ê¯eã­Ó«q+ýÝ:÷Ý.â¿7™Jã‹ÈÛE¡/‰3Y(Y™*AˆW RõÝVJSƒª‚¶á:(u@c¡ðD±]a*Õíf)¤9J­ñæ)¥o,#Ú\ØZ>MU¡Û\ØjPSã {HSãçMª•ôj»ˆ·’{fk”Œ°yGá‰m[z*EïsaëÝ>Š&îÓ«Óúôj%u¼Üî; ¥2^ÆWÃ[Õßήòvú[¾Ïþ2î쯲uú[•¢³Pš:ÙçÂVÌ¡§Õ…> ¼M†ÁBi2 .Ħ‰ÇÜèÔ‡!¯áñdÈk¹`†¼–=oÌ ‘qWÞ•wdJF(”L164ÞU Ñ)™x0Eú~êñZ?
endstream
endobj
-643 0 obj
+612 0 obj
[1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 653 1000 1000 1000 1000 1000 792 1000 1000 1000 1000 1000 1000 1000 620 1000 1000 543 1000 1000 674 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 579 1000 486 579 493 1000 1000 599 304 1000 1000 304 895 599 574 577 560 467 463 368 599 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000]
endobj
-644 0 obj
+613 0 obj
<< /Length1 3280
/Length 2112
/Filter [/FlateDecode]
@@ -34779,10 +33859,10 @@ xœµV{L›×?ç³±yûyš’Ï|„<üÛ„b^ì
ˆ‡¶€$W´¦ö"k8À Vš­Ûi<êí!‹§–N..ðͶ&W+uXœ¶—¨:‹’j³† Z;Ù×cžOÎ-/²UFN¤ÓÉ6»][§)å%ÛÒâr*Ÿf©Ûf“RÓTó6°Óß<Qsäz‰B–Ó^"KD/“çùŸÞ)ƒ~™’¹T¾^õ‡i9šít-Ñ£\î‚céúìw='4‡î‚9÷F|ðÂBìßëVbCAÿWAþö}½‚[Ï‹¸1?¾ˆøbä¢Oe›Dm$ BD<yBT™'ÂÑ`Á"BY@Ü ‹þS„ÃU´nH²g#ü‡"–Ùª¬"Zø›b±Ù*r–@(Ü+DLVQa9YÅ‹Þ Áz#VQia¦&ÁôLøOÆßDŒ¤~`ü{Ä(˜Ä<sXôŠH‘áåYJ&Ƭ¢Êr±WÉ;¿:1a`Ô–‹ ’È»#Ê·èuü»U,°ðÏ2'W †»^T6úE†3ñL”gD«ÑdŠ3ÊqÌaa.:­Qk"Ä" CJ§ØÂÛE5„çû_t–óS“9¦WÂ<“k>Ã÷e|Q!ÃgÉÀÀE/iR~L zãŒ!›RÉSûz•Édä×3T2 hŽÊ±™$5Eà×eçŒM"FÂJh@È|f #D™A΄-VQËŽAOqëXŒÐÿG¶ÑÙ§΄™–Y(‰Ì÷YÙüSBF-òÁð!ãû´c°¼^ôvuaàŠ–Ú[š™òÑ0›Caa’¢ºŒ´ ÐE•÷†Â—¨¯»c]—GZD>&VÇk·}•[D’R]h²²ß‘zÖóé?+wú_½î“ä
endstream
endobj
-645 0 obj
+614 0 obj
<< /Type /FontDescriptor
/FontName /AAAAAD+mplus1mn-regular
-/FontFile2 644 0 R
+/FontFile2 613 0 R
/FontBBox [0 -230 1000 860]
/Flags 4
/StemV 0
@@ -34793,7 +33873,7 @@ endobj
/XHeight 0
>>
endobj
-646 0 obj
+615 0 obj
<< /Length 1286
/Filter [/FlateDecode]
>>
@@ -34803,664 +33883,633 @@ xœe×ËnÛF†á½®BËtHs&Ã@‘n¼èu{stÔ’ + ß}ù½¤i Æ/‰œy¾_Ã!uøôôÓÓùtß~»]ês¿ïÇéÜnýí
¿âíJ¼âíJ¼â특âíâ¬x»¯x»¯x‡+Þ!Êw¹âB®x‡b®x‡+ÞïrÅ;àà2äÍkçÎœñJ¼Y³e¼Y†Œ7+|œÆx‹ oSŠŒ7+[Æ›ețךyÞ¢oVûòæµ– -ã­Œ‹·é€"¯åþR¦W*–Ó4Xq”êC™^Jú[(£à®^ƒ1»¢y]•¡Èk¹}¼YM-x ¥úëÈVæz·ÌþÊ[YEãV¼Y³ÕÙ_}/7×*¯Y%«ê¯eã­Ó«q+ýÝ:÷Ý.â¿7™Jã‹ÈÛE¡/‰3Y(Y™*AˆW RõÝVJSƒª‚¶á:(u@c¡ðD±]a*Õíf)¤9J­ñæ)¥o,#Ú\ØZ>MU¡Û\ØjPSã {HSãçMª•ôj»ˆ·’{fk”Œ°yGá‰m[z*EïsaëÝ>Š&îÓ«Óúôj%u¼Üî; ¥2^ÆWÃ[Õßήòvú[¾Ïþ2î쯲uú[•¢³Pš:ÙçÂVÌ¡§Õ…> ¼M†ÁBi2 .Ħ‰ÇÜèÔ‡!¯áñdÈk¹`†¼–=oÌ ‘qWÞ•wdJF(”L164ÞU Ñ)™x0Eú~êñZ?
endstream
endobj
-647 0 obj
+616 0 obj
[1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 500 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 500 1000 500 1000 500 1000 1000 1000 500 500 1000 500 500 500 500 500 1000 1000 500 500 1000 1000 1000 500 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000]
endobj
xref
-0 648
+0 617
0000000000 65535 f
0000000015 00000 n
0000000264 00000 n
0000000467 00000 n
-0000000714 00000 n
-0000000765 00000 n
-0000000919 00000 n
-0000001163 00000 n
-0000001341 00000 n
-0000001508 00000 n
-0000032734 00000 n
-0000033512 00000 n
-0000065962 00000 n
-0000066760 00000 n
-0000098843 00000 n
-0000099641 00000 n
-0000115913 00000 n
-0000116407 00000 n
-0000118829 00000 n
-0000119066 00000 n
-0000119109 00000 n
-0000119158 00000 n
-0000119273 00000 n
-0000119446 00000 n
-0000119501 00000 n
-0000119676 00000 n
-0000119720 00000 n
-0000135214 00000 n
-0000135495 00000 n
-0000135538 00000 n
-0000135593 00000 n
-0000135636 00000 n
-0000135789 00000 n
-0000135845 00000 n
-0000135900 00000 n
-0000136075 00000 n
-0000136131 00000 n
-0000136186 00000 n
-0000136242 00000 n
-0000136411 00000 n
-0000136590 00000 n
-0000136646 00000 n
-0000152110 00000 n
-0000152384 00000 n
-0000152427 00000 n
-0000152471 00000 n
-0000152636 00000 n
-0000152691 00000 n
-0000152746 00000 n
-0000152801 00000 n
-0000152955 00000 n
-0000153011 00000 n
-0000153067 00000 n
-0000153123 00000 n
-0000153179 00000 n
-0000153499 00000 n
-0000153788 00000 n
-0000153844 00000 n
-0000171058 00000 n
-0000171332 00000 n
-0000171465 00000 n
-0000171520 00000 n
-0000171575 00000 n
-0000171630 00000 n
-0000171686 00000 n
-0000171741 00000 n
-0000171908 00000 n
-0000171963 00000 n
-0000172018 00000 n
-0000172073 00000 n
-0000172129 00000 n
-0000187452 00000 n
-0000187719 00000 n
-0000187762 00000 n
-0000187817 00000 n
-0000187872 00000 n
-0000187927 00000 n
-0000188185 00000 n
-0000188240 00000 n
-0000188296 00000 n
-0000188351 00000 n
-0000188406 00000 n
-0000188565 00000 n
-0000188621 00000 n
-0000188677 00000 n
-0000202475 00000 n
-0000202749 00000 n
-0000202792 00000 n
-0000202945 00000 n
-0000202989 00000 n
-0000203146 00000 n
-0000203202 00000 n
-0000203257 00000 n
-0000203312 00000 n
-0000203368 00000 n
-0000203412 00000 n
-0000203456 00000 n
-0000203499 00000 n
-0000220720 00000 n
-0000220988 00000 n
-0000221032 00000 n
-0000221088 00000 n
-0000221379 00000 n
-0000221435 00000 n
-0000221492 00000 n
-0000221548 00000 n
-0000221605 00000 n
-0000221661 00000 n
-0000221815 00000 n
-0000221872 00000 n
-0000234659 00000 n
-0000234929 00000 n
-0000234974 00000 n
-0000235031 00000 n
-0000235088 00000 n
-0000235145 00000 n
-0000235312 00000 n
-0000235370 00000 n
-0000235427 00000 n
-0000235484 00000 n
-0000235541 00000 n
-0000235599 00000 n
-0000235657 00000 n
-0000235928 00000 n
-0000235985 00000 n
-0000255677 00000 n
-0000255955 00000 n
-0000256012 00000 n
-0000256069 00000 n
-0000256126 00000 n
-0000256184 00000 n
-0000256242 00000 n
-0000256554 00000 n
-0000256724 00000 n
-0000256782 00000 n
-0000256840 00000 n
-0000256898 00000 n
-0000257060 00000 n
-0000275374 00000 n
-0000275668 00000 n
-0000275713 00000 n
-0000275883 00000 n
-0000275940 00000 n
-0000275997 00000 n
-0000276054 00000 n
-0000276111 00000 n
-0000276284 00000 n
-0000276342 00000 n
-0000276399 00000 n
-0000276457 00000 n
-0000276625 00000 n
-0000276683 00000 n
-0000276853 00000 n
-0000295216 00000 n
-0000295502 00000 n
-0000295547 00000 n
-0000295604 00000 n
-0000296106 00000 n
-0000296163 00000 n
-0000296220 00000 n
-0000296278 00000 n
-0000296451 00000 n
-0000296509 00000 n
-0000296566 00000 n
-0000296623 00000 n
-0000296788 00000 n
-0000296846 00000 n
-0000297013 00000 n
-0000309655 00000 n
-0000309925 00000 n
-0000309970 00000 n
-0000310387 00000 n
-0000310444 00000 n
-0000310501 00000 n
-0000310558 00000 n
-0000310615 00000 n
-0000310672 00000 n
-0000310730 00000 n
-0000310902 00000 n
-0000310959 00000 n
-0000311017 00000 n
-0000311075 00000 n
-0000311133 00000 n
-0000329725 00000 n
-0000330003 00000 n
-0000330049 00000 n
-0000330106 00000 n
-0000330431 00000 n
-0000330488 00000 n
-0000330546 00000 n
-0000330717 00000 n
-0000330774 00000 n
-0000330832 00000 n
-0000330889 00000 n
-0000331055 00000 n
-0000331113 00000 n
-0000331464 00000 n
-0000335852 00000 n
-0000336091 00000 n
-0000336136 00000 n
-0000336193 00000 n
-0000336250 00000 n
-0000336307 00000 n
-0000336364 00000 n
-0000354567 00000 n
-0000354824 00000 n
-0000354869 00000 n
-0000354926 00000 n
-0000355082 00000 n
-0000355140 00000 n
-0000375081 00000 n
-0000375320 00000 n
-0000375377 00000 n
-0000375434 00000 n
-0000397084 00000 n
-0000397349 00000 n
-0000397406 00000 n
-0000397582 00000 n
-0000397745 00000 n
-0000417509 00000 n
-0000417748 00000 n
-0000417805 00000 n
-0000417862 00000 n
-0000438355 00000 n
-0000438594 00000 n
-0000438640 00000 n
-0000458573 00000 n
-0000458812 00000 n
-0000458869 00000 n
-0000459196 00000 n
-0000459254 00000 n
-0000467722 00000 n
-0000467979 00000 n
-0000468155 00000 n
-0000468201 00000 n
-0000468345 00000 n
-0000468490 00000 n
-0000468655 00000 n
-0000468811 00000 n
-0000468969 00000 n
-0000469116 00000 n
-0000469278 00000 n
-0000469420 00000 n
-0000469585 00000 n
-0000469729 00000 n
-0000469897 00000 n
-0000470044 00000 n
-0000470201 00000 n
-0000470347 00000 n
-0000470502 00000 n
-0000470647 00000 n
-0000470803 00000 n
-0000470948 00000 n
-0000471101 00000 n
-0000471244 00000 n
-0000471404 00000 n
-0000471553 00000 n
-0000471712 00000 n
-0000471860 00000 n
-0000472024 00000 n
-0000472167 00000 n
-0000472327 00000 n
-0000472476 00000 n
-0000472635 00000 n
-0000472783 00000 n
-0000472950 00000 n
-0000473096 00000 n
-0000473267 00000 n
-0000473417 00000 n
-0000473576 00000 n
-0000473724 00000 n
-0000473881 00000 n
-0000474028 00000 n
+0000000706 00000 n
+0000000757 00000 n
+0000000911 00000 n
+0000001155 00000 n
+0000001333 00000 n
+0000001500 00000 n
+0000032726 00000 n
+0000033504 00000 n
+0000066014 00000 n
+0000066812 00000 n
+0000098949 00000 n
+0000099747 00000 n
+0000110046 00000 n
+0000110428 00000 n
+0000112850 00000 n
+0000113087 00000 n
+0000113130 00000 n
+0000113179 00000 n
+0000113286 00000 n
+0000113459 00000 n
+0000113514 00000 n
+0000113689 00000 n
+0000113733 00000 n
+0000129227 00000 n
+0000129508 00000 n
+0000129551 00000 n
+0000129606 00000 n
+0000129649 00000 n
+0000129802 00000 n
+0000129858 00000 n
+0000129913 00000 n
+0000130088 00000 n
+0000130144 00000 n
+0000130199 00000 n
+0000130255 00000 n
+0000130424 00000 n
+0000130603 00000 n
+0000130659 00000 n
+0000146123 00000 n
+0000146397 00000 n
+0000146440 00000 n
+0000146484 00000 n
+0000146649 00000 n
+0000146704 00000 n
+0000146759 00000 n
+0000146814 00000 n
+0000146968 00000 n
+0000147024 00000 n
+0000147080 00000 n
+0000147136 00000 n
+0000147192 00000 n
+0000147512 00000 n
+0000147802 00000 n
+0000147858 00000 n
+0000165072 00000 n
+0000165346 00000 n
+0000165479 00000 n
+0000165534 00000 n
+0000165589 00000 n
+0000165644 00000 n
+0000165700 00000 n
+0000165755 00000 n
+0000165922 00000 n
+0000165977 00000 n
+0000166032 00000 n
+0000166087 00000 n
+0000166143 00000 n
+0000181466 00000 n
+0000181733 00000 n
+0000181776 00000 n
+0000181831 00000 n
+0000181886 00000 n
+0000181941 00000 n
+0000182215 00000 n
+0000182270 00000 n
+0000182326 00000 n
+0000182381 00000 n
+0000182436 00000 n
+0000182595 00000 n
+0000182651 00000 n
+0000182707 00000 n
+0000199388 00000 n
+0000199662 00000 n
+0000199705 00000 n
+0000199858 00000 n
+0000199902 00000 n
+0000200059 00000 n
+0000200115 00000 n
+0000200170 00000 n
+0000200225 00000 n
+0000200281 00000 n
+0000200325 00000 n
+0000200369 00000 n
+0000200413 00000 n
+0000217743 00000 n
+0000218018 00000 n
+0000218151 00000 n
+0000218207 00000 n
+0000218263 00000 n
+0000218554 00000 n
+0000218610 00000 n
+0000218667 00000 n
+0000218723 00000 n
+0000218891 00000 n
+0000218947 00000 n
+0000219003 00000 n
+0000219059 00000 n
+0000219116 00000 n
+0000234610 00000 n
+0000234880 00000 n
+0000234925 00000 n
+0000234982 00000 n
+0000235039 00000 n
+0000235096 00000 n
+0000235153 00000 n
+0000235211 00000 n
+0000235268 00000 n
+0000235325 00000 n
+0000235497 00000 n
+0000235555 00000 n
+0000235613 00000 n
+0000235863 00000 n
+0000253868 00000 n
+0000254154 00000 n
+0000254199 00000 n
+0000254361 00000 n
+0000254407 00000 n
+0000254577 00000 n
+0000254635 00000 n
+0000254692 00000 n
+0000254749 00000 n
+0000254807 00000 n
+0000255348 00000 n
+0000255500 00000 n
+0000255558 00000 n
+0000255604 00000 n
+0000255650 00000 n
+0000272180 00000 n
+0000272466 00000 n
+0000272612 00000 n
+0000272669 00000 n
+0000272841 00000 n
+0000272898 00000 n
+0000272955 00000 n
+0000273013 00000 n
+0000273070 00000 n
+0000273128 00000 n
+0000273302 00000 n
+0000273360 00000 n
+0000273839 00000 n
+0000273896 00000 n
+0000273954 00000 n
+0000290688 00000 n
+0000290974 00000 n
+0000291117 00000 n
+0000291174 00000 n
+0000291321 00000 n
+0000291367 00000 n
+0000291425 00000 n
+0000291483 00000 n
+0000291540 00000 n
+0000291597 00000 n
+0000291655 00000 n
+0000291713 00000 n
+0000291886 00000 n
+0000307333 00000 n
+0000307603 00000 n
+0000307648 00000 n
+0000307705 00000 n
+0000307762 00000 n
+0000307819 00000 n
+0000307876 00000 n
+0000307934 00000 n
+0000307991 00000 n
+0000308360 00000 n
+0000308417 00000 n
+0000308590 00000 n
+0000308648 00000 n
+0000308706 00000 n
+0000320554 00000 n
+0000320824 00000 n
+0000320869 00000 n
+0000321035 00000 n
+0000321081 00000 n
+0000321138 00000 n
+0000321196 00000 n
+0000321253 00000 n
+0000321310 00000 n
+0000321367 00000 n
+0000339568 00000 n
+0000339825 00000 n
+0000339870 00000 n
+0000339927 00000 n
+0000340083 00000 n
+0000340141 00000 n
+0000360084 00000 n
+0000360323 00000 n
+0000360380 00000 n
+0000360437 00000 n
+0000382085 00000 n
+0000382350 00000 n
+0000382407 00000 n
+0000382583 00000 n
+0000382746 00000 n
+0000402500 00000 n
+0000402739 00000 n
+0000402796 00000 n
+0000402853 00000 n
+0000423589 00000 n
+0000423828 00000 n
+0000423874 00000 n
+0000443673 00000 n
+0000443912 00000 n
+0000443969 00000 n
+0000444296 00000 n
+0000444354 00000 n
+0000454003 00000 n
+0000454260 00000 n
+0000454416 00000 n
+0000454473 00000 n
+0000454773 00000 n
+0000454917 00000 n
+0000455062 00000 n
+0000455227 00000 n
+0000455383 00000 n
+0000455541 00000 n
+0000455688 00000 n
+0000455850 00000 n
+0000455992 00000 n
+0000456157 00000 n
+0000456301 00000 n
+0000456469 00000 n
+0000456616 00000 n
+0000456773 00000 n
+0000456919 00000 n
+0000457074 00000 n
+0000457219 00000 n
+0000457375 00000 n
+0000457520 00000 n
+0000457674 00000 n
+0000457818 00000 n
+0000457978 00000 n
+0000458127 00000 n
+0000458286 00000 n
+0000458434 00000 n
+0000458599 00000 n
+0000458743 00000 n
+0000458903 00000 n
+0000459052 00000 n
+0000459211 00000 n
+0000459359 00000 n
+0000459526 00000 n
+0000459672 00000 n
+0000459843 00000 n
+0000459993 00000 n
+0000460152 00000 n
+0000460300 00000 n
+0000460457 00000 n
+0000460604 00000 n
+0000460763 00000 n
+0000460911 00000 n
+0000461078 00000 n
+0000461224 00000 n
+0000461395 00000 n
+0000461545 00000 n
+0000461705 00000 n
+0000461854 00000 n
+0000462011 00000 n
+0000462158 00000 n
+0000462318 00000 n
+0000462467 00000 n
+0000462634 00000 n
+0000462780 00000 n
+0000462939 00000 n
+0000463087 00000 n
+0000463245 00000 n
+0000463392 00000 n
+0000463547 00000 n
+0000463691 00000 n
+0000463863 00000 n
+0000464014 00000 n
+0000464175 00000 n
+0000464325 00000 n
+0000464485 00000 n
+0000464634 00000 n
+0000464801 00000 n
+0000464947 00000 n
+0000465118 00000 n
+0000465268 00000 n
+0000465427 00000 n
+0000465575 00000 n
+0000465733 00000 n
+0000465880 00000 n
+0000466010 00000 n
+0000466142 00000 n
+0000466301 00000 n
+0000466439 00000 n
+0000466587 00000 n
+0000466724 00000 n
+0000466871 00000 n
+0000467007 00000 n
+0000467172 00000 n
+0000467316 00000 n
+0000467486 00000 n
+0000467635 00000 n
+0000467794 00000 n
+0000467943 00000 n
+0000468101 00000 n
+0000468248 00000 n
+0000468417 00000 n
+0000468565 00000 n
+0000468719 00000 n
+0000468863 00000 n
+0000469022 00000 n
+0000469171 00000 n
+0000469340 00000 n
+0000469488 00000 n
+0000469653 00000 n
+0000469797 00000 n
+0000469967 00000 n
+0000470116 00000 n
+0000470276 00000 n
+0000470426 00000 n
+0000470585 00000 n
+0000470733 00000 n
+0000470903 00000 n
+0000471052 00000 n
+0000471215 00000 n
+0000471359 00000 n
+0000471518 00000 n
+0000471667 00000 n
+0000471837 00000 n
+0000471986 00000 n
+0000472151 00000 n
+0000472297 00000 n
+0000472468 00000 n
+0000472618 00000 n
+0000472777 00000 n
+0000472926 00000 n
+0000473095 00000 n
+0000473243 00000 n
+0000473409 00000 n
+0000473554 00000 n
+0000473726 00000 n
+0000473877 00000 n
+0000474037 00000 n
0000474187 00000 n
-0000474335 00000 n
-0000474502 00000 n
-0000474648 00000 n
-0000474819 00000 n
-0000474969 00000 n
-0000475129 00000 n
-0000475278 00000 n
-0000475435 00000 n
-0000475582 00000 n
-0000475742 00000 n
-0000475891 00000 n
-0000476057 00000 n
-0000476202 00000 n
-0000476361 00000 n
-0000476509 00000 n
-0000476667 00000 n
-0000476814 00000 n
-0000476968 00000 n
-0000477111 00000 n
-0000477283 00000 n
-0000477434 00000 n
-0000477595 00000 n
-0000477745 00000 n
-0000477905 00000 n
-0000478054 00000 n
-0000478220 00000 n
-0000478365 00000 n
-0000478536 00000 n
-0000478686 00000 n
-0000478845 00000 n
-0000478993 00000 n
-0000479151 00000 n
-0000479298 00000 n
-0000479427 00000 n
-0000479558 00000 n
-0000479717 00000 n
-0000479855 00000 n
-0000480003 00000 n
-0000480140 00000 n
-0000480287 00000 n
-0000480423 00000 n
-0000480587 00000 n
-0000480730 00000 n
-0000480900 00000 n
-0000481049 00000 n
-0000481208 00000 n
-0000481357 00000 n
-0000481515 00000 n
-0000481662 00000 n
-0000481831 00000 n
-0000481979 00000 n
-0000482133 00000 n
-0000482277 00000 n
-0000482436 00000 n
-0000482585 00000 n
-0000482754 00000 n
-0000482902 00000 n
-0000483057 00000 n
-0000483201 00000 n
-0000483371 00000 n
-0000483520 00000 n
-0000483680 00000 n
-0000483830 00000 n
-0000484000 00000 n
-0000484149 00000 n
-0000484304 00000 n
-0000484449 00000 n
-0000484608 00000 n
-0000484757 00000 n
-0000484926 00000 n
-0000485074 00000 n
-0000485240 00000 n
-0000485385 00000 n
-0000485557 00000 n
-0000485708 00000 n
-0000485868 00000 n
-0000486018 00000 n
-0000486176 00000 n
-0000486323 00000 n
-0000486492 00000 n
-0000486640 00000 n
-0000486804 00000 n
-0000486949 00000 n
-0000487109 00000 n
-0000487259 00000 n
-0000487429 00000 n
-0000487578 00000 n
-0000487741 00000 n
-0000487885 00000 n
-0000488058 00000 n
-0000488210 00000 n
-0000488371 00000 n
-0000488522 00000 n
-0000488693 00000 n
-0000488843 00000 n
-0000489010 00000 n
-0000489156 00000 n
-0000489329 00000 n
-0000489481 00000 n
-0000489642 00000 n
-0000489793 00000 n
-0000489964 00000 n
-0000490114 00000 n
-0000490278 00000 n
-0000490423 00000 n
-0000490592 00000 n
-0000490740 00000 n
-0000490899 00000 n
-0000491048 00000 n
-0000491205 00000 n
-0000491341 00000 n
-0000491493 00000 n
-0000491626 00000 n
-0000491786 00000 n
-0000491925 00000 n
-0000492073 00000 n
-0000492210 00000 n
-0000492368 00000 n
-0000492514 00000 n
-0000492683 00000 n
-0000492830 00000 n
-0000492985 00000 n
-0000493128 00000 n
-0000493287 00000 n
-0000493435 00000 n
-0000493604 00000 n
-0000493751 00000 n
-0000493906 00000 n
-0000494049 00000 n
-0000494220 00000 n
-0000494369 00000 n
-0000494528 00000 n
-0000494676 00000 n
-0000494834 00000 n
-0000494980 00000 n
-0000495149 00000 n
-0000495296 00000 n
-0000495462 00000 n
-0000495606 00000 n
-0000495778 00000 n
-0000495928 00000 n
-0000496088 00000 n
-0000496237 00000 n
-0000496406 00000 n
-0000496553 00000 n
-0000496718 00000 n
-0000496861 00000 n
-0000497033 00000 n
-0000497183 00000 n
-0000497344 00000 n
-0000497494 00000 n
-0000497653 00000 n
-0000497800 00000 n
-0000497969 00000 n
-0000498116 00000 n
-0000498280 00000 n
-0000498422 00000 n
-0000498582 00000 n
-0000498731 00000 n
-0000498901 00000 n
-0000499049 00000 n
-0000499215 00000 n
-0000499359 00000 n
-0000499518 00000 n
-0000499666 00000 n
-0000499837 00000 n
-0000499986 00000 n
-0000500143 00000 n
-0000500288 00000 n
-0000500461 00000 n
-0000500612 00000 n
-0000500773 00000 n
+0000474356 00000 n
+0000474504 00000 n
+0000474669 00000 n
+0000474815 00000 n
+0000474988 00000 n
+0000475140 00000 n
+0000475301 00000 n
+0000475452 00000 n
+0000475623 00000 n
+0000475773 00000 n
+0000475938 00000 n
+0000476084 00000 n
+0000476257 00000 n
+0000476409 00000 n
+0000476570 00000 n
+0000476721 00000 n
+0000476880 00000 n
+0000477028 00000 n
+0000477195 00000 n
+0000477341 00000 n
+0000477496 00000 n
+0000477640 00000 n
+0000477787 00000 n
+0000477924 00000 n
+0000478082 00000 n
+0000478219 00000 n
+0000478363 00000 n
+0000478496 00000 n
+0000478656 00000 n
+0000478795 00000 n
+0000478954 00000 n
+0000479102 00000 n
+0000479260 00000 n
+0000479406 00000 n
+0000479575 00000 n
+0000479722 00000 n
+0000479887 00000 n
+0000480030 00000 n
+0000480201 00000 n
+0000480350 00000 n
+0000480509 00000 n
+0000480657 00000 n
+0000480826 00000 n
+0000480973 00000 n
+0000481138 00000 n
+0000481281 00000 n
+0000481452 00000 n
+0000481601 00000 n
+0000481760 00000 n
+0000481908 00000 n
+0000482067 00000 n
+0000482214 00000 n
+0000482384 00000 n
+0000482532 00000 n
+0000482698 00000 n
+0000482842 00000 n
+0000483001 00000 n
+0000483149 00000 n
+0000483318 00000 n
+0000483465 00000 n
+0000483631 00000 n
+0000483775 00000 n
+0000483936 00000 n
+0000484086 00000 n
+0000484256 00000 n
+0000484404 00000 n
+0000484559 00000 n
+0000484702 00000 n
+0000484873 00000 n
+0000485022 00000 n
+0000485182 00000 n
+0000485331 00000 n
+0000485501 00000 n
+0000485649 00000 n
+0000485805 00000 n
+0000485949 00000 n
+0000486120 00000 n
+0000486269 00000 n
+0000486430 00000 n
+0000486580 00000 n
+0000486751 00000 n
+0000486900 00000 n
+0000487057 00000 n
+0000487202 00000 n
+0000487375 00000 n
+0000487526 00000 n
+0000487687 00000 n
+0000487837 00000 n
+0000487997 00000 n
+0000488145 00000 n
+0000488316 00000 n
+0000488465 00000 n
+0000488620 00000 n
+0000488764 00000 n
+0000488921 00000 n
+0000489067 00000 n
+0000489236 00000 n
+0000489383 00000 n
+0000489528 00000 n
+0000489663 00000 n
+0000489801 00000 n
+0000489940 00000 n
+0000490094 00000 n
+0000490237 00000 n
+0000490382 00000 n
+0000490516 00000 n
+0000490682 00000 n
+0000490826 00000 n
+0000490993 00000 n
+0000491138 00000 n
+0000491313 00000 n
+0000491466 00000 n
+0000491633 00000 n
+0000491790 00000 n
+0000491960 00000 n
+0000492108 00000 n
+0000492278 00000 n
+0000492428 00000 n
+0000492595 00000 n
+0000492740 00000 n
+0000492905 00000 n
+0000493050 00000 n
+0000493335 00000 n
+0000493414 00000 n
+0000493578 00000 n
+0000493769 00000 n
+0000493997 00000 n
+0000494214 00000 n
+0000494384 00000 n
+0000494602 00000 n
+0000494968 00000 n
+0000495145 00000 n
+0000495345 00000 n
+0000495540 00000 n
+0000495722 00000 n
+0000495990 00000 n
+0000496176 00000 n
+0000496358 00000 n
+0000496602 00000 n
+0000496776 00000 n
+0000496957 00000 n
+0000497273 00000 n
+0000497462 00000 n
+0000497662 00000 n
+0000497858 00000 n
+0000498040 00000 n
+0000498337 00000 n
+0000498527 00000 n
+0000498726 00000 n
+0000498921 00000 n
+0000499102 00000 n
+0000499371 00000 n
+0000499556 00000 n
+0000499737 00000 n
+0000500049 00000 n
+0000500238 00000 n
+0000500438 00000 n
+0000500607 00000 n
0000500923 00000 n
-0000501094 00000 n
-0000501243 00000 n
-0000501400 00000 n
-0000501545 00000 n
-0000501718 00000 n
-0000501869 00000 n
-0000502029 00000 n
-0000502178 00000 n
-0000502345 00000 n
-0000502490 00000 n
-0000502645 00000 n
-0000502788 00000 n
-0000502947 00000 n
-0000503084 00000 n
-0000503232 00000 n
-0000503369 00000 n
-0000503516 00000 n
-0000503651 00000 n
-0000503809 00000 n
-0000503945 00000 n
-0000504099 00000 n
-0000504242 00000 n
-0000504401 00000 n
-0000504549 00000 n
-0000504718 00000 n
-0000504865 00000 n
-0000505034 00000 n
-0000505181 00000 n
-0000505342 00000 n
-0000505492 00000 n
-0000505657 00000 n
-0000505811 00000 n
-0000505967 00000 n
-0000506112 00000 n
-0000506278 00000 n
-0000506422 00000 n
-0000506589 00000 n
+0000501112 00000 n
+0000501311 00000 n
+0000501492 00000 n
+0000501785 00000 n
+0000501974 00000 n
+0000502173 00000 n
+0000502355 00000 n
+0000502652 00000 n
+0000502833 00000 n
+0000503025 00000 n
+0000503225 00000 n
+0000503410 00000 n
+0000503678 00000 n
+0000503868 00000 n
+0000504042 00000 n
+0000504339 00000 n
+0000504521 00000 n
+0000504724 00000 n
+0000504923 00000 n
+0000505108 00000 n
+0000505421 00000 n
+0000505610 00000 n
+0000505795 00000 n
+0000506163 00000 n
+0000506356 00000 n
+0000506560 00000 n
0000506734 00000 n
-0000506909 00000 n
-0000507062 00000 n
-0000507230 00000 n
-0000507388 00000 n
-0000507559 00000 n
-0000507708 00000 n
-0000507879 00000 n
-0000508030 00000 n
-0000508197 00000 n
-0000508342 00000 n
-0000508507 00000 n
-0000508652 00000 n
-0000508937 00000 n
-0000509016 00000 n
-0000509180 00000 n
-0000509371 00000 n
-0000509599 00000 n
-0000509816 00000 n
-0000509986 00000 n
-0000510204 00000 n
-0000510570 00000 n
-0000510747 00000 n
-0000510947 00000 n
-0000511142 00000 n
-0000511324 00000 n
-0000511592 00000 n
-0000511778 00000 n
-0000511960 00000 n
-0000512204 00000 n
-0000512378 00000 n
-0000512559 00000 n
-0000512875 00000 n
-0000513064 00000 n
-0000513264 00000 n
-0000513460 00000 n
-0000513642 00000 n
-0000513939 00000 n
-0000514129 00000 n
-0000514328 00000 n
-0000514523 00000 n
-0000514704 00000 n
-0000514973 00000 n
-0000515158 00000 n
-0000515339 00000 n
-0000515651 00000 n
-0000515840 00000 n
-0000516040 00000 n
-0000516209 00000 n
-0000516525 00000 n
-0000516714 00000 n
-0000516913 00000 n
-0000517094 00000 n
-0000517387 00000 n
-0000517576 00000 n
-0000517775 00000 n
-0000517957 00000 n
-0000518254 00000 n
-0000518435 00000 n
-0000518627 00000 n
-0000518827 00000 n
-0000519012 00000 n
-0000519280 00000 n
-0000519470 00000 n
-0000519644 00000 n
-0000520065 00000 n
-0000520246 00000 n
-0000520438 00000 n
-0000520623 00000 n
-0000520899 00000 n
-0000521089 00000 n
-0000521274 00000 n
-0000521583 00000 n
-0000521776 00000 n
-0000521980 00000 n
-0000522168 00000 n
-0000522354 00000 n
-0000522667 00000 n
-0000522857 00000 n
-0000523044 00000 n
-0000523413 00000 n
-0000523607 00000 n
-0000523811 00000 n
-0000523998 00000 n
-0000524372 00000 n
-0000524566 00000 n
-0000524770 00000 n
-0000524956 00000 n
-0000525305 00000 n
-0000525500 00000 n
-0000525705 00000 n
-0000525892 00000 n
-0000526242 00000 n
-0000526437 00000 n
-0000526629 00000 n
-0000526829 00000 n
-0000527015 00000 n
-0000527264 00000 n
-0000527454 00000 n
-0000527641 00000 n
-0000527958 00000 n
-0000528153 00000 n
-0000528358 00000 n
-0000528546 00000 n
-0000528732 00000 n
-0000529073 00000 n
-0000529267 00000 n
-0000529472 00000 n
-0000529659 00000 n
-0000530000 00000 n
-0000530194 00000 n
-0000530399 00000 n
-0000530587 00000 n
-0000530773 00000 n
+0000507107 00000 n
+0000507301 00000 n
+0000507505 00000 n
+0000507691 00000 n
+0000508041 00000 n
+0000508235 00000 n
+0000508439 00000 n
+0000508626 00000 n
+0000508976 00000 n
+0000509158 00000 n
+0000509351 00000 n
+0000509552 00000 n
+0000509738 00000 n
+0000509987 00000 n
+0000510178 00000 n
+0000510365 00000 n
+0000510671 00000 n
+0000510854 00000 n
+0000511058 00000 n
+0000511258 00000 n
+0000511444 00000 n
+0000511786 00000 n
+0000511980 00000 n
+0000512185 00000 n
+0000512372 00000 n
+0000512713 00000 n
+0000512908 00000 n
+0000513112 00000 n
+0000513301 00000 n
+0000513488 00000 n
+0000513742 00000 n
+0000513932 00000 n
+0000514118 00000 n
+0000514376 00000 n
+0000514567 00000 n
+0000514741 00000 n
+0000515094 00000 n
+0000515288 00000 n
+0000515492 00000 n
+0000515678 00000 n
+0000516004 00000 n
+0000516198 00000 n
+0000516402 00000 n
+0000516589 00000 n
+0000516915 00000 n
+0000517097 00000 n
+0000517290 00000 n
+0000517490 00000 n
+0000517677 00000 n
+0000517920 00000 n
+0000518110 00000 n
+0000518296 00000 n
+0000518524 00000 n
+0000518722 00000 n
+0000518951 00000 n
+0000519143 00000 n
+0000519331 00000 n
+0000519523 00000 n
+0000519747 00000 n
+0000519987 00000 n
+0000520180 00000 n
+0000520392 00000 n
+0000520589 00000 n
+0000520771 00000 n
+0000521207 00000 n
+0000528371 00000 n
+0000528587 00000 n
+0000529950 00000 n
0000531026 00000 n
-0000531216 00000 n
-0000531402 00000 n
-0000531659 00000 n
-0000531850 00000 n
-0000532036 00000 n
-0000532390 00000 n
-0000532585 00000 n
-0000532790 00000 n
-0000532965 00000 n
-0000533290 00000 n
-0000533484 00000 n
-0000533689 00000 n
-0000533875 00000 n
-0000534201 00000 n
-0000534395 00000 n
-0000534600 00000 n
-0000534788 00000 n
-0000534974 00000 n
-0000535217 00000 n
-0000535407 00000 n
-0000535593 00000 n
-0000535821 00000 n
-0000536019 00000 n
-0000536248 00000 n
-0000536440 00000 n
-0000536628 00000 n
-0000536820 00000 n
-0000537044 00000 n
-0000537284 00000 n
-0000537477 00000 n
-0000537689 00000 n
-0000537886 00000 n
-0000538057 00000 n
-0000538510 00000 n
-0000545674 00000 n
-0000545890 00000 n
-0000547253 00000 n
-0000548329 00000 n
-0000556098 00000 n
-0000556319 00000 n
-0000557682 00000 n
-0000558758 00000 n
-0000561852 00000 n
-0000562078 00000 n
-0000563441 00000 n
-0000564559 00000 n
-0000566762 00000 n
-0000566976 00000 n
-0000568339 00000 n
+0000538795 00000 n
+0000539016 00000 n
+0000540379 00000 n
+0000541455 00000 n
+0000544549 00000 n
+0000544775 00000 n
+0000546138 00000 n
+0000547256 00000 n
+0000549459 00000 n
+0000549673 00000 n
+0000551036 00000 n
trailer
-<< /Size 648
+<< /Size 617
/Root 2 0 R
/Info 1 0 R
>>
startxref
-569464
+552161
%%EOF
diff --git a/extra/sql/bulkload/clds-create-db-objects.sql b/extra/sql/bulkload/clds-create-db-objects.sql
index ac64b5d76..aa3aa65e9 100644
--- a/extra/sql/bulkload/clds-create-db-objects.sql
+++ b/extra/sql/bulkload/clds-create-db-objects.sql
@@ -107,14 +107,6 @@ CREATE TABLE event (
PRIMARY KEY (event_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-CREATE TABLE clds_service_cache (
- invariant_service_id VARCHAR(36) NOT NULL,
- service_id VARCHAR(36) NULL,
- timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
- object_data MEDIUMBLOB NULL,
- PRIMARY KEY (invariant_service_id)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
-
CREATE TABLE IF NOT EXISTS tosca_model (
tosca_model_id VARCHAR(36) NOT NULL,
tosca_model_name VARCHAR(80) NOT NULL,
diff --git a/pom.xml b/pom.xml
index 297b0a10c..6a2d2734a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,7 +66,7 @@
<eelf.core.version>1.0.0</eelf.core.version>
<camel.version>2.22.1</camel.version>
<springboot.version>2.0.6.RELEASE</springboot.version>
-
+
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.surefire.reportsPath>${project.build.directory}/surefire-reports</sonar.surefire.reportsPath>
<sonar.jacoco.reportPath>${project.build.directory}/coverage-reports/jacoco.exec</sonar.jacoco.reportPath>
@@ -75,7 +75,7 @@
<sonar.projectVersion>${project.version}</sonar.projectVersion>
<!-- Enable language to disable javascript analysis -->
<sonar.language>java</sonar.language>
- <!-- Parameters for Javascript coverage
+ <!-- Parameters for Javascript coverage
<sonar.sources>src/main,${project.build.directory}/clamp-ui/designer</sonar.sources>
<sonar.javascript.lcov.reportPaths>${project.build.directory}/clamp-ui/coverage/lcov.info</sonar.javascript.lcov.reportPaths>
-->
@@ -265,7 +265,7 @@
<artifactId>camel-servlet-starter</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.camel</groupId>
+ <groupId>org.apache.camel</groupId>
<artifactId>camel-jackson-starter</artifactId>
</dependency>
<dependency>
@@ -296,6 +296,12 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-json</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
@@ -438,6 +444,10 @@
<artifactId>integrity-audit</artifactId>
</exclusion>
<exclusion>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </exclusion>
+ <exclusion>
<groupId>org.onap.aaf.cadi</groupId>
<artifactId>cadi-aaf</artifactId>
</exclusion>
@@ -567,6 +577,12 @@
<groupId>org.onap.sdc.sdc-tosca</groupId>
<artifactId>sdc-tosca</artifactId>
<version>1.4.1</version>
+ <exclusions>
+ <exclusion>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<!-- TESTING -->
<dependency>
@@ -642,7 +658,7 @@
</testResource>
</testResources>
<resources>
- <!-- For AAF folder maven should not try to filter Keystores/Truststores ...
+ <!-- For AAF folder maven should not try to filter Keystores/Truststores ...
Otherwise they will be broken and unreadable
-->
<resource>
@@ -701,8 +717,8 @@
</execution>
</executions>
</plugin>
- <!-- Read the swagger.json file and the definition from SwaggerConfig.java;
- generate a list of .adoc files containing the APIs info in more structured
+ <!-- Read the swagger.json file and the definition from SwaggerConfig.java;
+ generate a list of .adoc files containing the APIs info in more structured
way -->
<plugin>
<groupId>io.github.swagger2markup</groupId>
@@ -737,7 +753,7 @@
</executions>
</plugin>
- <!-- Run the generated asciidoc through Asciidoctor to generate other
+ <!-- Run the generated asciidoc through Asciidoctor to generate other
documentation types, such as PDFs or HTML5 -->
<plugin>
<groupId>org.asciidoctor</groupId>
@@ -1002,7 +1018,7 @@
<tag>${project.docker.latesttagtimestamp.version}</tag>
<tag>${project.docker.latesttag.version}</tag>
</tags>
- <!-- A relative path is looked up in ${project.basedir}/src/main/docker
+ <!-- A relative path is looked up in ${project.basedir}/src/main/docker
by default -->
<dockerFile>Dockerfile</dockerFile>
<assembly>
diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
index 4151c7aad..68454525d 100644
--- a/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/DcaeDispatcherServices.java
@@ -25,9 +25,8 @@ package org.onap.clamp.clds.client;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.gson.JsonObject;
import java.io.IOException;
import java.util.Date;
@@ -122,16 +121,16 @@ public class DcaeDispatcherServices {
* The value for each blueprint parameters in a flat JSON
* @return The status URL
*/
- public String createNewDeployment(String deploymentId, String serviceTypeId, JsonNode blueprintInputJson) {
+ public String createNewDeployment(String deploymentId, String serviceTypeId, JsonObject blueprintInputJson) {
Date startTime = new Date();
LoggingUtils.setTargetContext("DCAE", "createNewDeployment");
try {
- ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("dcae.deployment.template");
- rootNode.put("serviceTypeId", serviceTypeId);
+ JsonObject rootObject = refProp.getJsonTemplate("dcae.deployment.template").getAsJsonObject();
+ rootObject.addProperty("serviceTypeId", serviceTypeId);
if (blueprintInputJson != null) {
- rootNode.set("inputs", blueprintInputJson);
+ rootObject.add("inputs", blueprintInputJson);
}
- String apiBodyString = rootNode.toString();
+ String apiBodyString = rootObject.toString();
logger.info("Dcae api Body String - " + apiBodyString);
String url = refProp.getStringValue(DCAE_URL_PROPERTY_NAME) + DCAE_URL_PREFIX + deploymentId;
String statusUrl = getDcaeResponse(url, "PUT", apiBodyString, "application/json", DCAE_LINK_FIELD,
diff --git a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
index 327aff1da..770230784 100644
--- a/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/DcaeInventoryServices.java
@@ -44,7 +44,7 @@ import org.onap.clamp.clds.model.DcaeEvent;
import org.onap.clamp.clds.model.dcae.DcaeInventoryResponse;
import org.onap.clamp.clds.model.properties.Global;
import org.onap.clamp.clds.model.properties.ModelProperties;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
import org.onap.clamp.clds.util.LoggingUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -155,14 +155,13 @@ public class DcaeInventoryServices {
}
private DcaeInventoryResponse getItemsFromDcaeInventoryResponse(String responseStr)
- throws ParseException, IOException {
+ throws ParseException {
JSONParser parser = new JSONParser();
Object obj0 = parser.parse(responseStr);
JSONObject jsonObj = (JSONObject) obj0;
JSONArray itemsArray = (JSONArray) jsonObj.get("items");
JSONObject dcaeServiceType0 = (JSONObject) itemsArray.get(0);
- return JacksonUtils.getObjectMapperInstance().readValue(dcaeServiceType0.toString(),
- DcaeInventoryResponse.class);
+ return JsonUtils.GSON.fromJson(dcaeServiceType0.toString(), DcaeInventoryResponse.class);
}
/**
diff --git a/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcCatalogServices.java b/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcCatalogServices.java
deleted file mode 100644
index cd7d4f2cc..000000000
--- a/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcCatalogServices.java
+++ /dev/null
@@ -1,1051 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * Modifications copyright (c) 2018 Nokia
- * ===================================================================
- *
- */
-
-package org.onap.clamp.clds.client.req.sdc;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.fasterxml.jackson.databind.node.TextNode;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.security.GeneralSecurityException;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.csv.CSVFormat;
-import org.apache.commons.csv.CSVRecord;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.onap.clamp.clds.config.ClampProperties;
-import org.onap.clamp.clds.exception.sdc.SdcCommunicationException;
-import org.onap.clamp.clds.model.CldsAlarmCondition;
-import org.onap.clamp.clds.model.CldsServiceData;
-import org.onap.clamp.clds.model.CldsVfData;
-import org.onap.clamp.clds.model.CldsVfKPIData;
-import org.onap.clamp.clds.model.CldsVfcData;
-import org.onap.clamp.clds.model.sdc.SdcResource;
-import org.onap.clamp.clds.model.sdc.SdcResourceBasicInfo;
-import org.onap.clamp.clds.model.sdc.SdcServiceDetail;
-import org.onap.clamp.clds.model.sdc.SdcServiceInfo;
-import org.onap.clamp.clds.service.CldsService;
-import org.onap.clamp.clds.util.CryptoUtils;
-import org.onap.clamp.clds.util.JacksonUtils;
-import org.onap.clamp.clds.util.LoggingUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
-@Component
-@Primary
-public class SdcCatalogServices {
-
- private static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcCatalogServices.class);
- private static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
- public static final String RESOURCE_VF_TYPE = "VF";
- public static final String RESOURCE_VFC_TYPE = "VFC";
- public static final String RESOURCE_CVFC_TYPE = "CVFC";
- public static final String SDC_REQUESTID_PROPERTY_NAME = "sdc.header.requestId";
- public static final String SDC_METADATA_URL_PREFIX = "/metadata";
- public static final String SDC_INSTANCE_ID_PROPERTY_NAME = "sdc.InstanceID";
- public static final String SDC_CATALOG_URL_PROPERTY_NAME = "sdc.catalog.url";
- public static final String SDC_SERVICE_URL_PROPERTY_NAME = "sdc.serviceUrl";
- public static final String SDC_INSTANCE_ID_CLAMP = "CLAMP-Tool";
- public static final String RESOURCE_URL_PREFIX = "resources";
- private static final LoggingUtils utils = new LoggingUtils(logger);
- @Autowired
- private ClampProperties refProp;
-
- /**
- * Return SDC id and pw as a HTTP Basic Auth string (for example: Basic
- * dGVzdDoxMjM0NTY=).
- *
- * @return The String with Basic Auth and password
- * @throws GeneralSecurityException
- * In case of issue when decryting the SDC password
- * @throws DecoderException
- * In case of issues with the decoding of the HexString message
- */
- public String getSdcBasicAuth() throws GeneralSecurityException, DecoderException {
- String sdcId = refProp.getStringValue("sdc.serviceUsername");
- String sdcPw = refProp.getStringValue("sdc.servicePassword");
- String password = CryptoUtils.decrypt(sdcPw);
- String idPw = Base64.getEncoder().encodeToString((sdcId + ":" + password).getBytes(StandardCharsets.UTF_8));
- return "Basic " + idPw;
- }
-
- /**
- * This method get the SDC services Information with the corresponding Service
- * UUID.
- *
- * @param uuid
- * The service UUID
- * @return A Json String with all the service list
- * @throws GeneralSecurityException
- * In case of issue when decryting the SDC password
- * @throws DecoderException
- * In case of issues with the decoding of the Hex String
- */
- public String getSdcServicesInformation(String uuid) throws GeneralSecurityException, DecoderException {
- Date startTime = new Date();
- String baseUrl = refProp.getStringValue(SDC_SERVICE_URL_PROPERTY_NAME);
- String basicAuth = getSdcBasicAuth();
- try {
- String url = baseUrl;
- if (uuid != null && !uuid.isEmpty()) {
- url = baseUrl + "/" + uuid + SDC_METADATA_URL_PREFIX;
- }
- URL urlObj = new URL(url);
- HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
- conn = utils.invoke(conn, "SDC", "getSdcServicesInformation");
- conn.setRequestProperty(refProp.getStringValue(SDC_INSTANCE_ID_PROPERTY_NAME), SDC_INSTANCE_ID_CLAMP);
- conn.setRequestProperty(HttpHeaders.AUTHORIZATION, basicAuth);
- conn.setRequestProperty(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8");
- conn.setRequestProperty(refProp.getStringValue(SDC_REQUESTID_PROPERTY_NAME), LoggingUtils.getRequestId());
- conn.setRequestMethod("GET");
- String resp = getResponse(conn);
- logger.debug("Services list received from SDC:" + resp);
- utils.invokeReturn();
- return resp;
- } catch (IOException e) {
- LoggingUtils.setResponseContext("900", "Get sdc services failed", this.getClass().getName());
- LoggingUtils.setErrorContext("900", "Get sdc services error");
- logger.error("not able to get any service information from sdc for uuid:" + uuid, e);
- } finally {
- LoggingUtils.setTimeContext(startTime, new Date());
- metricsLogger.info("getSdcServicesInformation complete");
- }
- utils.invokeReturn();
- return "";
- }
-
- /**
- * To remove duplicate serviceUUIDs from sdc services List.
- *
- * @param rawCldsSdcServiceList
- * A list of CldsSdcServiceInfo
- * @return A list of CldsSdcServiceInfo without duplicate service UUID
- */
- public List<SdcServiceInfo> removeDuplicateServices(List<SdcServiceInfo> rawCldsSdcServiceList) {
- List<SdcServiceInfo> cldsSdcServiceInfoList = null;
- if (rawCldsSdcServiceList != null && !rawCldsSdcServiceList.isEmpty()) {
- // sort list
- Collections.sort(rawCldsSdcServiceList);
- // and then take only the services with the max version (last in the
- // list with the same name)
- cldsSdcServiceInfoList = new ArrayList<>();
- for (int i = 1; i < rawCldsSdcServiceList.size(); i++) {
- // compare name with previous - if not equal, then keep the
- // previous (it's the last with that name)
- SdcServiceInfo prev = rawCldsSdcServiceList.get(i - 1);
- if (!rawCldsSdcServiceList.get(i).getName().equals(prev.getName())) {
- cldsSdcServiceInfoList.add(prev);
- }
- }
- // add the last in the list
- cldsSdcServiceInfoList.add(rawCldsSdcServiceList.get(rawCldsSdcServiceList.size() - 1));
- }
- return cldsSdcServiceInfoList;
- }
-
- /**
- * To remove duplicate serviceUUIDs from sdc resources List.
- *
- * @param rawCldsSdcResourceList
- * @return List of CldsSdcResource
- */
- public List<SdcResource> removeDuplicateSdcResourceInstances(List<SdcResource> rawCldsSdcResourceList) {
- List<SdcResource> cldsSdcResourceList = null;
- if (rawCldsSdcResourceList != null && !rawCldsSdcResourceList.isEmpty()) {
- // sort list
- Collections.sort(rawCldsSdcResourceList);
- // and then take only the resources with the max version (last in
- // the list with the same name)
- cldsSdcResourceList = new ArrayList<>();
- for (int i = 1; i < rawCldsSdcResourceList.size(); i++) {
- // compare name with previous - if not equal, then keep the
- // previous (it's the last with that name)
- SdcResource prev = rawCldsSdcResourceList.get(i - 1);
- if (!rawCldsSdcResourceList.get(i).getResourceInstanceName().equals(prev.getResourceInstanceName())) {
- cldsSdcResourceList.add(prev);
- }
- }
- // add the last in the list
- cldsSdcResourceList.add(rawCldsSdcResourceList.get(rawCldsSdcResourceList.size() - 1));
- }
- return cldsSdcResourceList;
- }
-
- /**
- * To remove duplicate basic resources with same resourceUUIDs.
- *
- * @param rawCldsSdcResourceListBasicList
- * @return List of CldsSdcResourceBasicInfo
- */
- public List<SdcResourceBasicInfo> removeDuplicateSdcResourceBasicInfo(
- List<SdcResourceBasicInfo> rawCldsSdcResourceListBasicList) {
- List<SdcResourceBasicInfo> cldsSdcResourceBasicInfoList = new ArrayList<>();
- if (rawCldsSdcResourceListBasicList != null && !rawCldsSdcResourceListBasicList.isEmpty()) {
- // sort list
- Collections.sort(rawCldsSdcResourceListBasicList);
- // and then take only the resources with the max version (last in
- // the list with the same name)
- for (int i = 1; i < rawCldsSdcResourceListBasicList.size(); i++) {
- // compare name with previous - if not equal, then keep the
- // previous (it's the last with that name)
- SdcResourceBasicInfo prev = rawCldsSdcResourceListBasicList.get(i - 1);
- if (!rawCldsSdcResourceListBasicList.get(i).getName().equals(prev.getName())) {
- cldsSdcResourceBasicInfoList.add(prev);
- }
- }
- // add the last in the list
- cldsSdcResourceBasicInfoList
- .add(rawCldsSdcResourceListBasicList.get(rawCldsSdcResourceListBasicList.size() - 1));
- }
- return cldsSdcResourceBasicInfoList;
- }
-
- /**
- * To get ServiceUUID by using serviceInvariantUUID.
- *
- * @param invariantId
- * The invariant ID
- * @return The service UUID
- * @throws GeneralSecurityException
- * In case of issue when decryting the SDC password
- * @throws DecoderException
- * In case of issues with the decoding of the Hex String
- */
- public String getServiceUuidFromServiceInvariantId(String invariantId)
- throws GeneralSecurityException, DecoderException {
- String serviceUuid = "";
- String responseStr = getSdcServicesInformation(null);
- List<SdcServiceInfo> rawCldsSdcServicesList = getCldsSdcServicesListFromJson(responseStr);
- List<SdcServiceInfo> cldsSdcServicesList = removeDuplicateServices(rawCldsSdcServicesList);
- if (cldsSdcServicesList != null && !cldsSdcServicesList.isEmpty()) {
- for (SdcServiceInfo currCldsSdcServiceInfo : cldsSdcServicesList) {
- if (currCldsSdcServiceInfo != null && currCldsSdcServiceInfo.getInvariantUUID() != null
- && currCldsSdcServiceInfo.getInvariantUUID().equalsIgnoreCase(invariantId)) {
- serviceUuid = currCldsSdcServiceInfo.getUuid();
- break;
- }
- }
- }
- return serviceUuid;
- }
-
- /**
- * To get CldsAsdsServiceInfo class by parsing json string.
- *
- * @param jsonStr
- * The Json string that must be decoded
- * @return The list of CldsSdcServiceInfo, if there is a failure it return an
- * empty list
- */
- private List<SdcServiceInfo> getCldsSdcServicesListFromJson(String jsonStr) {
- if (StringUtils.isBlank(jsonStr)) {
- return new ArrayList<>();
- }
- try {
- return JacksonUtils.getObjectMapperInstance().readValue(jsonStr, JacksonUtils.getObjectMapperInstance()
- .getTypeFactory().constructCollectionType(List.class, SdcServiceInfo.class));
- } catch (IOException e) {
- logger.error("Error when attempting to decode the JSON containing CldsSdcServiceInfo", e);
- return new ArrayList<>();
- }
- }
-
- /**
- * To get List of CldsSdcResourceBasicInfo class by parsing json string.
- *
- * @param jsonStr
- * The JSOn string that must be decoded
- * @return The list of CldsSdcResourceBasicInfo, an empty list in case of issues
- */
- private List<SdcResourceBasicInfo> getAllSdcResourcesListFromJson(String jsonStr) {
- if (StringUtils.isBlank(jsonStr)) {
- return new ArrayList<>();
- }
- try {
- return JacksonUtils.getObjectMapperInstance().readValue(jsonStr, JacksonUtils.getObjectMapperInstance()
- .getTypeFactory().constructCollectionType(List.class, SdcResourceBasicInfo.class));
- } catch (IOException e) {
- logger.error("Exception occurred when attempting to decode the list of CldsSdcResourceBasicInfo JSON", e);
- return new ArrayList<>();
- }
- }
-
- /**
- * To get CldsSdcServiceDetail by parsing json string.
- *
- * @param jsonStr
- * @return
- */
- public SdcServiceDetail decodeCldsSdcServiceDetailFromJson(String jsonStr) {
- try {
- return JacksonUtils.getObjectMapperInstance().readValue(jsonStr, SdcServiceDetail.class);
- } catch (IOException e) {
- logger.error("Exception when attempting to decode the CldsSdcServiceDetail JSON", e);
- return null;
- }
- }
-
- public String getResponse(HttpURLConnection conn) {
- try (InputStream is = getInputStream(conn)) {
- try (BufferedReader in = new BufferedReader(new InputStreamReader(is))) {
- return IOUtils.toString(in);
- }
- } catch (IOException e) {
- logger.error("Exception when attempting to open SDC response", e);
- throw new SdcCommunicationException("Exception when attempting to open SDC response", e);
- }
- }
-
- private InputStream getInputStream(HttpURLConnection conn) {
- try {
- InputStream inStream = conn.getErrorStream();
- if (inStream == null) {
- inStream = conn.getInputStream();
- }
- return inStream;
- } catch (IOException e) {
- logger.error("Exception when attempting to open SDC error stream", e);
- throw new SdcCommunicationException("Exception when attempting to open SDC error stream", e);
- }
- }
-
- /**
- * Check if the SDC Info in cache has expired.
- *
- * @param cldsServiceData
- * The object representing the service data
- * @return boolean flag
- * @throws GeneralSecurityException
- * In case of issues with the decryting the encrypted password
- * @throws DecoderException
- * In case of issues with the decoding of the Hex String
- */
- public boolean isCldsSdcCacheDataExpired(CldsServiceData cldsServiceData)
- throws GeneralSecurityException, DecoderException {
- if (cldsServiceData != null && cldsServiceData.getServiceUUID() != null) {
- String cachedServiceUuid = cldsServiceData.getServiceUUID();
- String latestServiceUuid = getServiceUuidFromServiceInvariantId(cldsServiceData.getServiceInvariantUUID());
- String configuredMaxAge = refProp.getStringValue("clds.service.cache.invalidate.after.seconds");
- if (configuredMaxAge == null) {
- logger.warn(
- "clds.service.cache.invalidate.after.seconds NOT set in clds-reference.properties file, taking 60s as default");
- configuredMaxAge = "60";
- }
- return (!cachedServiceUuid.equalsIgnoreCase(latestServiceUuid)) || (cldsServiceData.getAgeOfRecord() != null
- && cldsServiceData.getAgeOfRecord() > Long.parseLong(configuredMaxAge));
- } else {
- return true;
- }
- }
-
- /**
- * Get the Service Data with Alarm Conditions for a given invariantServiceUuid.
- *
- * @param invariantServiceUuid
- * @return The CldsServiceData
- * @throws GeneralSecurityException
- * In case of issues with the decryting the encrypted password
- * @throws DecoderException
- * In case of issues with the decoding of the Hex String
- */
- public CldsServiceData getCldsServiceDataWithAlarmConditions(String invariantServiceUuid)
- throws GeneralSecurityException, DecoderException {
- String url = refProp.getStringValue(SDC_SERVICE_URL_PROPERTY_NAME);
- String catalogUrl = refProp.getStringValue(SDC_CATALOG_URL_PROPERTY_NAME);
- String serviceUuid = getServiceUuidFromServiceInvariantId(invariantServiceUuid);
- String serviceDetailUrl = url + "/" + serviceUuid + SDC_METADATA_URL_PREFIX;
- String responseStr = getCldsServicesOrResourcesBasedOnURL(serviceDetailUrl);
- CldsServiceData cldsServiceData = new CldsServiceData();
- if (responseStr != null) {
- SdcServiceDetail cldsSdcServiceDetail;
- try {
- cldsSdcServiceDetail = JacksonUtils.getObjectMapperInstance().readValue(responseStr,
- SdcServiceDetail.class);
- } catch (IOException e) {
- logger.error("Exception when decoding the CldsServiceData JSON from SDC", e);
- throw new SdcCommunicationException("Exception when decoding the CldsServiceData JSON from SDC", e);
- }
- // To remove duplicate resources from serviceDetail and add valid
- // vfs to service
- if (cldsSdcServiceDetail != null && cldsSdcServiceDetail.getResources() != null) {
- cldsServiceData.setServiceUUID(cldsSdcServiceDetail.getUuid());
- cldsServiceData.setServiceInvariantUUID(cldsSdcServiceDetail.getInvariantUUID());
- List<SdcResource> cldsSdcResourceList = removeDuplicateSdcResourceInstances(
- cldsSdcServiceDetail.getResources());
- if (cldsSdcResourceList != null && !cldsSdcResourceList.isEmpty()) {
- List<CldsVfData> cldsVfDataList = new ArrayList<>();
- for (SdcResource currCldsSdcResource : cldsSdcResourceList) {
- if (currCldsSdcResource != null && currCldsSdcResource.getResoucreType() != null
- && "VF".equalsIgnoreCase(currCldsSdcResource.getResoucreType())) {
- CldsVfData currCldsVfData = new CldsVfData();
- currCldsVfData.setVfName(currCldsSdcResource.getResourceInstanceName());
- currCldsVfData.setVfInvariantResourceUUID(currCldsSdcResource.getResourceInvariantUUID());
- cldsVfDataList.add(currCldsVfData);
- }
- }
- cldsServiceData.setCldsVfs(cldsVfDataList);
- // For each vf in the list , add all vfc's
- getAllVfcForVfList(cldsVfDataList, catalogUrl);
- logger.info("Invariant Service ID of cldsServiceData:" + cldsServiceData.getServiceInvariantUUID());
- }
- }
- }
- return cldsServiceData;
- }
-
- private void getAllVfcForVfList(List<CldsVfData> cldsVfDataList, String catalogUrl)
- throws GeneralSecurityException {
- // todo : refact this..
- if (cldsVfDataList != null && !cldsVfDataList.isEmpty()) {
- List<SdcResourceBasicInfo> allVfResources = getAllSdcVForVfcResourcesBasedOnResourceType(RESOURCE_VF_TYPE);
- List<SdcResourceBasicInfo> allVfcResources = getAllSdcVForVfcResourcesBasedOnResourceType(
- RESOURCE_VFC_TYPE);
- allVfcResources.addAll(getAllSdcVForVfcResourcesBasedOnResourceType(RESOURCE_CVFC_TYPE));
- for (CldsVfData currCldsVfData : cldsVfDataList) {
- if (currCldsVfData != null && currCldsVfData.getVfInvariantResourceUUID() != null) {
- String resourceUuid = getResourceUuidFromResourceInvariantUuid(
- currCldsVfData.getVfInvariantResourceUUID(), allVfResources);
- if (resourceUuid != null) {
- String vfResourceUuidUrl = catalogUrl + RESOURCE_URL_PREFIX + "/" + resourceUuid
- + SDC_METADATA_URL_PREFIX;
- String vfResponse = getCldsServicesOrResourcesBasedOnURL(vfResourceUuidUrl);
- if (vfResponse != null) {
- // Below 2 line are to get the KPI(field path) data
- // associated with the VF's
- List<CldsVfKPIData> cldsVfKPIDataList = getFieldPathFromVF(vfResponse);
- currCldsVfData.setCldsKPIList(cldsVfKPIDataList);
- List<CldsVfcData> vfcDataListFromVfResponse = getVfcDataListFromVfResponse(vfResponse);
- if (vfcDataListFromVfResponse != null) {
- currCldsVfData.setCldsVfcs(vfcDataListFromVfResponse);
- if (!vfcDataListFromVfResponse.isEmpty()) {
- // To get artifacts for every VFC and get
- // alarm conditions from artifact
- for (CldsVfcData currCldsVfcData : vfcDataListFromVfResponse) {
- if (currCldsVfcData != null
- && currCldsVfcData.getVfcInvariantResourceUUID() != null) {
- String resourceVfcUuid = getResourceUuidFromResourceInvariantUuid(
- currCldsVfcData.getVfcInvariantResourceUUID(), allVfcResources);
- if (resourceVfcUuid != null) {
- String vfcResourceUuidUrl = catalogUrl + RESOURCE_URL_PREFIX + "/"
- + resourceVfcUuid + SDC_METADATA_URL_PREFIX;
- String vfcResponse = getCldsServicesOrResourcesBasedOnURL(
- vfcResourceUuidUrl);
- if (vfcResponse != null) {
- List<CldsAlarmCondition> alarmCondtionsFromVfc = getAlarmCondtionsFromVfc(
- vfcResponse);
- currCldsVfcData.setCldsAlarmConditions(alarmCondtionsFromVfc);
- }
- } else {
- logger.info("No resourceVFC UUID found for given invariantID:"
- + currCldsVfcData.getVfcInvariantResourceUUID());
- }
- }
- }
- }
- }
- }
- } else {
- logger.info("No resourceUUID found for given invariantREsourceUUID:"
- + currCldsVfData.getVfInvariantResourceUUID());
- }
- }
- }
- }
- }
-
- private List<CldsVfcData> getVfcDataListFromVfResponse(String vfResponse) {
- ObjectNode vfResponseNode;
- try {
- vfResponseNode = (ObjectNode) JacksonUtils.getObjectMapperInstance().readTree(vfResponse);
- } catch (IOException e) {
- logger.error("Exception when decoding the JSON list of CldsVfcData", e);
- return new ArrayList<>();
- }
- ArrayNode vfcArrayNode = (ArrayNode) vfResponseNode.get("resources");
- List<CldsVfcData> cldsVfcDataList = new ArrayList<>();
- if (vfcArrayNode != null) {
- for (JsonNode vfcjsonNode : vfcArrayNode) {
- ObjectNode currVfcNode = (ObjectNode) vfcjsonNode;
- TextNode resourceTypeNode = (TextNode) currVfcNode.get("resoucreType");
- if (resourceTypeNode != null && "VFC".equalsIgnoreCase(resourceTypeNode.textValue())) {
- handleVFCtypeNode(currVfcNode, cldsVfcDataList);
- } else if (resourceTypeNode != null && "CVFC".equalsIgnoreCase(resourceTypeNode.textValue())) {
- handleCVFCtypeNode(currVfcNode, cldsVfcDataList);
- }
- }
- }
- return cldsVfcDataList;
- }
-
- private void handleVFCtypeNode(ObjectNode currVfcNode, List<CldsVfcData> cldsVfcDataList) {
- CldsVfcData currCldsVfcData = new CldsVfcData();
- TextNode vfcResourceName = (TextNode) currVfcNode.get("resourceInstanceName");
- TextNode vfcInvariantResourceUuid = (TextNode) currVfcNode.get("resourceInvariantUUID");
- currCldsVfcData.setVfcName(vfcResourceName.textValue());
- currCldsVfcData.setVfcInvariantResourceUUID(vfcInvariantResourceUuid.textValue());
- cldsVfcDataList.add(currCldsVfcData);
- }
-
- private void handleCVFCtypeNode(ObjectNode currVfcNode, List<CldsVfcData> cldsVfcDataList) {
- handleVFCtypeNode(currVfcNode, cldsVfcDataList);
- cldsVfcDataList.addAll(getVFCfromCVFC(currVfcNode.get("resourceUUID").textValue()));
- }
-
- private List<CldsVfcData> getVFCfromCVFC(String resourceUUID) {
- String catalogUrl = refProp.getStringValue(SDC_CATALOG_URL_PROPERTY_NAME);
- List<CldsVfcData> cldsVfcDataList = new ArrayList<>();
- if (resourceUUID != null) {
- String vfcResourceUUIDUrl = catalogUrl + RESOURCE_URL_PREFIX + "/" + resourceUUID + SDC_METADATA_URL_PREFIX;
- try {
- String vfcResponse = getCldsServicesOrResourcesBasedOnURL(vfcResourceUUIDUrl);
- ObjectNode vfResponseNode = (ObjectNode) JacksonUtils.getObjectMapperInstance().readTree(vfcResponse);
- ArrayNode vfcArrayNode = (ArrayNode) vfResponseNode.get("resources");
- if (vfcArrayNode != null) {
- for (JsonNode vfcjsonNode : vfcArrayNode) {
- ObjectNode currVfcNode = (ObjectNode) vfcjsonNode;
- TextNode resourceTypeNode = (TextNode) currVfcNode.get("resoucreType");
- if (resourceTypeNode != null && "VFC".equalsIgnoreCase(resourceTypeNode.textValue())) {
- handleVFCtypeNode(currVfcNode, cldsVfcDataList);
- }
- }
- }
- } catch (IOException e) {
- logger.error("Exception during JSON analyzis", e);
- }
- }
- return cldsVfcDataList;
- }
-
- private String removeUnwantedBracesFromString(String id) {
- return (id != null) ? id.replaceAll("\"", "") : "";
- }
-
- private List<CldsAlarmCondition> getAlarmCondtionsFromVfc(String vfcResponse) throws GeneralSecurityException {
- List<CldsAlarmCondition> cldsAlarmConditionList = new ArrayList<>();
- ObjectNode vfcResponseNode;
- try {
- vfcResponseNode = (ObjectNode) JacksonUtils.getObjectMapperInstance().readTree(vfcResponse);
- } catch (IOException e) {
- logger.error("Exception when decoding the JSON list of CldsAlarmCondition", e);
- return cldsAlarmConditionList;
- }
- ArrayNode artifactsArrayNode = (ArrayNode) vfcResponseNode.get("artifacts");
- if (artifactsArrayNode != null && artifactsArrayNode.size() > 0) {
- for (int index = 0; index < artifactsArrayNode.size(); index++) {
- ObjectNode currArtifactNode = (ObjectNode) artifactsArrayNode.get(index);
- TextNode artifactUrlNode = (TextNode) currArtifactNode.get("artifactURL");
- if (artifactUrlNode != null) {
- String responsesFromArtifactUrl = getResponsesFromArtifactUrl(artifactUrlNode.textValue());
- cldsAlarmConditionList.addAll(parseCsvToGetAlarmConditions(responsesFromArtifactUrl));
- logger.info(responsesFromArtifactUrl);
- }
- }
- }
- return cldsAlarmConditionList;
- }
-
- private List<CldsAlarmCondition> parseCsvToGetAlarmConditions(String allAlarmCondsValues) {
- try {
- List<CldsAlarmCondition> cldsAlarmConditionList = new ArrayList<>();
- Reader alarmReader = new StringReader(allAlarmCondsValues);
- Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(alarmReader);
- if (records != null) {
- Iterator<CSVRecord> it = records.iterator();
- if (it.hasNext()) {
- it.next();
- }
- it.forEachRemaining(record -> processRecord(cldsAlarmConditionList, record));
- }
- return cldsAlarmConditionList;
- } catch (IOException e) {
- logger.error("Exception when attempting to parse the CSV containing the alarm", e);
- return new ArrayList<>();
- }
- }
-
- // Method to get the artifact for any particular VF
- private List<CldsVfKPIData> getFieldPathFromVF(String vfResponse) throws GeneralSecurityException {
- List<CldsVfKPIData> cldsVfKPIDataList = new ArrayList<>();
- ObjectNode vfResponseNode;
- try {
- vfResponseNode = (ObjectNode) JacksonUtils.getObjectMapperInstance().readTree(vfResponse);
- } catch (IOException e) {
- logger.error("Exception when decoding the JSON list of CldsVfKPIData", e);
- return cldsVfKPIDataList;
- }
- ArrayNode artifactsArrayNode = (ArrayNode) vfResponseNode.get("artifacts");
- if (artifactsArrayNode != null && artifactsArrayNode.size() > 0) {
- for (int index = 0; index < artifactsArrayNode.size(); index++) {
- ObjectNode currArtifactNode = (ObjectNode) artifactsArrayNode.get(index);
- TextNode artifactUrlNode = (TextNode) currArtifactNode.get("artifactURL");
- TextNode artifactNameNode = (TextNode) currArtifactNode.get("artifactName");
- String artifactName = "";
- if (artifactNameNode != null) {
- artifactName = artifactNameNode.textValue();
- artifactName = artifactName.substring(artifactName.lastIndexOf('.') + 1);
- }
- if (artifactUrlNode != null && "csv".equalsIgnoreCase(artifactName)) {
- String responsesFromArtifactUrl = getResponsesFromArtifactUrl(artifactUrlNode.textValue());
- cldsVfKPIDataList.addAll(parseCsvToGetFieldPath(responsesFromArtifactUrl));
- logger.info(responsesFromArtifactUrl);
- }
- }
- }
- return cldsVfKPIDataList;
- }
-
- private CldsVfKPIData convertCsvRecordToKpiData(CSVRecord record) {
- if (record.size() < 6) {
- logger.debug("invalid csv field path Record,total columns less than 6: " + record);
- return null;
- }
- if (StringUtils.isBlank(record.get(1)) || StringUtils.isBlank(record.get(3))
- || StringUtils.isBlank(record.get(5))) {
- logger.debug("Invalid csv field path Record,one of column is having blank value : " + record);
- return null;
- }
- CldsVfKPIData cldsVfKPIData = new CldsVfKPIData();
- cldsVfKPIData.setNfNamingCode(record.get(0).trim());
- cldsVfKPIData.setNfNamingValue(record.get(1).trim());
- cldsVfKPIData.setFieldPath(record.get(2).trim());
- cldsVfKPIData.setFieldPathValue(record.get(3).trim());
- cldsVfKPIData.setThresholdName(record.get(4).trim());
- cldsVfKPIData.setThresholdValue(record.get(5).trim());
- return cldsVfKPIData;
- }
-
- // Method to get the artifactURL Data and set the CldsVfKPIData node
- private List<CldsVfKPIData> parseCsvToGetFieldPath(String allFieldPathValues) {
- try {
- List<CldsVfKPIData> cldsVfKPIDataList = new ArrayList<>();
- Reader alarmReader = new StringReader(allFieldPathValues);
- Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(alarmReader);
- if (records != null) {
- for (CSVRecord record : records) {
- CldsVfKPIData kpiData = this.convertCsvRecordToKpiData(record);
- if (kpiData != null) {
- cldsVfKPIDataList.add(kpiData);
- }
- }
- }
- return cldsVfKPIDataList;
- } catch (IOException e) {
- logger.error("Exception when attempting to parse the CSV containing the alarm kpi data", e);
- return new ArrayList<>();
- }
- }
-
- private void processRecord(List<CldsAlarmCondition> cldsAlarmConditionList, CSVRecord record) {
- if (record == null) {
- return;
- }
- if (record.size() < 5) {
- logger.debug("invalid csv alarm Record,total columns less than 5: " + record);
- return;
- }
- if (StringUtils.isBlank(record.get(1)) || StringUtils.isBlank(record.get(3))
- || StringUtils.isBlank(record.get(4))) {
- logger.debug("invalid csv alarm Record,one of column is having blank value : " + record);
- return;
- }
- CldsAlarmCondition cldsAlarmCondition = new CldsAlarmCondition();
- cldsAlarmCondition.setEventSourceType(record.get(1));
- cldsAlarmCondition.setEventName(record.get(2));
- cldsAlarmCondition.setAlarmConditionKey(record.get(3));
- cldsAlarmCondition.setSeverity(record.get(4));
- cldsAlarmConditionList.add(cldsAlarmCondition);
- }
-
- // Get the responses for the current artifact from the artifacts URL.
- private String getResponsesFromArtifactUrl(String artifactsUrl) {
- String hostUrl = refProp.getStringValue("sdc.hostUrl");
- String artifactsUrlReworked = artifactsUrl.replaceAll("\"", "");
- String artifactUrl = hostUrl + artifactsUrlReworked;
- logger.info("value of artifactURl:" + artifactUrl);
- String currArtifactResponse = getCldsServicesOrResourcesBasedOnURL(artifactUrl);
- logger.info("value of artifactResponse:" + currArtifactResponse);
- return currArtifactResponse;
- }
-
- /**
- * Service to services/resources/artifacts from sdc.Pass alarmConditions as true
- * to get alarm conditons from artifact url and else it is false
- *
- * @param url
- * The URL to trigger
- * @return The String containing the payload
- */
- public String getCldsServicesOrResourcesBasedOnURL(String url) {
- Date startTime = new Date();
- try {
- LoggingUtils.setTargetContext("SDC", "getCldsServicesOrResourcesBasedOnURL");
- String urlReworked = removeUnwantedBracesFromString(url);
- URL urlObj = new URL(urlReworked);
- HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
- conn = utils.invoke(conn, "SDC", "getSdcResources");
- String basicAuth = getSdcBasicAuth();
- conn.setRequestProperty(refProp.getStringValue(SDC_INSTANCE_ID_PROPERTY_NAME), SDC_INSTANCE_ID_CLAMP);
- conn.setRequestProperty(HttpHeaders.AUTHORIZATION, basicAuth);
- conn.setRequestProperty(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8");
- conn.setRequestProperty(refProp.getStringValue(SDC_REQUESTID_PROPERTY_NAME), LoggingUtils.getRequestId());
- conn.setRequestMethod("GET");
- int responseCode = conn.getResponseCode();
- logger.info("Sdc resource url - " + urlReworked + " , responseCode=" + responseCode);
- try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
- String response = IOUtils.toString(in);
- return response;
- }
- } catch (IOException e) {
- LoggingUtils.setErrorContext("900", "Get sdc resources error");
- logger.error("Exception occurred during query to SDC", e);
- return "";
- } catch (DecoderException e) {
- LoggingUtils.setErrorContext("900", "Get sdc resources error");
- logger.error("Exception when attempting to decode the Hex string", e);
- throw new SdcCommunicationException("Exception when attempting to decode the Hex string", e);
- } catch (GeneralSecurityException e) {
- LoggingUtils.setErrorContext("900", "Get sdc resources error");
- logger.error("Exception when attempting to decrypt the encrypted password", e);
- throw new SdcCommunicationException("Exception when attempting to decrypt the encrypted password", e);
- } finally {
- LoggingUtils.setTimeContext(startTime, new Date());
- metricsLogger.info("getCldsServicesOrResourcesBasedOnURL completed");
- utils.invokeReturn();
- }
- }
-
- /**
- * To create properties object by using cldsServicedata.
- *
- * @param globalProps
- * @param cldsServiceData
- * @return
- * @throws IOException
- * In case of issues during the parsing of the Global Properties
- */
- public String createPropertiesObjectByUUID(CldsServiceData cldsServiceData) throws IOException {
- String totalPropsStr;
- ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();
- ObjectNode globalPropsJson = (ObjectNode) refProp.getJsonTemplate(CldsService.GLOBAL_PROPERTIES_KEY);
- if (cldsServiceData != null && cldsServiceData.getServiceUUID() != null) {
- // Objectnode to save all byservice, byvf , byvfc and byalarm nodes
- ObjectNode byIdObjectNode = mapper.createObjectNode();
- // To create vf ResourceUUID node with serviceInvariantUUID
- ObjectNode invariantUuidObjectNodeWithVf = createVfObjectNodeByServiceInvariantUuid(cldsServiceData);
- byIdObjectNode.putPOJO("byService", invariantUuidObjectNodeWithVf);
- // To create byVf and vfcResourceNode with vfResourceUUID
- ObjectNode vfcObjectNodeByVfUuid = createVfcObjectNodeByVfUuid(cldsServiceData.getCldsVfs());
- byIdObjectNode.putPOJO("byVf", vfcObjectNodeByVfUuid);
- // To create byKpi
- ObjectNode kpiObjectNode = mapper.createObjectNode();
- if (cldsServiceData.getCldsVfs() != null && !cldsServiceData.getCldsVfs().isEmpty()) {
- for (CldsVfData currCldsVfData : cldsServiceData.getCldsVfs()) {
- if (currCldsVfData != null) {
- createKpiObjectNodeByVfUuid(kpiObjectNode, currCldsVfData.getCldsKPIList());
- }
- }
- }
- byIdObjectNode.putPOJO("byKpi", kpiObjectNode);
- // To create byVfc and alarmCondition with vfcResourceUUID
- ObjectNode vfcResourceUuidObjectNode = mapper.createObjectNode();
- if (cldsServiceData.getCldsVfs() != null && !cldsServiceData.getCldsVfs().isEmpty()) {
- for (CldsVfData currCldsVfData : cldsServiceData.getCldsVfs()) {
- if (currCldsVfData != null) {
- createAlarmCondObjectNodeByVfcUuid(vfcResourceUuidObjectNode, currCldsVfData.getCldsVfcs());
- }
- }
- }
- byIdObjectNode.putPOJO("byVfc", vfcResourceUuidObjectNode);
- // To create byAlarmCondition with alarmConditionKey
- List<CldsAlarmCondition> allAlarmConditions = getAllAlarmConditionsFromCldsServiceData(cldsServiceData,
- "alarmCondition");
- ObjectNode alarmCondObjectNodeByAlarmKey = createAlarmCondObjectNodeByAlarmKey(allAlarmConditions);
- byIdObjectNode.putPOJO("byAlarmCondition", alarmCondObjectNodeByAlarmKey);
- // To create byAlertDescription with AlertDescription
- List<CldsAlarmCondition> allAlertDescriptions = getAllAlarmConditionsFromCldsServiceData(cldsServiceData,
- "alertDescription");
- ObjectNode alertDescObjectNodeByAlert = createAlarmCondObjectNodeByAlarmKey(allAlertDescriptions);
- byIdObjectNode.putPOJO("byAlertDescription", alertDescObjectNodeByAlert);
- globalPropsJson.putPOJO("shared", byIdObjectNode);
- logger.info("Global properties JSON created with SDC info:" + globalPropsJson);
- }
- totalPropsStr = globalPropsJson.toString();
- return totalPropsStr;
- }
-
- /**
- * Method to get alarm conditions/alert description from Service Data.
- *
- * @param cldsServiceData
- * CldsServiceData the Service Data to analyze
- * @param eventName
- * The String event name that will be used to filter the alarm list
- * @return The list of CldsAlarmCondition for the event name specified
- */
- public List<CldsAlarmCondition> getAllAlarmConditionsFromCldsServiceData(CldsServiceData cldsServiceData,
- String eventName) {
- List<CldsAlarmCondition> alarmCondList = new ArrayList<>();
- if (cldsServiceData != null && cldsServiceData.getCldsVfs() != null
- && !cldsServiceData.getCldsVfs().isEmpty()) {
- for (CldsVfData currCldsVfData : cldsServiceData.getCldsVfs()) {
- alarmCondList.addAll(getAllAlarmConditionsFromCldsVfData(currCldsVfData, eventName));
- }
- }
- return alarmCondList;
- }
-
- /**
- * Method to get alarm conditions/alert description from VF Data.
- *
- * @param currCldsVfData
- * The Vf Data to analyze
- * @param eventName
- * The String event name that will be used to filter the alarm list
- * @return The list of CldsAlarmCondition for the event name specified
- */
- private List<CldsAlarmCondition> getAllAlarmConditionsFromCldsVfData(CldsVfData currCldsVfData, String eventName) {
- List<CldsAlarmCondition> alarmCondList = new ArrayList<>();
- if (currCldsVfData != null && currCldsVfData.getCldsVfcs() != null && !currCldsVfData.getCldsVfcs().isEmpty()) {
- for (CldsVfcData currCldsVfcData : currCldsVfData.getCldsVfcs()) {
- alarmCondList.addAll(getAllAlarmConditionsFromCldsVfcData(currCldsVfcData, eventName));
- }
- }
- return alarmCondList;
- }
-
- /**
- * Method to get alarm conditions/alert description from VFC Data.
- *
- * @param currCldsVfcData
- * The VfC Data to analyze
- * @param eventName
- * The String event name that will be used to filter the alarm list
- * @return The list of CldsAlarmCondition for the event name specified
- */
- private List<CldsAlarmCondition> getAllAlarmConditionsFromCldsVfcData(CldsVfcData currCldsVfcData,
- String eventName) {
- List<CldsAlarmCondition> alarmCondList = new ArrayList<>();
- if (currCldsVfcData != null && currCldsVfcData.getCldsAlarmConditions() != null
- && !currCldsVfcData.getCldsAlarmConditions().isEmpty()) {
- for (CldsAlarmCondition currCldsAlarmCondition : currCldsVfcData.getCldsAlarmConditions()) {
- if (currCldsAlarmCondition != null
- && currCldsAlarmCondition.getEventName().equalsIgnoreCase(eventName)) {
- alarmCondList.add(currCldsAlarmCondition);
- }
- }
- }
- return alarmCondList;
- }
-
- private ObjectNode createAlarmCondObjectNodeByAlarmKey(List<CldsAlarmCondition> cldsAlarmCondList) {
- ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();
- ObjectNode alarmCondKeyNode = mapper.createObjectNode();
- if (cldsAlarmCondList != null && !cldsAlarmCondList.isEmpty()) {
- for (CldsAlarmCondition currCldsAlarmCondition : cldsAlarmCondList) {
- if (currCldsAlarmCondition != null) {
- ObjectNode alarmCondNode = mapper.createObjectNode();
- alarmCondNode.put("eventSourceType", currCldsAlarmCondition.getEventSourceType());
- alarmCondNode.put("eventSeverity", currCldsAlarmCondition.getSeverity());
- alarmCondKeyNode.putPOJO(currCldsAlarmCondition.getAlarmConditionKey(), alarmCondNode);
- }
- }
- } else {
- ObjectNode alarmCondNode = mapper.createObjectNode();
- alarmCondNode.put("eventSourceType", "");
- alarmCondNode.put("eventSeverity", "");
- alarmCondKeyNode.putPOJO("", alarmCondNode);
- }
- return alarmCondKeyNode;
- }
-
- private ObjectNode createVfObjectNodeByServiceInvariantUuid(CldsServiceData cldsServiceData) {
- ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();
- ObjectNode invariantUuidObjectNode = mapper.createObjectNode();
- ObjectNode vfObjectNode = mapper.createObjectNode();
- ObjectNode vfUuidNode = mapper.createObjectNode();
- List<CldsVfData> cldsVfsList = cldsServiceData.getCldsVfs();
- if (cldsVfsList != null && !cldsVfsList.isEmpty()) {
- for (CldsVfData currCldsVfData : cldsVfsList) {
- if (currCldsVfData != null) {
- vfUuidNode.put(currCldsVfData.getVfInvariantResourceUUID(), currCldsVfData.getVfName());
- }
- }
- } else {
- vfUuidNode.put("", "");
- }
- vfObjectNode.putPOJO("vf", vfUuidNode);
- invariantUuidObjectNode.putPOJO(cldsServiceData.getServiceInvariantUUID(), vfObjectNode);
- return invariantUuidObjectNode;
- }
-
- private void createKpiObjectNodeByVfUuid(ObjectNode vfResourceUuidObjectNode,
- List<CldsVfKPIData> cldsVfKpiDataList) {
- ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();
- if (cldsVfKpiDataList != null && !cldsVfKpiDataList.isEmpty()) {
- for (CldsVfKPIData currCldsVfKpiData : cldsVfKpiDataList) {
- if (currCldsVfKpiData != null) {
- ObjectNode thresholdNameObjectNode = mapper.createObjectNode();
- ObjectNode fieldPathObjectNode = mapper.createObjectNode();
- ObjectNode nfNamingCodeNode = mapper.createObjectNode();
- fieldPathObjectNode.put(currCldsVfKpiData.getFieldPathValue(),
- currCldsVfKpiData.getFieldPathValue());
- nfNamingCodeNode.put(currCldsVfKpiData.getNfNamingValue(), currCldsVfKpiData.getNfNamingValue());
- thresholdNameObjectNode.putPOJO("fieldPath", fieldPathObjectNode);
- thresholdNameObjectNode.putPOJO("nfNamingCode", nfNamingCodeNode);
- vfResourceUuidObjectNode.putPOJO(currCldsVfKpiData.getThresholdValue(), thresholdNameObjectNode);
- }
- }
- }
- }
-
- private void createAlarmCondObjectNodeByVfcUuid(ObjectNode vfcResourceUuidObjectNode,
- List<CldsVfcData> cldsVfcDataList) {
- ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();
- ObjectNode vfcObjectNode = mapper.createObjectNode();
- ObjectNode alarmCondNode = mapper.createObjectNode();
- ObjectNode alertDescNode = mapper.createObjectNode();
- if (cldsVfcDataList != null && !cldsVfcDataList.isEmpty()) {
- for (CldsVfcData currCldsVfcData : cldsVfcDataList) {
- if (currCldsVfcData != null) {
- if (currCldsVfcData.getCldsAlarmConditions() != null
- && !currCldsVfcData.getCldsAlarmConditions().isEmpty()) {
- for (CldsAlarmCondition currCldsAlarmCondition : currCldsVfcData.getCldsAlarmConditions()) {
- if ("alarmCondition".equalsIgnoreCase(currCldsAlarmCondition.getEventName())) {
- alarmCondNode.put(currCldsAlarmCondition.getAlarmConditionKey(),
- currCldsAlarmCondition.getAlarmConditionKey());
- } else {
- alertDescNode.put(currCldsAlarmCondition.getAlarmConditionKey(),
- currCldsAlarmCondition.getAlarmConditionKey());
- }
- }
- }
- vfcObjectNode.putPOJO("alarmCondition", alarmCondNode);
- vfcObjectNode.putPOJO("alertDescription", alertDescNode);
- vfcResourceUuidObjectNode.putPOJO(currCldsVfcData.getVfcInvariantResourceUUID(), vfcObjectNode);
- }
- }
- } else {
- alarmCondNode.put("", "");
- vfcObjectNode.putPOJO("alarmCondition", alarmCondNode);
- alertDescNode.put("", "");
- vfcObjectNode.putPOJO("alertDescription", alarmCondNode);
- vfcResourceUuidObjectNode.putPOJO("", vfcObjectNode);
- }
- }
-
- /**
- * Method to create vfc and kpi nodes inside vf node
- *
- * @param mapper
- * @param cldsVfDataList
- * @return
- */
- private ObjectNode createVfcObjectNodeByVfUuid(List<CldsVfData> cldsVfDataList) {
- ObjectMapper mapper = JacksonUtils.getObjectMapperInstance();
- ObjectNode vfUuidObjectNode = mapper.createObjectNode();
- if (cldsVfDataList != null && !cldsVfDataList.isEmpty()) {
- for (CldsVfData currCldsVfData : cldsVfDataList) {
- if (currCldsVfData != null) {
- ObjectNode vfObjectNode = mapper.createObjectNode();
- ObjectNode vfcUuidNode = mapper.createObjectNode();
- ObjectNode kpiObjectNode = mapper.createObjectNode();
- if (currCldsVfData.getCldsVfcs() != null && !currCldsVfData.getCldsVfcs().isEmpty()) {
- for (CldsVfcData currCldsVfcData : currCldsVfData.getCldsVfcs()) {
- if (currCldsVfcData.getCldsAlarmConditions() != null
- && !currCldsVfcData.getCldsAlarmConditions().isEmpty()) {
- vfcUuidNode.put(currCldsVfcData.getVfcInvariantResourceUUID(),
- currCldsVfcData.getVfcName());
- }
- }
- } else {
- vfcUuidNode.put("", "");
- }
- if (currCldsVfData.getCldsKPIList() != null && !currCldsVfData.getCldsKPIList().isEmpty()) {
- for (CldsVfKPIData currCldsVfKPIData : currCldsVfData.getCldsKPIList()) {
- kpiObjectNode.put(currCldsVfKPIData.getThresholdValue(),
- currCldsVfKPIData.getThresholdValue());
- }
- } else {
- kpiObjectNode.put("", "");
- }
- vfObjectNode.putPOJO("vfc", vfcUuidNode);
- vfObjectNode.putPOJO("kpi", kpiObjectNode);
- vfUuidObjectNode.putPOJO(currCldsVfData.getVfInvariantResourceUUID(), vfObjectNode);
- }
- }
- } else {
- ObjectNode vfcUuidNode = mapper.createObjectNode();
- vfcUuidNode.put("", "");
- ObjectNode vfcObjectNode = mapper.createObjectNode();
- vfcObjectNode.putPOJO("vfc", vfcUuidNode);
- vfUuidObjectNode.putPOJO("", vfcObjectNode);
- }
- return vfUuidObjectNode;
- }
-
- // To get all sdc VF/VFC Resources basic info.
- private List<SdcResourceBasicInfo> getAllSdcVForVfcResourcesBasedOnResourceType(String resourceType) {
- String catalogUrl = refProp.getStringValue(SDC_CATALOG_URL_PROPERTY_NAME);
- String resourceUrl = catalogUrl + "resources?resourceType=" + resourceType;
- String allSdcVfcResources = getCldsServicesOrResourcesBasedOnURL(resourceUrl);
- return removeDuplicateSdcResourceBasicInfo(getAllSdcResourcesListFromJson(allSdcVfcResources));
- }
-
- private String getResourceUuidFromResourceInvariantUuid(String resourceInvariantUuid,
- List<SdcResourceBasicInfo> resourceInfoList) {
- String resourceUuid = null;
- if (resourceInfoList != null && !resourceInfoList.isEmpty()) {
- for (SdcResourceBasicInfo currResource : resourceInfoList) {
- if (currResource != null && currResource.getInvariantUUID() != null && currResource.getUuid() != null
- && currResource.getInvariantUUID().equalsIgnoreCase(resourceInvariantUuid)) {
- resourceUuid = currResource.getUuid();
- break;
- }
- }
- }
- return resourceUuid;
- }
-}
diff --git a/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcRequests.java b/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcRequests.java
deleted file mode 100644
index efd664c65..000000000
--- a/src/main/java/org/onap/clamp/clds/client/req/sdc/SdcRequests.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-
-package org.onap.clamp.clds.client.req.sdc;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.security.GeneralSecurityException;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.apache.commons.codec.DecoderException;
-import org.onap.clamp.clds.client.req.tca.TcaRequestFormatter;
-import org.onap.clamp.clds.config.ClampProperties;
-import org.onap.clamp.clds.model.properties.Global;
-import org.onap.clamp.clds.model.properties.ModelProperties;
-import org.onap.clamp.clds.model.properties.Tca;
-import org.onap.clamp.clds.model.sdc.SdcResource;
-import org.onap.clamp.clds.model.sdc.SdcServiceDetail;
-import org.onap.clamp.clds.util.JacksonUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-
-/**
- * Construct a Sdc request given CLDS objects.
- */
-@Component
-@Primary
-public class SdcRequests {
-
- protected static final EELFLogger logger = EELFManager.getInstance().getLogger(SdcRequests.class);
- protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
- @Autowired
- private SdcCatalogServices sdcCatalogServices;
- @Autowired
- protected ClampProperties refProp;
-
- /**
- * Format the Blueprint from a Yaml
- *
- * @param prop
- * The ModelProperties describing the clds model
- * @param docText
- * The Yaml file that must be converted
- * @return A String containing the BluePrint
- * @throws IOException
- * In case of issues
- */
- public String formatBlueprint(ModelProperties prop, String docText) throws IOException {
- String yamlvalue = getYamlvalue(docText);
- String updatedBlueprint = "";
- Tca tca = prop.getType(Tca.class);
- if (tca.isFound()) {
- updatedBlueprint = TcaRequestFormatter.updatedBlueprintWithConfiguration(refProp, prop, yamlvalue);
- }
- logger.info("value of blueprint:" + updatedBlueprint);
- return updatedBlueprint;
- }
-
- /**
- * Format the SDC Locations Request in the JSON Format
- *
- * @param prop
- * The ModelProperties describing the clds model
- * @param artifactName
- * The name of the artifact
- * @return SDC Locations request in the JSON Format
- */
- public String formatSdcLocationsReq(ModelProperties prop, String artifactName) {
- ObjectMapper objectMapper = JacksonUtils.getObjectMapperInstance();
- Global global = prop.getGlobal();
- List<String> locationsList = global.getLocation();
- ArrayNode locationsArrayNode = objectMapper.createArrayNode();
- ObjectNode locationObject = objectMapper.createObjectNode();
- for (String currLocation : locationsList) {
- locationsArrayNode.add(currLocation);
- }
- locationObject.put("artifactName", artifactName);
- locationObject.putPOJO("locations", locationsArrayNode);
- String locationJsonFormat = locationObject.toString();
- logger.info("Value of location Json Artifact:" + locationsArrayNode);
- return locationJsonFormat;
- }
-
- /**
- * Format the SDC Request
- *
- * @param payloadData
- * The ModelProperties describing the clds model
- * @param artifactName
- * The name of the artifact
- * @param artifactLabel
- * The Label of the artifact
- * @param artifactType
- * The type of the artifact
- * @return formatted SDC Request
- */
- public String formatSdcReq(String payloadData, String artifactName, String artifactLabel, String artifactType) {
- logger.info("artifact=" + payloadData);
- String base64Artifact = Base64.getEncoder().encodeToString(payloadData.getBytes(StandardCharsets.UTF_8));
- return "{ \n" + "\"payloadData\" : \"" + base64Artifact + "\",\n" + "\"artifactLabel\" : \"" + artifactLabel
- + "\",\n" + "\"artifactName\" :\"" + artifactName + "\",\n" + "\"artifactType\" : \"" + artifactType
- + "\",\n" + "\"artifactGroupType\" : \"DEPLOYMENT\",\n" + "\"description\" : \"from CLAMP Cockpit\"\n"
- + "} \n";
- }
-
- private List<String> filterVfResourceList(String serviceUuid, List<SdcResource> sdcResourcesList,
- List<String> cldsResourceVfList) {
- List<String> urlList = new ArrayList<>();
- for (SdcResource cldsSdcResource : sdcResourcesList) {
- if (cldsSdcResource != null && cldsSdcResource.getResoucreType() != null
- && cldsSdcResource.getResoucreType().equalsIgnoreCase("VF")
- && cldsResourceVfList.contains(cldsSdcResource.getResourceInvariantUUID())) {
- String normalizedResourceInstanceName = normalizeResourceInstanceName(
- cldsSdcResource.getResourceInstanceName());
- String svcUrl = createUrlForResource(normalizedResourceInstanceName, serviceUuid);
- urlList.add(svcUrl);
- }
- }
- return urlList;
- }
-
- private String createUrlForResource(String normalizedResourceInstanceName, String serviceUuid) {
- return refProp.getStringValue("sdc.serviceUrl") + "/" + serviceUuid + "/resourceInstances/"
- + normalizedResourceInstanceName + "/artifacts";
- }
-
- /**
- * To get List of urls for all vfresources
- *
- * @param prop
- * The model properties JSON describing the closed loop flow
- * @return A list of Service URL
- * @throws GeneralSecurityException
- * In case of issues when decrypting the password
- * @throws DecoderException
- * In case of issues when decoding the Hex String
- */
- public List<String> getSdcReqUrlsList(ModelProperties prop) throws GeneralSecurityException, DecoderException {
- List<String> urlList = new ArrayList<>();
- Global globalProps = prop.getGlobal();
- if (globalProps != null && globalProps.getService() != null && globalProps.getResourceVf() != null) {
- String serviceUuid = sdcCatalogServices.getServiceUuidFromServiceInvariantId(globalProps.getService());
- SdcServiceDetail sdcServiceDetail = sdcCatalogServices
- .decodeCldsSdcServiceDetailFromJson(sdcCatalogServices.getSdcServicesInformation(serviceUuid));
- if (sdcServiceDetail != null) {
- urlList = filterVfResourceList(serviceUuid, sdcServiceDetail.getResources(),
- globalProps.getResourceVf());
- }
- } else {
- logger.warn("GlobalProperties json is empty, skipping getSdcReqUrlsList and returning empty list");
- }
- return urlList;
- }
-
- /**
- * "Normalize" the resource instance name: - Remove spaces, underscores,
- * dashes, and periods. - make lower case This is required by SDC when using
- * the resource instance name to upload an artifact.
- *
- * @param inText
- * @return
- */
- public String normalizeResourceInstanceName(String inText) {
- return inText.replace(" ", "").replace("-", "").replace(".", "").toLowerCase();
- }
-
- /**
- * Method to get yaml/template properties value from json.
- *
- * @param jsonGlobal
- * The Json containing a Yaml file
- * @return The yaml extracted from the JSON
- * @throws IOException
- * In case of issues with the Json parser
- */
- protected String getYamlvalue(String jsonGlobal) throws IOException {
- String yamlFileValue = "";
- ObjectNode root = JacksonUtils.getObjectMapperInstance().readValue(jsonGlobal, ObjectNode.class);
- Iterator<Entry<String, JsonNode>> entryItr = root.fields();
- while (entryItr.hasNext()) {
- Entry<String, JsonNode> entry = entryItr.next();
- String key = entry.getKey();
- if (key != null && key.equalsIgnoreCase("global")) {
- ArrayNode arrayNode = (ArrayNode) entry.getValue();
- for (JsonNode anArrayNode : arrayNode) {
- ObjectNode node = (ObjectNode) anArrayNode;
- ArrayNode arrayValueNode = (ArrayNode) node.get("value");
- JsonNode jsonNode = arrayValueNode.get(0);
- yamlFileValue = jsonNode.asText();
- logger.info("value:" + yamlFileValue);
- }
- break;
- }
- }
- return yamlFileValue;
- }
-}
diff --git a/src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java b/src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java
index 1478342c5..6b8f04397 100644
--- a/src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java
+++ b/src/main/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatter.java
@@ -25,10 +25,9 @@ package org.onap.clamp.clds.client.req.tca;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
import java.io.IOException;
import java.util.Map;
@@ -38,6 +37,7 @@ import org.onap.clamp.clds.model.properties.ModelProperties;
import org.onap.clamp.clds.model.properties.Tca;
import org.onap.clamp.clds.model.properties.TcaItem;
import org.onap.clamp.clds.model.properties.TcaThreshold;
+import org.onap.clamp.clds.util.JsonUtils;
import org.yaml.snakeyaml.Yaml;
/**
@@ -71,10 +71,10 @@ public class TcaRequestFormatter {
modelProperties.setCurrentModelElementId(tca.getId());
// Always one tcaItem so must be set to id 0
modelProperties.setPolicyUniqueId("0");
- ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("tca.policy.template", service);
+ JsonObject rootNode = refProp.getJsonTemplate("tca.policy.template", service ).getAsJsonObject();
String policyName = modelProperties.getCurrentPolicyScopeAndPolicyName();
- rootNode.put("policyName", policyName);
- ((ObjectNode) rootNode.get("content")).replace("tca_policy",
+ rootNode.addProperty("policyName", policyName);
+ rootNode.get("content").getAsJsonObject().add("tca_policy",
createPolicyContent(refProp, modelProperties, service, policyName, tca));
String tcaPolicyReq = rootNode.toString();
logger.info("tcaPolicyReq=" + tcaPolicyReq);
@@ -104,7 +104,7 @@ public class TcaRequestFormatter {
* modelProperties.setCurrentModelElementId will be used
* @return The Json node containing what should be sent to policy
*/
- public static JsonNode createPolicyContent(ClampProperties refProp, ModelProperties modelProperties, String service,
+ public static JsonObject createPolicyContent(ClampProperties refProp, ModelProperties modelProperties, String service,
String policyName, Tca tca) {
try {
String serviceToUse = service;
@@ -120,14 +120,12 @@ public class TcaRequestFormatter {
if (policyNameToUse == null) {
policyNameToUse = modelProperties.getCurrentPolicyScopeAndPolicyName();
}
- ObjectNode rootNode = (ObjectNode) refProp.getJsonTemplate("tca.template", serviceToUse);
- ((ObjectNode) rootNode.get("metricsPerEventName").get(0)).put("eventName",
- tcaToUse.getTcaItem().getEventName());
- ((ObjectNode) rootNode.get("metricsPerEventName").get(0)).put("policyName", policyNameToUse);
- ((ObjectNode) rootNode.get("metricsPerEventName").get(0)).put("controlLoopSchemaType",
- tcaToUse.getTcaItem().getControlLoopSchemaType());
- ObjectNode thresholdsParent = ((ObjectNode) rootNode.get("metricsPerEventName").get(0));
- addThresholds(refProp, serviceToUse, thresholdsParent, tcaToUse.getTcaItem(), modelProperties);
+ JsonObject rootNode = refProp.getJsonTemplate("tca.template", serviceToUse).getAsJsonObject();
+ JsonObject metricsPerEventName = rootNode.get("metricsPerEventName").getAsJsonArray().get(0).getAsJsonObject();
+ metricsPerEventName.addProperty("eventName", tcaToUse.getTcaItem().getEventName());
+ metricsPerEventName.addProperty("policyName", policyNameToUse);
+ metricsPerEventName.addProperty("controlLoopSchemaType",tcaToUse.getTcaItem().getControlLoopSchemaType());
+ addThresholds(refProp, serviceToUse, metricsPerEventName, tcaToUse.getTcaItem(), modelProperties);
logger.info("tcaPolicyContent=" + rootNode.toString());
return rootNode;
} catch (IOException e) {
@@ -154,17 +152,17 @@ public class TcaRequestFormatter {
* The Model Properties created from BPMN JSON and BPMN
* properties JSON
*/
- private static void addThresholds(ClampProperties refProp, String service, ObjectNode appendToNode, TcaItem tcaItem,
+ private static void addThresholds(ClampProperties refProp, String service, JsonObject appendToNode, TcaItem tcaItem,
ModelProperties modelProperties) {
- ArrayNode tcaNodes = appendToNode.withArray("thresholds");
+ JsonArray tcaNodes = appendToNode.get("thresholds").getAsJsonArray();
try {
for (TcaThreshold tcaThreshold : tcaItem.getTcaThresholds()) {
- ObjectNode tcaNode = (ObjectNode) refProp.getJsonTemplate("tca.thresholds.template", service);
- tcaNode.put("closedLoopControlName", modelProperties.getControlNameAndPolicyUniqueId());
- tcaNode.put("fieldPath", tcaThreshold.getFieldPath());
- tcaNode.put("thresholdValue", tcaThreshold.getThreshold());
- tcaNode.put("direction", tcaThreshold.getOperator());
- tcaNode.put("closedLoopEventStatus", tcaThreshold.getClosedLoopEventStatus());
+ JsonObject tcaNode = refProp.getJsonTemplate("tca.thresholds.template", service).getAsJsonObject();
+ tcaNode.addProperty("closedLoopControlName", modelProperties.getControlNameAndPolicyUniqueId());
+ tcaNode.addProperty("fieldPath", tcaThreshold.getFieldPath());
+ tcaNode.addProperty("thresholdValue", tcaThreshold.getThreshold());
+ tcaNode.addProperty("direction", tcaThreshold.getOperator());
+ tcaNode.addProperty("closedLoopEventStatus", tcaThreshold.getClosedLoopEventStatus());
tcaNodes.add(tcaNode);
}
} catch (IOException e) {
@@ -187,7 +185,7 @@ public class TcaRequestFormatter {
*/
public static String updatedBlueprintWithConfiguration(ClampProperties refProp, ModelProperties modelProperties,
String yamlValue) {
- String jsonPolicy = ((ObjectNode) createPolicyContent(refProp, modelProperties, null, null, null)).toString();
+ String jsonPolicy = JsonUtils.GSON.toJson(createPolicyContent(refProp, modelProperties, null, null, null));
logger.info("Yaml that will be updated:" + yamlValue);
Yaml yaml = new Yaml();
Map<String, Object> loadedYaml = (Map<String, Object>) yaml.load(yamlValue);
diff --git a/src/main/java/org/onap/clamp/clds/config/ClampProperties.java b/src/main/java/org/onap/clamp/clds/config/ClampProperties.java
index 9acad94ab..4f1e8a281 100644
--- a/src/main/java/org/onap/clamp/clds/config/ClampProperties.java
+++ b/src/main/java/org/onap/clamp/clds/config/ClampProperties.java
@@ -23,16 +23,16 @@
package org.onap.clamp.clds.config;
-import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.base.Splitter;
+import com.google.gson.JsonElement;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.apache.commons.io.IOUtils;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
@@ -89,10 +89,10 @@ public class ClampProperties {
* @throws IOException
* In case of issues with the JSON parser
*/
- public JsonNode getJsonTemplate(String key) throws IOException {
+ public JsonElement getJsonTemplate(String key) throws IOException {
String fileReference = getStringValue(key);
return (fileReference != null)
- ? JacksonUtils.getObjectMapperInstance().readValue(getFileContentFromPath(fileReference), JsonNode.class)
+ ? JsonUtils.GSON.fromJson(getFileContentFromPath(fileReference), JsonElement.class)
: null;
}
@@ -109,10 +109,10 @@ public class ClampProperties {
* @throws IOException
* In case of issues with the JSON parser
*/
- public JsonNode getJsonTemplate(String key1, String key2) throws IOException {
+ public JsonElement getJsonTemplate(String key1, String key2) throws IOException {
String fileReference = getStringValue(key1, key2);
return (fileReference != null)
- ? JacksonUtils.getObjectMapperInstance().readValue(getFileContentFromPath(fileReference), JsonNode.class)
+ ? JsonUtils.GSON.fromJson(getFileContentFromPath(fileReference), JsonElement.class)
: null;
}
diff --git a/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java b/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java
index 0b873335f..d1beb956d 100644
--- a/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java
+++ b/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java
@@ -23,14 +23,18 @@
package org.onap.clamp.clds.config;
+import com.google.gson.JsonParseException;
+import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
+import java.util.List;
import org.apache.commons.io.IOUtils;
import org.onap.clamp.clds.exception.CldsUsersException;
import org.onap.clamp.clds.service.CldsUser;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
public class CldsUserJsonDecoder {
@@ -55,8 +59,8 @@ public class CldsUserJsonDecoder {
try {
// the ObjectMapper readValue method closes the stream no need to do
// it
- return JacksonUtils.getObjectMapperInstance().readValue(cldsUsersString, CldsUser[].class);
- } catch (IOException e) {
+ return JsonUtils.GSON.fromJson(cldsUsersString, CldsUser[].class);
+ } catch (JsonParseException e) {
throw new CldsUsersException("Exception occurred during the decoding of the clds-users.json", e);
}
}
diff --git a/src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserMappingConfiguration.java b/src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserMappingConfiguration.java
index 2cab17b3a..2f0e698c8 100644
--- a/src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserMappingConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/config/sdc/BlueprintParserMappingConfiguration.java
@@ -23,13 +23,16 @@
package org.onap.clamp.clds.config.sdc;
-import com.fasterxml.jackson.core.type.TypeReference;
-import java.io.IOException;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
import java.util.List;
-
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* This class is used to decode the configuration found in
@@ -39,6 +42,8 @@ import org.onap.clamp.clds.util.JacksonUtils;
*/
public class BlueprintParserMappingConfiguration {
+ private static final Type BLUEPRINT_MAP_CONF_TYPE = new TypeToken<List<BlueprintParserMappingConfiguration>>() {
+ }.getType();
private String blueprintKey;
private boolean dcaeDeployable;
private BlueprintParserFilesConfiguration files;
@@ -63,9 +68,7 @@ public class BlueprintParserMappingConfiguration {
return dcaeDeployable;
}
- public static List<BlueprintParserMappingConfiguration> createFromJson(InputStream json) throws IOException {
- TypeReference<List<BlueprintParserMappingConfiguration>> mapType = new TypeReference<List<BlueprintParserMappingConfiguration>>() {
- };
- return JacksonUtils.getObjectMapperInstance().readValue(json, mapType);
+ public static List<BlueprintParserMappingConfiguration> createFromJson(InputStream json) {
+ return JsonUtils.GSON.fromJson(new InputStreamReader(json, StandardCharsets.UTF_8), BLUEPRINT_MAP_CONF_TYPE);
}
}
diff --git a/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java b/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java
index 0f75d46e7..b21c75f2a 100644
--- a/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/config/sdc/SdcControllersConfiguration.java
@@ -25,16 +25,18 @@ package org.onap.clamp.clds.config.sdc;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonObject;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.onap.clamp.clds.exception.sdc.controller.SdcParametersException;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
@@ -59,13 +61,13 @@ public class SdcControllersConfiguration {
/**
* The root of the JSON.
*/
- private JsonNode jsonRootNode;
+ private JsonObject jsonRootNode;
@PostConstruct
public void loadConfiguration() throws IOException {
Resource resource = appContext.getResource(sdcControllerFile);
// Try to load json tree
- jsonRootNode = JacksonUtils.getObjectMapperInstance().readValue(resource.getInputStream(), JsonNode.class);
+ jsonRootNode = JsonUtils.GSON.fromJson(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8), JsonObject.class);
}
public SdcSingleControllerConfiguration getSdcSingleControllerConfiguration(String controllerName) {
@@ -80,8 +82,9 @@ public class SdcControllersConfiguration {
public Map<String, SdcSingleControllerConfiguration> getAllDefinedControllers() {
Map<String, SdcSingleControllerConfiguration> result = new HashMap<>();
if (jsonRootNode.get(CONTROLLER_SUBTREE_KEY) != null) {
- jsonRootNode.get(CONTROLLER_SUBTREE_KEY).fields().forEachRemaining(entry -> result.put(entry.getKey(),
- new SdcSingleControllerConfiguration(entry.getValue(), entry.getKey())));
+ jsonRootNode.get(CONTROLLER_SUBTREE_KEY).getAsJsonObject().entrySet().forEach(
+ entry -> result.put(entry.getKey(),
+ new SdcSingleControllerConfiguration(entry.getValue().getAsJsonObject(), entry.getKey())));
} else {
throw new SdcParametersException(
CONTROLLER_SUBTREE_KEY + " key not found in the file: " + sdcControllerFile);
diff --git a/src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java b/src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java
index ca756aa09..564e01f18 100644
--- a/src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfiguration.java
@@ -25,8 +25,8 @@ package org.onap.clamp.clds.config.sdc;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonObject;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -52,7 +52,7 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
/**
* The root of the JSON.
*/
- private JsonNode jsonRootNode;
+ private JsonObject jsonRootNode;
// All keys that can be present in the JSON
public static final String CONSUMER_GROUP_ATTRIBUTE_NAME = "consumerGroup";
public static final String CONSUMER_ID_ATTRIBUTE_NAME = "consumerId";
@@ -90,12 +90,12 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
* This constructor builds a SdcSingleControllerConfiguration from the
* corresponding json.
*
- * @param jsonRootNode
+ * @param jsonNode
* The JSON node
* @param controllerName
* The controller name that must appear in the JSON
*/
- public SdcSingleControllerConfiguration(JsonNode jsonNode, String controllerName) {
+ public SdcSingleControllerConfiguration(JsonObject jsonNode, String controllerName) {
jsonRootNode = jsonNode;
setSdcControllerName(controllerName);
testAllRequiredParameters();
@@ -113,7 +113,7 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
private String getStringConfig(String key) {
if (jsonRootNode != null && jsonRootNode.get(key) != null) {
- String config = jsonRootNode.get(key).asText();
+ String config = jsonRootNode.get(key).getAsString();
return config.isEmpty() ? null : config;
}
return null;
@@ -121,7 +121,7 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
private Integer getIntConfig(String key) {
if (jsonRootNode != null && jsonRootNode.get(key) != null) {
- return jsonRootNode.get(key).asInt();
+ return jsonRootNode.get(key).getAsInt();
} else {
return 0;
}
@@ -129,8 +129,8 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
private String getEncryptedStringConfig(String key) throws GeneralSecurityException, DecoderException {
if (jsonRootNode != null && jsonRootNode.get(key) != null) {
- return jsonRootNode.get(key).asText().isEmpty() ? null
- : CryptoUtils.decrypt(jsonRootNode.get(key).asText());
+ return jsonRootNode.get(key).getAsString().isEmpty() ? null
+ : CryptoUtils.decrypt(jsonRootNode.get(key).getAsString());
}
return null;
}
@@ -143,7 +143,7 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
@Override
public String getConsumerGroup() {
if (jsonRootNode != null && jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME) != null) {
- String config = jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME).asText();
+ String config = jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME).getAsString();
return "NULL".equals(config) || config.isEmpty() ? null : config;
}
return null;
@@ -198,8 +198,8 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
@Override
public boolean activateServerTLSAuth() {
- if (jsonRootNode != null && jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH) != null) {
- return jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH).asBoolean(false);
+ if (jsonRootNode != null && jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH) != null && jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH).isJsonPrimitive()) {
+ return jsonRootNode.get(ACTIVATE_SERVER_TLS_AUTH).getAsBoolean();
} else {
return false;
}
@@ -231,7 +231,7 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
throw new SdcParametersException("Json is null for controller " + this.getSdcControllerName());
}
if (this.getConsumerGroup() == null && (jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME) == null
- || !"NULL".equals(jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME).asText()))) {
+ || !"NULL".equals(jsonRootNode.get(CONSUMER_GROUP_ATTRIBUTE_NAME).getAsString()))) {
throw new SdcParametersException(CONSUMER_GROUP_ATTRIBUTE_NAME + errorMessageKeyNotFound);
}
if (this.getConsumerID() == null || this.getConsumerID().isEmpty()) {
@@ -277,7 +277,7 @@ public class SdcSingleControllerConfiguration implements IConfiguration {
public List<String> getMsgBusAddress() {
List<String> addressesList = new ArrayList<>();
if (jsonRootNode != null && jsonRootNode.get(MESSAGE_BUS_ADDRESSES) != null) {
- jsonRootNode.get(MESSAGE_BUS_ADDRESSES).forEach(k -> addressesList.add(k.asText()));
+ jsonRootNode.get(MESSAGE_BUS_ADDRESSES).getAsJsonArray().forEach(k -> addressesList.add(k.getAsString()));
return addressesList;
} else {
return addressesList;
diff --git a/src/main/java/org/onap/clamp/clds/dao/CldsDao.java b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
index b6e27c5e1..eef635359 100644
--- a/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
+++ b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
@@ -336,45 +336,6 @@ public class CldsDao {
return template;
}
- public void clearServiceCache() {
- String clearCldsServiceCacheSql = "TRUNCATE clds_service_cache";
- jdbcTemplateObject.execute(clearCldsServiceCacheSql);
- }
-
- public CldsServiceData getCldsServiceCache(String invariantUUID) {
- CldsServiceData cldsServiceData = null;
- try {
- String getCldsServiceSQL = "SELECT * , TIMESTAMPDIFF(SECOND, timestamp, CURRENT_TIMESTAMP()) FROM clds_service_cache where invariant_service_id = ? ";
- cldsServiceData = jdbcTemplateObject.queryForObject(getCldsServiceSQL, new Object[] { invariantUUID },
- new CldsServiceDataMapper());
- if (cldsServiceData != null) {
- logger.info("CldsServiceData found in cache for Service Invariant ID:"
- + cldsServiceData.getServiceInvariantUUID());
- return cldsServiceData;
- } else {
- logger.warn("CldsServiceData not found in cache for Service Invariant ID:" + invariantUUID);
- return null;
- }
- } catch (EmptyResultDataAccessException e) {
- logger.info("CldsServiceData not found in cache for Service Invariant ID: " + invariantUUID);
- logger.debug("CldsServiceData not found in cache for Service Invariant ID: " + invariantUUID, e);
- return null;
- }
- }
-
- public void setCldsServiceCache(CldsDbServiceCache cldsDBServiceCache) {
- if (cldsDBServiceCache != null && cldsDBServiceCache.getInvariantId() != null
- && cldsDBServiceCache.getServiceId() != null) {
- String invariantUuid = cldsDBServiceCache.getInvariantId();
- String serviceUuid = cldsDBServiceCache.getServiceId();
- InputStream is = cldsDBServiceCache.getCldsDataInstream();
- String insertCldsServiceCacheSql = "INSERT INTO clds_service_cache"
- + "(invariant_service_id,service_id,timestamp,object_data) VALUES"
- + "(?,?,CURRENT_TIMESTAMP,?) ON DUPLICATE KEY UPDATE invariant_service_id = VALUES(invariant_service_id) , timestamp = CURRENT_TIMESTAMP , object_data = VALUES(object_data) ";
- jdbcTemplateObject.update(insertCldsServiceCacheSql, invariantUuid, serviceUuid, is);
- }
- }
-
private static Map<String, Object> logSqlExecution(SimpleJdbcCall call, SqlParameterSource source) {
try {
return call.execute(source);
diff --git a/src/main/java/org/onap/clamp/clds/model/CldsModelInstance.java b/src/main/java/org/onap/clamp/clds/model/CldsModelInstance.java
index 75801ae2b..082bfe335 100644
--- a/src/main/java/org/onap/clamp/clds/model/CldsModelInstance.java
+++ b/src/main/java/org/onap/clamp/clds/model/CldsModelInstance.java
@@ -23,9 +23,6 @@
package org.onap.clamp.clds.model;
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
public class CldsModelInstance {
private String modelInstanceId;
diff --git a/src/main/java/org/onap/clamp/clds/model/actions/ActionsHandler.java b/src/main/java/org/onap/clamp/clds/model/actions/ActionsHandler.java
index 1c54dae01..bafe48d9a 100644
--- a/src/main/java/org/onap/clamp/clds/model/actions/ActionsHandler.java
+++ b/src/main/java/org/onap/clamp/clds/model/actions/ActionsHandler.java
@@ -24,14 +24,13 @@
package org.onap.clamp.clds.model.actions;
import com.att.eelf.configuration.EELFLogger;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
import java.util.Arrays;
import java.util.List;
-
import org.onap.clamp.clds.model.CldsEvent;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* Interface for actions that the user can do according to the last event.
@@ -44,7 +43,7 @@ public interface ActionsHandler {
SIMPLE_MODEL("simpleModel"), POLICY_MODEL("policyModel");
private final String type;
- private ModelType(String type) {
+ ModelType(String type) {
this.type = type;
}
@@ -53,7 +52,7 @@ public interface ActionsHandler {
}
}
- public EELFLogger getLogger();
+ EELFLogger getLogger();
/**
* This method determines a list of actions that the user can do according to
@@ -155,13 +154,15 @@ public interface ActionsHandler {
boolean result = false;
try {
if (propText != null) {
- JsonNode modelJson = JacksonUtils.getObjectMapperInstance().readTree(propText);
- JsonNode modelJsonOfType = modelJson.get(key.getType());
- if (modelJsonOfType != null && modelJsonOfType.asBoolean()) {
+ JsonObject modelJson = JsonUtils.GSON.fromJson(propText, JsonObject.class);
+ JsonElement modelJsonOfType = modelJson.get(key.getType());
+ if (modelJsonOfType != null
+ && modelJsonOfType.isJsonPrimitive()
+ && modelJsonOfType.getAsJsonPrimitive().getAsBoolean()) {
result = true;
}
}
- } catch (IOException e) {
+ } catch (JsonParseException e) {
getLogger().error("Error while parsing propText json", e);
}
return result;
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java b/src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java
index 571e5b1bc..8e8debe83 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/AbstractModelElement.java
@@ -25,15 +25,12 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
/**
- * Provide base ModelElement functionality. Perform base parsing of properties
- * for a ModelElement (such as, VesCollector, Policy, Tca, Holmes, ...)
+ * Provide base ModelElement functionality. Perform base parsing of properties for a ModelElement (such as,
+ * VesCollector, Policy, Tca, Holmes, ...)
*/
public abstract class AbstractModelElement {
@@ -43,17 +40,14 @@ public abstract class AbstractModelElement {
private final ModelBpmn modelBpmn;
private final String id;
protected String topicPublishes;
- protected final JsonNode modelElementJsonNode;
+ protected final JsonElement modelElementJsonNode;
private boolean isFound;
private final ModelProperties modelProp;
- private static final String LOG_ELEMENT_NOT_FOUND = "Value '{}' for key 'name' not found in JSON";
- private static final String LOG_ELEMENT_NOT_FOUND_IN_JSON = "Value '{}' for key 'name' not found in JSON {}";
/**
- * Perform base parsing of properties for a ModelElement (such as, VesCollector,
- * Policy and Tca)
+ * Perform base parsing of properties for a ModelElement (such as, VesCollector, Policy and Tca)
*/
- protected AbstractModelElement(String type, ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) {
+ protected AbstractModelElement(String type, ModelProperties modelProp, ModelBpmn modelBpmn, JsonObject modelJson) {
this.type = type;
this.modelProp = modelProp;
this.modelBpmn = modelBpmn;
@@ -69,163 +63,6 @@ public abstract class AbstractModelElement {
return topicPublishes;
}
- /**
- * Return the value field of the json node element that has a name field equals
- * to the given name.
- */
- public static String getValueByName(JsonNode nodeIn, String name) {
- String value = null;
- if (nodeIn != null) {
- for (JsonNode node : nodeIn) {
- if (node.path("name").asText().equals(name)) {
- JsonNode vnode = node.path("value");
- if (vnode.isArray()) {
- // if array, assume value is in first element
- value = vnode.path(0).asText();
- } else {
- // otherwise, just return text
- value = vnode.asText();
- }
- }
- }
- }
- if (value == null || value.length() == 0) {
- logger.warn(LOG_ELEMENT_NOT_FOUND, name);
- } else {
- logger.debug(LOG_ELEMENT_NOT_FOUND_IN_JSON, name, nodeIn.toString());
- }
- return value;
- }
-
- /**
- * Return the Json value field of the json node element that has a name field
- * equals to the given name.
- */
- public static JsonNode getJsonNodeByName(JsonNode nodeIn, String name) {
- JsonNode vnode = null;
- if (nodeIn != null) {
- for (JsonNode node : nodeIn) {
- if (node.path("name").asText().equals(name)) {
- vnode = node.path("value");
- }
- }
- }
- if (vnode == null) {
- logger.warn(LOG_ELEMENT_NOT_FOUND, name);
- } else {
- logger.debug(LOG_ELEMENT_NOT_FOUND_IN_JSON, name, nodeIn.toString());
- }
- return vnode;
- }
-
- /**
- * Return the value field of the json node element that has a name field that
- * equals the given name.
- */
- public static String getNodeValueByName(JsonNode nodeIn, String name) {
- String value = null;
- if (nodeIn != null) {
- value = nodeIn.path(name).asText();
- }
- if (value == null || value.length() == 0) {
- logger.warn(LOG_ELEMENT_NOT_FOUND, name);
- } else {
- logger.debug(LOG_ELEMENT_NOT_FOUND_IN_JSON, name, nodeIn.toString());
- }
- return value;
- }
-
- /**
- * Return the value field of the json node element that has a name field that
- * equals the given name.
- */
- public static List<String> getNodeValuesByName(JsonNode nodeIn, String name) {
- List<String> values = new ArrayList<>();
- if (nodeIn != null) {
- for (JsonNode node : nodeIn) {
- if (node.path("name").asText().equals(name)) {
- JsonNode vnode = node.path("value");
- if (vnode.isArray()) {
- // if array, assume value is in first element
- values.add(vnode.path(0).asText());
- } else {
- // otherwise, just return text
- values.add(vnode.asText());
- }
- }
- }
- }
- return values;
- }
-
- /**
- * Return the int value field of the json node element that has a name field
- * equals to the given name.
- */
- public static Integer getIntValueByName(JsonNode nodeIn, String name) {
- String value = getValueByName(nodeIn, name);
- return Integer.valueOf(value);
- }
-
- /**
- * Return an array of values for the field of the json node element that has a
- * name field equals to the given name.
- */
- public static List<String> getValuesByName(JsonNode nodeIn, String name) {
- List<String> values = null;
- if (nodeIn != null) {
- for (JsonNode node : nodeIn) {
- if (node.path("name").asText().equals(name)) {
- values = getValuesList(node);
- }
- }
- }
- if (values == null || values.isEmpty()) {
- logger.warn(LOG_ELEMENT_NOT_FOUND, name);
- } else {
- logger.debug(LOG_ELEMENT_NOT_FOUND_IN_JSON, name, nodeIn.toString());
- }
- return values;
- }
-
- /**
- * Return an array of String values.
- */
- public static List<String> getValuesList(JsonNode nodeIn) {
- ArrayList<String> al = new ArrayList<>();
- if (nodeIn != null) {
- Iterator<JsonNode> itr = nodeIn.path("value").elements();
- while (itr.hasNext()) {
- JsonNode node = itr.next();
- al.add(node.asText());
- }
- }
- return al;
- }
-
- /**
- * Return the value field of the json node element that has a name field equals
- * to the given name.
- */
- public String getValueByName(String name) {
- return getValueByName(modelElementJsonNode, name);
- }
-
- /**
- * Return the int value field of the json node element that has a name field
- * equals to the given name.
- */
- public Integer getIntValueByName(String name) {
- return getIntValueByName(modelElementJsonNode, name);
- }
-
- /**
- * Return an array of values for the field of the json node element that has a
- * name field equals to the given name.
- */
- public List<String> getValuesByName(String name) {
- return getValuesByName(modelElementJsonNode, name);
- }
/**
* @return the id
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/Global.java b/src/main/java/org/onap/clamp/clds/model/properties/Global.java
index e86740726..66491489a 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/Global.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/Global.java
@@ -25,9 +25,11 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
import java.util.List;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* Parse global json properties.
@@ -45,7 +47,7 @@ public class Global {
private String actionSet;
private List<String> resourceVf;
private List<String> resourceVfc;
- private JsonNode deployParameters;
+ private JsonObject deployParameters;
private List<String> location;
private String vnfScope;
@@ -54,15 +56,15 @@ public class Global {
*
* @param modelJson
*/
- public Global(JsonNode modelJson) {
- JsonNode globalNode = modelJson.get("global");
- service = AbstractModelElement.getValueByName(globalNode, "service");
- actionSet = AbstractModelElement.getValueByName(globalNode, "actionSet");
- resourceVf = AbstractModelElement.getValuesByName(globalNode, "vf");
- resourceVfc = AbstractModelElement.getValuesByName(globalNode, "vfc");
- deployParameters = AbstractModelElement.getJsonNodeByName(globalNode, "deployParameters");
- location = AbstractModelElement.getValuesByName(globalNode, "location");
- vnfScope = AbstractModelElement.getValueByName(globalNode, "vnf");
+ public Global(JsonObject modelJson) {
+ JsonElement globalNode = modelJson.get("global");
+ service = JsonUtils.getStringValueByName(globalNode, "service");
+ actionSet = JsonUtils.getStringValueByName(globalNode, "actionSet");
+ resourceVf = JsonUtils.getStringValuesByName(globalNode, "vf");
+ resourceVfc = JsonUtils.getStringValuesByName(globalNode, "vfc");
+ deployParameters = JsonUtils.getJsonObjectByName(globalNode, "deployParameters");
+ location = JsonUtils.getStringValuesByName(globalNode, "location");
+ vnfScope = JsonUtils.getStringValueByName(globalNode, "vnf");
}
/**
@@ -136,11 +138,11 @@ public class Global {
this.location = location;
}
- public JsonNode getDeployParameters() {
+ public JsonObject getDeployParameters() {
return deployParameters;
}
- public void setDeployParameters(JsonNode deployParameters) {
+ public void setDeployParameters(JsonObject deployParameters) {
this.deployParameters = deployParameters;
}
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/Holmes.java b/src/main/java/org/onap/clamp/clds/model/properties/Holmes.java
index 530e2db95..b0607e914 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/Holmes.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/Holmes.java
@@ -23,7 +23,8 @@
package org.onap.clamp.clds.model.properties;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonObject;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* Parse Holmes bpmn parameters json properties.
@@ -49,11 +50,11 @@ public class Holmes extends AbstractModelElement {
* @param modelBpmn
* @param modelJson
*/
- public Holmes(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) {
+ public Holmes(ModelProperties modelProp, ModelBpmn modelBpmn, JsonObject modelJson) {
super(TYPE_HOLMES, modelProp, modelBpmn, modelJson);
- correlationLogic = this.getValueByName("correlationalLogic");
- configPolicyName = this.getValueByName("configPolicyName");
+ correlationLogic = JsonUtils.getStringValueByName(modelElementJsonNode, "correlationalLogic");
+ configPolicyName = JsonUtils.getStringValueByName(modelElementJsonNode, "configPolicyName");
}
public static final String getType() {
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/ModelBpmn.java b/src/main/java/org/onap/clamp/clds/model/properties/ModelBpmn.java
index dbd5d8a4f..248a52fcb 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/ModelBpmn.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/ModelBpmn.java
@@ -25,11 +25,11 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import java.io.IOException;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -39,7 +39,7 @@ import java.util.Map.Entry;
import org.onap.clamp.clds.exception.ModelBpmnException;
import org.onap.clamp.clds.service.CldsService;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* Parse Model BPMN properties.
@@ -66,22 +66,22 @@ public class ModelBpmn {
public static ModelBpmn create(String modelBpmnPropText) {
try {
ModelBpmn modelBpmn = new ModelBpmn();
- ObjectNode root = JacksonUtils.getObjectMapperInstance().readValue(modelBpmnPropText, ObjectNode.class);
+ JsonObject root = JsonUtils.GSON.fromJson(modelBpmnPropText, JsonObject.class);
// iterate over each entry like:
// "Policy":[{"id":"Policy","from":"StartEvent_1"}]
- Iterator<Entry<String, JsonNode>> entryItr = root.fields();
+ Iterator<Entry<String, JsonElement>> entryItr = root.entrySet().iterator();
List<String> bpmnElementIdList = new ArrayList<>();
while (entryItr.hasNext()) {
// process the entry
- Entry<String, JsonNode> entry = entryItr.next();
+ Entry<String, JsonElement> entry = entryItr.next();
String type = entry.getKey();
- ArrayNode arrayNode = (ArrayNode) entry.getValue();
+ JsonArray arrayNode = entry.getValue().getAsJsonArray();
// process each id/from object, like:
// {"id":"Policy","from":"StartEvent_1"}
- for (JsonNode anArrayNode : arrayNode) {
- ObjectNode node = (ObjectNode) anArrayNode;
- String id = node.get("id").asText();
- String fromId = node.get("from").asText();
+ for (JsonElement anArrayNode : arrayNode) {
+ JsonObject node = anArrayNode.getAsJsonObject();
+ String id = node.get("id").getAsString();
+ String fromId = node.get("from").getAsString();
ModelBpmnEntry modelBpmnEntry = new ModelBpmnEntry(type, id, fromId);
modelBpmn.addEntry(modelBpmnEntry);
bpmnElementIdList.add(id);
@@ -89,7 +89,7 @@ public class ModelBpmn {
modelBpmn.setBpmnElementIds(bpmnElementIdList);
}
return modelBpmn;
- } catch (IOException e) {
+ } catch (JsonParseException e) {
throw new ModelBpmnException("Exception occurred during the decoding of the bpmn JSON", e);
}
}
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/ModelProperties.java b/src/main/java/org/onap/clamp/clds/model/properties/ModelProperties.java
index 3d7bbcc3a..61eeac101 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/ModelProperties.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/ModelProperties.java
@@ -25,23 +25,21 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.IOException;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-
import org.apache.camel.Exchange;
import org.onap.clamp.clds.client.req.policy.PolicyClient;
import org.onap.clamp.clds.config.ClampProperties;
import org.onap.clamp.clds.exception.ModelBpmnException;
import org.onap.clamp.clds.model.CldsModel;
import org.onap.clamp.clds.service.CldsService;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* Parse model properties.
@@ -51,7 +49,7 @@ public class ModelProperties {
protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsService.class);
protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
private ModelBpmn modelBpmn;
- private JsonNode modelJson;
+ private JsonObject modelJson;
private final String modelName;
private final String controlName;
private final String actionCd;
@@ -65,6 +63,7 @@ public class ModelProperties {
public static final String POLICY_GUARD_SUFFIX = "_Guard_";
private static final Object lock = new Object();
private static Map<Class<? extends AbstractModelElement>, String> modelElementClasses = new ConcurrentHashMap<>();
+
static {
synchronized (lock) {
modelElementClasses.put(Policy.class, Policy.getType());
@@ -99,9 +98,9 @@ public class ModelProperties {
this.actionCd = actionCd;
this.testOnly = isATest;
modelBpmn = ModelBpmn.create(modelBpmnText);
- modelJson = JacksonUtils.getObjectMapperInstance().readTree(modelPropText);
+ modelJson = JsonUtils.GSON.fromJson(modelPropText, JsonObject.class);
instantiateMissingModelElements();
- } catch (IOException e) {
+ } catch (JsonParseException e) {
throw new ModelBpmnException("Exception occurred when trying to decode the BPMN Properties JSON", e);
}
}
@@ -112,7 +111,7 @@ public class ModelProperties {
* after instantiation of this ModelProperties, we need to build the missing
* ModelElement instances.
*/
- private final void instantiateMissingModelElements() {
+ private void instantiateMissingModelElements() {
if (modelElementClasses.size() != modelElements.size()) {
Set<String> missingTypes = new HashSet<>(modelElementClasses.values());
missingTypes.removeAll(modelElements.keySet());
@@ -124,11 +123,11 @@ public class ModelProperties {
.forEach(entry -> {
try {
modelElements.put(entry.getValue(),
- (entry.getKey().getConstructor(ModelProperties.class, ModelBpmn.class, JsonNode.class)
+ (entry.getKey().getConstructor(ModelProperties.class, ModelBpmn.class, JsonObject.class)
.newInstance(this, modelBpmn, modelJson)));
} catch (InstantiationException | NoSuchMethodException | IllegalAccessException
| InvocationTargetException e) {
- logger.warn("Unable to instantiate a ModelElement, exception follows: ", e);
+ logger.warn("Unable to instantiate a ModelElement "+ entry.getValue()+", exception follows: ", e);
}
});
}
@@ -143,10 +142,10 @@ public class ModelProperties {
public static String getVf(CldsModel model) {
List<String> vfs = null;
try {
- JsonNode modelJson = JacksonUtils.getObjectMapperInstance().readTree(model.getPropText());
+ JsonObject modelJson = JsonUtils.GSON.fromJson(model.getPropText(), JsonObject.class);
Global global = new Global(modelJson);
vfs = global.getResourceVf();
- } catch (IOException e) {
+ } catch (JsonParseException e) {
logger.warn("no VF found", e);
}
String vf = null;
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/Policy.java b/src/main/java/org/onap/clamp/clds/model/properties/Policy.java
index 501eb8077..059d73293 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/Policy.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/Policy.java
@@ -25,12 +25,14 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Map.Entry;
/**
* Parse Policy json properties.
@@ -65,15 +67,15 @@ public class Policy extends AbstractModelElement {
* @param modelJson
* @throws IOException
*/
- public Policy(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) throws IOException {
+ public Policy(ModelProperties modelProp, ModelBpmn modelBpmn, JsonObject modelJson) throws IOException {
super(TYPE_POLICY, modelProp, modelBpmn, modelJson);
// process policies
if (modelElementJsonNode != null) {
- Iterator<JsonNode> itr = modelElementJsonNode.elements();
+ Iterator<Entry<String, JsonElement>> itr = modelElementJsonNode.getAsJsonObject().entrySet().iterator();
policyChains = new ArrayList<>();
while (itr.hasNext()) {
- policyChains.add(new PolicyChain(itr.next()));
+ policyChains.add(new PolicyChain(itr.next().getValue()));
}
}
}
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/PolicyChain.java b/src/main/java/org/onap/clamp/clds/model/properties/PolicyChain.java
index cf24c7810..f29ba160b 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/PolicyChain.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/PolicyChain.java
@@ -25,12 +25,13 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* Parse Policy json properties.
@@ -66,20 +67,21 @@ public class PolicyChain {
private List<PolicyItem> policyItems;
private String policyType;
- public PolicyChain(JsonNode node) throws IOException {
-
- policyId = AbstractModelElement.getValueByName(node, "pid");
- timeout = AbstractModelElement.getIntValueByName(node, "timeout");
- policyType = AbstractModelElement.getValueByName(node, "policyType");
+ public PolicyChain(JsonElement node) throws IOException {
+ if (node != null && node.isJsonArray() && node.getAsJsonArray().size() > 0) {
+ JsonArray operationalPolicyParameters = node.getAsJsonArray();
+ policyId = JsonUtils.getStringValueByName(node, "pid");
+ timeout = JsonUtils.getIntValueByName(node, "timeout");
+ policyType = JsonUtils.getStringValueByName(node, "policyType");
- if(node != null && node.size() > 0) {
- JsonNode policyNode = node.get(node.size() - 1).get("policyConfigurations");
- if(policyNode != null) {
- Iterator<JsonNode> itr = policyNode.elements();
- policyItems = new ArrayList<>();
- while (itr.hasNext()) {
- policyItems.add(new PolicyItem(itr.next()));
- }
+ JsonArray policyConfigurations = operationalPolicyParameters.get(operationalPolicyParameters.size() - 1)
+ .getAsJsonObject()
+ .get("policyConfigurations")
+ .getAsJsonArray();
+ Iterator<JsonElement> itr = policyConfigurations.iterator();
+ policyItems = new ArrayList<>();
+ while (itr.hasNext()) {
+ policyItems.add(new PolicyItem(itr.next()));
}
}
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java b/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java
index d6deddc68..bb57d5dc0 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/PolicyItem.java
@@ -25,14 +25,14 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonElement;
+import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.util.List;
import java.util.Map;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
import org.yaml.snakeyaml.Yaml;
/**
@@ -86,51 +86,48 @@ public class PolicyItem implements Cloneable {
/**
* Parse Policy given json node.
*
- * @param node
+ * @param item
* @throws IOException
*/
- public PolicyItem(JsonNode node) throws IOException {
- id = AbstractModelElement.getValueByName(node, "_id");
- recipe = AbstractModelElement.getValueByName(node, "recipe");
- maxRetries = AbstractModelElement.getIntValueByName(node, "maxRetries");
- retryTimeLimit = AbstractModelElement.getIntValueByName(node, "retryTimeLimit");
- parentPolicy = AbstractModelElement.getValueByName(node, "parentPolicy");
- parentPolicyConditions = AbstractModelElement.getValuesByName(node, "parentPolicyConditions");
- targetResourceId = AbstractModelElement.getValueByName(node, "targetResourceId");
+ public PolicyItem(JsonElement item) throws IOException {
+ id = JsonUtils.getStringValueByName(item, "_id");
+ recipe = JsonUtils.getStringValueByName(item, "recipe");
+ maxRetries = JsonUtils.getIntValueByName(item, "maxRetries");
+ retryTimeLimit = JsonUtils.getIntValueByName(item, "retryTimeLimit");
+ parentPolicy = JsonUtils.getStringValueByName(item, "parentPolicy");
+ parentPolicyConditions = JsonUtils.getStringValuesByName(item, "parentPolicyConditions");
+ targetResourceId = JsonUtils.getStringValueByName(item, "targetResourceId");
if (targetResourceId != null && targetResourceId.isEmpty()) {
this.setTargetResourceId(null);
}
- recipeInfo = AbstractModelElement.getValueByName(node, "recipeInfo");
- recipeLevel = AbstractModelElement.getValueByName(node, "recipeLevel");
- recipeInput = AbstractModelElement.getValueByName(node, "recipeInput");
- String payload = AbstractModelElement.getValueByName(node, "recipePayload");
+ recipeInfo = JsonUtils.getStringValueByName(item, "recipeInfo");
+ recipeLevel = JsonUtils.getStringValueByName(item, "recipeLevel");
+ recipeInput = JsonUtils.getStringValueByName(item, "recipeInput");
+ String payload = JsonUtils.getStringValueByName(item, "recipePayload");
if (payload != null && !payload.isEmpty()) {
if (payload.trim().startsWith("{") && payload.trim().endsWith("}")) {
// Seems to be a JSON
- recipePayload = JacksonUtils.getObjectMapperInstance().readValue(payload,
- new TypeReference<Map<String, String>>() {
- });
+ recipePayload = JsonUtils.GSON.fromJson(payload, new TypeToken<Map<String, String>>() {}.getType());
} else {
// SHould be a YAML then
- Yaml yaml = new Yaml();
- recipePayload = (Map<String, String>) yaml.load(payload);
+ recipePayload = new Yaml().load(payload);
}
}
- oapRop = AbstractModelElement.getValueByName(node, "oapRop");
- oapLimit = AbstractModelElement.getValueByName(node, "oapLimit");
- actor = AbstractModelElement.getValueByName(node, "actor");
-
- enableGuardPolicy = AbstractModelElement.getValueByName(node, "enableGuardPolicy");
- guardPolicyType = AbstractModelElement.getValueByName(node, "guardPolicyType");
- guardTargets = AbstractModelElement.getValueByName(node, "guardTargets");
- minGuard = AbstractModelElement.getValueByName(node, "minGuard");
- maxGuard = AbstractModelElement.getValueByName(node, "maxGuard");
- limitGuard = AbstractModelElement.getValueByName(node, "limitGuard");
- timeUnitsGuard = AbstractModelElement.getValueByName(node, "timeUnitsGuard");
- timeWindowGuard = AbstractModelElement.getValueByName(node, "timeWindowGuard");
- guardActiveStart = AbstractModelElement.getValueByName(node, "guardActiveStart");
- guardActiveEnd = AbstractModelElement.getValueByName(node, "guardActiveEnd");
+ oapRop = JsonUtils.getStringValueByName(item, "oapRop");
+ oapLimit = JsonUtils.getStringValueByName(item, "oapLimit");
+ actor = JsonUtils.getStringValueByName(item, "actor");
+
+ enableGuardPolicy = JsonUtils.getStringValueByName(item, "enableGuardPolicy");
+ guardPolicyType = JsonUtils.getStringValueByName(item, "guardPolicyType");
+ guardTargets = JsonUtils.getStringValueByName(item, "guardTargets");
+ minGuard = JsonUtils.getStringValueByName(item, "minGuard");
+ maxGuard = JsonUtils.getStringValueByName(item, "maxGuard");
+ limitGuard = JsonUtils.getStringValueByName(item, "limitGuard");
+ timeUnitsGuard = JsonUtils.getStringValueByName(item, "timeUnitsGuard");
+ timeWindowGuard = JsonUtils.getStringValueByName(item, "timeWindowGuard");
+ guardActiveStart = JsonUtils.getStringValueByName(item, "guardActiveStart");
+ guardActiveEnd = JsonUtils.getStringValueByName(item, "guardActiveEnd");
}
/**
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/Tca.java b/src/main/java/org/onap/clamp/clds/model/properties/Tca.java
index 7297ccbd4..50808229f 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/Tca.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/Tca.java
@@ -25,7 +25,10 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import java.util.Map.Entry;
+import java.util.Set;
/**
* Parse ONAP Tca json properties.
@@ -47,12 +50,14 @@ public class Tca extends AbstractModelElement {
* @param modelBpmn
* @param modelJson
*/
- public Tca(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) {
+ public Tca(ModelProperties modelProp, ModelBpmn modelBpmn, JsonObject modelJson) {
super(TYPE_TCA, modelProp, modelBpmn, modelJson);
// process Server_Configurations
if (modelElementJsonNode != null) {
- tcaItem = new TcaItem(modelElementJsonNode.elements().next());
+ //this is wrong assumption that there is only one property object
+ Set<Entry<String, JsonElement>> entries = modelElementJsonNode.getAsJsonObject().entrySet();
+ tcaItem = new TcaItem(entries.iterator().next().getValue());
}
}
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/TcaItem.java b/src/main/java/org/onap/clamp/clds/model/properties/TcaItem.java
index 3a4ea7126..987b77658 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/TcaItem.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/TcaItem.java
@@ -25,11 +25,13 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* Parse ONAP Tca Item json properties.
@@ -50,21 +52,23 @@ public class TcaItem {
/**
* Parse Tca Item given json node
*
- * @param node
+ * @param tcaJson
*/
- public TcaItem(JsonNode node) {
+ public TcaItem(JsonElement tcaJson) {
- tcaName = AbstractModelElement.getValueByName(node, "tname");
- tcaUuId = AbstractModelElement.getValueByName(node, "tuuid");
- policyId = AbstractModelElement.getValueByName(node, "tcaPolId");
- eventName = AbstractModelElement.getValueByName(node, "eventName");
- controlLoopSchemaType = AbstractModelElement.getValueByName(node, "controlLoopSchemaType");
+ tcaName = JsonUtils.getStringValueByName(tcaJson, "tname");
+ tcaUuId = JsonUtils.getStringValueByName(tcaJson, "tuuid");
+ policyId = JsonUtils.getStringValueByName(tcaJson, "tcaPolId");
+ eventName = JsonUtils.getStringValueByName(tcaJson, "eventName");
+ controlLoopSchemaType = JsonUtils.getStringValueByName(tcaJson, "controlLoopSchemaType");
// process service Configurations
- JsonNode serviceConfigurationsNode = node.get(node.size() - 1).get("serviceConfigurations");
- Iterator<JsonNode> itr = serviceConfigurationsNode.elements();
+ JsonArray tcaConfigurationArray = tcaJson.getAsJsonArray();
+ JsonArray serviceConfigurationsNode = tcaConfigurationArray.get(tcaConfigurationArray.size() - 1)
+ .getAsJsonObject().get("serviceConfigurations").getAsJsonArray();
+ Iterator<JsonElement> itr = serviceConfigurationsNode.iterator();
tcaThresholds = new ArrayList<>();
while (itr.hasNext()) {
- tcaThresholds.add(new TcaThreshold(itr.next()));
+ tcaThresholds.add(new TcaThreshold(itr.next().getAsJsonArray()));
}
}
diff --git a/src/main/java/org/onap/clamp/clds/model/properties/TcaThreshold.java b/src/main/java/org/onap/clamp/clds/model/properties/TcaThreshold.java
index 05b8ae355..0903d72f7 100644
--- a/src/main/java/org/onap/clamp/clds/model/properties/TcaThreshold.java
+++ b/src/main/java/org/onap/clamp/clds/model/properties/TcaThreshold.java
@@ -25,7 +25,7 @@ package org.onap.clamp.clds.model.properties;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
+import com.google.gson.JsonArray;
/**
* Parse ONAP Tca Threshold json properties.
@@ -44,21 +44,21 @@ public class TcaThreshold {
/**
* Parse Tca Threshhold given json node
*
- * @param node
+ * @param tcaTresholdConfiguration
*/
- public TcaThreshold(JsonNode node) {
+ public TcaThreshold(JsonArray tcaTresholdConfiguration) {
- if (node.get(0) != null) {
- fieldPath = node.get(0).asText();
+ if (tcaTresholdConfiguration.get(0) != null) {
+ fieldPath = tcaTresholdConfiguration.get(0).getAsString();
}
- if (node.get(1) != null) {
- operator = node.get(1).asText();
+ if (tcaTresholdConfiguration.get(1) != null) {
+ operator = tcaTresholdConfiguration.get(1).getAsString();
}
- if (node.get(2) != null) {
- threshold = Integer.valueOf(node.get(2).asText());
+ if (tcaTresholdConfiguration.get(2) != null) {
+ threshold = Integer.valueOf(tcaTresholdConfiguration.get(2).getAsString());
}
- if (node.get(3) != null) {
- closedLoopEventStatus = node.get(3).asText();
+ if (tcaTresholdConfiguration.get(3) != null) {
+ closedLoopEventStatus = tcaTresholdConfiguration.get(3).getAsString();
}
}
diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
index 1b7cb28c2..1a99919ee 100644
--- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
+++ b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandler.java
@@ -138,8 +138,7 @@ public class CsarHandler {
blueprintArtifact.setResourceAttached(searchForResourceByInstanceName(entry.getName().substring(
entry.getName().indexOf(RESOURCE_INSTANCE_NAME_PREFIX) + RESOURCE_INSTANCE_NAME_PREFIX.length(),
entry.getName().indexOf(RESOURCE_INSTANCE_NAME_SUFFIX))));
- this.mapOfBlueprints.put(blueprintArtifact.getResourceAttached().getResourceInstanceName(),
- blueprintArtifact);
+ this.mapOfBlueprints.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact);
logger.info("Found a blueprint entry in the CSAR " + blueprintArtifact.getBlueprintArtifactName()
+ " for resource instance Name "
+ blueprintArtifact.getResourceAttached().getResourceInstanceName());
diff --git a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java
index 382c1d776..bfda6924d 100644
--- a/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java
+++ b/src/main/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImpl.java
@@ -25,7 +25,7 @@ package org.onap.clamp.clds.sdc.controller.installer;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.gson.JsonObject;
import java.io.IOException;
import java.util.ArrayList;
@@ -51,7 +51,7 @@ import org.onap.clamp.clds.model.properties.ModelProperties;
import org.onap.clamp.clds.service.CldsService;
import org.onap.clamp.clds.service.CldsTemplateService;
import org.onap.clamp.clds.transform.XslTransformer;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
@@ -102,15 +102,14 @@ public class CsarInstallerImpl implements CsarInstaller {
boolean alreadyInstalled = true;
for (Entry<String, BlueprintArtifact> blueprint : csar.getMapOfBlueprints().entrySet()) {
alreadyInstalled = alreadyInstalled
- && (CldsModel.retrieve(cldsDao, buildModelName(csar, blueprint.getKey()), true).getId() != null) ? true
- : false;
+ && CldsModel.retrieve(cldsDao, buildModelName(csar, blueprint.getValue()), true).getId() != null;
}
return alreadyInstalled;
}
- public static String buildModelName(CsarHandler csar, String resourceInstanceName)
+ public static String buildModelName(CsarHandler csar, BlueprintArtifact artifact)
throws SdcArtifactInstallerException {
- String policyScopePrefix = searchForPolicyScopePrefix(csar.getMapOfBlueprints().get(resourceInstanceName));
+ String policyScopePrefix = searchForPolicyScopePrefix(artifact);
if (policyScopePrefix.contains("*")) {
// This is policy_filter type
policyScopePrefix = policyScopePrefix.replaceAll("\\*", "");
@@ -118,9 +117,10 @@ public class CsarInstallerImpl implements CsarInstaller {
// This is normally the get_input case
policyScopePrefix = MODEL_NAME_PREFIX;
}
- return policyScopePrefix + csar.getSdcCsarHelper().getServiceMetadata().getValue("name") + "_v"
- + csar.getSdcNotification().getServiceVersion().replace('.', '_') + "_"
- + resourceInstanceName.replaceAll(" ", "");
+ return (policyScopePrefix + "_" + csar.getSdcCsarHelper().getServiceMetadata().getValue("name") + "_v"
+ + csar.getSdcNotification().getServiceVersion() + "_"
+ + artifact.getResourceAttached().getResourceInstanceName().replaceAll(" ", "") + "_"
+ + artifact.getBlueprintArtifactName().replace(".yaml", "")).replace('.', '_');
}
@Override
@@ -165,22 +165,20 @@ public class CsarInstallerImpl implements CsarInstaller {
return listConfig.get(0);
}
- private static String getAllBlueprintParametersInJson(BlueprintArtifact blueprintArtifact) {
- ObjectNode node = JacksonUtils.getObjectMapperInstance().createObjectNode();
+ String getAllBlueprintParametersInJson(BlueprintArtifact blueprintArtifact) {
+ JsonObject node = new JsonObject();
Yaml yaml = new Yaml();
Map<String, Object> inputsNodes = ((Map<String, Object>) ((Map<String, Object>) yaml
.load(blueprintArtifact.getDcaeBlueprint())).get("inputs"));
inputsNodes.entrySet().stream().filter(e -> !e.getKey().contains("policy_id")).forEach(elem -> {
- Object defaultNode = ((Map<String, Object>) elem.getValue()).get("default");
- if (defaultNode != null && defaultNode instanceof String) {
- node.put(elem.getKey(), (String) defaultNode);
- } else if (defaultNode != null) {
- node.putPOJO(elem.getKey(), defaultNode);
+ Object defaultValue = ((Map<String, Object>) elem.getValue()).get("default");
+ if (defaultValue != null) {
+ addPropertyToNode(node, elem.getKey(), defaultValue);
} else {
- node.put(elem.getKey(), "");
+ node.addProperty(elem.getKey(), "");
}
});
- node.put("policy_id", "AUTO_GENERATED_POLICY_ID_AT_SUBMIT");
+ node.addProperty("policy_id", "AUTO_GENERATED_POLICY_ID_AT_SUBMIT");
return node.toString();
}
@@ -220,11 +218,7 @@ public class CsarInstallerImpl implements CsarInstaller {
* This call must be done when deploying the SDC notification as this call get
* the latest version of the artifact (version can be specified to DCAE call)
*
- * @param blueprintArtifact
* @return The DcaeInventoryResponse object containing the dcae values
- * @throws IOException
- * @throws ParseException
- * @throws InterruptedException
*/
private DcaeInventoryResponse queryDcaeToGetServiceTypeId(BlueprintArtifact blueprintArtifact)
throws IOException, ParseException, InterruptedException {
@@ -243,8 +237,7 @@ public class CsarInstallerImpl implements CsarInstaller {
"{\"global\":[{\"name\":\"service\",\"value\":[\"" + blueprintArtifact.getDcaeBlueprint() + "\"]}]}");
template
.setImageText(IOUtils.toString(appContext.getResource(configFiles.getSvgXmlFilePath()).getInputStream()));
- template.setName(TEMPLATE_NAME_PREFIX
- + buildModelName(csar, blueprintArtifact.getResourceAttached().getResourceInstanceName()));
+ template.setName(TEMPLATE_NAME_PREFIX + buildModelName(csar, blueprintArtifact));
template.save(cldsDao, null);
logger.info("Fake Clds Template created for blueprint " + blueprintArtifact.getBlueprintArtifactName()
+ " with name " + template.getName());
@@ -253,9 +246,14 @@ public class CsarInstallerImpl implements CsarInstaller {
private CldsModel createFakeCldsModel(CsarHandler csar, BlueprintArtifact blueprintArtifact,
CldsTemplate cldsTemplate, DcaeInventoryResponse dcaeInventoryResponse) throws SdcArtifactInstallerException {
+
+ if (dcaeInventoryResponse == null) {
+ throw new SdcArtifactInstallerException(
+ "DCAE inventory response is NULL, query to DCAE fail to be answered properly, this is required to deploy CSAR properly !!!");
+ }
try {
CldsModel cldsModel = new CldsModel();
- cldsModel.setName(buildModelName(csar, blueprintArtifact.getResourceAttached().getResourceInstanceName()));
+ cldsModel.setName(buildModelName(csar, blueprintArtifact));
cldsModel.setBlueprintText(blueprintArtifact.getDcaeBlueprint());
cldsModel.setTemplateName(cldsTemplate.getName());
cldsModel.setTemplateId(cldsTemplate.getId());
@@ -292,4 +290,18 @@ public class CsarInstallerImpl implements CsarInstaller {
+ inputParams + "]}");
return cldsModel.save(cldsDao, null);
}
+
+ private void addPropertyToNode(JsonObject node, String key, Object value) {
+ if (value instanceof String) {
+ node.addProperty(key, (String) value);
+ } else if (value instanceof Number) {
+ node.addProperty(key, (Number) value);
+ } else if (value instanceof Boolean) {
+ node.addProperty(key, (Boolean) value);
+ } else if (value instanceof Character) {
+ node.addProperty(key, (Character) value);
+ } else {
+ node.addProperty(key, JsonUtils.GSON.toJson(value));
+ }
+ }
}
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsService.java b/src/main/java/org/onap/clamp/clds/service/CldsService.java
index 206a4246b..42e9cf713 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsService.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java
@@ -26,15 +26,15 @@ package org.onap.clamp.clds.service;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
import java.io.IOException;
+import java.lang.reflect.Type;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.List;
-import java.util.Optional;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
@@ -44,32 +44,27 @@ import javax.xml.transform.TransformerException;
import org.apache.camel.Produce;
import org.apache.commons.codec.DecoderException;
-import org.apache.commons.lang3.StringUtils;
import org.json.simple.parser.ParseException;
import org.onap.clamp.clds.camel.CamelProxy;
import org.onap.clamp.clds.client.DcaeDispatcherServices;
import org.onap.clamp.clds.client.DcaeInventoryServices;
-import org.onap.clamp.clds.client.req.sdc.SdcCatalogServices;
import org.onap.clamp.clds.config.ClampProperties;
import org.onap.clamp.clds.dao.CldsDao;
import org.onap.clamp.clds.exception.policy.PolicyClientException;
import org.onap.clamp.clds.exception.sdc.SdcCommunicationException;
-import org.onap.clamp.clds.model.CldsDbServiceCache;
import org.onap.clamp.clds.model.CldsEvent;
import org.onap.clamp.clds.model.CldsInfo;
import org.onap.clamp.clds.model.CldsModel;
import org.onap.clamp.clds.model.CldsModelProp;
import org.onap.clamp.clds.model.CldsMonitoringDetails;
-import org.onap.clamp.clds.model.CldsServiceData;
import org.onap.clamp.clds.model.CldsTemplate;
import org.onap.clamp.clds.model.DcaeEvent;
import org.onap.clamp.clds.model.ValueItem;
-import org.onap.clamp.clds.model.properties.AbstractModelElement;
import org.onap.clamp.clds.model.properties.ModelProperties;
import org.onap.clamp.clds.model.sdc.SdcServiceInfo;
import org.onap.clamp.clds.sdc.controller.installer.CsarInstallerImpl;
import org.onap.clamp.clds.transform.XslTransformer;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
import org.onap.clamp.clds.util.LoggingUtils;
import org.onap.clamp.clds.util.ONAPLogConstants;
import org.slf4j.event.Level;
@@ -86,17 +81,17 @@ import org.springframework.web.client.HttpClientErrorException;
@Component
public class CldsService extends SecureServiceBase {
+ public static final Type LIST_OF_SDC_SERVICE_INFO_TYPE = new TypeToken<List<SdcServiceInfo>>() {
+ }.getType();
@Produce(uri = "direct:processSubmit")
private CamelProxy camelProxy;
protected static final EELFLogger securityLogger = EELFManager.getInstance().getSecurityLogger();
protected static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsService.class);
public static final String GLOBAL_PROPERTIES_KEY = "files.globalProperties";
- private final String cldsPersmissionTypeCl;
private final String cldsPermissionTypeClManage;
private final String cldsPermissionTypeClEvent;
private final String cldsPermissionTypeFilterVf;
- private final String cldsPermissionTypeTemplate;
private final String cldsPermissionInstance;
final SecureServicePermission permissionReadCl;
final SecureServicePermission permissionUpdateCl;
@@ -108,7 +103,6 @@ public class CldsService extends SecureServiceBase {
private final CldsDao cldsDao;
private final XslTransformer cldsBpmnTransformer;
private final ClampProperties refProp;
- private final SdcCatalogServices sdcCatalogServices;
private final DcaeDispatcherServices dcaeDispatcherServices;
private final DcaeInventoryServices dcaeInventoryServices;
private LoggingUtils util = new LoggingUtils(logger);
@@ -118,7 +112,7 @@ public class CldsService extends SecureServiceBase {
@Autowired
public CldsService(CldsDao cldsDao, XslTransformer cldsBpmnTransformer, ClampProperties refProp,
- SdcCatalogServices sdcCatalogServices, DcaeDispatcherServices dcaeDispatcherServices,
+ DcaeDispatcherServices dcaeDispatcherServices,
DcaeInventoryServices dcaeInventoryServices,
@Value("${clamp.config.security.permission.type.cl:permission-type-cl}") String cldsPersmissionTypeCl,
@Value("${clamp.config.security.permission.type.cl.manage:permission-type-cl-manage}") String cldsPermissionTypeClManage,
@@ -130,14 +124,11 @@ public class CldsService extends SecureServiceBase {
this.cldsDao = cldsDao;
this.cldsBpmnTransformer = cldsBpmnTransformer;
this.refProp = refProp;
- this.sdcCatalogServices = sdcCatalogServices;
this.dcaeDispatcherServices = dcaeDispatcherServices;
this.dcaeInventoryServices = dcaeInventoryServices;
- this.cldsPersmissionTypeCl = cldsPersmissionTypeCl;
this.cldsPermissionTypeClManage = cldsPermissionTypeClManage;
this.cldsPermissionTypeClEvent = cldsPermissionTypeClEvent;
this.cldsPermissionTypeFilterVf = cldsPermissionTypeFilterVf;
- this.cldsPermissionTypeTemplate = cldsPermissionTypeTemplate;
this.cldsPermissionInstance = cldsPermissionInstance;
permissionReadCl = SecureServicePermission.create(cldsPersmissionTypeCl, cldsPermissionInstance, "read");
permissionUpdateCl = SecureServicePermission.create(cldsPersmissionTypeCl, cldsPermissionInstance, "update");
@@ -333,7 +324,7 @@ public class CldsService extends SecureServiceBase {
*
* @param action
* @param modelName
- * @param validateFlag
+ * @param test
* @param model
* @return
* @throws TransformerException
@@ -468,76 +459,15 @@ public class CldsService extends SecureServiceBase {
}
/**
- * REST service that retrieves sdc services
- *
- * @throws GeneralSecurityException
- * In case of issue when decryting the SDC password
- * @throws DecoderException
- * In case of issues with the decoding of the Hex String
- */
- public String getSdcServices() throws GeneralSecurityException, DecoderException {
- util.entering(request, "CldsService: GET sdc services");
- Date startTime = new Date();
- String retStr;
- try {
- retStr = createUiServiceFormatJson(sdcCatalogServices.getSdcServicesInformation(null));
- } catch (IOException e) {
- logger.error("IOException during SDC communication", e);
- throw new SdcCommunicationException("IOException during SDC communication", e);
- }
- logger.info("value of sdcServices : {}", retStr);
- // audit log
- LoggingUtils.setTimeContext(startTime, new Date());
- auditLogger.info("GET sdc services completed");
- util.exiting("200", "Get sdc services success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
- return retStr;
- }
-
- /**
* REST service that retrieves total properties required by UI
*
* @throws IOException
* In case of issues
*/
public String getSdcProperties() throws IOException {
- return ((ObjectNode) refProp.getJsonTemplate(GLOBAL_PROPERTIES_KEY)).toString();
+ return refProp.getJsonTemplate(GLOBAL_PROPERTIES_KEY).toString();
}
- /**
- * REST service that retrieves total properties by using invariantUUID based on
- * refresh and non refresh
- *
- * @throws GeneralSecurityException
- * In case of issues with the decryting the encrypted password
- * @throws DecoderException
- * In case of issues with the decoding of the Hex String
- * @throws IOException
- * In case of issue to convert CldsServiceCache to InputStream
- */
- public String getSdcPropertiesByServiceUUIDForRefresh(String serviceInvariantUUID, Boolean refresh)
- throws GeneralSecurityException, DecoderException, IOException {
- util.entering(request, "CldsService: GET sdc properties by uuid");
- Date startTime = new Date();
- CldsServiceData cldsServiceData = new CldsServiceData();
- cldsServiceData.setServiceInvariantUUID(serviceInvariantUUID);
- if (!Optional.ofNullable(refresh).orElse(false)) {
- cldsServiceData = cldsDao.getCldsServiceCache(serviceInvariantUUID);
- }
- if (sdcCatalogServices.isCldsSdcCacheDataExpired(cldsServiceData)) {
- cldsServiceData = sdcCatalogServices.getCldsServiceDataWithAlarmConditions(serviceInvariantUUID);
- cldsDao.setCldsServiceCache(new CldsDbServiceCache(cldsServiceData));
- }
- // filter out VFs the user is not authorized for
- cldsServiceData.filterVfs(this);
- // format retrieved data into properties json
- String sdcProperties = sdcCatalogServices.createPropertiesObjectByUUID(cldsServiceData);
- // audit log
- LoggingUtils.setTimeContext(startTime, new Date());
- auditLogger.info("GET sdc properties by uuid completed");
- util.exiting("200", "Get sdc properties by uuid success", Level.INFO,
- ONAPLogConstants.ResponseStatus.COMPLETED);
- return sdcProperties;
- }
/**
* Determine if the user is authorized for a particular VF by its invariant
@@ -577,29 +507,6 @@ public class CldsService extends SecureServiceBase {
}
}
- private String createUiServiceFormatJson(String responseStr) throws IOException {
- if (StringUtils.isBlank(responseStr)) {
- return "";
- }
- ObjectMapper objectMapper = JacksonUtils.getObjectMapperInstance();
- List<SdcServiceInfo> rawList = objectMapper.readValue(responseStr,
- objectMapper.getTypeFactory().constructCollectionType(List.class, SdcServiceInfo.class));
- ObjectNode invariantIdServiceNode = objectMapper.createObjectNode();
- ObjectNode serviceNode = objectMapper.createObjectNode();
- logger.info("value of cldsserviceiNfolist: {}", rawList);
- if (rawList != null && !rawList.isEmpty()) {
- List<SdcServiceInfo> cldsSdcServiceInfoList = sdcCatalogServices.removeDuplicateServices(rawList);
- for (SdcServiceInfo currCldsSdcServiceInfo : cldsSdcServiceInfoList) {
- if (currCldsSdcServiceInfo != null) {
- invariantIdServiceNode.put(currCldsSdcServiceInfo.getInvariantUUID(),
- currCldsSdcServiceInfo.getName());
- }
- }
- serviceNode.putPOJO("service", invariantIdServiceNode);
- }
- return serviceNode.toString();
- }
-
public ResponseEntity<CldsModel> deployModel(String modelName, CldsModel model) {
util.entering(request, "CldsService: Deploy model");
Date startTime = new Date();
@@ -710,16 +617,17 @@ public class CldsService extends SecureServiceBase {
}
private void checkForDuplicateServiceVf(String modelName, String modelPropText) throws IOException {
- JsonNode globalNode = JacksonUtils.getObjectMapperInstance().readTree(modelPropText).get("global");
- String service = AbstractModelElement.getValueByName(globalNode, "service");
- List<String> resourceVf = AbstractModelElement.getValuesByName(globalNode, "vf");
+ JsonElement globalNode = JsonUtils.GSON.fromJson(modelPropText, JsonObject.class).get("global");
+ String service = JsonUtils.getStringValueByName(globalNode, "service");
+ List<String> resourceVf = JsonUtils.getStringValuesByName(globalNode, "vf");
if (service != null && resourceVf != null && !resourceVf.isEmpty()) {
List<CldsModelProp> cldsModelPropList = cldsDao.getDeployedModelProperties();
for (CldsModelProp cldsModelProp : cldsModelPropList) {
- JsonNode currentNode = JacksonUtils.getObjectMapperInstance().readTree(cldsModelProp.getPropText())
+ JsonElement currentNode = JsonUtils.GSON
+ .fromJson(cldsModelProp.getPropText(), JsonObject.class)
.get("global");
- String currentService = AbstractModelElement.getValueByName(currentNode, "service");
- List<String> currentVf = AbstractModelElement.getValuesByName(currentNode, "vf");
+ String currentService = JsonUtils.getStringValueByName(currentNode, "service");
+ List<String> currentVf = JsonUtils.getStringValuesByName(currentNode, "vf");
if (currentVf != null && !currentVf.isEmpty()) {
if (!modelName.equalsIgnoreCase(cldsModelProp.getName()) && service.equalsIgnoreCase(currentService)
&& resourceVf.get(0).equalsIgnoreCase(currentVf.get(0))) {
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsUser.java b/src/main/java/org/onap/clamp/clds/service/CldsUser.java
index b30397dbe..82b7727bd 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsUser.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsUser.java
@@ -87,7 +87,7 @@ public class CldsUser {
/**
* Sets the permissions.
- *
+ *
* @param permissionsArray
* the permissions to set
*/
diff --git a/src/main/java/org/onap/clamp/clds/service/JacksonObjectMapperProvider.java b/src/main/java/org/onap/clamp/clds/service/SecureServicePermissionDeserializer.java
index d6a4d2f50..9cbf711c9 100644
--- a/src/main/java/org/onap/clamp/clds/service/JacksonObjectMapperProvider.java
+++ b/src/main/java/org/onap/clamp/clds/service/SecureServicePermissionDeserializer.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* ONAP CLAMP
* ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ * Copyright (C) 2019 Nokia Intellectual Property. All rights
* reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,34 +18,28 @@
* limitations under the License.
* ============LICENSE_END============================================
* ===================================================================
- *
+ *
*/
package org.onap.clamp.clds.service;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import javax.ws.rs.ext.ContextResolver;
-
-import org.onap.clamp.clds.util.JacksonUtils;
-
-/**
- * This class is to restrcit the class type that can be de-serialized.
- */
-public class JacksonObjectMapperProvider implements ContextResolver<ObjectMapper> {
+import com.google.gson.Gson;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import java.lang.reflect.Type;
- private final ObjectMapper defaultObjectMapper;
-
- public JacksonObjectMapperProvider() {
- defaultObjectMapper = createDefaultMapper();
- }
+public class SecureServicePermissionDeserializer implements JsonDeserializer<SecureServicePermission> {
@Override
- public ObjectMapper getContext(Class<?> type) {
- return defaultObjectMapper;
- }
-
- private static ObjectMapper createDefaultMapper() {
- return JacksonUtils.getObjectMapperInstance();
+ public SecureServicePermission deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+ throws JsonParseException {
+ if (json.isJsonPrimitive()) {
+ return new SecureServicePermission(json.getAsString());
+ } else {
+ // if not string try default deserialization
+ return new Gson().fromJson(json, SecureServicePermission.class);
+ }
}
}
diff --git a/src/main/java/org/onap/clamp/clds/util/JacksonUtils.java b/src/main/java/org/onap/clamp/clds/util/JacksonUtils.java
deleted file mode 100644
index 1f5419d71..000000000
--- a/src/main/java/org/onap/clamp/clds/util/JacksonUtils.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-
-package org.onap.clamp.clds.util;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/**
- * This class is used to access the jackson with restricted type access.
- */
-public class JacksonUtils {
-
- private static ObjectMapper objectMapper;
-
- private JacksonUtils() {
- }
-
- /**
- * Call this method to retrieve a secure ObjectMapper.
- *
- * @return an ObjectMapper instance (same for clamp)
- */
- public static synchronized ObjectMapper getObjectMapperInstance() {
- if (objectMapper == null) {
- objectMapper = new ObjectMapper();
- // This is to disable the security hole that could be opened for
- // json deserialization, if needed do this
- // objectMapper.enableDefaultTyping(DefaultTyping.NON_FINAL);
- objectMapper.disableDefaultTyping();
- }
- return objectMapper;
- }
-}
diff --git a/src/main/java/org/onap/clamp/clds/util/JsonUtils.java b/src/main/java/org/onap/clamp/clds/util/JsonUtils.java
new file mode 100644
index 000000000..96ddc2929
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/util/JsonUtils.java
@@ -0,0 +1,170 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.util;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.google.common.collect.Lists;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.Spliterator;
+import java.util.Spliterators;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+import org.onap.clamp.clds.model.properties.AbstractModelElement;
+import org.onap.clamp.clds.service.SecureServicePermission;
+import org.onap.clamp.clds.service.SecureServicePermissionDeserializer;
+
+/**
+ * This class is used to access the jackson with restricted type access.
+ */
+public class JsonUtils {
+
+ protected static final EELFLogger logger = EELFManager.getInstance().getLogger(AbstractModelElement.class);
+ private static final String LOG_ELEMENT_NOT_FOUND = "Value '{}' for key 'name' not found in JSON";
+ private static final String LOG_ELEMENT_NOT_FOUND_IN_JSON = "Value '{}' for key 'name' not found in JSON {}";
+
+ public static final Gson GSON = new GsonBuilder()
+ .registerTypeAdapter(SecureServicePermission.class, new SecureServicePermissionDeserializer())
+ .create();
+
+ private JsonUtils() {
+ }
+
+
+ /**
+ * Return the value field of the json node element that has a name field equals to the given name.
+ */
+ public static String getStringValueByName(JsonElement jsonElement, String name) {
+ String value = extractJsonValueFromElement(jsonElement, name)
+ .map(JsonUtils::extractStringValueFromElement)
+ .orElse(null);
+ if (value == null) {
+ if (logger.isDebugEnabled()) {
+ logger.debug(LOG_ELEMENT_NOT_FOUND_IN_JSON, name, jsonElement.toString());
+ } else {
+ logger.warn(LOG_ELEMENT_NOT_FOUND, name);
+ }
+ }
+ return value;
+ }
+
+ /**
+ * Return an array of values for the field of the json node element that has a name field equals to the given name.
+ */
+ public static List<String> getStringValuesByName(JsonElement jsonElement, String name) {
+ List<String> values = extractJsonValueFromElement(jsonElement, name)
+ .map(JsonUtils::extractStringValuesFromElement).orElse(new ArrayList<>());
+ if (values.isEmpty()) {
+ if (logger.isDebugEnabled()) {
+ logger.debug(LOG_ELEMENT_NOT_FOUND_IN_JSON, name, jsonElement.toString());
+ } else {
+ logger.warn(LOG_ELEMENT_NOT_FOUND, name);
+ }
+ }
+ return values;
+ }
+
+ /**
+ * Return the int value field of the json node element that has a name field equals to the given name.
+ */
+ public static Integer getIntValueByName(JsonElement element, String name) {
+ String value = getStringValueByName(element, name);
+ return Integer.valueOf(value);
+ }
+
+
+ /**
+ * Return the Json value field of the json node element that has a name field equals to the given name.
+ */
+ public static JsonObject getJsonObjectByName(JsonElement jsonElement, String name) {
+ JsonObject jsonObject = extractJsonValueFromElement(jsonElement, name).map(JsonElement::getAsJsonObject)
+ .orElse(null);
+ if (jsonObject == null) {
+ logger.warn(LOG_ELEMENT_NOT_FOUND, name);
+ } else {
+ logger.debug(LOG_ELEMENT_NOT_FOUND_IN_JSON, name, jsonElement.toString());
+ }
+ return jsonObject;
+ }
+
+ private static Optional<JsonElement> extractJsonValueFromElement(JsonElement jsonElement, String name) {
+ if(jsonElement != null ){
+ if (jsonElement.isJsonArray()) {
+ return extractValueJsonFromArray(jsonElement, name);
+ } else if (hasMatchingParameterName(name, jsonElement)) {
+ return Optional.of(jsonElement);
+ }
+ }
+ return Optional.empty();
+ }
+
+ private static Optional<JsonElement> extractValueJsonFromArray(JsonElement jsonElement, String name) {
+ for (JsonElement element : jsonElement.getAsJsonArray()) {
+ if (hasMatchingParameterName(name, element)) {
+ return Optional.of(element.getAsJsonObject().get("value"));
+ }
+ }
+ return Optional.empty();
+ }
+
+ private static boolean hasMatchingParameterName(String name, JsonElement element) {
+ return element.isJsonObject()
+ && element.getAsJsonObject().has("name")
+ && name.equals(element.getAsJsonObject().get("name").getAsString());
+ }
+
+ private static String extractStringValueFromElement(JsonElement element) {
+ if (element.isJsonArray()) {
+ return element.getAsJsonArray().get(0).getAsString();
+ } else if (element.isJsonPrimitive()) {
+ return element.getAsJsonPrimitive().getAsString();
+ } else {
+ return GSON.toJson(element);
+ }
+ }
+
+ private static List<String> extractStringValuesFromElement(JsonElement element) {
+ if (element.isJsonArray()) {
+ return StreamSupport.stream(
+ Spliterators.spliteratorUnknownSize(element.getAsJsonArray().iterator(), Spliterator.ORDERED),
+ false)
+ .filter(JsonElement::isJsonPrimitive)
+ .map(JsonElement::getAsJsonPrimitive)
+ .filter(JsonPrimitive::isString)
+ .map(JsonPrimitive::getAsString)
+ .collect(Collectors.toList());
+ } else {
+ String value = extractStringValueFromElement(element);
+ return Lists.newArrayList(value);
+ }
+
+ }
+}
diff --git a/src/main/resources/META-INF/resources/designer/index.html b/src/main/resources/META-INF/resources/designer/index.html
index d8b3fedad..5d1e53047 100644
--- a/src/main/resources/META-INF/resources/designer/index.html
+++ b/src/main/resources/META-INF/resources/designer/index.html
@@ -92,7 +92,10 @@
style="width: 100%; height: 100%"></div>
<script src="lib/jquery.min.js"></script>
-
+
+ <!-- TOSCA Model Driven Dymamic UI Support -->
+ <script src="lib/jsoneditor.js"></script>
+ <script src="lib/query-builder.standalone.js"></script>
<script src="lib/angular.min.js"></script>
<script src="lib/angular-cookies.min.js"></script>
@@ -172,6 +175,8 @@
<script src="scripts/CldsTemplateService.js"></script>
<script src="scripts/GlobalPropertiesCtrl.js"></script>
<script src="scripts/AlertService.js"></script>
+ <script src="scripts/ToscaModelCtrl.js"></script>
+ <script src="scripts/ToscaModelService.js"></script>
<!-- dialog box ctl end -->
<script src="scripts/aOnBoot.js"></script>
diff --git a/src/main/resources/META-INF/resources/designer/lib/jsoneditor.js b/src/main/resources/META-INF/resources/designer/lib/jsoneditor.js
new file mode 100644
index 000000000..2966fac97
--- /dev/null
+++ b/src/main/resources/META-INF/resources/designer/lib/jsoneditor.js
@@ -0,0 +1,10235 @@
+/**
+ * @name JSON Editor
+ * @description JSON Schema Based Editor
+ * Deprecation notice
+ * This repo is no longer maintained (see also https://github.com/jdorn/json-editor/issues/800)
+ * Development is continued at https://github.com/json-editor/json-editor
+ * For details please visit https://github.com/json-editor/json-editor/issues/5
+ * @version 1.1.0-beta.2
+ * @author Jeremy Dorn
+ * @see https://github.com/jdorn/json-editor/
+ * @see https://github.com/json-editor/json-editor
+ * @license MIT
+ * @example see README.md and docs/ for requirements, examples and usage info
+ */
+
+(function() {
+
+/*jshint loopfunc: true */
+/* Simple JavaScript Inheritance
+ * By John Resig http://ejohn.org/
+ * MIT Licensed.
+ */
+// Inspired by base2 and Prototype
+var Class;
+(function(){
+ var initializing = false, fnTest = /xyz/.test(function(){window.postMessage("xyz");}) ? /\b_super\b/ : /.*/;
+
+ // The base Class implementation (does nothing)
+ Class = function(){};
+
+ // Create a new Class that inherits from this class
+ Class.extend = function extend(prop) {
+ var _super = this.prototype;
+
+ // Instantiate a base class (but only create the instance,
+ // don't run the init constructor)
+ initializing = true;
+ var prototype = new this();
+ initializing = false;
+
+ // Copy the properties over onto the new prototype
+ for (var name in prop) {
+ // Check if we're overwriting an existing function
+ prototype[name] = typeof prop[name] == "function" &&
+ typeof _super[name] == "function" && fnTest.test(prop[name]) ?
+ (function(name, fn){
+ return function() {
+ var tmp = this._super;
+
+ // Add a new ._super() method that is the same method
+ // but on the super-class
+ this._super = _super[name];
+
+ // The method only need to be bound temporarily, so we
+ // remove it when we're done executing
+ var ret = fn.apply(this, arguments);
+ this._super = tmp;
+
+ return ret;
+ };
+ })(name, prop[name]) :
+ prop[name];
+ }
+
+ // The dummy class constructor
+ function Class() {
+ // All construction is actually done in the init method
+ if ( !initializing && this.init )
+ this.init.apply(this, arguments);
+ }
+
+ // Populate our constructed prototype object
+ Class.prototype = prototype;
+
+ // Enforce the constructor to be what we expect
+ Class.prototype.constructor = Class;
+
+ // And make this class extendable
+ Class.extend = extend;
+
+ return Class;
+ };
+
+ return Class;
+})();
+
+// CustomEvent constructor polyfill
+// From MDN
+(function () {
+ function CustomEvent ( event, params ) {
+ params = params || { bubbles: false, cancelable: false, detail: undefined };
+ var evt = document.createEvent( 'CustomEvent' );
+ evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
+ return evt;
+ }
+
+ CustomEvent.prototype = window.Event.prototype;
+
+ window.CustomEvent = CustomEvent;
+})();
+
+// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
+// MIT license
+(function() {
+ var lastTime = 0;
+ var vendors = ['ms', 'moz', 'webkit', 'o'];
+ for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
+ window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
+ window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] ||
+ window[vendors[x]+'CancelRequestAnimationFrame'];
+ }
+
+ if (!window.requestAnimationFrame)
+ window.requestAnimationFrame = function(callback, element) {
+ var currTime = new Date().getTime();
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+ var id = window.setTimeout(function() { callback(currTime + timeToCall); },
+ timeToCall);
+ lastTime = currTime + timeToCall;
+ return id;
+ };
+
+ if (!window.cancelAnimationFrame)
+ window.cancelAnimationFrame = function(id) {
+ clearTimeout(id);
+ };
+}());
+
+// Array.isArray polyfill
+// From MDN
+(function() {
+ if(!Array.isArray) {
+ Array.isArray = function(arg) {
+ return Object.prototype.toString.call(arg) === '[object Array]';
+ };
+ }
+}());
+/**
+ * Taken from jQuery 2.1.3
+ *
+ * @param obj
+ * @returns {boolean}
+ */
+var $isplainobject = function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if (typeof obj !== "object" || obj.nodeType || (obj !== null && obj === obj.window)) {
+ return false;
+ }
+
+ if (obj.constructor && !Object.prototype.hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf")) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+};
+
+var $extend = function(destination) {
+ var source, i,property;
+ for(i=1; i<arguments.length; i++) {
+ source = arguments[i];
+ for (property in source) {
+ if(!source.hasOwnProperty(property)) continue;
+ if(source[property] && $isplainobject(source[property])) {
+ if(!destination.hasOwnProperty(property)) destination[property] = {};
+ $extend(destination[property], source[property]);
+ }
+ else {
+ destination[property] = source[property];
+ }
+ }
+ }
+ return destination;
+};
+
+var $each = function(obj,callback) {
+ if(!obj || typeof obj !== "object") return;
+ var i;
+ if(Array.isArray(obj) || (typeof obj.length === 'number' && obj.length > 0 && (obj.length - 1) in obj)) {
+ for(i=0; i<obj.length; i++) {
+ if(callback(i,obj[i])===false) return;
+ }
+ }
+ else {
+ if (Object.keys) {
+ var keys = Object.keys(obj);
+ for(i=0; i<keys.length; i++) {
+ if(callback(keys[i],obj[keys[i]])===false) return;
+ }
+ }
+ else {
+ for(i in obj) {
+ if(!obj.hasOwnProperty(i)) continue;
+ if(callback(i,obj[i])===false) return;
+ }
+ }
+ }
+};
+
+var $trigger = function(el,event) {
+ var e = document.createEvent('HTMLEvents');
+ e.initEvent(event, true, true);
+ el.dispatchEvent(e);
+};
+var $triggerc = function(el,event) {
+ var e = new CustomEvent(event,{
+ bubbles: true,
+ cancelable: true
+ });
+
+ el.dispatchEvent(e);
+};
+
+var JSONEditor = function(element,options) {
+ if (!(element instanceof Element)) {
+ throw new Error('element should be an instance of Element');
+ }
+ options = $extend({},JSONEditor.defaults.options,options||{});
+ this.element = element;
+ this.options = options;
+ this.init();
+};
+JSONEditor.prototype = {
+ // necessary since we remove the ctor property by doing a literal assignment. Without this
+ // the $isplainobject function will think that this is a plain object.
+ constructor: JSONEditor,
+ init: function() {
+ var self = this;
+
+ this.ready = false;
+ this.copyClipboard = null;
+
+ var theme_class = JSONEditor.defaults.themes[this.options.theme || JSONEditor.defaults.theme];
+ if(!theme_class) throw "Unknown theme " + (this.options.theme || JSONEditor.defaults.theme);
+
+ this.schema = this.options.schema;
+ this.theme = new theme_class();
+ this.template = this.options.template;
+ this.refs = this.options.refs || {};
+ this.uuid = 0;
+ this.__data = {};
+
+ var icon_class = JSONEditor.defaults.iconlibs[this.options.iconlib || JSONEditor.defaults.iconlib];
+ if(icon_class) this.iconlib = new icon_class();
+
+ this.root_container = this.theme.getContainer();
+ this.element.appendChild(this.root_container);
+
+ this.translate = this.options.translate || JSONEditor.defaults.translate;
+
+ // Fetch all external refs via ajax
+ this._loadExternalRefs(this.schema, function() {
+ self._getDefinitions(self.schema);
+
+ // Validator options
+ var validator_options = {};
+ if(self.options.custom_validators) {
+ validator_options.custom_validators = self.options.custom_validators;
+ }
+ self.validator = new JSONEditor.Validator(self,null,validator_options);
+
+ // Create the root editor
+ var schema = self.expandRefs(self.schema);
+ var editor_class = self.getEditorClass(schema);
+ self.root = self.createEditor(editor_class, {
+ jsoneditor: self,
+ schema: schema,
+ required: true,
+ container: self.root_container
+ });
+
+ self.root.preBuild();
+ self.root.build();
+ self.root.postBuild();
+
+ // Starting data
+ if(self.options.hasOwnProperty('startval')) self.root.setValue(self.options.startval, true);
+
+ self.validation_results = self.validator.validate(self.root.getValue());
+ self.root.showValidationErrors(self.validation_results);
+ self.ready = true;
+
+ // Fire ready event asynchronously
+ window.requestAnimationFrame(function() {
+ if(!self.ready) return;
+ self.validation_results = self.validator.validate(self.root.getValue());
+ self.root.showValidationErrors(self.validation_results);
+ self.trigger('ready');
+ self.trigger('change');
+ });
+ });
+ },
+ getValue: function() {
+ if(!this.ready) throw "JSON Editor not ready yet. Listen for 'ready' event before getting the value";
+
+ return this.root.getValue();
+ },
+ setValue: function(value) {
+ if(!this.ready) throw "JSON Editor not ready yet. Listen for 'ready' event before setting the value";
+
+ this.root.setValue(value);
+ return this;
+ },
+ validate: function(value) {
+ if(!this.ready) throw "JSON Editor not ready yet. Listen for 'ready' event before validating";
+
+ // Custom value
+ if(arguments.length === 1) {
+ return this.validator.validate(value);
+ }
+ // Current value (use cached result)
+ else {
+ return this.validation_results;
+ }
+ },
+ destroy: function() {
+ if(this.destroyed) return;
+ if(!this.ready) return;
+
+ this.schema = null;
+ this.options = null;
+ this.root.destroy();
+ this.root = null;
+ this.root_container = null;
+ this.validator = null;
+ this.validation_results = null;
+ this.theme = null;
+ this.iconlib = null;
+ this.template = null;
+ this.__data = null;
+ this.ready = false;
+ this.element.innerHTML = '';
+
+ this.destroyed = true;
+ },
+ on: function(event, callback) {
+ this.callbacks = this.callbacks || {};
+ this.callbacks[event] = this.callbacks[event] || [];
+ this.callbacks[event].push(callback);
+
+ return this;
+ },
+ off: function(event, callback) {
+ // Specific callback
+ if(event && callback) {
+ this.callbacks = this.callbacks || {};
+ this.callbacks[event] = this.callbacks[event] || [];
+ var newcallbacks = [];
+ for(var i=0; i<this.callbacks[event].length; i++) {
+ if(this.callbacks[event][i]===callback) continue;
+ newcallbacks.push(this.callbacks[event][i]);
+ }
+ this.callbacks[event] = newcallbacks;
+ }
+ // All callbacks for a specific event
+ else if(event) {
+ this.callbacks = this.callbacks || {};
+ this.callbacks[event] = [];
+ }
+ // All callbacks for all events
+ else {
+ this.callbacks = {};
+ }
+
+ return this;
+ },
+ trigger: function(event) {
+ if(this.callbacks && this.callbacks[event] && this.callbacks[event].length) {
+ for(var i=0; i<this.callbacks[event].length; i++) {
+ this.callbacks[event][i].apply(this, []);
+ }
+ }
+
+ return this;
+ },
+ setOption: function(option, value) {
+ if(option === "show_errors") {
+ this.options.show_errors = value;
+ this.onChange();
+ }
+ // Only the `show_errors` option is supported for now
+ else {
+ throw "Option "+option+" must be set during instantiation and cannot be changed later";
+ }
+
+ return this;
+ },
+ getEditorClass: function(schema) {
+ var classname;
+
+ schema = this.expandSchema(schema);
+
+ $each(JSONEditor.defaults.resolvers,function(i,resolver) {
+ var tmp = resolver(schema);
+ if(tmp) {
+ if(JSONEditor.defaults.editors[tmp]) {
+ classname = tmp;
+ return false;
+ }
+ }
+ });
+
+ if(!classname) throw "Unknown editor for schema "+JSON.stringify(schema);
+ if(!JSONEditor.defaults.editors[classname]) throw "Unknown editor "+classname;
+
+ return JSONEditor.defaults.editors[classname];
+ },
+ createEditor: function(editor_class, options) {
+ options = $extend({},editor_class.options||{},options);
+ return new editor_class(options);
+ },
+ onChange: function() {
+ if(!this.ready) return;
+
+ if(this.firing_change) return;
+ this.firing_change = true;
+
+ var self = this;
+
+ window.requestAnimationFrame(function() {
+ self.firing_change = false;
+ if(!self.ready) return;
+
+ // Validate and cache results
+ self.validation_results = self.validator.validate(self.root.getValue());
+
+ if(self.options.show_errors !== "never") {
+ self.root.showValidationErrors(self.validation_results);
+ }
+ else {
+ self.root.showValidationErrors([]);
+ }
+
+ // Fire change event
+ self.trigger('change');
+ });
+
+ return this;
+ },
+ compileTemplate: function(template, name) {
+ name = name || JSONEditor.defaults.template;
+
+ var engine;
+
+ // Specifying a preset engine
+ if(typeof name === 'string') {
+ if(!JSONEditor.defaults.templates[name]) throw "Unknown template engine "+name;
+ engine = JSONEditor.defaults.templates[name]();
+
+ if(!engine) throw "Template engine "+name+" missing required library.";
+ }
+ // Specifying a custom engine
+ else {
+ engine = name;
+ }
+
+ if(!engine) throw "No template engine set";
+ if(!engine.compile) throw "Invalid template engine set";
+
+ return engine.compile(template);
+ },
+ _data: function(el,key,value) {
+ // Setting data
+ if(arguments.length === 3) {
+ var uuid;
+ if(el.hasAttribute('data-jsoneditor-'+key)) {
+ uuid = el.getAttribute('data-jsoneditor-'+key);
+ }
+ else {
+ uuid = this.uuid++;
+ el.setAttribute('data-jsoneditor-'+key,uuid);
+ }
+
+ this.__data[uuid] = value;
+ }
+ // Getting data
+ else {
+ // No data stored
+ if(!el.hasAttribute('data-jsoneditor-'+key)) return null;
+
+ return this.__data[el.getAttribute('data-jsoneditor-'+key)];
+ }
+ },
+ registerEditor: function(editor) {
+ this.editors = this.editors || {};
+ this.editors[editor.path] = editor;
+ return this;
+ },
+ unregisterEditor: function(editor) {
+ this.editors = this.editors || {};
+ this.editors[editor.path] = null;
+ return this;
+ },
+ getEditor: function(path) {
+ if(!this.editors) return;
+ return this.editors[path];
+ },
+ watch: function(path,callback) {
+ this.watchlist = this.watchlist || {};
+ this.watchlist[path] = this.watchlist[path] || [];
+ this.watchlist[path].push(callback);
+
+ return this;
+ },
+ unwatch: function(path,callback) {
+ if(!this.watchlist || !this.watchlist[path]) return this;
+ // If removing all callbacks for a path
+ if(!callback) {
+ this.watchlist[path] = null;
+ return this;
+ }
+
+ var newlist = [];
+ for(var i=0; i<this.watchlist[path].length; i++) {
+ if(this.watchlist[path][i] === callback) continue;
+ else newlist.push(this.watchlist[path][i]);
+ }
+ this.watchlist[path] = newlist.length? newlist : null;
+ return this;
+ },
+ notifyWatchers: function(path) {
+ if(!this.watchlist || !this.watchlist[path]) return this;
+ for(var i=0; i<this.watchlist[path].length; i++) {
+ this.watchlist[path][i]();
+ }
+ },
+ isEnabled: function() {
+ return !this.root || this.root.isEnabled();
+ },
+ enable: function() {
+ this.root.enable();
+ },
+ disable: function() {
+ this.root.disable();
+ },
+ _getDefinitions: function(schema,path) {
+ path = path || '#/definitions/';
+ if(schema.definitions) {
+ for(var i in schema.definitions) {
+ if(!schema.definitions.hasOwnProperty(i)) continue;
+ this.refs[path+i] = schema.definitions[i];
+ if(schema.definitions[i].definitions) {
+ this._getDefinitions(schema.definitions[i],path+i+'/definitions/');
+ }
+ }
+ }
+ },
+ _getExternalRefs: function(schema) {
+ var refs = {};
+ var merge_refs = function(newrefs) {
+ for(var i in newrefs) {
+ if(newrefs.hasOwnProperty(i)) {
+ refs[i] = true;
+ }
+ }
+ };
+
+ if(schema.$ref && typeof schema.$ref !== "object" && schema.$ref.substr(0,1) !== "#" && !this.refs[schema.$ref]) {
+ refs[schema.$ref] = true;
+ }
+
+ for(var i in schema) {
+ if(!schema.hasOwnProperty(i)) continue;
+ if(schema[i] && typeof schema[i] === "object" && Array.isArray(schema[i])) {
+ for(var j=0; j<schema[i].length; j++) {
+ if(schema[i][j] && typeof schema[i][j]==="object") {
+ merge_refs(this._getExternalRefs(schema[i][j]));
+ }
+ }
+ }
+ else if(schema[i] && typeof schema[i] === "object") {
+ merge_refs(this._getExternalRefs(schema[i]));
+ }
+ }
+
+ return refs;
+ },
+ _loadExternalRefs: function(schema, callback) {
+ var self = this;
+ var refs = this._getExternalRefs(schema);
+
+ var done = 0, waiting = 0, callback_fired = false;
+
+ $each(refs,function(url) {
+ if(self.refs[url]) return;
+ if(!self.options.ajax) throw "Must set ajax option to true to load external ref "+url;
+ self.refs[url] = 'loading';
+ waiting++;
+
+ var fetchUrl=url;
+ if( self.options.ajaxBase && self.options.ajaxBase!=url.substr(0,self.options.ajaxBase.length) && "http"!=url.substr(0,4)) fetchUrl=self.options.ajaxBase+url;
+
+ var r = new XMLHttpRequest();
+ r.open("GET", fetchUrl, true);
+ if(self.options.ajaxCredentials) r.withCredentials=self.options.ajaxCredentials;
+ r.onreadystatechange = function () {
+ if (r.readyState != 4) return;
+ // Request succeeded
+ if(r.status === 200) {
+ var response;
+ try {
+ response = JSON.parse(r.responseText);
+ }
+ catch(e) {
+ window.console.log(e);
+ throw "Failed to parse external ref "+fetchUrl;
+ }
+ if(!response || typeof response !== "object") throw "External ref does not contain a valid schema - "+fetchUrl;
+
+ self.refs[url] = response;
+ self._loadExternalRefs(response,function() {
+ done++;
+ if(done >= waiting && !callback_fired) {
+ callback_fired = true;
+ callback();
+ }
+ });
+ }
+ // Request failed
+ else {
+ window.console.log(r);
+ throw "Failed to fetch ref via ajax- "+url;
+ }
+ };
+ r.send();
+ });
+
+ if(!waiting) {
+ callback();
+ }
+ },
+ expandRefs: function(schema) {
+ schema = $extend({},schema);
+
+ while (schema.$ref) {
+ var ref = schema.$ref;
+ delete schema.$ref;
+
+ if(!this.refs[ref]) ref = decodeURIComponent(ref);
+
+ schema = this.extendSchemas(schema,this.refs[ref]);
+ }
+ return schema;
+ },
+ expandSchema: function(schema) {
+ var self = this;
+ var extended = $extend({},schema);
+ var i;
+
+ // Version 3 `type`
+ if(typeof schema.type === 'object') {
+ // Array of types
+ if(Array.isArray(schema.type)) {
+ $each(schema.type, function(key,value) {
+ // Schema
+ if(typeof value === 'object') {
+ schema.type[key] = self.expandSchema(value);
+ }
+ });
+ }
+ // Schema
+ else {
+ schema.type = self.expandSchema(schema.type);
+ }
+ }
+ // Version 3 `disallow`
+ if(typeof schema.disallow === 'object') {
+ // Array of types
+ if(Array.isArray(schema.disallow)) {
+ $each(schema.disallow, function(key,value) {
+ // Schema
+ if(typeof value === 'object') {
+ schema.disallow[key] = self.expandSchema(value);
+ }
+ });
+ }
+ // Schema
+ else {
+ schema.disallow = self.expandSchema(schema.disallow);
+ }
+ }
+ // Version 4 `anyOf`
+ if(schema.anyOf) {
+ $each(schema.anyOf, function(key,value) {
+ schema.anyOf[key] = self.expandSchema(value);
+ });
+ }
+ // Version 4 `dependencies` (schema dependencies)
+ if(schema.dependencies) {
+ $each(schema.dependencies,function(key,value) {
+ if(typeof value === "object" && !(Array.isArray(value))) {
+ schema.dependencies[key] = self.expandSchema(value);
+ }
+ });
+ }
+ // Version 4 `not`
+ if(schema.not) {
+ schema.not = this.expandSchema(schema.not);
+ }
+
+ // allOf schemas should be merged into the parent
+ if(schema.allOf) {
+ for(i=0; i<schema.allOf.length; i++) {
+ extended = this.extendSchemas(extended,this.expandSchema(schema.allOf[i]));
+ }
+ delete extended.allOf;
+ }
+ // extends schemas should be merged into parent
+ if(schema["extends"]) {
+ // If extends is a schema
+ if(!(Array.isArray(schema["extends"]))) {
+ extended = this.extendSchemas(extended,this.expandSchema(schema["extends"]));
+ }
+ // If extends is an array of schemas
+ else {
+ for(i=0; i<schema["extends"].length; i++) {
+ extended = this.extendSchemas(extended,this.expandSchema(schema["extends"][i]));
+ }
+ }
+ delete extended["extends"];
+ }
+ // parent should be merged into oneOf schemas
+ if(schema.oneOf) {
+ var tmp = $extend({},extended);
+ delete tmp.oneOf;
+ for(i=0; i<schema.oneOf.length; i++) {
+ extended.oneOf[i] = this.extendSchemas(this.expandSchema(schema.oneOf[i]),tmp);
+ }
+ }
+
+ return this.expandRefs(extended);
+ },
+ extendSchemas: function(obj1, obj2) {
+ obj1 = $extend({},obj1);
+ obj2 = $extend({},obj2);
+
+ var self = this;
+ var extended = {};
+ $each(obj1, function(prop,val) {
+ // If this key is also defined in obj2, merge them
+ if(typeof obj2[prop] !== "undefined") {
+ // Required and defaultProperties arrays should be unioned together
+ if((prop === 'required'||prop === 'defaultProperties') && typeof val === "object" && Array.isArray(val)) {
+ // Union arrays and unique
+ extended[prop] = val.concat(obj2[prop]).reduce(function(p, c) {
+ if (p.indexOf(c) < 0) p.push(c);
+ return p;
+ }, []);
+ }
+ // Type should be intersected and is either an array or string
+ else if(prop === 'type' && (typeof val === "string" || Array.isArray(val))) {
+ // Make sure we're dealing with arrays
+ if(typeof val === "string") val = [val];
+ if(typeof obj2.type === "string") obj2.type = [obj2.type];
+
+ // If type is only defined in the first schema, keep it
+ if(!obj2.type || !obj2.type.length) {
+ extended.type = val;
+ }
+ // If type is defined in both schemas, do an intersect
+ else {
+ extended.type = val.filter(function(n) {
+ return obj2.type.indexOf(n) !== -1;
+ });
+ }
+
+ // If there's only 1 type and it's a primitive, use a string instead of array
+ if(extended.type.length === 1 && typeof extended.type[0] === "string") {
+ extended.type = extended.type[0];
+ }
+ // Remove the type property if it's empty
+ else if(extended.type.length === 0) {
+ delete extended.type;
+ }
+ }
+ // All other arrays should be intersected (enum, etc.)
+ else if(typeof val === "object" && Array.isArray(val)){
+ extended[prop] = val.filter(function(n) {
+ return obj2[prop].indexOf(n) !== -1;
+ });
+ }
+ // Objects should be recursively merged
+ else if(typeof val === "object" && val !== null) {
+ extended[prop] = self.extendSchemas(val,obj2[prop]);
+ }
+ // Otherwise, use the first value
+ else {
+ extended[prop] = val;
+ }
+ }
+ // Otherwise, just use the one in obj1
+ else {
+ extended[prop] = val;
+ }
+ });
+ // Properties in obj2 that aren't in obj1
+ $each(obj2, function(prop,val) {
+ if(typeof obj1[prop] === "undefined") {
+ extended[prop] = val;
+ }
+ });
+
+ return extended;
+ },
+ setCopyClipboardContents: function(value) {
+ this.copyClipboard = value;
+ },
+ getCopyClipboardContents: function() {
+ return this.copyClipboard;
+ }
+};
+
+JSONEditor.defaults = {
+ themes: {},
+ templates: {},
+ iconlibs: {},
+ editors: {},
+ languages: {},
+ resolvers: [],
+ custom_validators: []
+};
+
+JSONEditor.Validator = Class.extend({
+ init: function(jsoneditor,schema,options) {
+ this.jsoneditor = jsoneditor;
+ this.schema = schema || this.jsoneditor.schema;
+ this.options = options || {};
+ this.translate = this.jsoneditor.translate || JSONEditor.defaults.translate;
+ },
+ validate: function(value) {
+ return this._validateSchema(this.schema, value);
+ },
+ _validateSchema: function(schema,value,path) {
+ var self = this;
+ var errors = [];
+ var valid, i, j;
+ var stringified = JSON.stringify(value);
+
+ path = path || 'root';
+
+ // Work on a copy of the schema
+ schema = $extend({},this.jsoneditor.expandRefs(schema));
+
+ /*
+ * Type Agnostic Validation
+ */
+
+ // Version 3 `required` and `required_by_default`
+ if(typeof value === "undefined" || value === null) {
+ if((typeof schema.required !== "undefined" && schema.required === true) || (typeof schema.required === "undefined" && this.jsoneditor.options.required_by_default === true)) {
+ errors.push({
+ path: path,
+ property: 'required',
+ message: this.translate("error_notset", [schema.title ? schema.title : path.split('-').pop().trim()])
+ });
+ }
+
+ return errors;
+ }
+
+ // `enum`
+ if(schema["enum"]) {
+ valid = false;
+ for(i=0; i<schema["enum"].length; i++) {
+ if(stringified === JSON.stringify(schema["enum"][i])) valid = true;
+ }
+ if(!valid) {
+ errors.push({
+ path: path,
+ property: 'enum',
+ message: this.translate("error_enum", [schema.title ? schema.title : path.split('-').pop().trim()])
+ });
+ }
+ }
+
+ // `extends` (version 3)
+ if(schema["extends"]) {
+ for(i=0; i<schema["extends"].length; i++) {
+ errors = errors.concat(this._validateSchema(schema["extends"][i],value,path));
+ }
+ }
+
+ // `allOf`
+ if(schema.allOf) {
+ for(i=0; i<schema.allOf.length; i++) {
+ errors = errors.concat(this._validateSchema(schema.allOf[i],value,path));
+ }
+ }
+
+ // `anyOf`
+ if(schema.anyOf) {
+ valid = false;
+ for(i=0; i<schema.anyOf.length; i++) {
+ if(!this._validateSchema(schema.anyOf[i],value,path).length) {
+ valid = true;
+ break;
+ }
+ }
+ if(!valid) {
+ errors.push({
+ path: path,
+ property: 'anyOf',
+ message: this.translate('error_anyOf')
+ });
+ }
+ }
+
+ // `oneOf`
+ if(schema.oneOf) {
+ valid = 0;
+ var oneof_errors = [];
+ for(i=0; i<schema.oneOf.length; i++) {
+ // Set the error paths to be path.oneOf[i].rest.of.path
+ var tmp = this._validateSchema(schema.oneOf[i],value,path);
+ if(!tmp.length) {
+ valid++;
+ }
+
+ for(j=0; j<tmp.length; j++) {
+ tmp[j].path = path+'.oneOf['+i+']'+tmp[j].path.substr(path.length);
+ }
+ oneof_errors = oneof_errors.concat(tmp);
+
+ }
+ if(valid !== 1) {
+ errors.push({
+ path: path,
+ property: 'oneOf',
+ message: this.translate('error_oneOf', [valid])
+ });
+ errors = errors.concat(oneof_errors);
+ }
+ }
+
+ // `not`
+ if(schema.not) {
+ if(!this._validateSchema(schema.not,value,path).length) {
+ errors.push({
+ path: path,
+ property: 'not',
+ message: this.translate('error_not')
+ });
+ }
+ }
+
+ // `type` (both Version 3 and Version 4 support)
+ if(schema.type) {
+ // Union type
+ if(Array.isArray(schema.type)) {
+ valid = false;
+ for(i=0;i<schema.type.length;i++) {
+ if(this._checkType(schema.type[i], value)) {
+ valid = true;
+ break;
+ }
+ }
+ if(!valid) {
+ errors.push({
+ path: path,
+ property: 'type',
+ message: this.translate('error_type_union')
+ });
+ }
+ }
+ // Simple type
+ else {
+ if(!this._checkType(schema.type, value)) {
+ errors.push({
+ path: path,
+ property: 'type',
+ message: this.translate('error_type', [schema.type])
+ });
+ }
+ }
+ }
+
+
+ // `disallow` (version 3)
+ if(schema.disallow) {
+ // Union type
+ if(Array.isArray(schema.disallow)) {
+ valid = true;
+ for(i=0;i<schema.disallow.length;i++) {
+ if(this._checkType(schema.disallow[i], value)) {
+ valid = false;
+ break;
+ }
+ }
+ if(!valid) {
+ errors.push({
+ path: path,
+ property: 'disallow',
+ message: this.translate('error_disallow_union')
+ });
+ }
+ }
+ // Simple type
+ else {
+ if(this._checkType(schema.disallow, value)) {
+ errors.push({
+ path: path,
+ property: 'disallow',
+ message: this.translate('error_disallow', [schema.disallow])
+ });
+ }
+ }
+ }
+
+ /*
+ * Type Specific Validation
+ */
+
+ // Number Specific Validation
+ if(typeof value === "number") {
+ // `multipleOf` and `divisibleBy`
+ if(schema.multipleOf || schema.divisibleBy) {
+ var divisor = schema.multipleOf || schema.divisibleBy;
+ // Vanilla JS, prone to floating point rounding errors (e.g. 1.14 / .01 == 113.99999)
+ valid = (value/divisor === Math.floor(value/divisor));
+
+ // Use math.js is available
+ if(window.math) {
+ valid = window.math.mod(window.math.bignumber(value), window.math.bignumber(divisor)).equals(0);
+ }
+ // Use decimal.js is available
+ else if(window.Decimal) {
+ valid = (new window.Decimal(value)).mod(new window.Decimal(divisor)).equals(0);
+ }
+
+ if(!valid) {
+ errors.push({
+ path: path,
+ property: schema.multipleOf? 'multipleOf' : 'divisibleBy',
+ message: this.translate('error_multipleOf', [divisor])
+ });
+ }
+ }
+
+ // `maximum`
+ if(schema.hasOwnProperty('maximum')) {
+ // Vanilla JS, prone to floating point rounding errors (e.g. .999999999999999 == 1)
+ valid = schema.exclusiveMaximum? (value < schema.maximum) : (value <= schema.maximum);
+
+ // Use math.js is available
+ if(window.math) {
+ valid = window.math[schema.exclusiveMaximum?'smaller':'smallerEq'](
+ window.math.bignumber(value),
+ window.math.bignumber(schema.maximum)
+ );
+ }
+ // Use Decimal.js if available
+ else if(window.Decimal) {
+ valid = (new window.Decimal(value))[schema.exclusiveMaximum?'lt':'lte'](new window.Decimal(schema.maximum));
+ }
+
+ if(!valid) {
+ errors.push({
+ path: path,
+ property: 'maximum',
+ message: this.translate(
+ (schema.exclusiveMaximum?'error_maximum_excl':'error_maximum_incl'),
+ [schema.title ? schema.title : path.split('-').pop().trim(), schema.maximum]
+ )
+ });
+ }
+ }
+
+ // `minimum`
+ if(schema.hasOwnProperty('minimum')) {
+ // Vanilla JS, prone to floating point rounding errors (e.g. .999999999999999 == 1)
+ valid = schema.exclusiveMinimum? (value > schema.minimum) : (value >= schema.minimum);
+
+ // Use math.js is available
+ if(window.math) {
+ valid = window.math[schema.exclusiveMinimum?'larger':'largerEq'](
+ window.math.bignumber(value),
+ window.math.bignumber(schema.minimum)
+ );
+ }
+ // Use Decimal.js if available
+ else if(window.Decimal) {
+ valid = (new window.Decimal(value))[schema.exclusiveMinimum?'gt':'gte'](new window.Decimal(schema.minimum));
+ }
+
+ if(!valid) {
+ errors.push({
+ path: path,
+ property: 'minimum',
+ message: this.translate(
+ (schema.exclusiveMinimum?'error_minimum_excl':'error_minimum_incl'),
+ [schema.title ? schema.title : path.split('-').pop().trim(), schema.minimum]
+ )
+ });
+ }
+ }
+ }
+ // String specific validation
+ else if(typeof value === "string") {
+ // `maxLength`
+ if(schema.maxLength) {
+ if((value+"").length > schema.maxLength) {
+ errors.push({
+ path: path,
+ property: 'maxLength',
+ message: this.translate('error_maxLength',
+ [schema.title ? schema.title : path.split('-').pop().trim(), schema.maxLength])
+ });
+ }
+ }
+
+ // `minLength` -- Commented because we are validating required field.
+ if(schema.minLength) {
+ if((value+"").length < schema.minLength) {
+ errors.push({
+ path: path,
+ property: 'minLength',
+ message: this.translate((schema.minLength===1?'error_notempty':'error_minLength'),
+ [schema.title ? schema.title : path.split('-').pop().trim(), schema.minLength])
+ });
+ }
+ }
+
+ // `pattern`
+ if(schema.pattern) {
+ if(!(new RegExp(schema.pattern)).test(value)) {
+ errors.push({
+ path: path,
+ property: 'pattern',
+ message: this.translate('error_pattern',
+ [schema.title ? schema.title : path.split('-').pop().trim(), schema.pattern])
+ });
+ }
+ }
+ }
+ // Array specific validation
+ else if(typeof value === "object" && value !== null && Array.isArray(value)) {
+ // `items` and `additionalItems`
+ if(schema.items) {
+ // `items` is an array
+ if(Array.isArray(schema.items)) {
+ for(i=0; i<value.length; i++) {
+ // If this item has a specific schema tied to it
+ // Validate against it
+ if(schema.items[i]) {
+ errors = errors.concat(this._validateSchema(schema.items[i],value[i],path+'.'+i));
+ }
+ // If all additional items are allowed
+ else if(schema.additionalItems === true) {
+ break;
+ }
+ // If additional items is a schema
+ // TODO: Incompatibility between version 3 and 4 of the spec
+ else if(schema.additionalItems) {
+ errors = errors.concat(this._validateSchema(schema.additionalItems,value[i],path+'.'+i));
+ }
+ // If no additional items are allowed
+ else if(schema.additionalItems === false) {
+ errors.push({
+ path: path,
+ property: 'additionalItems',
+ message: this.translate('error_additionalItems')
+ });
+ break;
+ }
+ // Default for `additionalItems` is an empty schema
+ else {
+ break;
+ }
+ }
+ }
+ // `items` is a schema
+ else {
+ // Each item in the array must validate against the schema
+ for(i=0; i<value.length; i++) {
+ errors = errors.concat(this._validateSchema(schema.items,value[i],path+'.'+i));
+ }
+ }
+ }
+
+ // `maxItems`
+ if(schema.maxItems) {
+ if(value.length > schema.maxItems) {
+ errors.push({
+ path: path,
+ property: 'maxItems',
+ message: this.translate('error_maxItems', [schema.maxItems])
+ });
+ }
+ }
+
+ // `minItems`
+ if(schema.minItems) {
+ if(value.length < schema.minItems) {
+ errors.push({
+ path: path,
+ property: 'minItems',
+ message: this.translate('error_minItems', [schema.minItems])
+ });
+ }
+ }
+
+ // `uniqueItems`
+ if(schema.uniqueItems) {
+ var seen = {};
+ for(i=0; i<value.length; i++) {
+ valid = JSON.stringify(value[i]);
+ if(seen[valid]) {
+ errors.push({
+ path: path,
+ property: 'uniqueItems',
+ message: this.translate('error_uniqueItems',
+ [schema.title ? schema.title : path.split('-').pop().trim()])
+ });
+ break;
+ }
+ seen[valid] = true;
+ }
+ }
+ }
+ // Object specific validation
+ else if(typeof value === "object" && value !== null) {
+ // `maxProperties`
+ if(schema.maxProperties) {
+ valid = 0;
+ for(i in value) {
+ if(!value.hasOwnProperty(i)) continue;
+ valid++;
+ }
+ if(valid > schema.maxProperties) {
+ errors.push({
+ path: path,
+ property: 'maxProperties',
+ message: this.translate('error_maxProperties', [schema.maxProperties])
+ });
+ }
+ }
+
+ // `minProperties`
+ if(schema.minProperties) {
+ valid = 0;
+ for(i in value) {
+ if(!value.hasOwnProperty(i)) continue;
+ valid++;
+ }
+ if(valid < schema.minProperties) {
+ errors.push({
+ path: path,
+ property: 'minProperties',
+ message: this.translate('error_minProperties', [schema.minProperties])
+ });
+ }
+ }
+
+ // Version 4 `required`
+ if(typeof schema.required !== "undefined" && Array.isArray(schema.required)) {
+ for(i=0; i<schema.required.length; i++) {
+ // Arrays are the only missing "required" thing we report in the "object"
+ // level control group error message area; all others appear in their own form control
+ // control message area.
+ if((typeof value[schema.required[i]] === "undefined") ||
+ (Array.isArray(value[schema.required[i]]) && value[schema.required[i]].length == 0)) {
+ var parm_name;
+ if(typeof schema.properties[schema.required[i]].title !== "undefined") {
+ parm_name = schema.properties[schema.required[i]].title;
+ }
+ else {
+ parm_name = schema.required[i];
+ }
+ errors.push({
+ path: path,
+ property: 'required',
+ message: this.translate('error_required', [parm_name])
+ });
+ }
+ }
+ }
+
+ // `properties`
+ var validated_properties = {};
+ if(schema.properties) {
+ if(typeof schema.required !== "undefined" && Array.isArray(schema.required)) {
+ for(i=0; i<schema.required.length; i++) {
+ var property = schema.required[i];
+ validated_properties[property] = true;
+ errors = errors.concat(this._validateSchema(schema.properties[property],value[property],path+'.'+property));
+ }
+ }
+
+ // If an optional property is not an object and is not empty, we must run validation
+ // on it as the user may have entered some data into it.
+
+ for(i in schema.properties) {
+ if(!schema.properties.hasOwnProperty(i) || validated_properties[i] === true) continue;
+ if((typeof value[i] !== "object" && typeof value[i] !== "undefined" && value[i] !== null) ||
+ (schema.properties[i].type === "array" && Array.isArray(value[i]) && value[i].length > 0)) {
+
+ errors = errors.concat(this._validateSchema(schema.properties[i],value[i],path+'.'+i));
+ }
+ validated_properties[i] = true;
+ }
+ }
+
+ // `patternProperties`
+ if(schema.patternProperties) {
+ for(i in schema.patternProperties) {
+ if(!schema.patternProperties.hasOwnProperty(i)) continue;
+ var regex = new RegExp(i);
+
+ // Check which properties match
+ for(j in value) {
+ if(!value.hasOwnProperty(j)) continue;
+ if(regex.test(j)) {
+ validated_properties[j] = true;
+ errors = errors.concat(this._validateSchema(schema.patternProperties[i],value[j],path+'.'+j));
+ }
+ }
+ }
+ }
+
+ // The no_additional_properties option currently doesn't work with extended schemas that use oneOf or anyOf
+ if(typeof schema.additionalProperties === "undefined" && this.jsoneditor.options.no_additional_properties && !schema.oneOf && !schema.anyOf) {
+ schema.additionalProperties = false;
+ }
+
+ // `additionalProperties`
+ if(typeof schema.additionalProperties !== "undefined") {
+ for(i in value) {
+ if(!value.hasOwnProperty(i)) continue;
+ if(!validated_properties[i]) {
+ // No extra properties allowed
+ if(!schema.additionalProperties) {
+ errors.push({
+ path: path,
+ property: 'additionalProperties',
+ message: this.translate('error_additional_properties', [i])
+ });
+ break;
+ }
+ // Allowed
+ else if(schema.additionalProperties === true) {
+ break;
+ }
+ // Must match schema
+ // TODO: incompatibility between version 3 and 4 of the spec
+ else {
+ errors = errors.concat(this._validateSchema(schema.additionalProperties,value[i],path+'.'+i));
+ }
+ }
+ }
+ }
+
+ // `dependencies`
+ if(schema.dependencies) {
+ for(i in schema.dependencies) {
+ if(!schema.dependencies.hasOwnProperty(i)) continue;
+
+ // Doesn't need to meet the dependency
+ if(typeof value[i] === "undefined") continue;
+
+ // Property dependency
+ if(Array.isArray(schema.dependencies[i])) {
+ for(j=0; j<schema.dependencies[i].length; j++) {
+ if(typeof value[schema.dependencies[i][j]] === "undefined") {
+ errors.push({
+ path: path,
+ property: 'dependencies',
+ message: this.translate('error_dependency', [schema.dependencies[i][j]])
+ });
+ }
+ }
+ }
+ // Schema dependency
+ else {
+ errors = errors.concat(this._validateSchema(schema.dependencies[i],value,path));
+ }
+ }
+ }
+ }
+
+ // Custom type validation (global)
+ $each(JSONEditor.defaults.custom_validators,function(i,validator) {
+ errors = errors.concat(validator.call(self,schema,value,path));
+ });
+ // Custom type validation (instance specific)
+ if(this.options.custom_validators) {
+ $each(this.options.custom_validators,function(i,validator) {
+ errors = errors.concat(validator.call(self,schema,value,path));
+ });
+ }
+
+ return errors;
+ },
+ _checkType: function(type, value) {
+ // Simple types
+ if(typeof type === "string") {
+ if(type==="string") return typeof value === "string";
+ else if(type==="number") return typeof value === "number";
+ else if(type==="qbldr") return typeof value === "string";
+ else if(type==="integer") return typeof value === "number" && value === Math.floor(value);
+ else if(type==="boolean") return typeof value === "boolean";
+ else if(type==="array") return Array.isArray(value);
+ else if(type === "object") return value !== null && !(Array.isArray(value)) && typeof value === "object";
+ else if(type === "null") return value === null;
+ else return true;
+ }
+ // Schema
+ else {
+ return !this._validateSchema(type,value).length;
+ }
+ }
+});
+
+/**
+ * All editors should extend from this class
+ */
+JSONEditor.AbstractEditor = Class.extend({
+ onChildEditorChange: function(editor) {
+ this.onChange(true);
+ },
+ notify: function() {
+ if(this.path) this.jsoneditor.notifyWatchers(this.path);
+ },
+ change: function() {
+ if(this.parent) this.parent.onChildEditorChange(this);
+ else if(this.jsoneditor) this.jsoneditor.onChange();
+ },
+ onChange: function(bubble) {
+ this.notify();
+ if(this.watch_listener) this.watch_listener();
+ if(bubble) this.change();
+ },
+ register: function() {
+ this.jsoneditor.registerEditor(this);
+ this.onChange();
+ },
+ unregister: function() {
+ if(!this.jsoneditor) return;
+ this.jsoneditor.unregisterEditor(this);
+ },
+ getNumColumns: function() {
+ return 12;
+ },
+ init: function(options) {
+ this.jsoneditor = options.jsoneditor;
+
+ this.theme = this.jsoneditor.theme;
+ this.template_engine = this.jsoneditor.template;
+ this.iconlib = this.jsoneditor.iconlib;
+
+ this.translate = this.jsoneditor.translate || JSONEditor.defaults.translate;
+
+ this.original_schema = options.schema;
+ this.schema = this.jsoneditor.expandSchema(this.original_schema);
+
+ this.options = $extend({}, (this.options || {}), (this.schema.options || {}), (options.schema.options || {}), options);
+
+ if(!options.path && !this.schema.id) this.schema.id = 'root';
+ this.path = options.path || 'root';
+ this.formname = options.formname || this.path.replace(/\.([^.]+)/g,'[$1]');
+ if(this.jsoneditor.options.form_name_root) this.formname = this.formname.replace(/^root\[/,this.jsoneditor.options.form_name_root+'[');
+ this.key = this.path.split('.').pop();
+ this.parent = options.parent;
+
+ this.link_watchers = [];
+
+ if(options.container) this.setContainer(options.container);
+ this.registerDependencies();
+ },
+ registerDependencies: function() {
+ this.dependenciesFulfilled = true;
+ var deps = this.options.dependencies;
+ if (!deps) {
+ return;
+ }
+
+ var self = this;
+ Object.keys(deps).forEach(function(dependency) {
+ var path = self.path.split('.');
+ path[path.length - 1] = dependency;
+ path = path.join('.');
+ var choices = deps[dependency];
+ self.jsoneditor.watch(path, function() {
+ self.checkDependency(path, choices);
+ });
+ });
+ },
+ checkDependency: function(path, choices) {
+ var wrapper = this.control || this.container;
+ if (this.path === path || !wrapper) {
+ return;
+ }
+
+ var self = this;
+ var editor = this.jsoneditor.getEditor(path);
+ var value = editor ? editor.getValue() : undefined;
+ var previousStatus = this.dependenciesFulfilled;
+ this.dependenciesFulfilled = false;
+
+ if (!editor || !editor.dependenciesFulfilled) {
+ this.dependenciesFulfilled = false;
+ } else if (Array.isArray(choices)) {
+ choices.some(function(choice) {
+ if (value === choice) {
+ self.dependenciesFulfilled = true;
+ return true;
+ }
+ });
+ } else if (typeof choices === 'object') {
+ if (typeof value !== 'object') {
+ this.dependenciesFulfilled = choices === value;
+ } else {
+ Object.keys(choices).some(function(key) {
+ if (!choices.hasOwnProperty(key)) {
+ return false;
+ }
+ if (!value.hasOwnProperty(key) || choices[key] !== value[key]) {
+ self.dependenciesFulfilled = false;
+ return true;
+ }
+ self.dependenciesFulfilled = true;
+ });
+ }
+ } else if (typeof choices === 'string' || typeof choices === 'number') {
+ this.dependenciesFulfilled = value === choices;
+ } else if (typeof choices === 'boolean') {
+ if (choices) {
+ this.dependenciesFulfilled = value && value.length > 0;
+ } else {
+ this.dependenciesFulfilled = !value || value.length === 0;
+ }
+ }
+
+ if (this.dependenciesFulfilled !== previousStatus) {
+ this.notify();
+ }
+
+ if (this.dependenciesFulfilled) {
+ wrapper.style.display = 'block';
+ } else {
+ wrapper.style.display = 'none';
+ }
+ },
+ setContainer: function(container) {
+ this.container = container;
+ if(this.schema.id) this.container.setAttribute('data-schemaid',this.schema.id);
+ if(this.schema.type && typeof this.schema.type === "string") this.container.setAttribute('data-schematype',this.schema.type);
+ this.container.setAttribute('data-schemapath',this.path);
+ this.container.style.padding = '4px';
+ },
+
+ preBuild: function() {
+
+ },
+ build: function() {
+
+ },
+ postBuild: function() {
+ this.setupWatchListeners();
+ this.addLinks();
+ this.setValue(this.getDefault(), true);
+ this.updateHeaderText();
+ this.register();
+ this.onWatchedFieldChange();
+ },
+
+ setupWatchListeners: function() {
+ var self = this;
+
+ // Watched fields
+ this.watched = {};
+ if(this.schema.vars) this.schema.watch = this.schema.vars;
+ this.watched_values = {};
+ this.watch_listener = function() {
+ if(self.refreshWatchedFieldValues()) {
+ self.onWatchedFieldChange();
+ }
+ };
+
+ if(this.schema.hasOwnProperty('watch')) {
+ var path,path_parts,first,root,adjusted_path;
+
+ for(var name in this.schema.watch) {
+ if(!this.schema.watch.hasOwnProperty(name)) continue;
+ path = this.schema.watch[name];
+
+ if(Array.isArray(path)) {
+ if(path.length<2) continue;
+ path_parts = [path[0]].concat(path[1].split('.'));
+ }
+ else {
+ path_parts = path.split('.');
+ if(!self.theme.closest(self.container,'[data-schemaid="'+path_parts[0]+'"]')) path_parts.unshift('#');
+ }
+ first = path_parts.shift();
+
+ if(first === '#') first = self.jsoneditor.schema.id || 'root';
+
+ // Find the root node for this template variable
+ root = self.theme.closest(self.container,'[data-schemaid="'+first+'"]');
+ if(!root) throw "Could not find ancestor node with id "+first;
+
+ // Keep track of the root node and path for use when rendering the template
+ adjusted_path = root.getAttribute('data-schemapath') + '.' + path_parts.join('.');
+
+ self.jsoneditor.watch(adjusted_path,self.watch_listener);
+
+ self.watched[name] = adjusted_path;
+ }
+ }
+
+ // Dynamic header
+ if(this.schema.headerTemplate) {
+ this.header_template = this.jsoneditor.compileTemplate(this.schema.headerTemplate, this.template_engine);
+ }
+ },
+
+ addLinks: function() {
+ // Add links
+ if(!this.no_link_holder) {
+ this.link_holder = this.theme.getLinksHolder();
+ this.container.appendChild(this.link_holder);
+ if(this.schema.links) {
+ for(var i=0; i<this.schema.links.length; i++) {
+ this.addLink(this.getLink(this.schema.links[i]));
+ }
+ }
+ }
+ },
+
+
+ getButton: function(text, icon, title) {
+ var btnClass = 'json-editor-btn-'+icon;
+ if(!this.iconlib) icon = null;
+ else icon = this.iconlib.getIcon(icon);
+
+ if(!icon && title) {
+ text = title;
+ title = null;
+ }
+
+ var btn = this.theme.getButton(text, icon, title);
+ btn.className += ' ' + btnClass + ' ';
+ return btn;
+ },
+ setButtonText: function(button, text, icon, title) {
+ if(!this.iconlib) icon = null;
+ else icon = this.iconlib.getIcon(icon);
+
+ if(!icon && title) {
+ text = title;
+ title = null;
+ }
+
+ return this.theme.setButtonText(button, text, icon, title);
+ },
+ addLink: function(link) {
+ if(this.link_holder) this.link_holder.appendChild(link);
+ },
+ getLink: function(data) {
+ var holder, link;
+
+ // Get mime type of the link
+ var mime = data.mediaType || 'application/javascript';
+ var type = mime.split('/')[0];
+
+ // Template to generate the link href
+ var href = this.jsoneditor.compileTemplate(data.href,this.template_engine);
+ var relTemplate = this.jsoneditor.compileTemplate(data.rel ? data.rel : data.href,this.template_engine);
+
+ // Template to generate the link's download attribute
+ var download = null;
+ if(data.download) download = data.download;
+
+ if(download && download !== true) {
+ download = this.jsoneditor.compileTemplate(download, this.template_engine);
+ }
+
+ // Image links
+ if(type === 'image') {
+ holder = this.theme.getBlockLinkHolder();
+ link = document.createElement('a');
+ link.setAttribute('target','_blank');
+ var image = document.createElement('img');
+
+ this.theme.createImageLink(holder,link,image);
+
+ // When a watched field changes, update the url
+ this.link_watchers.push(function(vars) {
+ var url = href(vars);
+ var rel = relTemplate(vars);
+ link.setAttribute('href',url);
+ link.setAttribute('title',rel || url);
+ image.setAttribute('src',url);
+ });
+ }
+ // Audio/Video links
+ else if(['audio','video'].indexOf(type) >=0) {
+ holder = this.theme.getBlockLinkHolder();
+
+ link = this.theme.getBlockLink();
+ link.setAttribute('target','_blank');
+
+ var media = document.createElement(type);
+ media.setAttribute('controls','controls');
+
+ this.theme.createMediaLink(holder,link,media);
+
+ // When a watched field changes, update the url
+ this.link_watchers.push(function(vars) {
+ var url = href(vars);
+ var rel = relTemplate(vars);
+ link.setAttribute('href',url);
+ link.textContent = rel || url;
+ media.setAttribute('src',url);
+ });
+ }
+ // Text links
+ else {
+ link = holder = this.theme.getBlockLink();
+ holder.setAttribute('target','_blank');
+ holder.textContent = data.rel;
+
+ // When a watched field changes, update the url
+ this.link_watchers.push(function(vars) {
+ var url = href(vars);
+ var rel = relTemplate(vars);
+ holder.setAttribute('href',url);
+ holder.textContent = rel || url;
+ });
+ }
+
+ if(download && link) {
+ if(download === true) {
+ link.setAttribute('download','');
+ }
+ else {
+ this.link_watchers.push(function(vars) {
+ link.setAttribute('download',download(vars));
+ });
+ }
+ }
+
+ if(data.class) link.className = link.className + ' ' + data.class;
+
+ return holder;
+ },
+ refreshWatchedFieldValues: function() {
+ if(!this.watched_values) return;
+ var watched = {};
+ var changed = false;
+ var self = this;
+
+ if(this.watched) {
+ var val,editor;
+ for(var name in this.watched) {
+ if(!this.watched.hasOwnProperty(name)) continue;
+ editor = self.jsoneditor.getEditor(this.watched[name]);
+ val = editor? editor.getValue() : null;
+ if(self.watched_values[name] !== val) changed = true;
+ watched[name] = val;
+ }
+ }
+
+ watched.self = this.getValue();
+ if(this.watched_values.self !== watched.self) changed = true;
+
+ this.watched_values = watched;
+
+ return changed;
+ },
+ getWatchedFieldValues: function() {
+ return this.watched_values;
+ },
+ updateHeaderText: function() {
+ if(this.header) {
+ // If the header has children, only update the text node's value
+ if(this.header.children.length) {
+ for(var i=0; i<this.header.childNodes.length; i++) {
+ if(this.header.childNodes[i].nodeType===3) {
+ this.header.childNodes[i].nodeValue = this.getHeaderText();
+ break;
+ }
+ }
+ }
+ // Otherwise, just update the entire node
+ else {
+ this.header.textContent = this.getHeaderText();
+ }
+ }
+ },
+ getHeaderText: function(title_only) {
+ if(this.header_text) return this.header_text;
+ else if(title_only) return this.schema.title;
+ else return this.getTitle();
+ },
+ onWatchedFieldChange: function() {
+ var vars;
+ if(this.header_template) {
+ vars = $extend(this.getWatchedFieldValues(),{
+ key: this.key,
+ i: this.key,
+ i0: (this.key*1),
+ i1: (this.key*1+1),
+ title: this.getTitle()
+ });
+ var header_text = this.header_template(vars);
+
+ if(header_text !== this.header_text) {
+ this.header_text = header_text;
+ this.updateHeaderText();
+ this.notify();
+ //this.fireChangeHeaderEvent();
+ }
+ }
+ if(this.link_watchers.length) {
+ vars = this.getWatchedFieldValues();
+ for(var i=0; i<this.link_watchers.length; i++) {
+ this.link_watchers[i](vars);
+ }
+ }
+ },
+ setValue: function(value) {
+ this.value = value;
+ },
+ getValue: function() {
+ if (!this.dependenciesFulfilled) {
+ return undefined;
+ }
+ return this.value;
+ },
+ refreshValue: function() {
+
+ },
+ getChildEditors: function() {
+ return false;
+ },
+ destroy: function() {
+ var self = this;
+ this.unregister(this);
+ $each(this.watched,function(name,adjusted_path) {
+ self.jsoneditor.unwatch(adjusted_path,self.watch_listener);
+ });
+ this.watched = null;
+ this.watched_values = null;
+ this.watch_listener = null;
+ this.header_text = null;
+ this.header_template = null;
+ this.value = null;
+ if(this.container && this.container.parentNode) this.container.parentNode.removeChild(this.container);
+ this.container = null;
+ this.jsoneditor = null;
+ this.schema = null;
+ this.path = null;
+ this.key = null;
+ this.parent = null;
+ },
+ getDefault: function() {
+ if (typeof this.schema["default"] !== 'undefined') {
+ return this.schema["default"];
+ }
+
+ if (typeof this.schema["enum"] !== 'undefined') {
+ return this.schema["enum"][0];
+ }
+
+ var type = this.schema.type || this.schema.oneOf;
+ if(type && Array.isArray(type)) type = type[0];
+ if(type && typeof type === "object") type = type.type;
+ if(type && Array.isArray(type)) type = type[0];
+
+ if(typeof type === "string") {
+ if(type === "number") return 0.0;
+ if(type === "boolean") return false;
+ if(type === "integer") return 0;
+ if(type === "string") return "";
+ if(type === "object") return {};
+ if(type === "array") return [];
+ }
+
+ return null;
+ },
+ getTitle: function() {
+ return this.schema.title || this.key;
+ },
+ enable: function() {
+ this.disabled = false;
+ },
+ disable: function() {
+ this.disabled = true;
+ },
+ isEnabled: function() {
+ return !this.disabled;
+ },
+ isRequired: function() {
+ if(typeof this.schema.required === "boolean") return this.schema.required;
+ else if(this.parent && this.parent.schema && Array.isArray(this.parent.schema.required)) return this.parent.schema.required.indexOf(this.key) > -1;
+ else if(this.jsoneditor.options.required_by_default) return true;
+ else return false;
+ },
+ getDisplayText: function(arr) {
+ var disp = [];
+ var used = {};
+
+ // Determine how many times each attribute name is used.
+ // This helps us pick the most distinct display text for the schemas.
+ $each(arr,function(i,el) {
+ if(el.title) {
+ used[el.title] = used[el.title] || 0;
+ used[el.title]++;
+ }
+ if(el.description) {
+ used[el.description] = used[el.description] || 0;
+ used[el.description]++;
+ }
+ if(el.format) {
+ used[el.format] = used[el.format] || 0;
+ used[el.format]++;
+ }
+ if(el.type) {
+ used[el.type] = used[el.type] || 0;
+ used[el.type]++;
+ }
+ });
+
+ // Determine display text for each element of the array
+ $each(arr,function(i,el) {
+ var name;
+
+ // If it's a simple string
+ if(typeof el === "string") name = el;
+ // Object
+ else if(el.title && used[el.title]<=1) name = el.title;
+ else if(el.format && used[el.format]<=1) name = el.format;
+ else if(el.type && used[el.type]<=1) name = el.type;
+ else if(el.description && used[el.description]<=1) name = el.descripton;
+ else if(el.title) name = el.title;
+ else if(el.format) name = el.format;
+ else if(el.type) name = el.type;
+ else if(el.description) name = el.description;
+ else if(JSON.stringify(el).length < 50) name = JSON.stringify(el);
+ else name = "type";
+
+ disp.push(name);
+ });
+
+ // Replace identical display text with "text 1", "text 2", etc.
+ var inc = {};
+ $each(disp,function(i,name) {
+ inc[name] = inc[name] || 0;
+ inc[name]++;
+
+ if(used[name] > 1) disp[i] = name + " " + inc[name];
+ });
+
+ return disp;
+ },
+ getOption: function(key) {
+ try {
+ throw "getOption is deprecated";
+ }
+ catch(e) {
+ window.console.error(e);
+ }
+
+ return this.options[key];
+ },
+ showValidationErrors: function(errors) {
+
+ }
+});
+
+JSONEditor.defaults.editors["null"] = JSONEditor.AbstractEditor.extend({
+ getValue: function() {
+ if (!this.dependenciesFulfilled) {
+ return undefined;
+ }
+ return null;
+ },
+ setValue: function() {
+ this.onChange();
+ },
+ getNumColumns: function() {
+ return 2;
+ }
+});
+
+JSONEditor.defaults.editors.qbldr = JSONEditor.AbstractEditor.extend({
+ register: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.setAttribute('name',this.formname);
+ },
+ unregister: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.removeAttribute('name');
+ },
+ setValue: function(value, initial) {
+ var self = this;
+
+ if(typeof value === "undefined" || typeof this.jqbldrId === "undefined" || value === this.value) {
+ return;
+ }
+
+ if ((initial === true) && (value !== "") && (value !== null)) {
+ $(this.jqbldrId).queryBuilder('off','rulesChanged');
+ $(this.jqbldrId).queryBuilder('setRulesFromSQL', value);
+ var filter_result = $(this.jqbldrId).queryBuilder('getSQL');
+ value = filter_result === null ? null : filter_result.sql;
+ $(this.jqbldrId).queryBuilder('on', 'rulesChanged', this.qbldrRulesChangedCb.bind(this));
+ }
+
+ this.input.value = value;
+ this.value = value;
+
+ // Bubble this setValue to parents if the value changed
+ this.onChange(true);
+ },
+ getValue: function() {
+ var self = this;
+
+ if (this.value === "" || this.value === null) {
+ return undefined;
+ } else {
+ return this.value;
+ }
+ },
+
+ getNumColumns: function() {
+ return 12;
+ },
+
+ qbldrRulesChangedCb: function(eventObj) {
+ var self = this;
+
+ $(this.jqbldrId).queryBuilder('off','rulesChanged');
+
+ var filter_result = $(this.jqbldrId).queryBuilder('getSQL');
+
+ if (filter_result !== null) {
+ this.setValue(filter_result.sql);
+ }
+
+ $(this.jqbldrId).queryBuilder('on', 'rulesChanged', this.qbldrRulesChangedCb.bind(this));
+
+ return;
+ },
+ preBuild: function() {
+ var self = this;
+ this._super();
+ },
+ build: function() {
+ var self = this;
+
+ this.qschema = this.schema.qschema;
+ this.qbldrId = this.path;
+ this.jqbldrId = '#' + this.qbldrId;
+ this.jqbldrId = this.jqbldrId.replace(/\./g,'\\.');
+
+ this.qgrid = this.theme.getGridContainer();
+ this.qgrid.style.padding = '4px';
+ this.qgrid.style.border = '1px solid #e3e3e3';
+
+ this.gridrow1 = this.theme.getGridRow();
+ this.gridrow1.style.padding = '4px';
+
+ this.gridrow2 = this.theme.getGridRow();
+ this.gridrow2.style.padding = '4px';
+
+ this.title = this.getTitle();
+ this.label = this.theme.getFormInputLabel(this.title);
+
+ this.input = this.theme.getTextareaInput();
+ this.input.disabled = 'true';
+
+ this.control = this.theme.getFormControl(this.label, this.input, this.description);
+
+ this.gridrow2.setAttribute('id',this.qbldrId);
+
+ this.container.appendChild(this.qgrid); // attach the grid to container
+
+ this.qgrid.appendChild(this.gridrow1); // attach gridrow1 to grid
+ this.gridrow1.appendChild(this.control); // attach control form to gridrow1
+
+ this.qgrid.appendChild(this.gridrow2);
+
+ var options = { conditions: [ 'AND', 'OR'], sort_filters: true };
+
+ $.extend(this.qschema, options);
+
+ $(this.jqbldrId).queryBuilder(this.qschema);
+
+ //$(this.jqbldrId).queryBuilder('on', 'rulesChanged', this.qbldrRulesChangedCb.bind(this));
+ //$(this.jqbldrId).queryBuilder('on', 'afterUpdateRuleValue', this.qbldrRulesChangedCb.bind(this));
+ $(this.jqbldrId).queryBuilder('on', 'rulesChanged', this.qbldrRulesChangedCb.bind(this));
+ },
+ enable: function() {
+ this._super();
+ },
+ disable: function() {
+ this._super();
+ },
+ afterInputReady: function() {
+ var self = this, options;
+ self.theme.afterInputReady(self.input);
+ },
+ refreshValue: function() {
+ this.value = this.input.value;
+ if(typeof this.value !== "string") this.value = '';
+ },
+ destroy: function() {
+ var self = this;
+ this._super();
+ },
+ /**
+ * This is overridden in derivative editors
+ */
+ sanitize: function(value) {
+ return value;
+ },
+ /**
+ * Re-calculates the value if needed
+ */
+ onWatchedFieldChange: function() {
+ var self = this, vars, j;
+
+ this._super();
+ },
+ showValidationErrors: function(errors) {
+ var self = this;
+
+ if(this.jsoneditor.options.show_errors === "always") {}
+ else if(this.previous_error_setting===this.jsoneditor.options.show_errors) return;
+
+ this.previous_error_setting = this.jsoneditor.options.show_errors;
+
+ var messages = [];
+ $each(errors,function(i,error) {
+ if(error.path === self.path) {
+ messages.push(error.message);
+ }
+ });
+
+ this.input.controlgroup = this.control;
+
+ if(messages.length) {
+ this.theme.addInputError(this.input, messages.join('. ')+'.');
+ }
+ else {
+ this.theme.removeInputError(this.input);
+ }
+ }
+});
+
+JSONEditor.defaults.editors.string = JSONEditor.AbstractEditor.extend({
+ register: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.setAttribute('name',this.formname);
+ },
+ unregister: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.removeAttribute('name');
+ },
+ setValue: function(value,initial,from_template) {
+ var self = this;
+
+ if(this.template && !from_template) {
+ return;
+ }
+
+ if(value === null || typeof value === 'undefined') value = "";
+ else if(typeof value === "object") value = JSON.stringify(value);
+ else if(typeof value !== "string") value = ""+value;
+
+ if(value === this.serialized) return;
+
+ // Sanitize value before setting it
+ var sanitized = this.sanitize(value);
+
+ if(this.input.value === sanitized) {
+ return;
+ }
+
+ this.input.value = sanitized;
+
+ // If using SCEditor, update the WYSIWYG
+ if(this.sceditor_instance) {
+ this.sceditor_instance.val(sanitized);
+ }
+ else if(this.SimpleMDE) {
+ this.SimpleMDE.value(sanitized);
+ }
+ else if(this.ace_editor) {
+ this.ace_editor.setValue(sanitized);
+ }
+
+ var changed = from_template || this.getValue() !== value;
+
+ this.refreshValue();
+
+ if(initial) this.is_dirty = false;
+ else if(this.jsoneditor.options.show_errors === "change") this.is_dirty = true;
+
+ if(this.adjust_height) this.adjust_height(this.input);
+
+ // Bubble this setValue to parents if the value changed
+ this.onChange(changed);
+ },
+ getNumColumns: function() {
+ var min = Math.ceil(Math.max(this.getTitle().length,this.schema.maxLength||0,this.schema.minLength||0)/5);
+ var num;
+
+ if(this.input_type === 'textarea') num = 6;
+ else if(['text','email'].indexOf(this.input_type) >= 0) num = 4;
+ else num = 2;
+
+ return Math.min(12,Math.max(min,num));
+ },
+ build: function() {
+ var self = this, i;
+ if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+ if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+ if(this.options.infoText) this.infoButton = this.theme.getInfoButton(this.options.infoText);
+
+ this.format = this.schema.format;
+ if(!this.format && this.schema.media && this.schema.media.type) {
+ this.format = this.schema.media.type.replace(/(^(application|text)\/(x-)?(script\.)?)|(-source$)/g,'');
+ }
+ if(!this.format && this.options.default_format) {
+ this.format = this.options.default_format;
+ }
+ if(this.options.format) {
+ this.format = this.options.format;
+ }
+
+ // Specific format
+ if(this.format) {
+ // Text Area
+ if(this.format === 'textarea') {
+ this.input_type = 'textarea';
+ this.input = this.theme.getTextareaInput();
+ }
+ // Range Input
+ else if(this.format === 'range') {
+ this.input_type = 'range';
+ var min = this.schema.minimum || 0;
+ var max = this.schema.maximum || Math.max(100,min+1);
+ var step = 1;
+ if(this.schema.multipleOf) {
+ if(min%this.schema.multipleOf) min = Math.ceil(min/this.schema.multipleOf)*this.schema.multipleOf;
+ if(max%this.schema.multipleOf) max = Math.floor(max/this.schema.multipleOf)*this.schema.multipleOf;
+ step = this.schema.multipleOf;
+ }
+
+ this.input = this.theme.getRangeInput(min,max,step);
+ }
+ // Source Code
+ else if([
+ 'actionscript',
+ 'batchfile',
+ 'bbcode',
+ 'c',
+ 'c++',
+ 'cpp',
+ 'coffee',
+ 'csharp',
+ 'css',
+ 'dart',
+ 'django',
+ 'ejs',
+ 'erlang',
+ 'golang',
+ 'groovy',
+ 'handlebars',
+ 'haskell',
+ 'haxe',
+ 'html',
+ 'ini',
+ 'jade',
+ 'java',
+ 'javascript',
+ 'json',
+ 'less',
+ 'lisp',
+ 'lua',
+ 'makefile',
+ 'markdown',
+ 'matlab',
+ 'mysql',
+ 'objectivec',
+ 'pascal',
+ 'perl',
+ 'pgsql',
+ 'php',
+ 'python',
+ 'r',
+ 'ruby',
+ 'sass',
+ 'scala',
+ 'scss',
+ 'smarty',
+ 'sql',
+ 'stylus',
+ 'svg',
+ 'twig',
+ 'vbscript',
+ 'xml',
+ 'yaml'
+ ].indexOf(this.format) >= 0
+ ) {
+ this.input_type = this.format;
+ this.source_code = true;
+
+ this.input = this.theme.getTextareaInput();
+ }
+ // HTML5 Input type
+ else {
+ this.input_type = this.format;
+ this.input = this.theme.getFormInputField(this.input_type);
+ }
+ }
+ // Normal text input
+ else {
+ this.input_type = 'text';
+ this.input = this.theme.getFormInputField(this.input_type);
+ }
+
+ // minLength, maxLength, and pattern
+ if(typeof this.schema.maxLength !== "undefined") this.input.setAttribute('maxlength',this.schema.maxLength);
+ if(typeof this.schema.pattern !== "undefined") this.input.setAttribute('pattern',this.schema.pattern);
+ else if(typeof this.schema.minLength !== "undefined") this.input.setAttribute('pattern','.{'+this.schema.minLength+',}');
+
+ if(this.options.compact) {
+ this.container.className += ' compact';
+ }
+ else {
+ if(this.options.input_width) this.input.style.width = this.options.input_width;
+ }
+
+ if(this.schema.readOnly || this.schema.readonly || this.schema.template) {
+ this.always_disabled = true;
+ this.input.disabled = true;
+ }
+
+ this.input
+ .addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ // Don't allow changing if this field is a template
+ if(self.schema.template) {
+ this.value = self.value;
+ return;
+ }
+
+ var val = this.value;
+
+ // sanitize value
+ var sanitized = self.sanitize(val);
+ if(val !== sanitized) {
+ this.value = sanitized;
+ }
+
+ self.is_dirty = true;
+
+ self.refreshValue();
+ self.onChange(true);
+ });
+
+ if(this.options.input_height) this.input.style.height = this.options.input_height;
+ if(this.options.expand_height) {
+ this.adjust_height = function(el) {
+ if(!el) return;
+ var i, ch=el.offsetHeight;
+ // Input too short
+ if(el.offsetHeight < el.scrollHeight) {
+ i=0;
+ while(el.offsetHeight < el.scrollHeight+3) {
+ if(i>100) break;
+ i++;
+ ch++;
+ el.style.height = ch+'px';
+ }
+ }
+ else {
+ i=0;
+ while(el.offsetHeight >= el.scrollHeight+3) {
+ if(i>100) break;
+ i++;
+ ch--;
+ el.style.height = ch+'px';
+ }
+ el.style.height = (ch+1)+'px';
+ }
+ };
+
+ this.input.addEventListener('keyup',function(e) {
+ self.adjust_height(this);
+ });
+ this.input.addEventListener('change',function(e) {
+ self.adjust_height(this);
+ });
+ this.adjust_height();
+ }
+
+ if(this.format) this.input.setAttribute('data-schemaformat',this.format);
+
+ this.control = this.theme.getFormControl(this.label, this.input, this.description, this.infoButton);
+ this.container.appendChild(this.control);
+
+ // Any special formatting that needs to happen after the input is added to the dom
+ window.requestAnimationFrame(function() {
+ // Skip in case the input is only a temporary editor,
+ // otherwise, in the case of an ace_editor creation,
+ // it will generate an error trying to append it to the missing parentNode
+ if(self.input.parentNode) self.afterInputReady();
+ if(self.adjust_height) self.adjust_height(self.input);
+ });
+
+ // Compile and store the template
+ if(this.schema.template) {
+ this.template = this.jsoneditor.compileTemplate(this.schema.template, this.template_engine);
+ this.refreshValue();
+ }
+ else {
+ this.refreshValue();
+ }
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ this.input.disabled = false;
+ // TODO: WYSIWYG and Markdown editors
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ this.input.disabled = true;
+ // TODO: WYSIWYG and Markdown editors
+ this._super();
+ },
+ afterInputReady: function() {
+ var self = this, options;
+
+ // Code editor
+ if(this.source_code) {
+ // WYSIWYG html and bbcode editor
+ if(this.options.wysiwyg &&
+ ['html','bbcode'].indexOf(this.input_type) >= 0 &&
+ window.jQuery && window.jQuery.fn && window.jQuery.fn.sceditor
+ ) {
+ options = $extend({},{
+ plugins: self.input_type==='html'? 'xhtml' : 'bbcode',
+ emoticonsEnabled: false,
+ width: '100%',
+ height: 300
+ },JSONEditor.plugins.sceditor,self.options.sceditor_options||{});
+
+ window.jQuery(self.input).sceditor(options);
+
+ self.sceditor_instance = window.jQuery(self.input).sceditor('instance');
+
+ self.sceditor_instance.blur(function() {
+ // Get editor's value
+ var val = window.jQuery("<div>"+self.sceditor_instance.val()+"</div>");
+ // Remove sceditor spans/divs
+ window.jQuery('#sceditor-start-marker,#sceditor-end-marker,.sceditor-nlf',val).remove();
+ // Set the value and update
+ self.input.value = val.html();
+ self.value = self.input.value;
+ self.is_dirty = true;
+ self.onChange(true);
+ });
+ }
+ // SimpleMDE for markdown (if it's loaded)
+ else if (this.input_type === 'markdown' && window.SimpleMDE) {
+ options = $extend({},JSONEditor.plugins.SimpleMDE,{
+ element: this.input
+ });
+
+ this.SimpleMDE = new window.SimpleMDE((options));
+
+ this.SimpleMDE.codemirror.on("change",function() {
+ self.value = self.SimpleMDE.value();
+ self.is_dirty = true;
+ self.onChange(true);
+ });
+ }
+ // ACE editor for everything else
+ else if(window.ace) {
+ var mode = this.input_type;
+ // aliases for c/cpp
+ if(mode === 'cpp' || mode === 'c++' || mode === 'c') {
+ mode = 'c_cpp';
+ }
+
+ this.ace_container = document.createElement('div');
+ this.ace_container.style.width = '100%';
+ this.ace_container.style.position = 'relative';
+ this.ace_container.style.height = '400px';
+ this.input.parentNode.insertBefore(this.ace_container,this.input);
+ this.input.style.display = 'none';
+ this.ace_editor = window.ace.edit(this.ace_container);
+
+ this.ace_editor.setValue(this.getValue());
+
+ // The theme
+ if(JSONEditor.plugins.ace.theme) this.ace_editor.setTheme('ace/theme/'+JSONEditor.plugins.ace.theme);
+ // The mode
+ this.ace_editor.getSession().setMode('ace/mode/' + this.schema.format);
+
+ // Listen for changes
+ this.ace_editor.on('change',function() {
+ var val = self.ace_editor.getValue();
+ self.input.value = val;
+ self.refreshValue();
+ self.is_dirty = true;
+ self.onChange(true);
+ });
+ }
+ }
+
+ self.theme.afterInputReady(self.input);
+ },
+ refreshValue: function() {
+ this.value = this.input.value;
+ if(typeof this.value !== "string") this.value = '';
+ this.serialized = this.value;
+ },
+ destroy: function() {
+ // If using SCEditor, destroy the editor instance
+ if(this.sceditor_instance) {
+ this.sceditor_instance.destroy();
+ }
+ else if(this.SimpleMDE) {
+ this.SimpleMDE.destroy();
+ }
+ else if(this.ace_editor) {
+ this.ace_editor.destroy();
+ }
+
+
+ this.template = null;
+ if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
+ if(this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label);
+ if(this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
+
+ this._super();
+ },
+ /**
+ * This is overridden in derivative editors
+ */
+ sanitize: function(value) {
+ return value;
+ },
+ /**
+ * Re-calculates the value if needed
+ */
+ onWatchedFieldChange: function() {
+ var self = this, vars, j;
+
+ // If this editor needs to be rendered by a macro template
+ if(this.template) {
+ vars = this.getWatchedFieldValues();
+ this.setValue(this.template(vars),false,true);
+ }
+
+ this._super();
+ },
+ showValidationErrors: function(errors) {
+ var self = this;
+
+ if(this.jsoneditor.options.show_errors === "always") {}
+ else if(!this.is_dirty && this.previous_error_setting===this.jsoneditor.options.show_errors) return;
+
+ this.previous_error_setting = this.jsoneditor.options.show_errors;
+
+ var messages = [];
+ $each(errors,function(i,error) {
+ if(error.path === self.path) {
+ messages.push(error.message);
+ }
+ });
+
+ this.input.controlgroup = this.control;
+
+ if(messages.length) {
+ this.theme.addInputError(this.input, messages.join('. ')+'.');
+ }
+ else {
+ this.theme.removeInputError(this.input);
+ }
+ }
+});
+
+/**
+ * Created by Mehmet Baker on 12.04.2017
+ */
+JSONEditor.defaults.editors.hidden = JSONEditor.AbstractEditor.extend({
+ register: function () {
+ this._super();
+ if (!this.input) return;
+ this.input.setAttribute('name', this.formname);
+ },
+ unregister: function () {
+ this._super();
+ if (!this.input) return;
+ this.input.removeAttribute('name');
+ },
+ setValue: function (value, initial, from_template) {
+ var self = this;
+
+ if(this.template && !from_template) {
+ return;
+ }
+
+ if(value === null || typeof value === 'undefined') value = "";
+ else if(typeof value === "object") value = JSON.stringify(value);
+ else if(typeof value !== "string") value = ""+value;
+
+ if(value === this.serialized) return;
+
+ // Sanitize value before setting it
+ var sanitized = this.sanitize(value);
+
+ if(this.input.value === sanitized) {
+ return;
+ }
+
+ this.input.value = sanitized;
+
+ var changed = from_template || this.getValue() !== value;
+
+ this.refreshValue();
+
+ if(initial) this.is_dirty = false;
+ else if(this.jsoneditor.options.show_errors === "change") this.is_dirty = true;
+
+ if(this.adjust_height) this.adjust_height(this.input);
+
+ // Bubble this setValue to parents if the value changed
+ this.onChange(changed);
+ },
+ getNumColumns: function () {
+ return 2;
+ },
+ enable: function () {
+ this._super();
+ },
+ disable: function () {
+ this._super();
+ },
+ refreshValue: function () {
+ this.value = this.input.value;
+ if (typeof this.value !== "string") this.value = '';
+ this.serialized = this.value;
+ },
+ destroy: function () {
+ this.template = null;
+ if (this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
+ if (this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label);
+ if (this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
+
+ this._super();
+ },
+ /**
+ * This is overridden in derivative editors
+ */
+ sanitize: function (value) {
+ return value;
+ },
+ /**
+ * Re-calculates the value if needed
+ */
+ onWatchedFieldChange: function () {
+ var self = this, vars, j;
+
+ // If this editor needs to be rendered by a macro template
+ if (this.template) {
+ vars = this.getWatchedFieldValues();
+ this.setValue(this.template(vars), false, true);
+ }
+
+ this._super();
+ },
+ build: function () {
+ var self = this;
+
+ this.format = this.schema.format;
+ if (!this.format && this.options.default_format) {
+ this.format = this.options.default_format;
+ }
+ if (this.options.format) {
+ this.format = this.options.format;
+ }
+
+ this.input_type = 'hidden';
+ this.input = this.theme.getFormInputField(this.input_type);
+
+ if (this.format) this.input.setAttribute('data-schemaformat', this.format);
+
+ this.container.appendChild(this.input);
+
+ // Compile and store the template
+ if (this.schema.template) {
+ this.template = this.jsoneditor.compileTemplate(this.schema.template, this.template_engine);
+ this.refreshValue();
+ }
+ else {
+ this.refreshValue();
+ }
+ }
+});
+JSONEditor.defaults.editors.number = JSONEditor.defaults.editors.string.extend({
+ build: function() {
+ this._super();
+
+ if (typeof this.schema.minimum !== "undefined") {
+ var minimum = this.schema.minimum;
+
+ if (typeof this.schema.exclusiveMinimum !== "undefined") {
+ minimum += 1;
+ }
+
+ this.input.setAttribute("min", minimum);
+ }
+
+ if (typeof this.schema.maximum !== "undefined") {
+ var maximum = this.schema.maximum;
+
+ if (typeof this.schema.exclusiveMaximum !== "undefined") {
+ maximum -= 1;
+ }
+
+ this.input.setAttribute("max", maximum);
+ }
+
+ if (typeof this.schema.step !== "undefined") {
+ var step = this.schema.step || 1;
+ this.input.setAttribute("step", step);
+ }
+
+ },
+ sanitize: function(value) {
+ return (value+"").replace(/[^0-9\.\-eE]/g,'');
+ },
+ getNumColumns: function() {
+ return 2;
+ },
+ getValue: function() {
+ if (!this.dependenciesFulfilled) {
+ return undefined;
+ }
+ return this.value===''?undefined:this.value*1;
+ }
+});
+
+JSONEditor.defaults.editors.integer = JSONEditor.defaults.editors.number.extend({
+ sanitize: function(value) {
+ value = value + "";
+ return value.replace(/[^0-9\-]/g,'');
+ },
+ getNumColumns: function() {
+ return 2;
+ }
+});
+
+JSONEditor.defaults.editors.rating = JSONEditor.defaults.editors.integer.extend({
+ build: function() {
+ var self = this, i;
+ if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+ if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+
+ // Dynamically add the required CSS the first time this editor is used
+ var styleId = 'json-editor-style-rating';
+ var styles = document.getElementById(styleId);
+ if (!styles) {
+ var style = document.createElement('style');
+ style.id = styleId;
+ style.type = 'text/css';
+ style.innerHTML =
+ ' .rating-container {' +
+ ' display: inline-block;' +
+ ' clear: both;' +
+ ' }' +
+ ' ' +
+ ' .rating {' +
+ ' float:left;' +
+ ' }' +
+ ' ' +
+ ' /* :not(:checked) is a filter, so that browsers that don’t support :checked don’t' +
+ ' follow these rules. Every browser that supports :checked also supports :not(), so' +
+ ' it doesn’t make the test unnecessarily selective */' +
+ ' .rating:not(:checked) > input {' +
+ ' position:absolute;' +
+ ' top:-9999px;' +
+ ' clip:rect(0,0,0,0);' +
+ ' }' +
+ ' ' +
+ ' .rating:not(:checked) > label {' +
+ ' float:right;' +
+ ' width:1em;' +
+ ' padding:0 .1em;' +
+ ' overflow:hidden;' +
+ ' white-space:nowrap;' +
+ ' cursor:pointer;' +
+ ' color:#ddd;' +
+ ' }' +
+ ' ' +
+ ' .rating:not(:checked) > label:before {' +
+ ' content: \'★ \';' +
+ ' }' +
+ ' ' +
+ ' .rating > input:checked ~ label {' +
+ ' color: #FFB200;' +
+ ' }' +
+ ' ' +
+ ' .rating:not([readOnly]):not(:checked) > label:hover,' +
+ ' .rating:not([readOnly]):not(:checked) > label:hover ~ label {' +
+ ' color: #FFDA00;' +
+ ' }' +
+ ' ' +
+ ' .rating:not([readOnly]) > input:checked + label:hover,' +
+ ' .rating:not([readOnly]) > input:checked + label:hover ~ label,' +
+ ' .rating:not([readOnly]) > input:checked ~ label:hover,' +
+ ' .rating:not([readOnly]) > input:checked ~ label:hover ~ label,' +
+ ' .rating:not([readOnly]) > label:hover ~ input:checked ~ label {' +
+ ' color: #FF8C0D;' +
+ ' }' +
+ ' ' +
+ ' .rating:not([readOnly]) > label:active {' +
+ ' position:relative;' +
+ ' top:2px;' +
+ ' left:2px;' +
+ ' }';
+ document.getElementsByTagName('head')[0].appendChild(style);
+ }
+
+ this.input = this.theme.getFormInputField('hidden');
+ this.container.appendChild(this.input);
+
+ // Required to keep height
+ var ratingContainer = document.createElement('div');
+ ratingContainer.className = 'rating-container';
+
+ // Contains options for rating
+ var group = document.createElement('div');
+ group.setAttribute('name', this.formname);
+ group.className = 'rating';
+ ratingContainer.appendChild(group);
+
+ if(this.options.compact) this.container.setAttribute('class',this.container.getAttribute('class')+' compact');
+
+ var max = this.schema.maximum ? this.schema.maximum : 5;
+ if (this.schema.exclusiveMaximum) max--;
+
+ this.inputs = [];
+ for(i=max; i>0; i--) {
+ var id = this.formname + i;
+ var radioInput = this.theme.getFormInputField('radio');
+ radioInput.setAttribute('id', id);
+ radioInput.setAttribute('value', i);
+ radioInput.setAttribute('name', this.formname);
+ group.appendChild(radioInput);
+ this.inputs.push(radioInput);
+
+ var label = document.createElement('label');
+ label.setAttribute('for', id);
+ label.appendChild(document.createTextNode(i + (i == 1 ? ' star' : ' stars')));
+ group.appendChild(label);
+ }
+
+ if(this.schema.readOnly || this.schema.readonly) {
+ this.always_disabled = true;
+ $each(this.inputs,function(i,input) {
+ group.setAttribute("readOnly", "readOnly");
+ input.disabled = true;
+ });
+ }
+
+ ratingContainer
+ .addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ self.input.value = e.srcElement.value;
+
+ self.is_dirty = true;
+
+ self.refreshValue();
+ self.watch_listener();
+ self.jsoneditor.notifyWatchers(self.path);
+ if(self.parent) self.parent.onChildEditorChange(self);
+ else self.jsoneditor.onChange();
+ });
+
+ this.control = this.theme.getFormControl(this.label, ratingContainer, this.description);
+ this.container.appendChild(this.control);
+
+ this.refreshValue();
+ },
+ setValue: function(val) {
+ var sanitized = this.sanitize(val);
+ if(this.value === sanitized) {
+ return;
+ }
+ var self = this;
+ $each(this.inputs,function(i,input) {
+ if (input.value === sanitized) {
+ input.checked = true;
+ self.value = sanitized;
+ self.input.value = self.value;
+ self.watch_listener();
+ self.jsoneditor.notifyWatchers(self.path);
+ return false;
+ }
+ });
+ }
+});
+
+JSONEditor.defaults.editors.object = JSONEditor.AbstractEditor.extend({
+ getDefault: function() {
+ return $extend({},this.schema["default"] || {});
+ },
+ getChildEditors: function() {
+ return this.editors;
+ },
+ register: function() {
+ this._super();
+ if(this.editors) {
+ for(var i in this.editors) {
+ if(!this.editors.hasOwnProperty(i)) continue;
+ this.editors[i].register();
+ }
+ }
+ },
+ unregister: function() {
+ this._super();
+ if(this.editors) {
+ for(var i in this.editors) {
+ if(!this.editors.hasOwnProperty(i)) continue;
+ this.editors[i].unregister();
+ }
+ }
+ },
+ getNumColumns: function() {
+ return Math.max(Math.min(12,this.maxwidth),3);
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ if(this.editjson_button) this.editjson_button.disabled = false;
+ if(this.addproperty_button) this.addproperty_button.disabled = false;
+
+ this._super();
+ if(this.editors) {
+ for(var i in this.editors) {
+ if(!this.editors.hasOwnProperty(i)) continue;
+ this.editors[i].enable();
+ }
+ }
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ if(this.editjson_button) this.editjson_button.disabled = true;
+ if(this.addproperty_button) this.addproperty_button.disabled = true;
+ this.hideEditJSON();
+
+ this._super();
+ if(this.editors) {
+ for(var i in this.editors) {
+ if(!this.editors.hasOwnProperty(i)) continue;
+ this.editors[i].disable(always_disabled);
+ }
+ }
+ },
+ layoutEditors: function() {
+ var self = this, i, j;
+
+ if(!this.row_container) return;
+
+ // Sort editors by propertyOrder
+ this.property_order = Object.keys(this.editors);
+ this.property_order = this.property_order.sort(function(a,b) {
+ var ordera = self.editors[a].schema.propertyOrder;
+ var orderb = self.editors[b].schema.propertyOrder;
+ if(typeof ordera !== "number") ordera = 1000;
+ if(typeof orderb !== "number") orderb = 1000;
+
+ return ordera - orderb;
+ });
+
+ var container = document.createElement('div');
+ var isCategoriesFormat = (this.format === 'categories');
+
+ if(this.format === 'grid') {
+ var rows = [];
+ $each(this.property_order, function(j,key) {
+ var editor = self.editors[key];
+ if(editor.property_removed) return;
+ var found = false;
+ var width = editor.options.hidden? 0 : (editor.options.grid_columns || editor.getNumColumns());
+ var height = editor.options.hidden? 0 : editor.container.offsetHeight;
+ // See if the editor will fit in any of the existing rows first
+ for(var i=0; i<rows.length; i++) {
+ // If the editor will fit in the row horizontally
+ if(rows[i].width + width <= 12) {
+ // If the editor is close to the other elements in height
+ // i.e. Don't put a really tall editor in an otherwise short row or vice versa
+ if(!height || (rows[i].minh*0.5 < height && rows[i].maxh*2 > height)) {
+ found = i;
+ }
+ }
+ }
+
+ // If there isn't a spot in any of the existing rows, start a new row
+ if(found === false) {
+ rows.push({
+ width: 0,
+ minh: 999999,
+ maxh: 0,
+ editors: []
+ });
+ found = rows.length-1;
+ }
+
+ rows[found].editors.push({
+ key: key,
+ //editor: editor,
+ width: width,
+ height: height
+ });
+ rows[found].width += width;
+ rows[found].minh = Math.min(rows[found].minh,height);
+ rows[found].maxh = Math.max(rows[found].maxh,height);
+ });
+
+ // Make almost full rows width 12
+ // Do this by increasing all editors' sizes proprotionately
+ // Any left over space goes to the biggest editor
+ // Don't touch rows with a width of 6 or less
+ for(i=0; i<rows.length; i++) {
+ if(rows[i].width < 12) {
+ var biggest = false;
+ var new_width = 0;
+ for(j=0; j<rows[i].editors.length; j++) {
+ if(biggest === false) biggest = j;
+ else if(rows[i].editors[j].width > rows[i].editors[biggest].width) biggest = j;
+ rows[i].editors[j].width *= 12/rows[i].width;
+ rows[i].editors[j].width = Math.floor(rows[i].editors[j].width);
+ new_width += rows[i].editors[j].width;
+ }
+ if(new_width < 12) rows[i].editors[biggest].width += 12-new_width;
+ rows[i].width = 12;
+ }
+ }
+
+ // layout hasn't changed
+ if(this.layout === JSON.stringify(rows)) return false;
+ this.layout = JSON.stringify(rows);
+
+ // Layout the form
+ for(i=0; i<rows.length; i++) {
+ var row = this.theme.getGridRow();
+ container.appendChild(row);
+ for(j=0; j<rows[i].editors.length; j++) {
+ var key = rows[i].editors[j].key;
+ var editor = this.editors[key];
+
+ if(editor.options.hidden) editor.container.style.display = 'none';
+ else this.theme.setGridColumnSize(editor.container,rows[i].editors[j].width);
+ row.appendChild(editor.container);
+ }
+ }
+ }
+ // Normal layout
+ else if(isCategoriesFormat) {
+ //A container for properties not object nor arrays
+ var containerSimple = document.createElement('div');
+ //This will be the place to (re)build tabs and panes
+ //tabs_holder has 2 childs, [0]: ul.nav.nav-tabs and [1]: div.tab-content
+ var newTabs_holder = this.theme.getTopTabHolder(this.schema.title);
+ //child [1] of previous, stores panes
+ var newTabPanesContainer = this.theme.getTopTabContentHolder(newTabs_holder);
+
+ $each(this.property_order, function(i,key){
+ var editor = self.editors[key];
+ if(editor.property_removed) return;
+ var aPane = self.theme.getTabContent();
+ var isObjOrArray = editor.schema && (editor.schema.type === "object" || editor.schema.type === "array");
+ //mark the pane
+ aPane.isObjOrArray = isObjOrArray;
+ var gridRow = self.theme.getGridRow();
+
+ //this happens with added properties, they don't have a tab
+ if(!editor.tab){
+ //Pass the pane which holds the editor
+ if(typeof self.basicPane === 'undefined'){
+ //There is no basicPane yet, so aPane will be it
+ self.addRow(editor,newTabs_holder, aPane);
+ }
+ else {
+ self.addRow(editor,newTabs_holder, self.basicPane);
+ }
+ }
+
+ aPane.id = editor.tab_text.textContent;
+
+ //For simple properties, add them on the same panel (Basic)
+ if(!isObjOrArray){
+ containerSimple.appendChild(gridRow);
+ //There is already some panes
+ if(newTabPanesContainer.childElementCount > 0){
+ //If first pane is object or array, insert before a simple pane
+ if(newTabPanesContainer.firstChild.isObjOrArray){
+ //Append pane for simple properties
+ aPane.appendChild(containerSimple);
+ newTabPanesContainer.insertBefore(aPane,newTabPanesContainer.firstChild);
+ //Add "Basic" tab
+ self.theme.insertBasicTopTab(editor.tab,newTabs_holder);
+ //newTabs_holder.firstChild.insertBefore(editor.tab,newTabs_holder.firstChild.firstChild);
+ //Update the basicPane
+ editor.basicPane = aPane;
+ }
+ else {
+ //We already have a first "Basic" pane, just add the new property to it, so
+ //do nothing;
+ }
+ }
+ //There is no pane, so add the first (simple) pane
+ else {
+ //Append pane for simple properties
+ aPane.appendChild(containerSimple);
+ newTabPanesContainer.appendChild(aPane);
+ //Add "Basic" tab
+ //newTabs_holder.firstChild.appendChild(editor.tab);
+ self.theme.addTopTab(newTabs_holder,editor.tab);
+ //Update the basicPane
+ editor.basicPane = aPane;
+ }
+ }
+ //Objects and arrays earn it's own panes
+ else {
+ aPane.appendChild(gridRow);
+ newTabPanesContainer.appendChild(aPane);
+ //newTabs_holder.firstChild.appendChild(editor.tab);
+ self.theme.addTopTab(newTabs_holder,editor.tab);
+ }
+
+ if(editor.options.hidden) editor.container.style.display = 'none';
+ else self.theme.setGridColumnSize(editor.container,12);
+ //Now, add the property editor to the row
+ gridRow.appendChild(editor.container);
+ //Update the container (same as self.rows[x].container)
+ editor.container = aPane;
+
+ });
+
+ //Erase old panes
+ while (this.tabPanesContainer.firstChild) {
+ this.tabPanesContainer.removeChild(this.tabPanesContainer.firstChild);
+ }
+
+ //Erase old tabs and set the new ones
+ var parentTabs_holder = this.tabs_holder.parentNode;
+ parentTabs_holder.removeChild(parentTabs_holder.firstChild);
+ parentTabs_holder.appendChild(newTabs_holder);
+
+ this.tabPanesContainer = newTabPanesContainer;
+ this.tabs_holder = newTabs_holder;
+
+ //Activate the first tab
+ var firstTab = this.theme.getFirstTab(this.tabs_holder);
+ if(firstTab){
+ $trigger(firstTab,'click');
+ }
+ return;
+ }
+ // !isCategoriesFormat
+ else {
+ $each(this.property_order, function(i,key) {
+ var editor = self.editors[key];
+ if(editor.property_removed) return;
+ var row = self.theme.getGridRow();
+ container.appendChild(row);
+
+ if(editor.options.hidden) editor.container.style.display = 'none';
+ else self.theme.setGridColumnSize(editor.container,12);
+ row.appendChild(editor.container);
+ });
+ }
+ //for grid and normal layout
+ while (this.row_container.firstChild) {
+ this.row_container.removeChild(this.row_container.firstChild);
+ }
+ this.row_container.appendChild(container);
+ },
+ getPropertySchema: function(key) {
+ // Schema declared directly in properties
+ var schema = this.schema.properties[key] || {};
+ schema = $extend({},schema);
+ var matched = this.schema.properties[key]? true : false;
+
+ // Any matching patternProperties should be merged in
+ if(this.schema.patternProperties) {
+ for(var i in this.schema.patternProperties) {
+ if(!this.schema.patternProperties.hasOwnProperty(i)) continue;
+ var regex = new RegExp(i);
+ if(regex.test(key)) {
+ schema.allOf = schema.allOf || [];
+ schema.allOf.push(this.schema.patternProperties[i]);
+ matched = true;
+ }
+ }
+ }
+
+ // Hasn't matched other rules, use additionalProperties schema
+ if(!matched && this.schema.additionalProperties && typeof this.schema.additionalProperties === "object") {
+ schema = $extend({},this.schema.additionalProperties);
+ }
+
+ return schema;
+ },
+ preBuild: function() {
+ this._super();
+
+ this.editors = {};
+ this.cached_editors = {};
+ var self = this;
+
+ this.format = this.options.layout || this.options.object_layout || this.schema.format || this.jsoneditor.options.object_layout || 'normal';
+
+ this.schema.properties = this.schema.properties || {};
+
+ this.minwidth = 0;
+ this.maxwidth = 0;
+
+ // If the object should be rendered as a table row
+ if(this.options.table_row) {
+ $each(this.schema.properties, function(key,schema) {
+ var editor = self.jsoneditor.getEditorClass(schema);
+ self.editors[key] = self.jsoneditor.createEditor(editor,{
+ jsoneditor: self.jsoneditor,
+ schema: schema,
+ path: self.path+'.'+key,
+ parent: self,
+ compact: true,
+ required: true
+ });
+ self.editors[key].preBuild();
+
+ var width = self.editors[key].options.hidden? 0 : (self.editors[key].options.grid_columns || self.editors[key].getNumColumns());
+
+ self.minwidth += width;
+ self.maxwidth += width;
+ });
+ this.no_link_holder = true;
+ }
+ // If the object should be rendered as a table
+ else if(this.options.table) {
+ // TODO: table display format
+ throw "Not supported yet";
+ }
+ // If the object should be rendered as a div
+ else {
+ if(!this.schema.defaultProperties) {
+ if(this.jsoneditor.options.display_required_only || this.options.display_required_only) {
+ this.schema.defaultProperties = [];
+ $each(this.schema.properties, function(k,s) {
+ if(self.isRequired({key: k, schema: s})) {
+ self.schema.defaultProperties.push(k);
+ }
+ });
+ }
+ else {
+ self.schema.defaultProperties = Object.keys(self.schema.properties);
+ }
+ }
+
+ // Increase the grid width to account for padding
+ self.maxwidth += 1;
+
+ $each(this.schema.defaultProperties, function(i,key) {
+ self.addObjectProperty(key, true);
+
+ if(self.editors[key]) {
+ self.minwidth = Math.max(self.minwidth,(self.editors[key].options.grid_columns || self.editors[key].getNumColumns()));
+ self.maxwidth += (self.editors[key].options.grid_columns || self.editors[key].getNumColumns());
+ }
+ });
+ }
+
+ // Sort editors by propertyOrder
+ this.property_order = Object.keys(this.editors);
+ this.property_order = this.property_order.sort(function(a,b) {
+ var ordera = self.editors[a].schema.propertyOrder;
+ var orderb = self.editors[b].schema.propertyOrder;
+ if(typeof ordera !== "number") ordera = 1000;
+ if(typeof orderb !== "number") orderb = 1000;
+
+ return ordera - orderb;
+ });
+ },
+ //"Borrow" from arrays code
+ addTab: function(idx){
+ var self = this;
+ var isObjOrArray = self.rows[idx].schema && (self.rows[idx].schema.type === "object" || self.rows[idx].schema.type === "array");
+ if(self.tabs_holder) {
+ self.rows[idx].tab_text = document.createElement('span');
+
+ if(!isObjOrArray){
+ self.rows[idx].tab_text.textContent = (typeof self.schema.basicCategoryTitle === 'undefined') ? "Basic" : self.schema.basicCategoryTitle;
+ } else {
+ self.rows[idx].tab_text.textContent = self.rows[idx].getHeaderText();
+ }
+ self.rows[idx].tab = self.theme.getTopTab(self.rows[idx].tab_text,self.rows[idx].tab_text.textContent);
+ self.rows[idx].tab.addEventListener('click', function(e) {
+ self.active_tab = self.rows[idx].tab;
+ self.refreshTabs();
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ }
+
+ },
+ addRow: function(editor, tabHolder, holder) {
+ var self = this;
+ var rowsLen = this.rows.length;
+ var isObjOrArray = editor.schema.type === "object" || editor.schema.type === "array";
+
+ //Add a row
+ self.rows[rowsLen] = editor;
+ //container stores the editor corresponding pane to set the display style when refreshing Tabs
+ self.rows[rowsLen].container = holder;
+
+ if(!isObjOrArray){
+
+ //This is the first simple property to be added,
+ //add a ("Basic") tab for it and save it's row number
+ if(typeof self.basicTab === "undefined"){
+ self.addTab(rowsLen);
+ //Store the index row of the first simple property added
+ self.basicTab = rowsLen;
+ self.basicPane = holder;
+ self.theme.addTopTab(tabHolder, self.rows[rowsLen].tab);
+ }
+
+ else {
+ //Any other simple property gets the same tab (and the same pane) as the first one,
+ //so, when 'click' event is fired from a row, it gets the correct ("Basic") tab
+ self.rows[rowsLen].tab = self.rows[self.basicTab].tab;
+ self.rows[rowsLen].tab_text = self.rows[self.basicTab].tab_text;
+ self.rows[rowsLen].container = self.rows[self.basicTab].container;
+ }
+ }
+ else {
+ self.addTab(rowsLen);
+ self.theme.addTopTab(tabHolder, self.rows[rowsLen].tab);
+ }
+ },
+ //Mark the active tab and make visible the corresponding pane, hide others
+ refreshTabs: function(refresh_headers) {
+ var self = this;
+ var basicTabPresent = typeof self.basicTab !== 'undefined';
+ var basicTabRefreshed = false;
+
+ $each(this.rows, function(i,row) {
+ //If it's an orphan row (some property which has been deleted), return
+ if(!row.tab || !row.container || !row.container.parentNode) return;
+
+ if(basicTabPresent && row.tab == self.rows[self.basicTab].tab && basicTabRefreshed) return;
+
+ if(refresh_headers) {
+ row.tab_text.textContent = row.getHeaderText();
+ }
+ else {
+ //All rows of simple properties point to the same tab, so refresh just once
+ if(basicTabPresent && row.tab == self.rows[self.basicTab].tab) basicTabRefreshed = true;
+
+ if(row.tab === self.active_tab) {
+ self.theme.markTabActive(row);
+ }
+ else {
+ self.theme.markTabInactive(row);
+ }
+ }
+ });
+ },
+ build: function() {
+ var self = this;
+
+ var isCategoriesFormat = (this.format === 'categories');
+ this.rows=[];
+ this.active_tab = null;
+
+ // If the object should be rendered as a table row
+ if(this.options.table_row) {
+ this.editor_holder = this.container;
+ $each(this.editors, function(key,editor) {
+ var holder = self.theme.getTableCell();
+ self.editor_holder.appendChild(holder);
+
+ editor.setContainer(holder);
+ editor.build();
+ editor.postBuild();
+
+ if(self.editors[key].options.hidden) {
+ holder.style.display = 'none';
+ }
+ if(self.editors[key].options.input_width) {
+ holder.style.width = self.editors[key].options.input_width;
+ }
+ });
+ }
+ // If the object should be rendered as a table
+ else if(this.options.table) {
+ // TODO: table display format
+ throw "Not supported yet";
+ }
+ // If the object should be rendered as a div
+ else {
+ this.header = document.createElement('span');
+ this.header.textContent = this.getTitle();
+ this.title = this.theme.getHeader(this.header);
+ this.container.appendChild(this.title);
+ this.container.style.position = 'relative';
+
+ // Edit JSON modal
+ this.editjson_holder = this.theme.getModal();
+ this.editjson_textarea = this.theme.getTextareaInput();
+ this.editjson_textarea.style.height = '170px';
+ this.editjson_textarea.style.width = '300px';
+ this.editjson_textarea.style.display = 'block';
+ this.editjson_save = this.getButton('Save','save','Save');
+ this.editjson_save.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.saveJSON();
+ });
+ this.editjson_cancel = this.getButton('Cancel','cancel','Cancel');
+ this.editjson_cancel.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.hideEditJSON();
+ });
+ this.editjson_holder.appendChild(this.editjson_textarea);
+ this.editjson_holder.appendChild(this.editjson_save);
+ this.editjson_holder.appendChild(this.editjson_cancel);
+
+ // Manage Properties modal
+ this.addproperty_holder = this.theme.getModal();
+ this.addproperty_list = document.createElement('div');
+ this.addproperty_list.style.width = '295px';
+ this.addproperty_list.style.maxHeight = '160px';
+ this.addproperty_list.style.padding = '5px 0';
+ this.addproperty_list.style.overflowY = 'auto';
+ this.addproperty_list.style.overflowX = 'hidden';
+ this.addproperty_list.style.paddingLeft = '5px';
+ this.addproperty_list.setAttribute('class', 'property-selector');
+ this.addproperty_add = this.getButton('add','add','add');
+ this.addproperty_input = this.theme.getFormInputField('text');
+ this.addproperty_input.setAttribute('placeholder','Property name...');
+ this.addproperty_input.style.width = '220px';
+ this.addproperty_input.style.marginBottom = '0';
+ this.addproperty_input.style.display = 'inline-block';
+ this.addproperty_add.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ if(self.addproperty_input.value) {
+ if(self.editors[self.addproperty_input.value]) {
+ window.alert('there is already a property with that name');
+ return;
+ }
+
+ self.addObjectProperty(self.addproperty_input.value);
+ if(self.editors[self.addproperty_input.value]) {
+ self.editors[self.addproperty_input.value].disable();
+ }
+ self.onChange(true);
+ }
+ });
+ this.addproperty_holder.appendChild(this.addproperty_list);
+ this.addproperty_holder.appendChild(this.addproperty_input);
+ this.addproperty_holder.appendChild(this.addproperty_add);
+ var spacer = document.createElement('div');
+ spacer.style.clear = 'both';
+ this.addproperty_holder.appendChild(spacer);
+
+
+ // Description
+ if(this.schema.description) {
+ this.description = this.theme.getDescription(this.schema.description);
+ this.container.appendChild(this.description);
+ }
+
+ // Validation error placeholder area
+ this.error_holder = document.createElement('div');
+ this.container.appendChild(this.error_holder);
+
+ // Container for child editor area
+ this.editor_holder = this.theme.getIndentedPanel();
+ this.container.appendChild(this.editor_holder);
+
+ // Container for rows of child editors
+ this.row_container = this.theme.getGridContainer();
+
+ if(isCategoriesFormat) {
+ this.tabs_holder = this.theme.getTopTabHolder(this.schema.title);
+ this.tabPanesContainer = this.theme.getTopTabContentHolder(this.tabs_holder);
+ this.editor_holder.appendChild(this.tabs_holder);
+ }
+ else {
+ this.tabs_holder = this.theme.getTabHolder(this.schema.title);
+ this.tabPanesContainer = this.theme.getTabContentHolder(this.tabs_holder);
+ this.editor_holder.appendChild(this.row_container);
+ }
+
+ $each(this.editors, function(key,editor) {
+ var aPane = self.theme.getTabContent();
+ var holder = self.theme.getGridColumn();
+ var isObjOrArray = (editor.schema && (editor.schema.type === 'object' || editor.schema.type === 'array')) ? true : false;
+ aPane.isObjOrArray = isObjOrArray;
+
+ if(isCategoriesFormat){
+ if(isObjOrArray) {
+ var single_row_container = self.theme.getGridContainer();
+ single_row_container.appendChild(holder);
+ aPane.appendChild(single_row_container);
+ self.tabPanesContainer.appendChild(aPane);
+ self.row_container = single_row_container;
+ }
+ else {
+ if(typeof self.row_container_basic === 'undefined'){
+ self.row_container_basic = self.theme.getGridContainer();
+ aPane.appendChild(self.row_container_basic);
+ if(self.tabPanesContainer.childElementCount == 0){
+ self.tabPanesContainer.appendChild(aPane);
+ }
+ else {
+ self.tabPanesContainer.insertBefore(aPane,self.tabPanesContainer.childNodes[1]);
+ }
+ }
+ self.row_container_basic.appendChild(holder);
+ }
+
+ self.addRow(editor,self.tabs_holder,aPane);
+
+ aPane.id = editor.schema.title; //editor.schema.path//tab_text.textContent
+
+ }
+ else {
+ self.row_container.appendChild(holder);
+ }
+
+ editor.setContainer(holder);
+ editor.build();
+ editor.postBuild();
+ });
+
+ if(this.rows[0]){
+ $trigger(this.rows[0].tab,'click');
+ }
+
+ // Control buttons
+ this.title_controls = this.theme.getHeaderButtonHolder();
+ this.editjson_controls = this.theme.getHeaderButtonHolder();
+ this.addproperty_controls = this.theme.getHeaderButtonHolder();
+ this.title.appendChild(this.title_controls);
+ this.title.appendChild(this.editjson_controls);
+ this.title.appendChild(this.addproperty_controls);
+
+ // Show/Hide button
+ this.collapsed = false;
+ this.toggle_button = this.getButton('', 'collapse', this.translate('button_collapse'));
+ this.title_controls.appendChild(this.toggle_button);
+ this.toggle_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ if(self.collapsed) {
+ self.editor_holder.style.display = '';
+ self.collapsed = false;
+ self.setButtonText(self.toggle_button,'','collapse',self.translate('button_collapse'));
+ }
+ else {
+ self.editor_holder.style.display = 'none';
+ self.collapsed = true;
+ self.setButtonText(self.toggle_button,'','expand',self.translate('button_expand'));
+ }
+ });
+
+ // If it should start collapsed
+ if(this.options.collapsed) {
+ $trigger(this.toggle_button,'click');
+ }
+
+ // Collapse button disabled
+ if(this.schema.options && typeof this.schema.options.disable_collapse !== "undefined") {
+ if(this.schema.options.disable_collapse) this.toggle_button.style.display = 'none';
+ }
+ else if(this.jsoneditor.options.disable_collapse) {
+ this.toggle_button.style.display = 'none';
+ }
+
+ // Edit JSON Button
+ this.editjson_button = this.getButton('JSON','edit','Edit JSON');
+ this.editjson_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.toggleEditJSON();
+ });
+ this.editjson_controls.appendChild(this.editjson_button);
+ this.editjson_controls.appendChild(this.editjson_holder);
+
+ // Edit JSON Buttton disabled
+ if(this.schema.options && typeof this.schema.options.disable_edit_json !== "undefined") {
+ if(this.schema.options.disable_edit_json) this.editjson_button.style.display = 'none';
+ }
+ else if(this.jsoneditor.options.disable_edit_json) {
+ this.editjson_button.style.display = 'none';
+ }
+
+ // Object Properties Button
+ this.addproperty_button = this.getButton('Properties','edit','Object Properties');
+ this.addproperty_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.toggleAddProperty();
+ });
+ this.addproperty_controls.appendChild(this.addproperty_button);
+ this.addproperty_controls.appendChild(this.addproperty_holder);
+ this.refreshAddProperties();
+ }
+
+ // Fix table cell ordering
+ if(this.options.table_row) {
+ this.editor_holder = this.container;
+ $each(this.property_order,function(i,key) {
+ self.editor_holder.appendChild(self.editors[key].container);
+ });
+ }
+ // Layout object editors in grid if needed
+ else {
+ // Initial layout
+ this.layoutEditors();
+ // Do it again now that we know the approximate heights of elements
+ this.layoutEditors();
+ }
+ },
+ showEditJSON: function() {
+ if(!this.editjson_holder) return;
+ this.hideAddProperty();
+
+ // Position the form directly beneath the button
+ // TODO: edge detection
+ this.editjson_holder.style.left = this.editjson_button.offsetLeft+"px";
+ this.editjson_holder.style.top = this.editjson_button.offsetTop + this.editjson_button.offsetHeight+"px";
+
+ // Start the textarea with the current value
+ this.editjson_textarea.value = JSON.stringify(this.getValue(),null,2);
+
+ // Disable the rest of the form while editing JSON
+ this.disable();
+
+ this.editjson_holder.style.display = '';
+ this.editjson_button.disabled = false;
+ this.editing_json = true;
+ },
+ hideEditJSON: function() {
+ if(!this.editjson_holder) return;
+ if(!this.editing_json) return;
+
+ this.editjson_holder.style.display = 'none';
+ this.enable();
+ this.editing_json = false;
+ },
+ saveJSON: function() {
+ if(!this.editjson_holder) return;
+
+ try {
+ var json = JSON.parse(this.editjson_textarea.value);
+ this.setValue(json);
+ this.hideEditJSON();
+ }
+ catch(e) {
+ window.alert('invalid JSON');
+ throw e;
+ }
+ },
+ toggleEditJSON: function() {
+ if(this.editing_json) this.hideEditJSON();
+ else this.showEditJSON();
+ },
+ insertPropertyControlUsingPropertyOrder: function (property, control, container) {
+ var propertyOrder;
+ if (this.schema.properties[property])
+ propertyOrder = this.schema.properties[property].propertyOrder;
+ if (typeof propertyOrder !== "number") propertyOrder = 1000;
+ control.propertyOrder = propertyOrder;
+
+ for (var i = 0; i < container.childNodes.length; i++) {
+ var child = container.childNodes[i];
+ if (control.propertyOrder < child.propertyOrder) {
+ this.addproperty_list.insertBefore(control, child);
+ control = null;
+ break;
+ }
+ }
+ if (control) {
+ this.addproperty_list.appendChild(control);
+ }
+ },
+ addPropertyCheckbox: function(key) {
+ var self = this;
+ var checkbox, label, labelText, control;
+
+ checkbox = self.theme.getCheckbox();
+ checkbox.style.width = 'auto';
+
+ if (this.schema.properties[key] && this.schema.properties[key].title)
+ labelText = this.schema.properties[key].title;
+ else
+ labelText = key;
+
+ label = self.theme.getCheckboxLabel(labelText);
+
+ control = self.theme.getFormControl(label,checkbox);
+ control.style.paddingBottom = control.style.marginBottom = control.style.paddingTop = control.style.marginTop = 0;
+ control.style.height = 'auto';
+ //control.style.overflowY = 'hidden';
+
+ this.insertPropertyControlUsingPropertyOrder(key, control, this.addproperty_list);
+
+ checkbox.checked = key in this.editors;
+ checkbox.addEventListener('change',function() {
+ if(checkbox.checked) {
+ self.addObjectProperty(key);
+ }
+ else {
+ self.removeObjectProperty(key);
+ }
+ self.onChange(true);
+ });
+ self.addproperty_checkboxes[key] = checkbox;
+
+ return checkbox;
+ },
+ showAddProperty: function() {
+ if(!this.addproperty_holder) return;
+ this.hideEditJSON();
+
+ // Position the form directly beneath the button
+ // TODO: edge detection
+ this.addproperty_holder.style.left = this.addproperty_button.offsetLeft+"px";
+ this.addproperty_holder.style.top = this.addproperty_button.offsetTop + this.addproperty_button.offsetHeight+"px";
+
+ // Disable the rest of the form while editing JSON
+ this.disable();
+
+ this.adding_property = true;
+ this.addproperty_button.disabled = false;
+ this.addproperty_holder.style.display = '';
+ this.refreshAddProperties();
+ },
+ hideAddProperty: function() {
+ if(!this.addproperty_holder) return;
+ if(!this.adding_property) return;
+
+ this.addproperty_holder.style.display = 'none';
+ this.enable();
+
+ this.adding_property = false;
+ },
+ toggleAddProperty: function() {
+ if(this.adding_property) this.hideAddProperty();
+ else this.showAddProperty();
+ },
+ removeObjectProperty: function(property) {
+ if(this.editors[property]) {
+ this.editors[property].unregister();
+ delete this.editors[property];
+
+ this.refreshValue();
+ this.layoutEditors();
+ }
+ },
+ addObjectProperty: function(name, prebuild_only) {
+ var self = this;
+
+ // Property is already added
+ if(this.editors[name]) return;
+
+ // Property was added before and is cached
+ if(this.cached_editors[name]) {
+ this.editors[name] = this.cached_editors[name];
+ if(prebuild_only) return;
+ this.editors[name].register();
+ }
+ // New property
+ else {
+ if(!this.canHaveAdditionalProperties() && (!this.schema.properties || !this.schema.properties[name])) {
+ return;
+ }
+
+ var schema = self.getPropertySchema(name);
+ if(typeof schema.propertyOrder !== 'number'){
+ // if the propertyOrder undefined, then set a smart default value.
+ schema.propertyOrder = Object.keys(self.editors).length + 1000;
+ }
+
+
+ // Add the property
+ var editor = self.jsoneditor.getEditorClass(schema);
+
+ self.editors[name] = self.jsoneditor.createEditor(editor,{
+ jsoneditor: self.jsoneditor,
+ schema: schema,
+ path: self.path+'.'+name,
+ parent: self
+ });
+ self.editors[name].preBuild();
+
+ if(!prebuild_only) {
+ var holder = self.theme.getChildEditorHolder();
+ self.editor_holder.appendChild(holder);
+ self.editors[name].setContainer(holder);
+ self.editors[name].build();
+ self.editors[name].postBuild();
+ }
+
+ self.cached_editors[name] = self.editors[name];
+ }
+
+ // If we're only prebuilding the editors, don't refresh values
+ if(!prebuild_only) {
+ self.refreshValue();
+ self.layoutEditors();
+ }
+ },
+ onChildEditorChange: function(editor) {
+ this.refreshValue();
+ this._super(editor);
+ },
+ canHaveAdditionalProperties: function() {
+ if (typeof this.schema.additionalProperties === "boolean") {//# sourceMappingURL=jsoneditor.js.map
+ return this.schema.additionalProperties;
+ }
+ return !this.jsoneditor.options.no_additional_properties;
+ },
+ destroy: function() {
+ $each(this.cached_editors, function(i,el) {
+ el.destroy();
+ });
+ if(this.editor_holder) this.editor_holder.innerHTML = '';
+ if(this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title);
+ if(this.error_holder && this.error_holder.parentNode) this.error_holder.parentNode.removeChild(this.error_holder);
+
+ this.editors = null;
+ this.cached_editors = null;
+ if(this.editor_holder && this.editor_holder.parentNode) this.editor_holder.parentNode.removeChild(this.editor_holder);
+ this.editor_holder = null;
+
+ this._super();
+ },
+ getValue: function() {
+ if (!this.dependenciesFulfilled) {
+ return undefined;
+ }
+ var result = this._super();
+ if(this.jsoneditor.options.remove_empty_properties || this.options.remove_empty_properties) {
+ for (var i in result) {
+ if (result.hasOwnProperty(i)) {
+ if ((typeof result[i] === 'undefined' || result[i] === '') ||
+ (Object.keys(result[i]).length == 0 && result[i].constructor == Object) ||
+ (Array.isArray(result[i]) && result[i].length == 0)) {
+ delete result[i];
+ }
+ }
+ }
+ }
+
+ return result;
+ },
+ refreshValue: function() {
+ this.value = {};
+ var self = this;
+
+ for(var i in this.editors) {
+ if(!this.editors.hasOwnProperty(i)) continue;
+ this.value[i] = this.editors[i].getValue();
+ }
+
+ if(this.adding_property) this.refreshAddProperties();
+ },
+ refreshAddProperties: function() {
+ if(this.options.disable_properties || (this.options.disable_properties !== false && this.jsoneditor.options.disable_properties)) {
+ this.addproperty_controls.style.display = 'none';
+ return;
+ }
+
+ var can_add = false, can_remove = false, num_props = 0, i, show_modal = false;
+
+ // Get number of editors
+ for(i in this.editors) {
+ if(!this.editors.hasOwnProperty(i)) continue;
+ num_props++;
+ }
+
+ // Determine if we can add back removed properties
+ can_add = this.canHaveAdditionalProperties() && !(typeof this.schema.maxProperties !== "undefined" && num_props >= this.schema.maxProperties);
+
+ if(this.addproperty_checkboxes) {
+ this.addproperty_list.innerHTML = '';
+ }
+ this.addproperty_checkboxes = {};
+
+ // Check for which editors can't be removed or added back
+ for(i in this.cached_editors) {
+ if(!this.cached_editors.hasOwnProperty(i)) continue;
+
+ this.addPropertyCheckbox(i);
+
+ if(this.isRequired(this.cached_editors[i]) && i in this.editors) {
+ this.addproperty_checkboxes[i].disabled = true;
+ }
+
+ if(typeof this.schema.minProperties !== "undefined" && num_props <= this.schema.minProperties) {
+ this.addproperty_checkboxes[i].disabled = this.addproperty_checkboxes[i].checked;
+ if(!this.addproperty_checkboxes[i].checked) show_modal = true;
+ }
+ else if(!(i in this.editors)) {
+ if(!can_add && !this.schema.properties.hasOwnProperty(i)) {
+ this.addproperty_checkboxes[i].disabled = true;
+ }
+ else {
+ this.addproperty_checkboxes[i].disabled = false;
+ show_modal = true;
+ }
+ }
+ else {
+ show_modal = true;
+ can_remove = true;
+ }
+ }
+
+ if(this.canHaveAdditionalProperties()) {
+ show_modal = true;
+ }
+
+ // Additional addproperty checkboxes not tied to a current editor
+ for(i in this.schema.properties) {
+ if(!this.schema.properties.hasOwnProperty(i)) continue;
+ if(this.cached_editors[i]) continue;
+ show_modal = true;
+ this.addPropertyCheckbox(i);
+ }
+
+ // If no editors can be added or removed, hide the modal button
+ if(!show_modal) {
+ this.hideAddProperty();
+ this.addproperty_controls.style.display = 'none';
+ }
+ // If additional properties are disabled
+ else if(!this.canHaveAdditionalProperties()) {
+ this.addproperty_add.style.display = 'none';
+ this.addproperty_input.style.display = 'none';
+ }
+ // If no new properties can be added
+ else if(!can_add) {
+ this.addproperty_add.disabled = true;
+ }
+ // If new properties can be added
+ else {
+ this.addproperty_add.disabled = false;
+ }
+ },
+ isRequired: function(editor) {
+ if(typeof editor.schema.required === "boolean") return editor.schema.required;
+ else if(Array.isArray(this.schema.required)) return this.schema.required.indexOf(editor.key) > -1;
+ else if(this.jsoneditor.options.required_by_default) return true;
+ else return false;
+ },
+ setValue: function(value, initial) {
+ var self = this;
+ value = value || {};
+
+ if(typeof value !== "object" || Array.isArray(value)) value = {};
+
+ // First, set the values for all of the defined properties
+ $each(this.cached_editors, function(i,editor) {
+ // Value explicitly set
+ if(typeof value[i] !== "undefined") {
+ self.addObjectProperty(i);
+ editor.setValue(value[i],initial);
+ }
+ // Otherwise, remove value unless this is the initial set or it's required
+ else if(!initial && !self.isRequired(editor)) {
+ self.removeObjectProperty(i);
+ }
+ // Otherwise, set the value to the default
+ else {
+ editor.setValue(editor.getDefault(),initial);
+ }
+ });
+
+ $each(value, function(i,val) {
+ if(!self.cached_editors[i]) {
+ self.addObjectProperty(i);
+ if(self.editors[i]) self.editors[i].setValue(val,initial);
+ }
+ });
+
+ this.refreshValue();
+ this.layoutEditors();
+ this.onChange();
+ },
+ showValidationErrors: function(errors) {
+ var self = this;
+
+ // Get all the errors that pertain to this editor
+ var my_errors = [];
+ var other_errors = [];
+ $each(errors, function(i,error) {
+ if(error.path === self.path) {
+ my_errors.push(error);
+ }
+ else {
+ other_errors.push(error);
+ }
+ });
+
+ // Show errors for this editor
+ if(this.error_holder) {
+ if(my_errors.length) {
+ var message = [];
+ this.error_holder.innerHTML = '';
+ this.error_holder.style.display = '';
+ $each(my_errors, function(i,error) {
+ self.error_holder.appendChild(self.theme.getErrorMessage(error.message));
+ });
+ }
+ // Hide error area
+ else {
+ this.error_holder.style.display = 'none';
+ }
+ }
+
+ // Show error for the table row if this is inside a table
+ if(this.options.table_row) {
+ if(my_errors.length) {
+ this.theme.addTableRowError(this.container);
+ }
+ else {
+ this.theme.removeTableRowError(this.container);
+ }
+ }
+
+ // Show errors for child editors
+ $each(this.editors, function(i,editor) {
+ editor.showValidationErrors(other_errors);
+ });
+ }
+});
+
+JSONEditor.defaults.editors.array = JSONEditor.AbstractEditor.extend({
+ getDefault: function() {
+ return this.schema["default"] || [];
+ },
+ register: function() {
+ this._super();
+ if(this.rows) {
+ for(var i=0; i<this.rows.length; i++) {
+ this.rows[i].register();
+ }
+ }
+ },
+ unregister: function() {
+ this._super();
+ if(this.rows) {
+ for(var i=0; i<this.rows.length; i++) {
+ this.rows[i].unregister();
+ }
+ }
+ },
+ getNumColumns: function() {
+ var info = this.getItemInfo(0);
+ // Tabs require extra horizontal space
+ if(this.tabs_holder && this.schema.format !== 'tabs-top') {
+ return Math.max(Math.min(12,info.width+2),4);
+ }
+ else {
+ return info.width;
+ }
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ if(this.add_row_button) this.add_row_button.disabled = false;
+ if(this.remove_all_rows_button) this.remove_all_rows_button.disabled = false;
+ if(this.delete_last_row_button) this.delete_last_row_button.disabled = false;
+
+ if(this.rows) {
+ for(var i=0; i<this.rows.length; i++) {
+ this.rows[i].enable();
+
+ if(this.rows[i].moveup_button) this.rows[i].moveup_button.disabled = false;
+ if(this.rows[i].movedown_button) this.rows[i].movedown_button.disabled = false;
+ if(this.rows[i].delete_button) this.rows[i].delete_button.disabled = false;
+ }
+ }
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ if(this.add_row_button) this.add_row_button.disabled = true;
+ if(this.remove_all_rows_button) this.remove_all_rows_button.disabled = true;
+ if(this.delete_last_row_button) this.delete_last_row_button.disabled = true;
+
+ if(this.rows) {
+ for(var i=0; i<this.rows.length; i++) {
+ this.rows[i].disable(always_disabled);
+
+ if(this.rows[i].moveup_button) this.rows[i].moveup_button.disabled = true;
+ if(this.rows[i].movedown_button) this.rows[i].movedown_button.disabled = true;
+ if(this.rows[i].delete_button) this.rows[i].delete_button.disabled = true;
+ }
+ }
+ this._super();
+ },
+ preBuild: function() {
+ this._super();
+
+ this.rows = [];
+ this.row_cache = [];
+
+ this.hide_delete_buttons = this.options.disable_array_delete || this.jsoneditor.options.disable_array_delete;
+ this.hide_delete_all_rows_buttons = this.hide_delete_buttons || this.options.disable_array_delete_all_rows || this.jsoneditor.options.disable_array_delete_all_rows;
+ this.hide_delete_last_row_buttons = this.hide_delete_buttons || this.options.disable_array_delete_last_row || this.jsoneditor.options.disable_array_delete_last_row;
+ this.hide_move_buttons = this.options.disable_array_reorder || this.jsoneditor.options.disable_array_reorder;
+ this.hide_add_button = this.options.disable_array_add || this.jsoneditor.options.disable_array_add;
+ this.show_copy_button = this.options.enable_array_copy || this.jsoneditor.options.enable_array_copy;
+ },
+ build: function() {
+ var self = this;
+
+ if(!this.options.compact) {
+ this.header = document.createElement('span');
+ this.header.textContent = this.getTitle();
+ this.title = this.theme.getHeader(this.header);
+ this.container.appendChild(this.title);
+ this.title_controls = this.theme.getHeaderButtonHolder();
+ this.title.appendChild(this.title_controls);
+ if(this.schema.description) {
+ this.description = this.theme.getDescription(this.schema.description);
+ this.container.appendChild(this.description);
+ }
+ this.error_holder = document.createElement('div');
+ this.container.appendChild(this.error_holder);
+
+ if(this.schema.format === 'tabs-top') {
+ this.controls = this.theme.getHeaderButtonHolder();
+ this.title.appendChild(this.controls);
+ this.tabs_holder = this.theme.getTopTabHolder(this.getItemTitle());
+ this.container.appendChild(this.tabs_holder);
+ this.row_holder = this.theme.getTopTabContentHolder(this.tabs_holder);
+
+ this.active_tab = null;
+ }
+ else if(this.schema.format === 'tabs') {
+ this.controls = this.theme.getHeaderButtonHolder();
+ this.title.appendChild(this.controls);
+ this.tabs_holder = this.theme.getTabHolder(this.getItemTitle());
+ this.container.appendChild(this.tabs_holder);
+ this.row_holder = this.theme.getTabContentHolder(this.tabs_holder);
+
+ this.active_tab = null;
+ }
+ else {
+ this.panel = this.theme.getIndentedPanel();
+ this.container.appendChild(this.panel);
+ this.row_holder = document.createElement('div');
+ this.panel.appendChild(this.row_holder);
+ this.controls = this.theme.getButtonHolder();
+ this.panel.appendChild(this.controls);
+ }
+ }
+ else {
+ this.panel = this.theme.getIndentedPanel();
+ this.container.appendChild(this.panel);
+ this.controls = this.theme.getButtonHolder();
+ this.panel.appendChild(this.controls);
+ this.row_holder = document.createElement('div');
+ this.panel.appendChild(this.row_holder);
+ }
+
+ // Add controls
+ this.addControls();
+ },
+ onChildEditorChange: function(editor) {
+ this.refreshValue();
+ this.refreshTabs(true);
+ this._super(editor);
+ },
+ getItemTitle: function() {
+ if(!this.item_title) {
+ if(this.schema.items && !Array.isArray(this.schema.items)) {
+ var tmp = this.jsoneditor.expandRefs(this.schema.items);
+ this.item_title = tmp.title || 'item';
+ }
+ else {
+ this.item_title = 'item';
+ }
+ }
+ return this.item_title;
+ },
+ getItemSchema: function(i) {
+ if(Array.isArray(this.schema.items)) {
+ if(i >= this.schema.items.length) {
+ if(this.schema.additionalItems===true) {
+ return {};
+ }
+ else if(this.schema.additionalItems) {
+ return $extend({},this.schema.additionalItems);
+ }
+ }
+ else {
+ return $extend({},this.schema.items[i]);
+ }
+ }
+ else if(this.schema.items) {
+ return $extend({},this.schema.items);
+ }
+ else {
+ return {};
+ }
+ },
+ getItemInfo: function(i) {
+ var schema = this.getItemSchema(i);
+
+ // Check if it's cached
+ this.item_info = this.item_info || {};
+ var stringified = JSON.stringify(schema);
+ if(typeof this.item_info[stringified] !== "undefined") return this.item_info[stringified];
+
+ // Get the schema for this item
+ schema = this.jsoneditor.expandRefs(schema);
+
+ this.item_info[stringified] = {
+ title: schema.title || "item",
+ 'default': schema["default"],
+ width: 12,
+ child_editors: schema.properties || schema.items
+ };
+
+ return this.item_info[stringified];
+ },
+ getElementEditor: function(i) {
+ var item_info = this.getItemInfo(i);
+ var schema = this.getItemSchema(i);
+ schema = this.jsoneditor.expandRefs(schema);
+ schema.title = item_info.title+' '+(i+1);
+
+ var editor = this.jsoneditor.getEditorClass(schema);
+
+ var holder;
+ if(this.tabs_holder) {
+ if(this.schema.format === 'tabs-top') {
+ holder = this.theme.getTopTabContent();
+ }
+ else {
+ holder = this.theme.getTabContent();
+ }
+ holder.id = this.path+'.'+i;
+ }
+ else if(item_info.child_editors) {
+ holder = this.theme.getChildEditorHolder();
+ }
+ else {
+ holder = this.theme.getIndentedPanel();
+ }
+
+ this.row_holder.appendChild(holder);
+
+ var ret = this.jsoneditor.createEditor(editor,{
+ jsoneditor: this.jsoneditor,
+ schema: schema,
+ container: holder,
+ path: this.path+'.'+i,
+ parent: this,
+ required: true
+ });
+ ret.preBuild();
+ ret.build();
+ ret.postBuild();
+
+ if(!ret.title_controls) {
+ ret.array_controls = this.theme.getButtonHolder();
+ holder.appendChild(ret.array_controls);
+ }
+
+ return ret;
+ },
+ destroy: function() {
+ this.empty(true);
+ if(this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title);
+ if(this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
+ if(this.row_holder && this.row_holder.parentNode) this.row_holder.parentNode.removeChild(this.row_holder);
+ if(this.controls && this.controls.parentNode) this.controls.parentNode.removeChild(this.controls);
+ if(this.panel && this.panel.parentNode) this.panel.parentNode.removeChild(this.panel);
+
+ this.rows = this.row_cache = this.title = this.description = this.row_holder = this.panel = this.controls = null;
+
+ this._super();
+ },
+ empty: function(hard) {
+ if(!this.rows) return;
+ var self = this;
+ $each(this.rows,function(i,row) {
+ if(hard) {
+ if(row.tab && row.tab.parentNode) row.tab.parentNode.removeChild(row.tab);
+ self.destroyRow(row,true);
+ self.row_cache[i] = null;
+ }
+ self.rows[i] = null;
+ });
+ self.rows = [];
+ if(hard) self.row_cache = [];
+ },
+ destroyRow: function(row,hard) {
+ var holder = row.container;
+ if(hard) {
+ row.destroy();
+ if(holder.parentNode) holder.parentNode.removeChild(holder);
+ if(row.tab && row.tab.parentNode) row.tab.parentNode.removeChild(row.tab);
+ }
+ else {
+ if(row.tab) row.tab.style.display = 'none';
+ holder.style.display = 'none';
+ row.unregister();
+ }
+ },
+ getMax: function() {
+ if((Array.isArray(this.schema.items)) && this.schema.additionalItems === false) {
+ return Math.min(this.schema.items.length,this.schema.maxItems || Infinity);
+ }
+ else {
+ return this.schema.maxItems || Infinity;
+ }
+ },
+ refreshTabs: function(refresh_headers) {
+ var self = this;
+ $each(this.rows, function(i,row) {
+ if(!row.tab) return;
+
+ if(refresh_headers) {
+ row.tab_text.textContent = row.getHeaderText();
+ }
+ else {
+ if(row.tab === self.active_tab) {
+ self.theme.markTabActive(row);
+ }
+ else {
+ self.theme.markTabInactive(row);
+ }
+ }
+ });
+ },
+ setValue: function(value, initial) {
+ // Update the array's value, adding/removing rows when necessary
+ value = value || [];
+
+ if(!(Array.isArray(value))) value = [value];
+
+ var serialized = JSON.stringify(value);
+ if(serialized === this.serialized) return;
+
+ // Make sure value has between minItems and maxItems items in it
+ if(this.schema.minItems) {
+ while(value.length < this.schema.minItems) {
+ value.push(this.getItemInfo(value.length)["default"]);
+ }
+ }
+ if(this.getMax() && value.length > this.getMax()) {
+ value = value.slice(0,this.getMax());
+ }
+
+ var self = this;
+ $each(value,function(i,val) {
+ if(self.rows[i]) {
+ // TODO: don't set the row's value if it hasn't changed
+ self.rows[i].setValue(val,initial);
+ }
+ else if(self.row_cache[i]) {
+ self.rows[i] = self.row_cache[i];
+ self.rows[i].setValue(val,initial);
+ self.rows[i].container.style.display = '';
+ if(self.rows[i].tab) self.rows[i].tab.style.display = '';
+ self.rows[i].register();
+ }
+ else {
+ self.addRow(val,initial);
+ }
+ });
+
+ for(var j=value.length; j<self.rows.length; j++) {
+ self.destroyRow(self.rows[j]);
+ self.rows[j] = null;
+ }
+ self.rows = self.rows.slice(0,value.length);
+
+ // Set the active tab
+ var new_active_tab = null;
+ $each(self.rows, function(i,row) {
+ if(row.tab === self.active_tab) {
+ new_active_tab = row.tab;
+ return false;
+ }
+ });
+ if(!new_active_tab && self.rows.length) new_active_tab = self.rows[0].tab;
+
+ self.active_tab = new_active_tab;
+
+ self.refreshValue(initial);
+ self.refreshTabs(true);
+ self.refreshTabs();
+
+ self.onChange();
+
+ // TODO: sortable
+ },
+ refreshValue: function(force) {
+ var self = this;
+ var oldi = this.value? this.value.length : 0;
+ this.value = [];
+
+ $each(this.rows,function(i,editor) {
+ // Get the value for this editor
+ self.value[i] = editor.getValue();
+ });
+
+ if(oldi !== this.value.length || force) {
+ // If we currently have minItems items in the array
+ var minItems = this.schema.minItems && this.schema.minItems >= this.rows.length;
+
+ $each(this.rows,function(i,editor) {
+ // Hide the move down button for the last row
+ if(editor.movedown_button) {
+ if(i === self.rows.length - 1) {
+ editor.movedown_button.style.display = 'none';
+ }
+ else {
+ editor.movedown_button.style.display = '';
+ }
+ }
+
+ // Hide the delete button if we have minItems items
+ if(editor.delete_button) {
+ if(minItems) {
+ editor.delete_button.style.display = 'none';
+ }
+ else {
+ editor.delete_button.style.display = '';
+ }
+ }
+
+ // Get the value for this editor
+ self.value[i] = editor.getValue();
+ });
+
+ var controls_needed = false;
+
+ if(!this.value.length) {
+ this.delete_last_row_button.style.display = 'none';
+ this.remove_all_rows_button.style.display = 'none';
+ }
+ else if(this.value.length === 1) {
+ this.remove_all_rows_button.style.display = 'none';
+
+ // If there are minItems items in the array, or configured to hide the delete_last_row button, hide the delete button beneath the rows
+ if(minItems || this.hide_delete_last_row_buttons) {
+ this.delete_last_row_button.style.display = 'none';
+ }
+ else {
+ this.delete_last_row_button.style.display = '';
+ controls_needed = true;
+ }
+ }
+ else {
+ if(minItems || this.hide_delete_last_row_buttons) {
+ this.delete_last_row_button.style.display = 'none';
+ }
+ else {
+ this.delete_last_row_button.style.display = '';
+ controls_needed = true;
+ }
+
+ if(minItems || this.hide_delete_all_rows_buttons) {
+ this.remove_all_rows_button.style.display = 'none';
+ }
+ else {
+ this.remove_all_rows_button.style.display = '';
+ controls_needed = true;
+ }
+ }
+
+ // If there are maxItems in the array, hide the add button beneath the rows
+ if((this.getMax() && this.getMax() <= this.rows.length) || this.hide_add_button){
+ this.add_row_button.style.display = 'none';
+ }
+ else {
+ this.add_row_button.style.display = '';
+ controls_needed = true;
+ }
+
+ if(!this.collapsed && controls_needed) {
+ this.controls.style.display = 'inline-block';
+ }
+ else {
+ this.controls.style.display = 'none';
+ }
+ }
+ },
+ addRow: function(value, initial) {
+ var self = this;
+ var i = this.rows.length;
+
+ self.rows[i] = this.getElementEditor(i);
+ self.row_cache[i] = self.rows[i];
+
+ if(self.tabs_holder) {
+ self.rows[i].tab_text = document.createElement('span');
+ self.rows[i].tab_text.textContent = self.rows[i].getHeaderText();
+ if(self.schema.format === 'tabs-top'){
+ self.rows[i].tab = self.theme.getTopTab(self.rows[i].tab_text,self.rows[i].path);
+ self.theme.addTopTab(self.tabs_holder, self.rows[i].tab);
+ }
+ else {
+ self.rows[i].tab = self.theme.getTab(self.rows[i].tab_text,self.rows[i].path);
+ self.theme.addTab(self.tabs_holder, self.rows[i].tab);
+ }
+ self.rows[i].tab.addEventListener('click', function(e) {
+ self.active_tab = self.rows[i].tab;
+ self.refreshTabs();
+ e.preventDefault();
+ e.stopPropagation();
+ });
+
+ }
+
+ var controls_holder = self.rows[i].title_controls || self.rows[i].array_controls;
+
+ // Buttons to delete row, move row up, and move row down
+ if(!self.hide_delete_buttons) {
+ self.rows[i].delete_button = this.getButton(self.getItemTitle(),'delete',this.translate('button_delete_row_title',[self.getItemTitle()]));
+ self.rows[i].delete_button.className += ' delete';
+ self.rows[i].delete_button.setAttribute('data-i',i);
+ self.rows[i].delete_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ if (self.jsoneditor.options.prompt_before_delete === true) {
+ if (confirm("Confirm to remove.") === false) {
+ return false;
+ }
+ }
+
+ var i = this.getAttribute('data-i')*1;
+
+ var value = self.getValue();
+
+ var newval = [];
+ var new_active_tab = null;
+ $each(value,function(j,row) {
+ if(j===i) {
+ // If the one we're deleting is the active tab
+ if(self.rows[j].tab === self.active_tab) {
+ // Make the next tab active if there is one
+ // Note: the next tab is going to be the current tab after deletion
+ if(self.rows[j+1]) new_active_tab = self.rows[j].tab;
+ // Otherwise, make the previous tab active if there is one
+ else if(j) new_active_tab = self.rows[j-1].tab;
+ }
+
+ return; // If this is the one we're deleting
+ }
+ newval.push(row);
+ });
+ self.setValue(newval);
+ if(new_active_tab) {
+ self.active_tab = new_active_tab;
+ self.refreshTabs();
+ }
+
+ self.onChange(true);
+ });
+
+ if(controls_holder) {
+ controls_holder.appendChild(self.rows[i].delete_button);
+ }
+ }
+
+ //Button to copy an array element and add it as last element
+ if(self.show_copy_button){
+ self.rows[i].copy_button = this.getButton(self.getItemTitle(),'copy','Copy '+self.getItemTitle());
+ self.rows[i].copy_button.className += ' copy';
+ self.rows[i].copy_button.setAttribute('data-i',i);
+ self.rows[i].copy_button.addEventListener('click',function(e) {
+ var value = self.getValue();
+ e.preventDefault();
+ e.stopPropagation();
+ var i = this.getAttribute('data-i')*1;
+
+ $each(value,function(j,row) {
+ if(j===i) {
+ value.push(row);
+ return;
+ }
+ });
+
+ self.setValue(value);
+ self.refreshValue(true);
+ self.onChange(true);
+
+ });
+
+ controls_holder.appendChild(self.rows[i].copy_button);
+ }
+
+
+ if(i && !self.hide_move_buttons) {
+ self.rows[i].moveup_button = this.getButton('','moveup',this.translate('button_move_up_title'));
+ self.rows[i].moveup_button.className += ' moveup';
+ self.rows[i].moveup_button.setAttribute('data-i',i);
+ self.rows[i].moveup_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var i = this.getAttribute('data-i')*1;
+
+ if(i<=0) return;
+ var rows = self.getValue();
+ var tmp = rows[i-1];
+ rows[i-1] = rows[i];
+ rows[i] = tmp;
+
+ self.setValue(rows);
+ self.active_tab = self.rows[i-1].tab;
+ self.refreshTabs();
+
+ self.onChange(true);
+ });
+
+ if(controls_holder) {
+ controls_holder.appendChild(self.rows[i].moveup_button);
+ }
+ }
+
+ if(!self.hide_move_buttons) {
+ self.rows[i].movedown_button = this.getButton('','movedown',this.translate('button_move_down_title'));
+ self.rows[i].movedown_button.className += ' movedown';
+ self.rows[i].movedown_button.setAttribute('data-i',i);
+ self.rows[i].movedown_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var i = this.getAttribute('data-i')*1;
+
+ var rows = self.getValue();
+ if(i>=rows.length-1) return;
+ var tmp = rows[i+1];
+ rows[i+1] = rows[i];
+ rows[i] = tmp;
+
+ self.setValue(rows);
+ self.active_tab = self.rows[i+1].tab;
+ self.refreshTabs();
+ self.onChange(true);
+ });
+
+ if(controls_holder) {
+ controls_holder.appendChild(self.rows[i].movedown_button);
+ }
+ }
+
+ if(value) self.rows[i].setValue(value, initial);
+ self.refreshTabs();
+ },
+ addControls: function() {
+ var self = this;
+
+ this.collapsed = false;
+ this.toggle_button = this.getButton('','collapse',this.translate('button_collapse'));
+ this.title_controls.appendChild(this.toggle_button);
+ var row_holder_display = self.row_holder.style.display;
+ var controls_display = self.controls.style.display;
+ this.toggle_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ if(self.collapsed) {
+ self.collapsed = false;
+ if(self.panel) self.panel.style.display = '';
+ self.row_holder.style.display = row_holder_display;
+ if(self.tabs_holder) self.tabs_holder.style.display = '';
+ self.controls.style.display = controls_display;
+ self.setButtonText(this,'','collapse',self.translate('button_collapse'));
+ }
+ else {
+ self.collapsed = true;
+ self.row_holder.style.display = 'none';
+ if(self.tabs_holder) self.tabs_holder.style.display = 'none';
+ self.controls.style.display = 'none';
+ if(self.panel) self.panel.style.display = 'none';
+ self.setButtonText(this,'','expand',self.translate('button_expand'));
+ }
+ });
+
+ // If it should start collapsed
+ if(this.options.collapsed) {
+ $trigger(this.toggle_button,'click');
+ }
+
+ // Collapse button disabled
+ if(this.schema.options && typeof this.schema.options.disable_collapse !== "undefined") {
+ if(this.schema.options.disable_collapse) this.toggle_button.style.display = 'none';
+ }
+ else if(this.jsoneditor.options.disable_collapse) {
+ this.toggle_button.style.display = 'none';
+ }
+
+ // Add "new row" and "delete last" buttons below editor
+ this.add_row_button = this.getButton(this.getItemTitle(),'add',this.translate('button_add_row_title',[this.getItemTitle()]));
+
+ this.add_row_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var i = self.rows.length;
+ if(self.row_cache[i]) {
+ self.rows[i] = self.row_cache[i];
+ self.rows[i].setValue(self.rows[i].getDefault(), true);
+ self.rows[i].container.style.display = '';
+ if(self.rows[i].tab) self.rows[i].tab.style.display = '';
+ self.rows[i].register();
+ }
+ else {
+ self.addRow();
+ }
+ self.active_tab = self.rows[i].tab;
+ self.refreshTabs();
+ self.refreshValue();
+ self.onChange(true);
+ });
+ self.controls.appendChild(this.add_row_button);
+
+ this.delete_last_row_button = this.getButton(this.translate('button_delete_last',[this.getItemTitle()]),'delete',this.translate('button_delete_last_title',[this.getItemTitle()]));
+ this.delete_last_row_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ if (self.jsoneditor.options.prompt_before_delete === true) {
+ if (confirm("Confirm to remove.") === false) {
+ return false;
+ }
+ }
+
+ var rows = self.getValue();
+
+ var new_active_tab = null;
+ if(self.rows.length > 1 && self.rows[self.rows.length-1].tab === self.active_tab) new_active_tab = self.rows[self.rows.length-2].tab;
+
+ rows.pop();
+ self.setValue(rows);
+ if(new_active_tab) {
+ self.active_tab = new_active_tab;
+ self.refreshTabs();
+ }
+ self.onChange(true);
+ });
+ self.controls.appendChild(this.delete_last_row_button);
+
+ this.remove_all_rows_button = this.getButton(this.translate('button_delete_all'),'delete',this.translate('button_delete_all_title'));
+ this.remove_all_rows_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ if (self.jsoneditor.options.prompt_before_delete === true) {
+ if (confirm("Confirm to remove.") === false) {
+ return false;
+ }
+ }
+
+ self.setValue([]);
+ self.onChange(true);
+ });
+ self.controls.appendChild(this.remove_all_rows_button);
+
+ if(self.tabs) {
+ this.add_row_button.style.width = '100%';
+ this.add_row_button.style.textAlign = 'left';
+ this.add_row_button.style.marginBottom = '3px';
+
+ this.delete_last_row_button.style.width = '100%';
+ this.delete_last_row_button.style.textAlign = 'left';
+ this.delete_last_row_button.style.marginBottom = '3px';
+
+ this.remove_all_rows_button.style.width = '100%';
+ this.remove_all_rows_button.style.textAlign = 'left';
+ this.remove_all_rows_button.style.marginBottom = '3px';
+ }
+ },
+ showValidationErrors: function(errors) {
+ var self = this;
+
+ // Get all the errors that pertain to this editor
+ var my_errors = [];
+ var other_errors = [];
+ $each(errors, function(i,error) {
+ if(error.path === self.path) {
+ my_errors.push(error);
+ }
+ else {
+ other_errors.push(error);
+ }
+ });
+
+ // Show errors for this editor
+ if(this.error_holder) {
+ if(my_errors.length) {
+ var message = [];
+ this.error_holder.innerHTML = '';
+ this.error_holder.style.display = '';
+ $each(my_errors, function(i,error) {
+ self.error_holder.appendChild(self.theme.getErrorMessage(error.message));
+ });
+ }
+ // Hide error area
+ else {
+ this.error_holder.style.display = 'none';
+ }
+ }
+
+ // Show errors for child editors
+ $each(this.rows, function(i,row) {
+ row.showValidationErrors(other_errors);
+ });
+ }
+});
+
+JSONEditor.defaults.editors.table = JSONEditor.defaults.editors.array.extend({
+ register: function() {
+ this._super();
+ if(this.rows) {
+ for(var i=0; i<this.rows.length; i++) {
+ this.rows[i].register();
+ }
+ }
+ },
+ unregister: function() {
+ this._super();
+ if(this.rows) {
+ for(var i=0; i<this.rows.length; i++) {
+ this.rows[i].unregister();
+ }
+ }
+ },
+ getNumColumns: function() {
+ return Math.max(Math.min(12,this.width),3);
+ },
+ preBuild: function() {
+ var item_schema = this.jsoneditor.expandRefs(this.schema.items || {});
+
+ this.item_title = item_schema.title || 'row';
+ this.item_default = item_schema["default"] || null;
+ this.item_has_child_editors = item_schema.properties || item_schema.items;
+ this.width = 12;
+ this._super();
+ },
+ build: function() {
+ var self = this;
+ this.table = this.theme.getTable();
+ this.container.appendChild(this.table);
+ this.thead = this.theme.getTableHead();
+ this.table.appendChild(this.thead);
+ this.header_row = this.theme.getTableRow();
+ this.thead.appendChild(this.header_row);
+ this.row_holder = this.theme.getTableBody();
+ this.table.appendChild(this.row_holder);
+
+ // Determine the default value of array element
+ var tmp = this.getElementEditor(0,true);
+ this.item_default = tmp.getDefault();
+ this.width = tmp.getNumColumns() + 2;
+
+ if(!this.options.compact) {
+ this.title = this.theme.getHeader(this.getTitle());
+ this.container.appendChild(this.title);
+ this.title_controls = this.theme.getHeaderButtonHolder();
+ this.title.appendChild(this.title_controls);
+ if(this.schema.description) {
+ this.description = this.theme.getDescription(this.schema.description);
+ this.container.appendChild(this.description);
+ }
+ this.panel = this.theme.getIndentedPanel();
+ this.container.appendChild(this.panel);
+ this.error_holder = document.createElement('div');
+ this.panel.appendChild(this.error_holder);
+ }
+ else {
+ this.panel = document.createElement('div');
+ this.container.appendChild(this.panel);
+ }
+
+ this.panel.appendChild(this.table);
+ this.controls = this.theme.getButtonHolder();
+ this.panel.appendChild(this.controls);
+
+ if(this.item_has_child_editors) {
+ var ce = tmp.getChildEditors();
+ var order = tmp.property_order || Object.keys(ce);
+ for(var i=0; i<order.length; i++) {
+ var th = self.theme.getTableHeaderCell(ce[order[i]].getTitle());
+ if(ce[order[i]].options.hidden) th.style.display = 'none';
+ self.header_row.appendChild(th);
+ }
+ }
+ else {
+ self.header_row.appendChild(self.theme.getTableHeaderCell(this.item_title));
+ }
+
+ tmp.destroy();
+ this.row_holder.innerHTML = '';
+
+ // Row Controls column
+ this.controls_header_cell = self.theme.getTableHeaderCell(" ");
+ self.header_row.appendChild(this.controls_header_cell);
+
+ // Add controls
+ this.addControls();
+ },
+ onChildEditorChange: function(editor) {
+ this.refreshValue();
+ this._super();
+ },
+ getItemDefault: function() {
+ return $extend({},{"default":this.item_default})["default"];
+ },
+ getItemTitle: function() {
+ return this.item_title;
+ },
+ getElementEditor: function(i,ignore) {
+ var schema_copy = $extend({},this.schema.items);
+ var editor = this.jsoneditor.getEditorClass(schema_copy, this.jsoneditor);
+ var row = this.row_holder.appendChild(this.theme.getTableRow());
+ var holder = row;
+ if(!this.item_has_child_editors) {
+ holder = this.theme.getTableCell();
+ row.appendChild(holder);
+ }
+
+ var ret = this.jsoneditor.createEditor(editor,{
+ jsoneditor: this.jsoneditor,
+ schema: schema_copy,
+ container: holder,
+ path: this.path+'.'+i,
+ parent: this,
+ compact: true,
+ table_row: true
+ });
+
+ ret.preBuild();
+ if(!ignore) {
+ ret.build();
+ ret.postBuild();
+
+ ret.controls_cell = row.appendChild(this.theme.getTableCell());
+ ret.row = row;
+ ret.table_controls = this.theme.getButtonHolder();
+ ret.controls_cell.appendChild(ret.table_controls);
+ ret.table_controls.style.margin = 0;
+ ret.table_controls.style.padding = 0;
+ }
+
+ return ret;
+ },
+ destroy: function() {
+ this.innerHTML = '';
+ if(this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title);
+ if(this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
+ if(this.row_holder && this.row_holder.parentNode) this.row_holder.parentNode.removeChild(this.row_holder);
+ if(this.table && this.table.parentNode) this.table.parentNode.removeChild(this.table);
+ if(this.panel && this.panel.parentNode) this.panel.parentNode.removeChild(this.panel);
+
+ this.rows = this.title = this.description = this.row_holder = this.table = this.panel = null;
+
+ this._super();
+ },
+ setValue: function(value, initial) {
+ // Update the array's value, adding/removing rows when necessary
+ value = value || [];
+
+ // Make sure value has between minItems and maxItems items in it
+ if(this.schema.minItems) {
+ while(value.length < this.schema.minItems) {
+ value.push(this.getItemDefault());
+ }
+ }
+ if(this.schema.maxItems && value.length > this.schema.maxItems) {
+ value = value.slice(0,this.schema.maxItems);
+ }
+
+ var serialized = JSON.stringify(value);
+ if(serialized === this.serialized) return;
+
+ var numrows_changed = false;
+
+ var self = this;
+ $each(value,function(i,val) {
+ if(self.rows[i]) {
+ // TODO: don't set the row's value if it hasn't changed
+ self.rows[i].setValue(val);
+ }
+ else {
+ self.addRow(val);
+ numrows_changed = true;
+ }
+ });
+
+ for(var j=value.length; j<self.rows.length; j++) {
+ var holder = self.rows[j].container;
+ if(!self.item_has_child_editors) {
+ self.rows[j].row.parentNode.removeChild(self.rows[j].row);
+ }
+ self.rows[j].destroy();
+ if(holder.parentNode) holder.parentNode.removeChild(holder);
+ self.rows[j] = null;
+ numrows_changed = true;
+ }
+ self.rows = self.rows.slice(0,value.length);
+
+ self.refreshValue();
+ if(numrows_changed || initial) self.refreshRowButtons();
+
+ self.onChange();
+
+ // TODO: sortable
+ },
+ refreshRowButtons: function() {
+ var self = this;
+
+ // If we currently have minItems items in the array
+ var minItems = this.schema.minItems && this.schema.minItems >= this.rows.length;
+
+ var need_row_buttons = false;
+ $each(this.rows,function(i,editor) {
+ // Hide the move down button for the last row
+ if(editor.movedown_button) {
+ if(i === self.rows.length - 1) {
+ editor.movedown_button.style.display = 'none';
+ }
+ else {
+ need_row_buttons = true;
+ editor.movedown_button.style.display = '';
+ }
+ }
+
+ // Hide the delete button if we have minItems items
+ if(editor.delete_button) {
+ if(minItems) {
+ editor.delete_button.style.display = 'none';
+ }
+ else {
+ need_row_buttons = true;
+ editor.delete_button.style.display = '';
+ }
+ }
+
+ if(editor.moveup_button) {
+ need_row_buttons = true;
+ }
+ });
+
+ // Show/hide controls column in table
+ $each(this.rows,function(i,editor) {
+ if(need_row_buttons) {
+ editor.controls_cell.style.display = '';
+ }
+ else {
+ editor.controls_cell.style.display = 'none';
+ }
+ });
+ if(need_row_buttons) {
+ this.controls_header_cell.style.display = '';
+ }
+ else {
+ this.controls_header_cell.style.display = 'none';
+ }
+
+ var controls_needed = false;
+
+ if(!this.value.length) {
+ this.delete_last_row_button.style.display = 'none';
+ this.remove_all_rows_button.style.display = 'none';
+ this.table.style.display = 'none';
+ }
+ else if(this.value.length === 1) {
+ this.table.style.display = '';
+ this.remove_all_rows_button.style.display = 'none';
+
+ // If there are minItems items in the array, or configured to hide the delete_last_row button, hide the delete button beneath the rows
+ if(minItems || this.hide_delete_last_row_buttons) {
+ this.delete_last_row_button.style.display = 'none';
+ }
+ else {
+ this.delete_last_row_button.style.display = '';
+ controls_needed = true;
+ }
+ }
+ else {
+ this.table.style.display = '';
+
+ if(minItems || this.hide_delete_last_row_buttons) {
+ this.delete_last_row_button.style.display = 'none';
+ }
+ else {
+ this.delete_last_row_button.style.display = '';
+ controls_needed = true;
+ }
+
+ if(minItems || this.hide_delete_all_rows_buttons) {
+ this.remove_all_rows_button.style.display = 'none';
+ }
+ else {
+ this.remove_all_rows_button.style.display = '';
+ controls_needed = true;
+ }
+ }
+
+ // If there are maxItems in the array, hide the add button beneath the rows
+ if((this.schema.maxItems && this.schema.maxItems <= this.rows.length) || this.hide_add_button) {
+ this.add_row_button.style.display = 'none';
+ }
+ else {
+ this.add_row_button.style.display = '';
+ controls_needed = true;
+ }
+
+ if(!controls_needed) {
+ this.controls.style.display = 'none';
+ }
+ else {
+ this.controls.style.display = '';
+ }
+ },
+ refreshValue: function() {
+ var self = this;
+ this.value = [];
+
+ $each(this.rows,function(i,editor) {
+ // Get the value for this editor
+ self.value[i] = editor.getValue();
+ });
+ this.serialized = JSON.stringify(this.value);
+ },
+ addRow: function(value) {
+ var self = this;
+ var i = this.rows.length;
+
+ self.rows[i] = this.getElementEditor(i);
+
+ var controls_holder = self.rows[i].table_controls;
+
+ // Buttons to delete row, move row up, and move row down
+ if(!this.hide_delete_buttons) {
+ self.rows[i].delete_button = this.getButton('','delete',this.translate('button_delete_row_title_short'));
+ self.rows[i].delete_button.className += ' delete';
+ self.rows[i].delete_button.setAttribute('data-i',i);
+ self.rows[i].delete_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var i = this.getAttribute('data-i')*1;
+
+ var value = self.getValue();
+
+ var newval = [];
+ $each(value,function(j,row) {
+ if(j===i) return; // If this is the one we're deleting
+ newval.push(row);
+ });
+ self.setValue(newval);
+ self.onChange(true);
+ });
+ controls_holder.appendChild(self.rows[i].delete_button);
+ }
+
+
+ if(i && !this.hide_move_buttons) {
+ self.rows[i].moveup_button = this.getButton('','moveup',this.translate('button_move_up_title'));
+ self.rows[i].moveup_button.className += ' moveup';
+ self.rows[i].moveup_button.setAttribute('data-i',i);
+ self.rows[i].moveup_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var i = this.getAttribute('data-i')*1;
+
+ if(i<=0) return;
+ var rows = self.getValue();
+ var tmp = rows[i-1];
+ rows[i-1] = rows[i];
+ rows[i] = tmp;
+
+ self.setValue(rows);
+ self.onChange(true);
+ });
+ controls_holder.appendChild(self.rows[i].moveup_button);
+ }
+
+ if(!this.hide_move_buttons) {
+ self.rows[i].movedown_button = this.getButton('','movedown',this.translate('button_move_down_title'));
+ self.rows[i].movedown_button.className += ' movedown';
+ self.rows[i].movedown_button.setAttribute('data-i',i);
+ self.rows[i].movedown_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ var i = this.getAttribute('data-i')*1;
+ var rows = self.getValue();
+ if(i>=rows.length-1) return;
+ var tmp = rows[i+1];
+ rows[i+1] = rows[i];
+ rows[i] = tmp;
+
+ self.setValue(rows);
+ self.onChange(true);
+ });
+ controls_holder.appendChild(self.rows[i].movedown_button);
+ }
+
+ if(value) self.rows[i].setValue(value);
+ },
+ addControls: function() {
+ var self = this;
+
+ this.collapsed = false;
+ this.toggle_button = this.getButton('','collapse',this.translate('button_collapse'));
+ if(this.title_controls) {
+ this.title_controls.appendChild(this.toggle_button);
+ this.toggle_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ if(self.collapsed) {
+ self.collapsed = false;
+ self.panel.style.display = '';
+ self.setButtonText(this,'','collapse',self.translate('button_collapse'));
+ }
+ else {
+ self.collapsed = true;
+ self.panel.style.display = 'none';
+ self.setButtonText(this,'','expand',self.translate('button_expand'));
+ }
+ });
+
+ // If it should start collapsed
+ if(this.options.collapsed) {
+ $trigger(this.toggle_button,'click');
+ }
+
+ // Collapse button disabled
+ if(this.schema.options && typeof this.schema.options.disable_collapse !== "undefined") {
+ if(this.schema.options.disable_collapse) this.toggle_button.style.display = 'none';
+ }
+ else if(this.jsoneditor.options.disable_collapse) {
+ this.toggle_button.style.display = 'none';
+ }
+ }
+
+ // Add "new row" and "delete last" buttons below editor
+ this.add_row_button = this.getButton(this.getItemTitle(),'add',this.translate('button_add_row_title',[this.getItemTitle()]));
+ this.add_row_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ self.addRow();
+ self.refreshValue();
+ self.refreshRowButtons();
+ self.onChange(true);
+ });
+ self.controls.appendChild(this.add_row_button);
+
+ this.delete_last_row_button = this.getButton(this.translate('button_delete_last',[this.getItemTitle()]),'delete',this.translate('button_delete_last_title',[this.getItemTitle()]));
+ this.delete_last_row_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ var rows = self.getValue();
+ rows.pop();
+ self.setValue(rows);
+ self.onChange(true);
+ });
+ self.controls.appendChild(this.delete_last_row_button);
+
+ this.remove_all_rows_button = this.getButton(this.translate('button_delete_all'),'delete',this.translate('button_delete_all_title'));
+ this.remove_all_rows_button.addEventListener('click',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ self.setValue([]);
+ self.onChange(true);
+ });
+ self.controls.appendChild(this.remove_all_rows_button);
+ }
+});
+
+// Multiple Editor (for when `type` is an array, also when `oneOf` is present)
+JSONEditor.defaults.editors.multiple = JSONEditor.AbstractEditor.extend({
+ register: function() {
+ if(this.editors) {
+ for(var i=0; i<this.editors.length; i++) {
+ if(!this.editors[i]) continue;
+ this.editors[i].unregister();
+ }
+ if(this.editors[this.type]) this.editors[this.type].register();
+ }
+ this._super();
+ },
+ unregister: function() {
+ this._super();
+ if(this.editors) {
+ for(var i=0; i<this.editors.length; i++) {
+ if(!this.editors[i]) continue;
+ this.editors[i].unregister();
+ }
+ }
+ },
+ getNumColumns: function() {
+ if(!this.editors[this.type]) return 4;
+ return Math.max(this.editors[this.type].getNumColumns(),4);
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ if(this.editors) {
+ for(var i=0; i<this.editors.length; i++) {
+ if(!this.editors[i]) continue;
+ this.editors[i].enable();
+ }
+ }
+ this.switcher.disabled = false;
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ if(this.editors) {
+ for(var i=0; i<this.editors.length; i++) {
+ if(!this.editors[i]) continue;
+ this.editors[i].disable(always_disabled);
+ }
+ }
+ this.switcher.disabled = true;
+ this._super();
+ },
+ switchEditor: function(i) {
+ var self = this;
+
+ if(!this.editors[i]) {
+ this.buildChildEditor(i);
+ }
+
+ var current_value = self.getValue();
+
+ self.type = i;
+
+ self.register();
+
+ $each(self.editors,function(type,editor) {
+ if(!editor) return;
+ if(self.type === type) {
+ if(self.keep_values) editor.setValue(current_value,true);
+ editor.container.style.display = '';
+ }
+ else editor.container.style.display = 'none';
+ });
+ self.refreshValue();
+ self.refreshHeaderText();
+ },
+ buildChildEditor: function(i) {
+ var self = this;
+ var type = this.types[i];
+ var holder = self.theme.getChildEditorHolder();
+ self.editor_holder.appendChild(holder);
+
+ var schema;
+
+ if(typeof type === "string") {
+ schema = $extend({},self.schema);
+ schema.type = type;
+ }
+ else {
+ schema = $extend({},self.schema,type);
+ schema = self.jsoneditor.expandRefs(schema);
+
+ // If we need to merge `required` arrays
+ if(type && type.required && Array.isArray(type.required) && self.schema.required && Array.isArray(self.schema.required)) {
+ schema.required = self.schema.required.concat(type.required);
+ }
+ }
+
+ var editor = self.jsoneditor.getEditorClass(schema);
+
+ self.editors[i] = self.jsoneditor.createEditor(editor,{
+ jsoneditor: self.jsoneditor,
+ schema: schema,
+ container: holder,
+ path: self.path,
+ parent: self,
+ required: true
+ });
+ self.editors[i].preBuild();
+ self.editors[i].build();
+ self.editors[i].postBuild();
+
+ if(self.editors[i].header) self.editors[i].header.style.display = 'none';
+
+ self.editors[i].option = self.switcher_options[i];
+
+ holder.addEventListener('change_header_text',function() {
+ self.refreshHeaderText();
+ });
+
+ if(i !== self.type) holder.style.display = 'none';
+ },
+ preBuild: function() {
+ var self = this;
+
+ this.types = [];
+ this.type = 0;
+ this.editors = [];
+ this.validators = [];
+
+ this.keep_values = true;
+ if(typeof this.jsoneditor.options.keep_oneof_values !== "undefined") this.keep_values = this.jsoneditor.options.keep_oneof_values;
+ if(typeof this.options.keep_oneof_values !== "undefined") this.keep_values = this.options.keep_oneof_values;
+
+ if(this.schema.oneOf) {
+ this.oneOf = true;
+ this.types = this.schema.oneOf;
+ delete this.schema.oneOf;
+ }
+ else if(this.schema.anyOf) {
+ this.anyOf = true;
+ this.types = this.schema.anyOf;
+ delete this.schema.anyOf;
+ }
+ else {
+ if(!this.schema.type || this.schema.type === "any") {
+ this.types = ['string','number','integer','boolean','object','array','null'];
+
+ // If any of these primitive types are disallowed
+ if(this.schema.disallow) {
+ var disallow = this.schema.disallow;
+ if(typeof disallow !== 'object' || !(Array.isArray(disallow))) {
+ disallow = [disallow];
+ }
+ var allowed_types = [];
+ $each(this.types,function(i,type) {
+ if(disallow.indexOf(type) === -1) allowed_types.push(type);
+ });
+ this.types = allowed_types;
+ }
+ }
+ else if(Array.isArray(this.schema.type)) {
+ this.types = this.schema.type;
+ }
+ else {
+ this.types = [this.schema.type];
+ }
+ delete this.schema.type;
+ }
+
+ this.display_text = this.getDisplayText(this.types);
+ },
+ build: function() {
+ var self = this;
+ var container = this.container;
+
+ this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+ this.container.appendChild(this.header);
+
+ this.switcher = this.theme.getSwitcher(this.display_text);
+ container.appendChild(this.switcher);
+ this.switcher.addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ self.switchEditor(self.display_text.indexOf(this.value));
+ self.onChange(true);
+ });
+
+ this.editor_holder = document.createElement('div');
+ container.appendChild(this.editor_holder);
+
+
+ var validator_options = {};
+ if(self.jsoneditor.options.custom_validators) {
+ validator_options.custom_validators = self.jsoneditor.options.custom_validators;
+ }
+
+ this.switcher_options = this.theme.getSwitcherOptions(this.switcher);
+ $each(this.types,function(i,type) {
+ self.editors[i] = false;
+
+ var schema;
+
+ if(typeof type === "string") {
+ schema = $extend({},self.schema);
+ schema.type = type;
+ }
+ else {
+ schema = $extend({},self.schema,type);
+
+ // If we need to merge `required` arrays
+ if(type.required && Array.isArray(type.required) && self.schema.required && Array.isArray(self.schema.required)) {
+ schema.required = self.schema.required.concat(type.required);
+ }
+ }
+
+ self.validators[i] = new JSONEditor.Validator(self.jsoneditor,schema,validator_options);
+ });
+
+ this.switchEditor(0);
+ },
+ onChildEditorChange: function(editor) {
+ if(this.editors[this.type]) {
+ this.refreshValue();
+ this.refreshHeaderText();
+ }
+
+ this._super();
+ },
+ refreshHeaderText: function() {
+ var display_text = this.getDisplayText(this.types);
+ $each(this.switcher_options, function(i,option) {
+ option.textContent = display_text[i];
+ });
+ },
+ refreshValue: function() {
+ this.value = this.editors[this.type].getValue();
+ },
+ setValue: function(val,initial) {
+ // Determine type by getting the first one that validates
+ var self = this;
+ var prev_type = this.type;
+ $each(this.validators, function(i,validator) {
+ if(!validator.validate(val).length) {
+ self.type = i;
+ self.switcher.value = self.display_text[i];
+ return false;
+ }
+ });
+
+ var type_changed = this.type != prev_type;
+ if (type_changed) {
+ this.switchEditor(this.type);
+ }
+
+ this.editors[this.type].setValue(val,initial);
+
+ this.refreshValue();
+ self.onChange(type_changed);
+ },
+ destroy: function() {
+ $each(this.editors, function(type,editor) {
+ if(editor) editor.destroy();
+ });
+ if(this.editor_holder && this.editor_holder.parentNode) this.editor_holder.parentNode.removeChild(this.editor_holder);
+ if(this.switcher && this.switcher.parentNode) this.switcher.parentNode.removeChild(this.switcher);
+ this._super();
+ },
+ showValidationErrors: function(errors) {
+ var self = this;
+
+ // oneOf and anyOf error paths need to remove the oneOf[i] part before passing to child editors
+ if(this.oneOf || this.anyOf) {
+ var check_part = this.oneOf? 'oneOf' : 'anyOf';
+ $each(this.editors,function(i,editor) {
+ if(!editor) return;
+ var check = self.path+'.'+check_part+'['+i+']';
+ var new_errors = [];
+ $each(errors, function(j,error) {
+ if(error.path.substr(0,check.length)===check) {
+ var new_error = $extend({},error);
+ new_error.path = self.path+new_error.path.substr(check.length);
+ new_errors.push(new_error);
+ }
+ });
+
+ editor.showValidationErrors(new_errors);
+ });
+ }
+ else {
+ $each(this.editors,function(type,editor) {
+ if(!editor) return;
+ editor.showValidationErrors(errors);
+ });
+ }
+ }
+});
+
+// Enum Editor (used for objects and arrays with enumerated values)
+JSONEditor.defaults.editors["enum"] = JSONEditor.AbstractEditor.extend({
+ getNumColumns: function() {
+ return 4;
+ },
+ build: function() {
+ var container = this.container;
+ this.title = this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+ this.container.appendChild(this.title);
+
+ this.options.enum_titles = this.options.enum_titles || [];
+
+ this["enum"] = this.schema["enum"];
+ this.selected = 0;
+ this.select_options = [];
+ this.html_values = [];
+
+ var self = this;
+ for(var i=0; i<this["enum"].length; i++) {
+ this.select_options[i] = this.options.enum_titles[i] || "Value "+(i+1);
+ this.html_values[i] = this.getHTML(this["enum"][i]);
+ }
+
+ // Switcher
+ this.switcher = this.theme.getSwitcher(this.select_options);
+ this.container.appendChild(this.switcher);
+
+ // Display area
+ this.display_area = this.theme.getIndentedPanel();
+ this.container.appendChild(this.display_area);
+
+ if(this.options.hide_display) this.display_area.style.display = "none";
+
+ this.switcher.addEventListener('change',function() {
+ self.selected = self.select_options.indexOf(this.value);
+ self.value = self["enum"][self.selected];
+ self.refreshValue();
+ self.onChange(true);
+ });
+ this.value = this["enum"][0];
+ this.refreshValue();
+
+ if(this["enum"].length === 1) this.switcher.style.display = 'none';
+ },
+ refreshValue: function() {
+ var self = this;
+ self.selected = -1;
+ var stringified = JSON.stringify(this.value);
+ $each(this["enum"], function(i, el) {
+ if(stringified === JSON.stringify(el)) {
+ self.selected = i;
+ return false;
+ }
+ });
+
+ if(self.selected<0) {
+ self.setValue(self["enum"][0]);
+ return;
+ }
+
+ this.switcher.value = this.select_options[this.selected];
+ this.display_area.innerHTML = this.html_values[this.selected];
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ this.switcher.disabled = false;
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ this.switcher.disabled = true;
+ this._super();
+ },
+ getHTML: function(el) {
+ var self = this;
+
+ if(el === null) {
+ return '<em>null</em>';
+ }
+ // Array or Object
+ else if(typeof el === "object") {
+ // TODO: use theme
+ var ret = '';
+
+ $each(el,function(i,child) {
+ var html = self.getHTML(child);
+
+ // Add the keys to object children
+ if(!(Array.isArray(el))) {
+ // TODO: use theme
+ html = '<div><em>'+i+'</em>: '+html+'</div>';
+ }
+
+ // TODO: use theme
+ ret += '<li>'+html+'</li>';
+ });
+
+ if(Array.isArray(el)) ret = '<ol>'+ret+'</ol>';
+ else ret = "<ul style='margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0;'>"+ret+'</ul>';
+
+ return ret;
+ }
+ // Boolean
+ else if(typeof el === "boolean") {
+ return el? 'true' : 'false';
+ }
+ // String
+ else if(typeof el === "string") {
+ return el.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+ }
+ // Number
+ else {
+ return el;
+ }
+ },
+ setValue: function(val) {
+ if(this.value !== val) {
+ this.value = val;
+ this.refreshValue();
+ this.onChange();
+ }
+ },
+ destroy: function() {
+ if(this.display_area && this.display_area.parentNode) this.display_area.parentNode.removeChild(this.display_area);
+ if(this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title);
+ if(this.switcher && this.switcher.parentNode) this.switcher.parentNode.removeChild(this.switcher);
+
+ this._super();
+ }
+});
+
+JSONEditor.defaults.editors.select = JSONEditor.AbstractEditor.extend({
+ setValue: function(value,initial) {
+ value = this.typecast(value||'');
+
+ // Sanitize value before setting it
+ var sanitized = value;
+ if(this.enum_values.indexOf(sanitized) < 0) {
+ sanitized = this.enum_values[0];
+ }
+
+ if(this.value === sanitized) {
+ return;
+ }
+
+ this.input.value = this.enum_options[this.enum_values.indexOf(sanitized)];
+ if(this.select2) {
+ if(this.select2v4)
+ this.select2.val(this.input.value).trigger("change");
+ else
+ this.select2.select2('val',this.input.value);
+ }
+ this.value = sanitized;
+ this.onChange();
+ this.change();
+ },
+ register: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.setAttribute('name',this.formname);
+ },
+ unregister: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.removeAttribute('name');
+ },
+ getNumColumns: function() {
+ if(!this.enum_options) return 3;
+ var longest_text = this.getTitle().length;
+ for(var i=0; i<this.enum_options.length; i++) {
+ longest_text = Math.max(longest_text,this.enum_options[i].length+4);
+ }
+ return Math.min(12,Math.max(longest_text/7,2));
+ },
+ typecast: function(value) {
+ if(this.schema.type === "boolean") {
+ return !!value;
+ }
+ else if(this.schema.type === "number") {
+ return 1*value;
+ }
+ else if(this.schema.type === "integer") {
+ return Math.floor(value*1);
+ }
+ else {
+ return ""+value;
+ }
+ },
+ getValue: function() {
+ if (!this.dependenciesFulfilled) {
+ return undefined;
+ }
+ return this.typecast(this.value);
+ },
+ preBuild: function() {
+ var self = this;
+ this.input_type = 'select';
+ this.enum_options = [];
+ this.enum_values = [];
+ this.enum_display = [];
+ var i;
+
+ // Enum options enumerated
+ if(this.schema["enum"]) {
+ var display = this.schema.options && this.schema.options.enum_titles || [];
+
+ $each(this.schema["enum"],function(i,option) {
+ self.enum_options[i] = ""+option;
+ self.enum_display[i] = ""+(display[i] || option);
+ self.enum_values[i] = self.typecast(option);
+ });
+
+ if(!this.isRequired()){
+ self.enum_display.unshift(' ');
+ self.enum_options.unshift('undefined');
+ self.enum_values.unshift(undefined);
+ }
+
+ }
+ // Boolean
+ else if(this.schema.type === "boolean") {
+ self.enum_display = this.schema.options && this.schema.options.enum_titles || ['true','false'];
+ self.enum_options = ['1',''];
+ self.enum_values = [true,false];
+
+ if(!this.isRequired()){
+ self.enum_display.unshift(' ');
+ self.enum_options.unshift('undefined');
+ self.enum_values.unshift(undefined);
+ }
+
+ }
+ // Dynamic Enum
+ else if(this.schema.enumSource) {
+ this.enumSource = [];
+ this.enum_display = [];
+ this.enum_options = [];
+ this.enum_values = [];
+
+ // Shortcut declaration for using a single array
+ if(!(Array.isArray(this.schema.enumSource))) {
+ if(this.schema.enumValue) {
+ this.enumSource = [
+ {
+ source: this.schema.enumSource,
+ value: this.schema.enumValue
+ }
+ ];
+ }
+ else {
+ this.enumSource = [
+ {
+ source: this.schema.enumSource
+ }
+ ];
+ }
+ }
+ else {
+ for(i=0; i<this.schema.enumSource.length; i++) {
+ // Shorthand for watched variable
+ if(typeof this.schema.enumSource[i] === "string") {
+ this.enumSource[i] = {
+ source: this.schema.enumSource[i]
+ };
+ }
+ // Make a copy of the schema
+ else if(!(Array.isArray(this.schema.enumSource[i]))) {
+ this.enumSource[i] = $extend({},this.schema.enumSource[i]);
+ }
+ else {
+ this.enumSource[i] = this.schema.enumSource[i];
+ }
+ }
+ }
+
+ // Now, enumSource is an array of sources
+ // Walk through this array and fix up the values
+ for(i=0; i<this.enumSource.length; i++) {
+ if(this.enumSource[i].value) {
+ this.enumSource[i].value = this.jsoneditor.compileTemplate(this.enumSource[i].value, this.template_engine);
+ }
+ if(this.enumSource[i].title) {
+ this.enumSource[i].title = this.jsoneditor.compileTemplate(this.enumSource[i].title, this.template_engine);
+ }
+ if(this.enumSource[i].filter) {
+ this.enumSource[i].filter = this.jsoneditor.compileTemplate(this.enumSource[i].filter, this.template_engine);
+ }
+ }
+ }
+ // Other, not supported
+ else {
+ throw "'select' editor requires the enum property to be set.";
+ }
+ },
+ build: function() {
+ var self = this;
+ if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+ if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+ if(this.options.infoText) this.infoButton = this.theme.getInfoButton(this.options.infoText);
+ if(this.options.compact) this.container.className += ' compact';
+
+ this.input = this.theme.getSelectInput(this.enum_options);
+ this.theme.setSelectOptions(this.input,this.enum_options,this.enum_display);
+
+ if(this.schema.readOnly || this.schema.readonly) {
+ this.always_disabled = true;
+ this.input.disabled = true;
+ }
+
+ this.input.addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.onInputChange();
+ });
+
+ this.control = this.theme.getFormControl(this.label, this.input, this.description, this.infoButton);
+ this.input.controlgroup = this.control;
+ this.container.appendChild(this.control);
+
+ this.value = this.enum_values[0];
+ },
+ onInputChange: function() {
+ var val = this.typecast(this.input.value);
+
+ var new_val;
+ // Invalid option, use first option instead
+ if(this.enum_options.indexOf(val) === -1) {
+ new_val = this.enum_values[0];
+ }
+ else {
+ new_val = this.enum_values[this.enum_options.indexOf(val)];
+ }
+
+ // If valid hasn't changed
+ if(new_val === this.value) return;
+
+ // Store new value and propogate change event
+ this.value = new_val;
+ this.onChange(true);
+ },
+ setupSelect2: function() {
+ // If the Select2 library is loaded use it when we have lots of items
+ if(window.jQuery && window.jQuery.fn && window.jQuery.fn.select2 && (this.enum_options.length > 2 || (this.enum_options.length && this.enumSource))) {
+ var options = $extend({},JSONEditor.plugins.select2);
+ if(this.schema.options && this.schema.options.select2_options) options = $extend(options,this.schema.options.select2_options);
+ this.select2 = window.jQuery(this.input).select2(options);
+ this.select2v4 = this.select2.select2.hasOwnProperty("amd");
+
+ var self = this;
+ this.select2.on('select2-blur',function() {
+ if(self.select2v4)
+ self.input.value = self.select2.val();
+ else
+ self.input.value = self.select2.select2('val');
+
+ self.onInputChange();
+ });
+
+ this.select2.on('change',function() {
+ if(self.select2v4)
+ self.input.value = self.select2.val();
+ else
+ self.input.value = self.select2.select2('val');
+
+ self.onInputChange();
+ });
+ }
+ else {
+ this.select2 = null;
+ }
+ },
+ postBuild: function() {
+ this._super();
+ this.theme.afterInputReady(this.input);
+ this.setupSelect2();
+ },
+ onWatchedFieldChange: function() {
+ var self = this, vars, j;
+
+ // If this editor uses a dynamic select box
+ if(this.enumSource) {
+ vars = this.getWatchedFieldValues();
+ var select_options = [];
+ var select_titles = [];
+
+ for(var i=0; i<this.enumSource.length; i++) {
+ // Constant values
+ if(Array.isArray(this.enumSource[i])) {
+ select_options = select_options.concat(this.enumSource[i]);
+ select_titles = select_titles.concat(this.enumSource[i]);
+ }
+ else {
+ var items = [];
+ // Static list of items
+ if(Array.isArray(this.enumSource[i].source)) {
+ items = this.enumSource[i].source;
+ // A watched field
+ } else {
+ items = vars[this.enumSource[i].source];
+ }
+
+ if(items) {
+ // Only use a predefined part of the array
+ if(this.enumSource[i].slice) {
+ items = Array.prototype.slice.apply(items,this.enumSource[i].slice);
+ }
+ // Filter the items
+ if(this.enumSource[i].filter) {
+ var new_items = [];
+ for(j=0; j<items.length; j++) {
+ if(this.enumSource[i].filter({i:j,item:items[j],watched:vars})) new_items.push(items[j]);
+ }
+ items = new_items;
+ }
+
+ var item_titles = [];
+ var item_values = [];
+ for(j=0; j<items.length; j++) {
+ var item = items[j];
+
+ // Rendered value
+ if(this.enumSource[i].value) {
+ item_values[j] = this.enumSource[i].value({
+ i: j,
+ item: item
+ });
+ }
+ // Use value directly
+ else {
+ item_values[j] = items[j];
+ }
+
+ // Rendered title
+ if(this.enumSource[i].title) {
+ item_titles[j] = this.enumSource[i].title({
+ i: j,
+ item: item
+ });
+ }
+ // Use value as the title also
+ else {
+ item_titles[j] = item_values[j];
+ }
+ }
+
+ // TODO: sort
+
+ select_options = select_options.concat(item_values);
+ select_titles = select_titles.concat(item_titles);
+ }
+ }
+ }
+
+ var prev_value = this.value;
+
+ this.theme.setSelectOptions(this.input, select_options, select_titles);
+ this.enum_options = select_options;
+ this.enum_display = select_titles;
+ this.enum_values = select_options;
+
+ if(this.select2) {
+ this.select2.select2('destroy');
+ }
+
+ // If the previous value is still in the new select options, stick with it
+ if(select_options.indexOf(prev_value) !== -1) {
+ this.input.value = prev_value;
+ this.value = prev_value;
+ }
+ // Otherwise, set the value to the first select option
+ else {
+ this.input.value = select_options[0];
+ this.value = this.typecast(select_options[0] || "");
+ if(this.parent) this.parent.onChildEditorChange(this);
+ else this.jsoneditor.onChange();
+ this.jsoneditor.notifyWatchers(this.path);
+ }
+
+ this.setupSelect2();
+ }
+
+ this._super();
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ this.input.disabled = false;
+ if(this.select2) {
+ if(this.select2v4)
+ this.select2.prop("disabled",false);
+ else
+ this.select2.select2("enable",true);
+ }
+ }
+ this._super();
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ this.input.disabled = true;
+ if(this.select2) {
+ if(this.select2v4)
+ this.select2.prop("disabled",true);
+ else
+ this.select2.select2("enable",false);
+ }
+ this._super();
+ },
+ destroy: function() {
+ if(this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label);
+ if(this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
+ if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
+ if(this.select2) {
+ this.select2.select2('destroy');
+ this.select2 = null;
+ }
+
+ this._super();
+ },
+ showValidationErrors: function (errors) {
+ var self = this;
+
+ if (this.jsoneditor.options.show_errors === "always") {}
+ else if (!this.is_dirty && this.previous_error_setting === this.jsoneditor.options.show_errors) {
+ return;
+ }
+
+ this.previous_error_setting = this.jsoneditor.options.show_errors;
+
+ var messages = [];
+ $each(errors, function (i, error) {
+ if (error.path === self.path) {
+ messages.push(error.message);
+ }
+ });
+
+ this.input.controlgroup = this.control;
+
+ if (messages.length) {
+ this.theme.addInputError(this.input, messages.join('. ') + '.');
+ }
+ else {
+ this.theme.removeInputError(this.input);
+ }
+ }
+});
+
+JSONEditor.defaults.editors.selectize = JSONEditor.AbstractEditor.extend({
+ setValue: function(value,initial) {
+ value = this.typecast(value||'');
+
+ // Sanitize value before setting it
+ var sanitized = value;
+ if(this.enum_values.indexOf(sanitized) < 0) {
+ sanitized = this.enum_values[0];
+ }
+
+ if(this.value === sanitized) {
+ return;
+ }
+
+ this.input.value = this.enum_options[this.enum_values.indexOf(sanitized)];
+
+ if(this.selectize) {
+ this.selectize[0].selectize.addItem(sanitized);
+ }
+
+ this.value = sanitized;
+ this.onChange();
+ },
+ register: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.setAttribute('name',this.formname);
+ },
+ unregister: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.removeAttribute('name');
+ },
+ getNumColumns: function() {
+ if(!this.enum_options) return 3;
+ var longest_text = this.getTitle().length;
+ for(var i=0; i<this.enum_options.length; i++) {
+ longest_text = Math.max(longest_text,this.enum_options[i].length+4);
+ }
+ return Math.min(12,Math.max(longest_text/7,2));
+ },
+ typecast: function(value) {
+ if(this.schema.type === "boolean") {
+ return !!value;
+ }
+ else if(this.schema.type === "number") {
+ return 1*value;
+ }
+ else if(this.schema.type === "integer") {
+ return Math.floor(value*1);
+ }
+ else {
+ return ""+value;
+ }
+ },
+ getValue: function() {
+ if (!this.dependenciesFulfilled) {
+ return undefined;
+ }
+ return this.value;
+ },
+ preBuild: function() {
+ var self = this;
+ this.input_type = 'select';
+ this.enum_options = [];
+ this.enum_values = [];
+ this.enum_display = [];
+ var i;
+
+ // Enum options enumerated
+ if(this.schema.enum) {
+ var display = this.schema.options && this.schema.options.enum_titles || [];
+
+ $each(this.schema.enum,function(i,option) {
+ self.enum_options[i] = ""+option;
+ self.enum_display[i] = ""+(display[i] || option);
+ self.enum_values[i] = self.typecast(option);
+ });
+ }
+ // Boolean
+ else if(this.schema.type === "boolean") {
+ self.enum_display = this.schema.options && this.schema.options.enum_titles || ['true','false'];
+ self.enum_options = ['1','0'];
+ self.enum_values = [true,false];
+ }
+ // Dynamic Enum
+ else if(this.schema.enumSource) {
+ this.enumSource = [];
+ this.enum_display = [];
+ this.enum_options = [];
+ this.enum_values = [];
+
+ // Shortcut declaration for using a single array
+ if(!(Array.isArray(this.schema.enumSource))) {
+ if(this.schema.enumValue) {
+ this.enumSource = [
+ {
+ source: this.schema.enumSource,
+ value: this.schema.enumValue
+ }
+ ];
+ }
+ else {
+ this.enumSource = [
+ {
+ source: this.schema.enumSource
+ }
+ ];
+ }
+ }
+ else {
+ for(i=0; i<this.schema.enumSource.length; i++) {
+ // Shorthand for watched variable
+ if(typeof this.schema.enumSource[i] === "string") {
+ this.enumSource[i] = {
+ source: this.schema.enumSource[i]
+ };
+ }
+ // Make a copy of the schema
+ else if(!(Array.isArray(this.schema.enumSource[i]))) {
+ this.enumSource[i] = $extend({},this.schema.enumSource[i]);
+ }
+ else {
+ this.enumSource[i] = this.schema.enumSource[i];
+ }
+ }
+ }
+
+ // Now, enumSource is an array of sources
+ // Walk through this array and fix up the values
+ for(i=0; i<this.enumSource.length; i++) {
+ if(this.enumSource[i].value) {
+ this.enumSource[i].value = this.jsoneditor.compileTemplate(this.enumSource[i].value, this.template_engine);
+ }
+ if(this.enumSource[i].title) {
+ this.enumSource[i].title = this.jsoneditor.compileTemplate(this.enumSource[i].title, this.template_engine);
+ }
+ if(this.enumSource[i].filter) {
+ this.enumSource[i].filter = this.jsoneditor.compileTemplate(this.enumSource[i].filter, this.template_engine);
+ }
+ }
+ }
+ // Other, not supported
+ else {
+ throw "'select' editor requires the enum property to be set.";
+ }
+ },
+ build: function() {
+ var self = this;
+ if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+ if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+ if(this.options.infoText) this.infoButton = this.theme.getInfoButton(this.options.infoText);
+
+ if(this.options.compact) this.container.className += ' compact';
+
+ this.input = this.theme.getSelectInput(this.enum_options);
+ this.theme.setSelectOptions(this.input,this.enum_options,this.enum_display);
+
+ if(this.schema.readOnly || this.schema.readonly) {
+ this.always_disabled = true;
+ this.input.disabled = true;
+ }
+
+ this.input.addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.onInputChange();
+ });
+
+ this.control = this.theme.getFormControl(this.label, this.input, this.description, this.infoButton);
+ this.container.appendChild(this.control);
+
+ this.value = this.enum_values[0];
+ },
+ onInputChange: function() {
+ //console.log("onInputChange");
+ var val = this.input.value;
+
+ var sanitized = val;
+ if(this.enum_options.indexOf(val) === -1) {
+ sanitized = this.enum_options[0];
+ }
+
+ //this.value = this.enum_values[this.enum_options.indexOf(val)];
+ this.value = val;
+ this.onChange(true);
+ },
+ setupSelectize: function() {
+ // If the Selectize library is loaded use it when we have lots of items
+ var self = this;
+ if(window.jQuery && window.jQuery.fn && window.jQuery.fn.selectize && (this.enum_options.length >= 2 || (this.enum_options.length && this.enumSource))) {
+ var options = $extend({},JSONEditor.plugins.selectize);
+ if(this.schema.options && this.schema.options.selectize_options) options = $extend(options,this.schema.options.selectize_options);
+ this.selectize = window.jQuery(this.input).selectize($extend(options,
+ {
+ // set the create option to true by default, or to the user specified value if defined
+ create: ( options.create === undefined ? true : options.create),
+ onChange : function() {
+ self.onInputChange();
+ }
+ }));
+ }
+ else {
+ this.selectize = null;
+ }
+ },
+ postBuild: function() {
+ this._super();
+ this.theme.afterInputReady(this.input);
+ this.setupSelectize();
+ },
+ onWatchedFieldChange: function() {
+ var self = this, vars, j;
+
+ // If this editor uses a dynamic select box
+ if(this.enumSource) {
+ vars = this.getWatchedFieldValues();
+ var select_options = [];
+ var select_titles = [];
+
+ for(var i=0; i<this.enumSource.length; i++) {
+ // Constant values
+ if(Array.isArray(this.enumSource[i])) {
+ select_options = select_options.concat(this.enumSource[i]);
+ select_titles = select_titles.concat(this.enumSource[i]);
+ }
+ // A watched field
+ else if(vars[this.enumSource[i].source]) {
+ var items = vars[this.enumSource[i].source];
+
+ // Only use a predefined part of the array
+ if(this.enumSource[i].slice) {
+ items = Array.prototype.slice.apply(items,this.enumSource[i].slice);
+ }
+ // Filter the items
+ if(this.enumSource[i].filter) {
+ var new_items = [];
+ for(j=0; j<items.length; j++) {
+ if(this.enumSource[i].filter({i:j,item:items[j]})) new_items.push(items[j]);
+ }
+ items = new_items;
+ }
+
+ var item_titles = [];
+ var item_values = [];
+ for(j=0; j<items.length; j++) {
+ var item = items[j];
+
+ // Rendered value
+ if(this.enumSource[i].value) {
+ item_values[j] = this.enumSource[i].value({
+ i: j,
+ item: item
+ });
+ }
+ // Use value directly
+ else {
+ item_values[j] = items[j];
+ }
+
+ // Rendered title
+ if(this.enumSource[i].title) {
+ item_titles[j] = this.enumSource[i].title({
+ i: j,
+ item: item
+ });
+ }
+ // Use value as the title also
+ else {
+ item_titles[j] = item_values[j];
+ }
+ }
+
+ // TODO: sort
+
+ select_options = select_options.concat(item_values);
+ select_titles = select_titles.concat(item_titles);
+ }
+ }
+
+ var prev_value = this.value;
+
+ // Check to see if this item is in the list
+ // Note: We have to skip empty string for watch lists to work properly
+ if ((prev_value !== undefined) && (prev_value !== "") && (select_options.indexOf(prev_value) === -1)) {
+ // item is not in the list. Add it.
+ select_options = select_options.concat(prev_value);
+ select_titles = select_titles.concat(prev_value);
+ }
+
+ this.theme.setSelectOptions(this.input, select_options, select_titles);
+ this.enum_options = select_options;
+ this.enum_display = select_titles;
+ this.enum_values = select_options;
+
+ // If the previous value is still in the new select options, stick with it
+ if(select_options.indexOf(prev_value) !== -1) {
+ this.input.value = prev_value;
+ this.value = prev_value;
+ }
+
+ // Otherwise, set the value to the first select option
+ else {
+ this.input.value = select_options[0];
+ this.value = select_options[0] || "";
+ if(this.parent) this.parent.onChildEditorChange(this);
+ else this.jsoneditor.onChange();
+ this.jsoneditor.notifyWatchers(this.path);
+ }
+
+ if(this.selectize) {
+ // Update the Selectize options
+ this.updateSelectizeOptions(select_options);
+ }
+ else {
+ this.setupSelectize();
+ }
+
+ this._super();
+ }
+ },
+ updateSelectizeOptions: function(select_options) {
+ var selectized = this.selectize[0].selectize,
+ self = this;
+
+ selectized.off();
+ selectized.clearOptions();
+ for(var n in select_options) {
+ selectized.addOption({value:select_options[n],text:select_options[n]});
+ }
+ selectized.addItem(this.value);
+ selectized.on('change',function() {
+ self.onInputChange();
+ });
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ this.input.disabled = false;
+ if(this.selectize) {
+ this.selectize[0].selectize.unlock();
+ }
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ this.input.disabled = true;
+ if(this.selectize) {
+ this.selectize[0].selectize.lock();
+ }
+ this._super();
+ },
+ destroy: function() {
+ if(this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label);
+ if(this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
+ if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
+ if(this.selectize) {
+ this.selectize[0].selectize.destroy();
+ this.selectize = null;
+ }
+ this._super();
+ }
+});
+
+JSONEditor.defaults.editors.multiselect = JSONEditor.AbstractEditor.extend({
+ preBuild: function() {
+ this._super();
+ var i;
+
+ this.select_options = {};
+ this.select_values = {};
+
+ var items_schema = this.jsoneditor.expandRefs(this.schema.items || {});
+
+ var e = items_schema["enum"] || [];
+ var t = items_schema.options? items_schema.options.enum_titles || [] : [];
+ this.option_keys = [];
+ this.option_titles = [];
+ for(i=0; i<e.length; i++) {
+ // If the sanitized value is different from the enum value, don't include it
+ if(this.sanitize(e[i]) !== e[i]) continue;
+
+ this.option_keys.push(e[i]+"");
+ this.option_titles.push((t[i]||e[i])+"");
+ this.select_values[e[i]+""] = e[i];
+ }
+ },
+ build: function() {
+ var self = this, i;
+ if(!this.options.compact) this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+ if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+
+ if((!this.schema.format && this.option_keys.length < 8) || this.schema.format === "checkbox") {
+ this.input_type = 'checkboxes';
+
+ this.inputs = {};
+ this.controls = {};
+ for(i=0; i<this.option_keys.length; i++) {
+ this.inputs[this.option_keys[i]] = this.theme.getCheckbox();
+ this.select_options[this.option_keys[i]] = this.inputs[this.option_keys[i]];
+ var label = this.theme.getCheckboxLabel(this.option_titles[i]);
+ this.controls[this.option_keys[i]] = this.theme.getFormControl(label, this.inputs[this.option_keys[i]]);
+ }
+
+ this.control = this.theme.getMultiCheckboxHolder(this.controls,this.label,this.description);
+ }
+ else {
+ this.input_type = 'select';
+ this.input = this.theme.getSelectInput(this.option_keys);
+ this.theme.setSelectOptions(this.input,this.option_keys,this.option_titles);
+ this.input.multiple = true;
+ this.input.size = Math.min(10,this.option_keys.length);
+
+ for(i=0; i<this.option_keys.length; i++) {
+ this.select_options[this.option_keys[i]] = this.input.children[i];
+ }
+
+ if(this.schema.readOnly || this.schema.readonly) {
+ this.always_disabled = true;
+ this.input.disabled = true;
+ }
+
+ this.control = this.theme.getFormControl(this.label, this.input, this.description);
+ }
+
+ this.container.appendChild(this.control);
+ this.control.addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ var new_value = [];
+ for(i = 0; i<self.option_keys.length; i++) {
+ if(self.select_options[self.option_keys[i]].selected || self.select_options[self.option_keys[i]].checked) new_value.push(self.select_values[self.option_keys[i]]);
+ }
+
+ self.updateValue(new_value);
+ self.onChange(true);
+ });
+ },
+ setValue: function(value, initial) {
+ var i;
+ value = value || [];
+ if(typeof value !== "object") value = [value];
+ else if(!(Array.isArray(value))) value = [];
+
+ // Make sure we are dealing with an array of strings so we can check for strict equality
+ for(i=0; i<value.length; i++) {
+ if(typeof value[i] !== "string") value[i] += "";
+ }
+
+ // Update selected status of options
+ for(i in this.select_options) {
+ if(!this.select_options.hasOwnProperty(i)) continue;
+
+ this.select_options[i][this.input_type === "select"? "selected" : "checked"] = (value.indexOf(i) !== -1);
+ }
+
+ this.updateValue(value);
+ this.onChange();
+ },
+ setupSelect2: function() {
+ if(window.jQuery && window.jQuery.fn && window.jQuery.fn.select2) {
+ var options = window.jQuery.extend({},JSONEditor.plugins.select2);
+ if(this.schema.options && this.schema.options.select2_options) options = $extend(options,this.schema.options.select2_options);
+ this.select2 = window.jQuery(this.input).select2(options);
+ this.select2v4 = this.select2.select2.hasOwnProperty("amd");
+
+ var self = this;
+ this.select2.on('select2-blur',function() {
+ if(self.select2v4)
+ self.value = self.select2.val();
+ else
+ self.value = self.select2.select2('val');
+
+ self.onChange(true);
+ });
+
+ this.select2.on('change',function() {
+ if(self.select2v4)
+ self.value = self.select2.val();
+ else
+ self.value = self.select2.select2('val');
+
+ self.onChange(true);
+ });
+ }
+ else {
+ this.select2 = null;
+ }
+ },
+ onInputChange: function() {
+ this.value = this.input.value;
+ this.onChange(true);
+ },
+ postBuild: function() {
+ this._super();
+ this.setupSelect2();
+ },
+ register: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.setAttribute('name',this.formname);
+ },
+ unregister: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.removeAttribute('name');
+ },
+ getNumColumns: function() {
+ var longest_text = this.getTitle().length;
+ for(var i in this.select_values) {
+ if(!this.select_values.hasOwnProperty(i)) continue;
+ longest_text = Math.max(longest_text,(this.select_values[i]+"").length+4);
+ }
+
+ return Math.min(12,Math.max(longest_text/7,2));
+ },
+ updateValue: function(value) {
+ var changed = false;
+ var new_value = [];
+ for(var i=0; i<value.length; i++) {
+ if(!this.select_options[value[i]+""]) {
+ changed = true;
+ continue;
+ }
+ var sanitized = this.sanitize(this.select_values[value[i]]);
+ new_value.push(sanitized);
+ if(sanitized !== value[i]) changed = true;
+ }
+ this.value = new_value;
+
+ if(this.select2) {
+ if(this.select2v4)
+ this.select2.val(this.value).trigger("change");
+ else
+ this.select2.select2('val',this.value);
+ }
+
+ return changed;
+ },
+ sanitize: function(value) {
+ if(this.schema.items.type === "number") {
+ return 1*value;
+ }
+ else if(this.schema.items.type === "integer") {
+ return Math.floor(value*1);
+ }
+ else {
+ return ""+value;
+ }
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ if(this.input) {
+ this.input.disabled = false;
+ }
+ else if(this.inputs) {
+ for(var i in this.inputs) {
+ if(!this.inputs.hasOwnProperty(i)) continue;
+ this.inputs[i].disabled = false;
+ }
+ }
+ if(this.select2) {
+ if(this.select2v4)
+ this.select2.prop("disabled",false);
+ else
+ this.select2.select2("enable",true);
+ }
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ if(this.input) {
+ this.input.disabled = true;
+ }
+ else if(this.inputs) {
+ for(var i in this.inputs) {
+ if(!this.inputs.hasOwnProperty(i)) continue;
+ this.inputs[i].disabled = true;
+ }
+ }
+ if(this.select2) {
+ if(this.select2v4)
+ this.select2.prop("disabled",true);
+ else
+ this.select2.select2("enable",false);
+ }
+ this._super();
+ },
+ destroy: function() {
+ if(this.select2) {
+ this.select2.select2('destroy');
+ this.select2 = null;
+ }
+ this._super();
+ }
+});
+
+JSONEditor.defaults.editors.base64 = JSONEditor.AbstractEditor.extend({
+ getNumColumns: function() {
+ return 4;
+ },
+ build: function() {
+ var self = this;
+ this.title = this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+ if(this.options.infoText) this.infoButton = this.theme.getInfoButton(this.options.infoText);
+
+ // Input that holds the base64 string
+ this.input = this.theme.getFormInputField('hidden');
+ this.container.appendChild(this.input);
+
+ // Don't show uploader if this is readonly
+ if(!this.schema.readOnly && !this.schema.readonly) {
+ if(!window.FileReader) throw "FileReader required for base64 editor";
+
+ // File uploader
+ this.uploader = this.theme.getFormInputField('file');
+
+ this.uploader.addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ if(this.files && this.files.length) {
+ var fr = new FileReader();
+ fr.onload = function(evt) {
+ self.value = evt.target.result;
+ self.refreshPreview();
+ self.onChange(true);
+ fr = null;
+ };
+ fr.readAsDataURL(this.files[0]);
+ }
+ });
+ }
+
+ this.preview = this.theme.getFormInputDescription(this.schema.description);
+ this.container.appendChild(this.preview);
+
+ this.control = this.theme.getFormControl(this.label, this.uploader||this.input, this.preview, this.infoButton);
+ this.container.appendChild(this.control);
+ },
+ refreshPreview: function() {
+ if(this.last_preview === this.value) return;
+ this.last_preview = this.value;
+
+ this.preview.innerHTML = '';
+
+ if(!this.value) return;
+
+ var mime = this.value.match(/^data:([^;,]+)[;,]/);
+ if(mime) mime = mime[1];
+
+ if(!mime) {
+ this.preview.innerHTML = '<em>Invalid data URI</em>';
+ }
+ else {
+ this.preview.innerHTML = '<strong>Type:</strong> '+mime+', <strong>Size:</strong> '+Math.floor((this.value.length-this.value.split(',')[0].length-1)/1.33333)+' bytes';
+ if(mime.substr(0,5)==="image") {
+ this.preview.innerHTML += '<br>';
+ var img = document.createElement('img');
+ img.style.maxWidth = '100%';
+ img.style.maxHeight = '100px';
+ img.src = this.value;
+ this.preview.appendChild(img);
+ }
+ }
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ if(this.uploader) this.uploader.disabled = false;
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ if(this.uploader) this.uploader.disabled = true;
+ this._super();
+ },
+ setValue: function(val) {
+ if(this.value !== val) {
+ this.value = val;
+ this.input.value = this.value;
+ this.refreshPreview();
+ this.onChange();
+ }
+ },
+ destroy: function() {
+ if(this.preview && this.preview.parentNode) this.preview.parentNode.removeChild(this.preview);
+ if(this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title);
+ if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
+ if(this.uploader && this.uploader.parentNode) this.uploader.parentNode.removeChild(this.uploader);
+
+ this._super();
+ }
+});
+
+JSONEditor.defaults.editors.upload = JSONEditor.AbstractEditor.extend({
+ getNumColumns: function() {
+ return 4;
+ },
+ build: function() {
+ var self = this;
+ this.title = this.header = this.label = this.theme.getFormInputLabel(this.getTitle());
+
+ // Input that holds the base64 string
+ this.input = this.theme.getFormInputField('hidden');
+ this.container.appendChild(this.input);
+
+ // Don't show uploader if this is readonly
+ if(!this.schema.readOnly && !this.schema.readonly) {
+
+ if(!this.jsoneditor.options.upload) throw "Upload handler required for upload editor";
+
+ // File uploader
+ this.uploader = this.theme.getFormInputField('file');
+
+ this.uploader.addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ if(this.files && this.files.length) {
+ var fr = new FileReader();
+ fr.onload = function(evt) {
+ self.preview_value = evt.target.result;
+ self.refreshPreview();
+ self.onChange(true);
+ fr = null;
+ };
+ fr.readAsDataURL(this.files[0]);
+ }
+ });
+ }
+
+ var description = this.schema.description;
+ if (!description) description = '';
+
+ this.preview = this.theme.getFormInputDescription(description);
+ this.container.appendChild(this.preview);
+
+ this.control = this.theme.getFormControl(this.label, this.uploader||this.input, this.preview);
+ this.container.appendChild(this.control);
+ },
+ refreshPreview: function() {
+ if(this.last_preview === this.preview_value) return;
+ this.last_preview = this.preview_value;
+
+ this.preview.innerHTML = '';
+
+ if(!this.preview_value) return;
+
+ var self = this;
+
+ var mime = this.preview_value.match(/^data:([^;,]+)[;,]/);
+ if(mime) mime = mime[1];
+ if(!mime) mime = 'unknown';
+
+ var file = this.uploader.files[0];
+
+ this.preview.innerHTML = '<strong>Type:</strong> '+mime+', <strong>Size:</strong> '+file.size+' bytes';
+ if(mime.substr(0,5)==="image") {
+ this.preview.innerHTML += '<br>';
+ var img = document.createElement('img');
+ img.style.maxWidth = '100%';
+ img.style.maxHeight = '100px';
+ img.src = this.preview_value;
+ this.preview.appendChild(img);
+ }
+
+ this.preview.innerHTML += '<br>';
+ var uploadButton = this.getButton('Upload', 'upload', 'Upload');
+ this.preview.appendChild(uploadButton);
+ uploadButton.addEventListener('click',function(event) {
+ event.preventDefault();
+
+ uploadButton.setAttribute("disabled", "disabled");
+ self.theme.removeInputError(self.uploader);
+
+ if (self.theme.getProgressBar) {
+ self.progressBar = self.theme.getProgressBar();
+ self.preview.appendChild(self.progressBar);
+ }
+
+ self.jsoneditor.options.upload(self.path, file, {
+ success: function(url) {
+ self.setValue(url);
+
+ if(self.parent) self.parent.onChildEditorChange(self);
+ else self.jsoneditor.onChange();
+
+ if (self.progressBar) self.preview.removeChild(self.progressBar);
+ uploadButton.removeAttribute("disabled");
+ },
+ failure: function(error) {
+ self.theme.addInputError(self.uploader, error);
+ if (self.progressBar) self.preview.removeChild(self.progressBar);
+ uploadButton.removeAttribute("disabled");
+ },
+ updateProgress: function(progress) {
+ if (self.progressBar) {
+ if (progress) self.theme.updateProgressBar(self.progressBar, progress);
+ else self.theme.updateProgressBarUnknown(self.progressBar);
+ }
+ }
+ });
+ });
+
+ if(this.jsoneditor.options.auto_upload || this.schema.options.auto_upload) {
+ uploadButton.dispatchEvent(new MouseEvent('click'));
+ this.preview.removeChild(uploadButton);
+ }
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ if(this.uploader) this.uploader.disabled = false;
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ if(this.uploader) this.uploader.disabled = true;
+ this._super();
+ },
+ setValue: function(val) {
+ if(this.value !== val) {
+ this.value = val;
+ this.input.value = this.value;
+ this.onChange();
+ }
+ },
+ destroy: function() {
+ if(this.preview && this.preview.parentNode) this.preview.parentNode.removeChild(this.preview);
+ if(this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title);
+ if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
+ if(this.uploader && this.uploader.parentNode) this.uploader.parentNode.removeChild(this.uploader);
+
+ this._super();
+ }
+});
+
+JSONEditor.defaults.editors.checkbox = JSONEditor.AbstractEditor.extend({
+ setValue: function(value,initial) {
+ this.value = !!value;
+ this.input.checked = this.value;
+ this.onChange();
+ },
+ register: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.setAttribute('name',this.formname);
+ },
+ unregister: function() {
+ this._super();
+ if(!this.input) return;
+ this.input.removeAttribute('name');
+ },
+ getNumColumns: function() {
+ return Math.min(12,Math.max(this.getTitle().length/7,2));
+ },
+ build: function() {
+ var self = this;
+ if(!this.options.compact) {
+ this.label = this.header = this.theme.getCheckboxLabel(this.getTitle());
+ }
+ if(this.schema.description) this.description = this.theme.getFormInputDescription(this.schema.description);
+ if(this.options.infoText) this.infoButton = this.theme.getInfoButton(this.options.infoText);
+ if(this.options.compact) this.container.className += ' compact';
+
+ this.input = this.theme.getCheckbox();
+ this.control = this.theme.getFormControl(this.label, this.input, this.description, this.infoButton);
+
+ if(this.schema.readOnly || this.schema.readonly) {
+ this.always_disabled = true;
+ this.input.disabled = true;
+ }
+
+ this.input.addEventListener('change',function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.value = this.checked;
+ self.onChange(true);
+ });
+
+ this.container.appendChild(this.control);
+ },
+ enable: function() {
+ if(!this.always_disabled) {
+ this.input.disabled = false;
+ this._super();
+ }
+ },
+ disable: function(always_disabled) {
+ if(always_disabled) this.always_disabled = true;
+ this.input.disabled = true;
+ this._super();
+ },
+ destroy: function() {
+ if(this.label && this.label.parentNode) this.label.parentNode.removeChild(this.label);
+ if(this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
+ if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
+ this._super();
+ },
+ showValidationErrors: function (errors) {
+ var self = this;
+
+ if (this.jsoneditor.options.show_errors === "always") {}
+
+ else if (!this.is_dirty && this.previous_error_setting === this.jsoneditor.options.show_errors) {
+ return;
+ }
+
+ this.previous_error_setting = this.jsoneditor.options.show_errors;
+
+ var messages = [];
+ $each(errors, function (i, error) {
+ if (error.path === self.path) {
+ messages.push(error.message);
+ }
+ });
+
+ this.input.controlgroup = this.control;
+
+ if (messages.length) {
+ this.theme.addInputError(this.input, messages.join('. ') + '.');
+ }
+ else {
+ this.theme.removeInputError(this.input);
+ }
+ }
+});
+
+JSONEditor.defaults.editors.arraySelectize = JSONEditor.AbstractEditor.extend({
+ build: function() {
+ this.title = this.theme.getFormInputLabel(this.getTitle());
+
+ this.title_controls = this.theme.getHeaderButtonHolder();
+ this.title.appendChild(this.title_controls);
+ this.error_holder = document.createElement('div');
+
+ if(this.schema.description) {
+ this.description = this.theme.getDescription(this.schema.description);
+ }
+
+ this.input = document.createElement('select');
+ this.input.setAttribute('multiple', 'multiple');
+
+ var group = this.theme.getFormControl(this.title, this.input, this.description);
+
+ this.container.appendChild(group);
+ this.container.appendChild(this.error_holder);
+
+ window.jQuery(this.input).selectize({
+ delimiter: false,
+ createOnBlur: true,
+ create: true
+ });
+ },
+ postBuild: function() {
+ var self = this;
+ this.input.selectize.on('change', function(event) {
+ self.refreshValue();
+ self.onChange(true);
+ });
+ },
+ destroy: function() {
+ this.empty(true);
+ if(this.title && this.title.parentNode) this.title.parentNode.removeChild(this.title);
+ if(this.description && this.description.parentNode) this.description.parentNode.removeChild(this.description);
+ if(this.input && this.input.parentNode) this.input.parentNode.removeChild(this.input);
+
+ this._super();
+ },
+ empty: function(hard) {},
+ setValue: function(value, initial) {
+ var self = this;
+ // Update the array's value, adding/removing rows when necessary
+ value = value || [];
+ if(!(Array.isArray(value))) value = [value];
+
+ this.input.selectize.clearOptions();
+ this.input.selectize.clear(true);
+
+ value.forEach(function(item) {
+ self.input.selectize.addOption({text: item, value: item});
+ });
+ this.input.selectize.setValue(value);
+
+ this.refreshValue(initial);
+ },
+ refreshValue: function(force) {
+ this.value = this.input.selectize.getValue();
+ },
+ showValidationErrors: function(errors) {
+ var self = this;
+
+ // Get all the errors that pertain to this editor
+ var my_errors = [];
+ var other_errors = [];
+ $each(errors, function(i,error) {
+ if(error.path === self.path) {
+ my_errors.push(error);
+ }
+ else {
+ other_errors.push(error);
+ }
+ });
+
+ // Show errors for this editor
+ if(this.error_holder) {
+
+ if(my_errors.length) {
+ var message = [];
+ this.error_holder.innerHTML = '';
+ this.error_holder.style.display = '';
+ $each(my_errors, function(i,error) {
+ self.error_holder.appendChild(self.theme.getErrorMessage(error.message));
+ });
+ }
+ // Hide error area
+ else {
+ this.error_holder.style.display = 'none';
+ }
+ }
+ }
+});
+
+var matchKey = (function () {
+ var elem = document.documentElement;
+
+ if (elem.matches) return 'matches';
+ else if (elem.webkitMatchesSelector) return 'webkitMatchesSelector';
+ else if (elem.mozMatchesSelector) return 'mozMatchesSelector';
+ else if (elem.msMatchesSelector) return 'msMatchesSelector';
+ else if (elem.oMatchesSelector) return 'oMatchesSelector';
+})();
+
+JSONEditor.AbstractTheme = Class.extend({
+ getContainer: function() {
+ return document.createElement('div');
+ },
+ getFloatRightLinkHolder: function() {
+ var el = document.createElement('div');
+ el.style = el.style || {};
+ el.style.cssFloat = 'right';
+ el.style.marginLeft = '10px';
+ return el;
+ },
+ getModal: function() {
+ var el = document.createElement('div');
+ el.style.backgroundColor = 'white';
+ el.style.border = '1px solid black';
+ el.style.boxShadow = '3px 3px black';
+ el.style.position = 'absolute';
+ el.style.zIndex = '10';
+ el.style.display = 'none';
+ return el;
+ },
+ getGridContainer: function() {
+ var el = document.createElement('div');
+ return el;
+ },
+ getGridRow: function() {
+ var el = document.createElement('div');
+ el.className = 'row';
+ return el;
+ },
+ getGridColumn: function() {
+ var el = document.createElement('div');
+ return el;
+ },
+ setGridColumnSize: function(el,size) {
+
+ },
+ getLink: function(text) {
+ var el = document.createElement('a');
+ el.setAttribute('href','#');
+ el.appendChild(document.createTextNode(text));
+ return el;
+ },
+ disableHeader: function(header) {
+ header.style.color = '#ccc';
+ },
+ disableLabel: function(label) {
+ label.style.color = '#ccc';
+ },
+ enableHeader: function(header) {
+ header.style.color = '';
+ },
+ enableLabel: function(label) {
+ label.style.color = '';
+ },
+ getInfoButton: function(text) {
+ var icon = document.createElement('span');
+ icon.innerText = "ⓘ";
+ icon.style.fontSize = "16px";
+ icon.style.fontWeight = "bold";
+ icon.style.padding = ".25rem";
+ icon.style.position = "relative";
+ icon.style.display = "inline-block";
+
+ var tooltip = document.createElement('span');
+ tooltip.style.fontSize = "12px";
+ icon.style.fontWeight = "normal";
+ tooltip.style["font-family"] = "sans-serif";
+ tooltip.style.visibility = "hidden";
+ tooltip.style["background-color"] = "rgba(50, 50, 50, .75)";
+ tooltip.style.margin = "0 .25rem";
+ tooltip.style.color = "#FAFAFA";
+ tooltip.style.padding = ".5rem 1rem";
+ tooltip.style["border-radius"] = ".25rem";
+ tooltip.style.width = "20rem";
+ tooltip.style.position = "absolute";
+ tooltip.innerText = text;
+ icon.onmouseover = function() {
+ tooltip.style.visibility = "visible";
+ };
+ icon.onmouseleave = function() {
+ tooltip.style.visibility = "hidden";
+ };
+
+ icon.appendChild(tooltip);
+
+ return icon;
+ },
+ getFormInputLabel: function(text) {
+ var el = document.createElement('label');
+ el.appendChild(document.createTextNode(text));
+ return el;
+ },
+ getCheckboxLabel: function(text) {
+ var el = this.getFormInputLabel(text);
+ el.style.fontWeight = 'normal';
+ return el;
+ },
+ getHeader: function(text) {
+ var el = document.createElement('h3');
+ if(typeof text === "string") {
+ el.textContent = text;
+ el.style.fontWeight = 'bold';
+ el.style.fontSize = '12px';
+ el.style.padding = '4px';
+ }
+ else {
+ el.appendChild(text);
+ }
+
+ return el;
+ },
+ getCheckbox: function() {
+ var el = this.getFormInputField('checkbox');
+ el.style.display = 'inline-block';
+ el.style.width = 'auto';
+ return el;
+ },
+ getMultiCheckboxHolder: function(controls,label,description) {
+ var el = document.createElement('div');
+
+ if(label) {
+ label.style.display = 'block';
+ el.appendChild(label);
+ }
+
+ for(var i in controls) {
+ if(!controls.hasOwnProperty(i)) continue;
+ controls[i].style.display = 'inline-block';
+ controls[i].style.marginRight = '20px';
+ el.appendChild(controls[i]);
+ }
+
+ if(description) el.appendChild(description);
+
+ return el;
+ },
+ getSelectInput: function(options) {
+ var select = document.createElement('select');
+ if(options) this.setSelectOptions(select, options);
+ return select;
+ },
+ getSwitcher: function(options) {
+ var switcher = this.getSelectInput(options);
+ switcher.style.backgroundColor = 'transparent';
+ switcher.style.display = 'inline-block';
+ switcher.style.fontStyle = 'italic';
+ switcher.style.fontWeight = 'normal';
+ switcher.style.height = 'auto';
+ switcher.style.marginBottom = 0;
+ switcher.style.marginLeft = '5px';
+ switcher.style.padding = '0 0 0 3px';
+ switcher.style.width = 'auto';
+ return switcher;
+ },
+ getSwitcherOptions: function(switcher) {
+ return switcher.getElementsByTagName('option');
+ },
+ setSwitcherOptions: function(switcher, options, titles) {
+ this.setSelectOptions(switcher, options, titles);
+ },
+ setSelectOptions: function(select, options, titles) {
+ titles = titles || [];
+ select.innerHTML = '';
+ for(var i=0; i<options.length; i++) {
+ var option = document.createElement('option');
+ option.setAttribute('value',options[i]);
+ option.textContent = titles[i] || options[i];
+ select.appendChild(option);
+ }
+ },
+ getTextareaInput: function(rows, cols) {
+ var el = document.createElement('textarea');
+ el.style = el.style || {};
+ el.style.width = '100%';
+ el.style.height = '50px';
+ el.style.fontWeight = 'bold';
+ el.style.fontSize = '1em';
+ el.style.boxSizing = 'border-box';
+ if(typeof rows === undefined) { rows = 1 };
+ if(typeof cols === undefined) { cols = 80 };
+ el.rows = rows;
+ el.cols = cols;
+ el.wrap = 'soft';
+ el.readonly = 'true';
+ return el;
+ },
+ getRangeInput: function(min,max,step) {
+ var el = this.getFormInputField('range');
+ el.setAttribute('min',min);
+ el.setAttribute('max',max);
+ el.setAttribute('step',step);
+ return el;
+ },
+ getFormInputField: function(type) {
+ var el = document.createElement('input');
+ el.setAttribute('type',type);
+ return el;
+ },
+ afterInputReady: function(input) {
+
+ },
+ getFormControl: function(label, input, description, infoText) {
+ var el = document.createElement('div');
+ el.className = 'form-control';
+ if(label) el.appendChild(label);
+ if(input.type === 'checkbox' && label) {
+ label.insertBefore(input,label.firstChild);
+ if(infoText) label.appendChild(infoText);
+ }
+ else {
+ if(infoText) label.appendChild(infoText);
+ el.appendChild(input);
+ }
+
+ if(description) el.appendChild(description);
+ return el;
+ },
+ getIndentedPanel: function() {
+ var el = document.createElement('div');
+ el.style = el.style || {};
+ el.style.paddingLeft = '10px';
+ el.style.marginLeft = '10px';
+ el.style.borderLeft = '1px solid #ccc';
+ return el;
+ },
+ getTopIndentedPanel: function() {
+ var el = document.createElement('div');
+ el.style = el.style || {};
+ el.style.paddingLeft = '10px';
+ el.style.marginLeft = '10px';
+ return el;
+ },
+ getChildEditorHolder: function() {
+ return document.createElement('div');
+ },
+ getDescription: function(text) {
+ var el = document.createElement('p');
+ el.innerHTML = text;
+ return el;
+ },
+ getCheckboxDescription: function(text) {
+ return this.getDescription(text);
+ },
+ getFormInputDescription: function(text) {
+ return this.getDescription(text);
+ },
+ getHeaderButtonHolder: function() {
+ return this.getButtonHolder();
+ },
+ getButtonHolder: function() {
+ return document.createElement('div');
+ },
+ getButton: function(text, icon, title) {
+ var el = document.createElement('button');
+ el.type = 'button';
+ this.setButtonText(el,text,icon,title);
+ return el;
+ },
+ setButtonText: function(button, text, icon, title) {
+ button.innerHTML = '';
+ if(icon) {
+ button.appendChild(icon);
+ button.innerHTML += ' ';
+ }
+ button.appendChild(document.createTextNode(text));
+ if(title) button.setAttribute('title',title);
+ },
+ getTable: function() {
+ return document.createElement('table');
+ },
+ getTableRow: function() {
+ return document.createElement('tr');
+ },
+ getTableHead: function() {
+ return document.createElement('thead');
+ },
+ getTableBody: function() {
+ return document.createElement('tbody');
+ },
+ getTableHeaderCell: function(text) {
+ var el = document.createElement('th');
+ el.textContent = text;
+ return el;
+ },
+ getTableCell: function() {
+ var el = document.createElement('td');
+ return el;
+ },
+ getErrorMessage: function(text) {
+ var el = document.createElement('p');
+ el.style = el.style || {};
+ el.style.color = 'red';
+ el.appendChild(document.createTextNode(text));
+ return el;
+ },
+ addInputError: function(input, text) {
+ },
+ removeInputError: function(input) {
+ },
+ addTableRowError: function(row) {
+ },
+ removeTableRowError: function(row) {
+ },
+ getTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.innerHTML = "<div style='float: left; width: 130px;' class='tabs' id='" + pName + "'></div><div class='content' style='margin-left: 120px;' id='" + pName + "'></div><div style='clear:both;'></div>";
+ return el;
+ },
+ getTopTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.innerHTML = "<div class='tabs' style='margin-left: 10px;' id='" + pName + "'></div><div style='clear:both;'></div><div class='content' id='" + pName + "'></div>";
+ return el;
+ },
+ applyStyles: function(el,styles) {
+ for(var i in styles) {
+ if(!styles.hasOwnProperty(i)) continue;
+ el.style[i] = styles[i];
+ }
+ },
+ closest: function(elem, selector) {
+ while (elem && elem !== document) {
+ if (elem[matchKey]) {
+ if (elem[matchKey](selector)) {
+ return elem;
+ } else {
+ elem = elem.parentNode;
+ }
+ }
+ else {
+ return false;
+ }
+ }
+ return false;
+ },
+ insertBasicTopTab: function(tab, newTabs_holder ) {
+ newTabs_holder.firstChild.insertBefore(tab,newTabs_holder.firstChild.firstChild);
+ },
+ getTab: function(span, tabId) {
+ var el = document.createElement('div');
+ el.appendChild(span);
+ el.id = tabId;
+ el.style = el.style || {};
+ this.applyStyles(el,{
+ border: '1px solid #ccc',
+ borderWidth: '1px 0 1px 1px',
+ textAlign: 'center',
+ lineHeight: '30px',
+ borderRadius: '5px',
+ borderBottomRightRadius: 0,
+ borderTopRightRadius: 0,
+ fontWeight: 'bold',
+ cursor: 'pointer'
+ });
+ return el;
+ },
+ getTopTab: function(span, tabId) {
+ var el = document.createElement('div');
+ el.id = tabId;
+ el.appendChild(span);
+ el.style = el.style || {};
+ this.applyStyles(el,{
+ float: 'left',
+ border: '1px solid #ccc',
+ borderWidth: '1px 1px 0px 1px',
+ textAlign: 'center',
+ lineHeight: '30px',
+ borderRadius: '5px',
+ paddingLeft:'5px',
+ paddingRight:'5px',
+ borderBottomRightRadius: 0,
+ borderBottomLeftRadius: 0,
+ fontWeight: 'bold',
+ cursor: 'pointer'
+ });
+ return el;
+ },
+ getTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1];
+ },
+ getTopTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1];
+ },
+ getTabContent: function() {
+ return this.getIndentedPanel();
+ },
+ getTopTabContent: function() {
+ return this.getTopIndentedPanel();
+ },
+ markTabActive: function(row) {
+ this.applyStyles(row.tab,{
+ opacity: 1,
+ background: 'white'
+ });
+ row.container.style.display = '';
+ },
+ markTabInactive: function(row) {
+ this.applyStyles(row.tab,{
+ opacity:0.5,
+ background: ''
+ });
+ row.container.style.display = 'none';
+ },
+ addTab: function(holder, tab) {
+ holder.children[0].appendChild(tab);
+ },
+ addTopTab: function(holder, tab) {
+ holder.children[0].appendChild(tab);
+ },
+ getBlockLink: function() {
+ var link = document.createElement('a');
+ link.style.display = 'block';
+ return link;
+ },
+ getBlockLinkHolder: function() {
+ var el = document.createElement('div');
+ return el;
+ },
+ getLinksHolder: function() {
+ var el = document.createElement('div');
+ return el;
+ },
+ createMediaLink: function(holder,link,media) {
+ holder.appendChild(link);
+ media.style.width='100%';
+ holder.appendChild(media);
+ },
+ createImageLink: function(holder,link,image) {
+ holder.appendChild(link);
+ link.appendChild(image);
+ },
+ getFirstTab: function(holder){
+ return holder.firstChild.firstChild;
+ }
+});
+
+JSONEditor.defaults.themes.bootstrap2 = JSONEditor.AbstractTheme.extend({
+ getRangeInput: function(min, max, step) {
+ // TODO: use bootstrap slider
+ return this._super(min, max, step);
+ },
+ getGridContainer: function() {
+ var el = document.createElement('div');
+ el.className = 'container-fluid';
+ el.style.padding = '4px';
+ return el;
+ },
+ getGridRow: function() {
+ var el = document.createElement('div');
+ el.className = 'row-fluid';
+ return el;
+ },
+ getFormInputLabel: function(text) {
+ var el = this._super(text);
+ el.style.display = 'inline-block';
+ el.style.fontWeight = 'bold';
+ return el;
+ },
+ setGridColumnSize: function(el,size) {
+ el.className = 'span'+size;
+ },
+ getSelectInput: function(options) {
+ var input = this._super(options);
+ input.style.width = 'auto';
+ input.style.maxWidth = '98%';
+ return input;
+ },
+ getFormInputField: function(type) {
+ var el = this._super(type);
+ el.style.width = '98%';
+ return el;
+ },
+ afterInputReady: function(input) {
+ if(input.controlgroup) return;
+ input.controlgroup = this.closest(input,'.control-group');
+ input.controls = this.closest(input,'.controls');
+ if(this.closest(input,'.compact')) {
+ input.controlgroup.className = input.controlgroup.className.replace(/control-group/g,'').replace(/[ ]{2,}/g,' ');
+ input.controls.className = input.controlgroup.className.replace(/controls/g,'').replace(/[ ]{2,}/g,' ');
+ input.style.marginBottom = 0;
+ }
+ if (this.queuedInputErrorText) {
+ var text = this.queuedInputErrorText;
+ delete this.queuedInputErrorText;
+ this.addInputError(input,text);
+ }
+
+ // TODO: use bootstrap slider
+ },
+ getIndentedPanel: function() {
+ var el = document.createElement('div');
+ el.className = 'well well-small';
+ el.style.padding = '4px';
+ return el;
+ },
+ getInfoButton: function(text) {
+ var icon = document.createElement('span');
+ icon.className = "icon-info-sign pull-right";
+ icon.style.padding = ".25rem";
+ icon.style.position = "relative";
+ icon.style.display = "inline-block";
+
+ var tooltip = document.createElement('span');
+ tooltip.style["font-family"] = "sans-serif";
+ tooltip.style.visibility = "hidden";
+ tooltip.style["background-color"] = "rgba(50, 50, 50, .75)";
+ tooltip.style.margin = "0 .25rem";
+ tooltip.style.color = "#FAFAFA";
+ tooltip.style.padding = ".5rem 1rem";
+ tooltip.style["border-radius"] = ".25rem";
+ tooltip.style.width = "25rem";
+ tooltip.style.transform = "translateX(-27rem) translateY(-.5rem)";
+ tooltip.style.position = "absolute";
+ tooltip.innerText = text;
+ icon.onmouseover = function() {
+ tooltip.style.visibility = "visible";
+ };
+ icon.onmouseleave = function() {
+ tooltip.style.visibility = "hidden";
+ };
+
+ icon.appendChild(tooltip);
+
+ return icon;
+ },
+ getFormInputDescription: function(text) {
+ var el = document.createElement('p');
+ el.className = 'help-inline';
+ el.textContent = text;
+ return el;
+ },
+ getFormControl: function(label, input, description, infoText) {
+ var ret = document.createElement('div');
+ ret.className = 'control-group';
+
+ var controls = document.createElement('div');
+ controls.className = 'controls';
+
+ if(label && input.getAttribute('type') === 'checkbox') {
+ ret.appendChild(controls);
+ label.className += ' checkbox';
+ label.appendChild(input);
+ controls.appendChild(label);
+ if(infoText) controls.appendChild(infoText);
+ controls.style.height = '30px';
+ }
+ else {
+ if(label) {
+ label.className += ' control-label';
+ ret.appendChild(label);
+ }
+ if(infoText) controls.appendChild(infoText);
+ controls.appendChild(input);
+ ret.appendChild(controls);
+ }
+
+ if(description) controls.appendChild(description);
+
+ return ret;
+ },
+ getHeaderButtonHolder: function() {
+ var el = this.getButtonHolder();
+ el.style.marginLeft = '10px';
+ return el;
+ },
+ getButtonHolder: function() {
+ var el = document.createElement('div');
+ el.className = 'btn-group';
+ return el;
+ },
+ getButton: function(text, icon, title) {
+ var el = this._super(text, icon, title);
+ el.className += ' btn btn-default';
+ el.style.backgroundColor = '#f2bfab';
+ el.style.border = '1px solid #ddd';
+ return el;
+ },
+ getTable: function() {
+ var el = document.createElement('table');
+ el.className = 'table table-bordered';
+ el.style.width = 'auto';
+ el.style.maxWidth = 'none';
+ return el;
+ },
+ addInputError: function(input,text) {
+ if(!input.controlgroup) {
+ this.queuedInputErrorText = text;
+ return;
+ }
+ if(!input.controlgroup || !input.controls) return;
+ input.controlgroup.className += ' error';
+ if(!input.errmsg) {
+ input.errmsg = document.createElement('p');
+ input.errmsg.className = 'help-block errormsg';
+ input.controls.appendChild(input.errmsg);
+ }
+ else {
+ input.errmsg.style.display = '';
+ }
+
+ input.errmsg.textContent = text;
+ },
+ removeInputError: function(input) {
+ if(!input.controlgroup) {
+ delete this.queuedInputErrorText;
+ }
+ if(!input.errmsg) return;
+ input.errmsg.style.display = 'none';
+ input.controlgroup.className = input.controlgroup.className.replace(/\s?error/g,'');
+ },
+ getTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.className = 'tabbable tabs-left';
+ el.innerHTML = "<ul class='nav nav-tabs' id='" + pName + "'></ul><div class='tab-content well well-small' id='" + pName + "'></div>";
+ return el;
+ },
+ getTopTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.className = 'tabbable tabs-over';
+ el.innerHTML = "<ul class='nav nav-tabs' id='" + pName + "'></ul><div class='tab-content well well-small' id='" + pName + "'></div>";
+ return el;
+ },
+ getTab: function(text,tabId) {
+ var el = document.createElement('li');
+ el.className = 'nav-item';
+ var a = document.createElement('a');
+ a.setAttribute('href','#' + tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ getTopTab: function(text,tabId) {
+ var el = document.createElement('li');
+ el.className = 'nav-item';
+ var a = document.createElement('a');
+ a.setAttribute('href','#' + tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ getTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1];
+ },
+ getTopTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1];
+ },
+ getTabContent: function() {
+ var el = document.createElement('div');
+ el.className = 'tab-pane';
+ return el;
+ },
+ getTopTabContent: function() {
+ var el = document.createElement('div');
+ el.className = 'tab-pane';
+ return el;
+ },
+ markTabActive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?active/g,'');
+ row.tab.className += ' active';
+ row.container.className = row.container.className.replace(/\s?active/g,'');
+ row.container.className += ' active';
+ },
+ markTabInactive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?active/g,'');
+ row.container.className = row.container.className.replace(/\s?active/g,'');
+ },
+ addTab: function(holder, tab) {
+ holder.children[0].appendChild(tab);
+ },
+ addTopTab: function(holder, tab) {
+ holder.children[0].appendChild(tab);
+ },
+ getProgressBar: function() {
+ var container = document.createElement('div');
+ container.className = 'progress';
+
+ var bar = document.createElement('div');
+ bar.className = 'bar';
+ bar.style.width = '0%';
+ container.appendChild(bar);
+
+ return container;
+ },
+ updateProgressBar: function(progressBar, progress) {
+ if (!progressBar) return;
+
+ progressBar.firstChild.style.width = progress + "%";
+ },
+ updateProgressBarUnknown: function(progressBar) {
+ if (!progressBar) return;
+
+ progressBar.className = 'progress progress-striped active';
+ progressBar.firstChild.style.width = '100%';
+ }
+});
+
+JSONEditor.defaults.themes.bootstrap3 = JSONEditor.AbstractTheme.extend({
+ getSelectInput: function(options) {
+ var el = this._super(options);
+ el.className += 'form-control';
+ //el.style.width = 'auto';
+ return el;
+ },
+ getGridContainer: function() {
+ var el = document.createElement('div');
+ el.className = 'container-fluid';
+ el.style.padding = '4px';
+ return el;
+ },
+ getGridRow: function() {
+ var el = document.createElement('div');
+ el.className = 'row-fluid';
+ el.style.padding = '4px';
+ return el;
+ },
+ setGridColumnSize: function(el,size) {
+ el.className = 'col-md-'+size;
+ },
+ afterInputReady: function(input) {
+ if(input.controlgroup) return;
+ input.controlgroup = this.closest(input,'.form-group');
+ if(this.closest(input,'.compact')) {
+ input.controlgroup.style.marginBottom = 0;
+ }
+ if (this.queuedInputErrorText) {
+ var text = this.queuedInputErrorText;
+ delete this.queuedInputErrorText;
+ this.addInputError(input,text);
+ }
+
+ // TODO: use bootstrap slider
+ },
+ getRangeInput: function(min, max, step) {
+ // TODO: use better slider
+ return this._super(min, max, step);
+ },
+ getFormInputField: function(type) {
+ var el = this._super(type);
+ if(type !== 'checkbox') {
+ el.className += 'form-control';
+ }
+ return el;
+ },
+ getFormControl: function(label, input, description, infoText) {
+ var group = document.createElement('div');
+
+ if(label && input.type === 'checkbox') {
+ group.className += ' checkbox';
+ label.appendChild(input);
+ label.style.fontSize = '12px';
+ group.style.marginTop = '0';
+ if(infoText) group.appendChild(infoText);
+ group.appendChild(label);
+ input.style.position = 'relative';
+ input.style.cssFloat = 'left';
+ }
+ else {
+ group.className += ' form-group';
+ if(label) {
+ label.className += ' control-label';
+ group.appendChild(label);
+ }
+
+ if(infoText) group.appendChild(infoText);
+ group.appendChild(input);
+ }
+
+ if(description) group.appendChild(description);
+
+ return group;
+ },
+ getIndentedPanel: function() {
+ var el = document.createElement('div');
+ el.className = 'well well-sm';
+ el.style.padding = '4px';
+ return el;
+ },
+ getInfoButton: function(text) {
+ var icon = document.createElement('span');
+ icon.className = "glyphicon glyphicon-info-sign pull-right";
+ icon.style.padding = ".25rem";
+ icon.style.position = "relative";
+ icon.style.display = "inline-block";
+
+ var tooltip = document.createElement('span');
+ tooltip.style["font-family"] = "sans-serif";
+ tooltip.style.visibility = "hidden";
+ tooltip.style["background-color"] = "rgba(50, 50, 50, .75)";
+ tooltip.style.margin = "0 .25rem";
+ tooltip.style.color = "#FAFAFA";
+ tooltip.style.padding = ".5rem 1rem";
+ tooltip.style["border-radius"] = ".25rem";
+ tooltip.style.width = "25rem";
+ tooltip.style.transform = "translateX(-27rem) translateY(-.5rem)";
+ tooltip.style.position = "absolute";
+ tooltip.innerText = text;
+ icon.onmouseover = function() {
+ tooltip.style.visibility = "visible";
+ };
+ icon.onmouseleave = function() {
+ tooltip.style.visibility = "hidden";
+ };
+
+ icon.appendChild(tooltip);
+
+ return icon;
+ },
+ getFormInputDescription: function(text) {
+ var el = document.createElement('p');
+ el.className = 'help-block';
+ el.innerHTML = text;
+ return el;
+ },
+ getHeaderButtonHolder: function() {
+ var el = this.getButtonHolder();
+ el.style.marginLeft = '5px';
+ return el;
+ },
+ getButtonHolder: function() {
+ var el = document.createElement('div');
+ el.className = 'btn-group';
+ return el;
+ },
+ getButton: function(text, icon, title) {
+ var el = this._super(text, icon, title);
+ el.className += ' btn btn-default';
+ el.style.backgroundColor = '#f2bfab';
+ el.style.border = '1px solid #ddd';
+ return el;
+ },
+ getTable: function() {
+ var el = document.createElement('table');
+ el.className = 'table table-bordered';
+ el.style.width = 'auto';
+ el.style.maxWidth = 'none';
+ return el;
+ },
+
+ addInputError: function(input,text) {
+ if(!input.controlgroup) {
+ this.queuedInputErrorText = text;
+ return;
+ }
+ input.controlgroup.className = input.controlgroup.className.replace(/\s?has-error/g,'');
+ input.controlgroup.className += ' has-error';
+ if(!input.errmsg) {
+ input.errmsg = document.createElement('p');
+ input.errmsg.className = 'help-block errormsg';
+ input.controlgroup.appendChild(input.errmsg);
+ }
+ else {
+ input.errmsg.style.display = '';
+ }
+
+ input.errmsg.textContent = text;
+ },
+ removeInputError: function(input) {
+ if(!input.controlgroup) {
+ delete this.queuedInputErrorText;
+ }
+ if(!input.errmsg) return;
+ input.errmsg.style.display = 'none';
+ input.controlgroup.className = input.controlgroup.className.replace(/\s?has-error/g,'');
+ },
+ getTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.innerHTML = "<div class='list-group pull-left' id='" + pName + "'></div><div class='col-sm-10 pull-left' id='" + pName + "'></div>";
+ return el;
+ },
+ getTopTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.innerHTML = "<ul class='nav nav-tabs' style='padding: 4px;' id='" + pName + "'></ul><div class='tab-content' style='overflow:visible;' id='" + pName + "'></div>";
+ return el;
+ },
+ getTab: function(text, tabId) {
+ var el = document.createElement('a');
+ el.className = 'list-group-item';
+ el.setAttribute('href','#'+tabId);
+ el.appendChild(text);
+ return el;
+ },
+ getTopTab: function(text, tabId) {
+ var el = document.createElement('li');
+ var a = document.createElement('a');
+ a.setAttribute('href','#'+tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ markTabActive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?active/g,'');
+ row.tab.className += ' active';
+ row.container.style.display = '';
+ },
+ markTabInactive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?active/g,'');
+ row.container.style.display = 'none';
+ },
+ getProgressBar: function() {
+ var min = 0, max = 100, start = 0;
+
+ var container = document.createElement('div');
+ container.className = 'progress';
+
+ var bar = document.createElement('div');
+ bar.className = 'progress-bar';
+ bar.setAttribute('role', 'progressbar');
+ bar.setAttribute('aria-valuenow', start);
+ bar.setAttribute('aria-valuemin', min);
+ bar.setAttribute('aria-valuenax', max);
+ bar.innerHTML = start + "%";
+ container.appendChild(bar);
+
+ return container;
+ },
+ updateProgressBar: function(progressBar, progress) {
+ if (!progressBar) return;
+
+ var bar = progressBar.firstChild;
+ var percentage = progress + "%";
+ bar.setAttribute('aria-valuenow', progress);
+ bar.style.width = percentage;
+ bar.innerHTML = percentage;
+ },
+ updateProgressBarUnknown: function(progressBar) {
+ if (!progressBar) return;
+
+ var bar = progressBar.firstChild;
+ progressBar.className = 'progress progress-striped active';
+ bar.removeAttribute('aria-valuenow');
+ bar.style.width = '100%';
+ bar.innerHTML = '';
+ }
+});
+
+JSONEditor.defaults.themes.bootstrap4 = JSONEditor.AbstractTheme.extend({
+ getSelectInput: function(options) {
+ var el = this._super(options);
+ el.className += "form-control";
+ //el.style.width = 'auto';
+ return el;
+ },
+ setGridColumnSize: function(el, size) {
+ el.className = "col-md-" + size;
+ },
+ afterInputReady: function(input) {
+ if (input.controlgroup) return;
+ input.controlgroup = this.closest(input, ".form-group");
+ if (this.closest(input, ".compact")) {
+ input.controlgroup.style.marginBottom = 0;
+ }
+
+ // TODO: use bootstrap slider
+ },
+ getTextareaInput: function() {
+ var el = document.createElement("textarea");
+ el.className = "form-control";
+ return el;
+ },
+ getRangeInput: function(min, max, step) {
+ // TODO: use better slider
+ return this._super(min, max, step);
+ },
+ getFormInputField: function(type) {
+ var el = this._super(type);
+ if (type !== "checkbox") {
+ el.className += "form-control";
+ }
+ return el;
+ },
+ getFormControl: function(label, input, description) {
+ var group = document.createElement("div");
+
+ if (label && input.type === "checkbox") {
+ group.className += " checkbox";
+ label.appendChild(input);
+ label.style.fontSize = "12px";
+ group.style.marginTop = "0";
+ group.appendChild(label);
+ input.style.position = "relative";
+ input.style.cssFloat = "left";
+ } else {
+ group.className += " form-group";
+ if (label) {
+ label.className += " form-control-label";
+ group.appendChild(label);
+ }
+ group.appendChild(input);
+ }
+
+ if (description) group.appendChild(description);
+
+ return group;
+ },
+ getIndentedPanel: function() {
+ var el = document.createElement("div");
+ el.className = "card card-body bg-light";
+ return el;
+ },
+ getFormInputDescription: function(text) {
+ var el = document.createElement("p");
+ el.className = "form-text";
+ el.innerHTML = text;
+ return el;
+ },
+ getHeaderButtonHolder: function() {
+ var el = this.getButtonHolder();
+ el.style.marginLeft = "10px";
+ return el;
+ },
+ getButtonHolder: function() {
+ var el = document.createElement("div");
+ el.className = "btn-group";
+ return el;
+ },
+ getButton: function(text, icon, title) {
+ var el = this._super(text, icon, title);
+ el.className += "btn btn-secondary";
+ return el;
+ },
+ getTable: function() {
+ var el = document.createElement("table");
+ el.className = "table-bordered table-sm";
+ el.style.width = "auto";
+ el.style.maxWidth = "none";
+ return el;
+ },
+
+ addInputError: function(input, text) {
+ if (!input.controlgroup) return;
+ input.controlgroup.className += " has-error";
+ if (!input.errmsg) {
+ input.errmsg = document.createElement("p");
+ input.errmsg.className = "form-text errormsg";
+ input.controlgroup.appendChild(input.errmsg);
+ } else {
+ input.errmsg.style.display = "";
+ }
+
+ input.errmsg.textContent = text;
+ },
+ removeInputError: function(input) {
+ if (!input.errmsg) return;
+ input.errmsg.style.display = "none";
+ input.controlgroup.className = input.controlgroup.className.replace(
+ /\s?has-error/g,
+ ""
+ );
+ },
+ getTabHolder: function(propertyName) {
+ var el = document.createElement("div");
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ el.innerHTML =
+ "<ul class='nav flex-column nav-pills col-md-2' style='padding: 0px;' id='" + pName + "'></ul><div class='tab-content col-md-10' style='padding:5px;' id='" + pName + "'></div>";
+el.className = "row";
+ return el;
+ },
+ getTopTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.innerHTML = "<ul class='nav nav-tabs' id='" + pName + "'></ul><div class='card-body' id='" + pName + "'></div>";
+ return el;
+ },
+ getTab: function(text,tabId) {
+ var liel = document.createElement('li');
+ liel.className = 'nav-item';
+ var ael = document.createElement("a");
+ ael.className = "nav-link";
+ ael.setAttribute("style",'padding:10px;');
+ ael.setAttribute("href", "#" + tabId);
+ ael.appendChild(text);
+ liel.appendChild(ael);
+ return liel;
+ },
+ getTopTab: function(text, tabId) {
+ var el = document.createElement('li');
+ el.className = 'nav-item';
+ var a = document.createElement('a');
+ a.className = 'nav-link';
+ a.setAttribute('href','#'+tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ markTabActive: function(row) {
+ var el = row.tab.firstChild;
+ el.className = el.className.replace(/\s?active/g,'');
+ el.className += " active";
+ row.container.style.display = '';
+ },
+ markTabInactive: function(row) {
+ var el = row.tab.firstChild;
+ el.className = el.className.replace(/\s?active/g,'');
+ row.container.style.display = 'none';
+ },
+ getProgressBar: function() {
+ var min = 0,
+ max = 100,
+ start = 0;
+
+ var container = document.createElement("div");
+ container.className = "progress";
+
+ var bar = document.createElement("div");
+ bar.className = "progress-bar";
+ bar.setAttribute("role", "progressbar");
+ bar.setAttribute("aria-valuenow", start);
+ bar.setAttribute("aria-valuemin", min);
+ bar.setAttribute("aria-valuenax", max);
+ bar.innerHTML = start + "%";
+ container.appendChild(bar);
+
+ return container;
+ },
+ updateProgressBar: function(progressBar, progress) {
+ if (!progressBar) return;
+
+ var bar = progressBar.firstChild;
+ var percentage = progress + "%";
+ bar.setAttribute("aria-valuenow", progress);
+ bar.style.width = percentage;
+ bar.innerHTML = percentage;
+ },
+ updateProgressBarUnknown: function(progressBar) {
+ if (!progressBar) return;
+
+ var bar = progressBar.firstChild;
+ progressBar.className = "progress progress-striped active";
+ bar.removeAttribute("aria-valuenow");
+ bar.style.width = "100%";
+ bar.innerHTML = "";
+ }
+});
+
+// Base Foundation theme
+JSONEditor.defaults.themes.foundation = JSONEditor.AbstractTheme.extend({
+ getChildEditorHolder: function() {
+ var el = document.createElement('div');
+ el.style.marginBottom = '15px';
+ return el;
+ },
+ getSelectInput: function(options) {
+ var el = this._super(options);
+ el.style.minWidth = 'none';
+ el.style.padding = '5px';
+ el.style.marginTop = '3px';
+ return el;
+ },
+ getSwitcher: function(options) {
+ var el = this._super(options);
+ el.style.paddingRight = '8px';
+ return el;
+ },
+ afterInputReady: function(input) {
+ if(input.group) return;
+ if(this.closest(input,'.compact')) {
+ input.style.marginBottom = 0;
+ }
+ input.group = this.closest(input,'.form-control');
+ if (this.queuedInputErrorText) {
+ var text = this.queuedInputErrorText;
+ delete this.queuedInputErrorText;
+ this.addInputError(input,text);
+ }
+ },
+ getFormInputLabel: function(text) {
+ var el = this._super(text);
+ el.style.display = 'inline-block';
+ return el;
+ },
+ getFormInputField: function(type) {
+ var el = this._super(type);
+ el.style.width = '100%';
+ el.style.marginBottom = type==='checkbox'? '0' : '12px';
+ return el;
+ },
+ getFormInputDescription: function(text) {
+ var el = document.createElement('p');
+ el.textContent = text;
+ el.style.marginTop = '-10px';
+ el.style.fontStyle = 'italic';
+ return el;
+ },
+ getIndentedPanel: function() {
+ var el = document.createElement('div');
+ el.className = 'panel';
+ el.style.paddingBottom = 0;
+ return el;
+ },
+ getHeaderButtonHolder: function() {
+ var el = this.getButtonHolder();
+ el.style.display = 'inline-block';
+ el.style.marginLeft = '10px';
+ el.style.verticalAlign = 'middle';
+ return el;
+ },
+ getButtonHolder: function() {
+ var el = document.createElement('div');
+ el.className = 'button-group';
+ return el;
+ },
+ getButton: function(text, icon, title) {
+ var el = this._super(text, icon, title);
+ el.className += ' small button';
+ return el;
+ },
+ addInputError: function(input,text) {
+ if(!input.group) {
+ this.queuedInputErrorText = text;
+ return;
+ }
+ input.group.className += ' error';
+
+ if(!input.errmsg) {
+ input.insertAdjacentHTML('afterend','<small class="error"></small>');
+ input.errmsg = input.parentNode.getElementsByClassName('error')[0];
+ }
+ else {
+ input.errmsg.style.display = '';
+ }
+
+ input.errmsg.textContent = text;
+ },
+ removeInputError: function(input) {
+ if(!input.group) {
+ delete this.queuedInputErrorText;
+ }
+ if(!input.errmsg) return;
+ input.group.className = input.group.className.replace(/ error/g,'');
+ input.errmsg.style.display = 'none';
+ },
+ getProgressBar: function() {
+ var progressBar = document.createElement('div');
+ progressBar.className = 'progress';
+
+ var meter = document.createElement('span');
+ meter.className = 'meter';
+ meter.style.width = '0%';
+ progressBar.appendChild(meter);
+ return progressBar;
+ },
+ updateProgressBar: function(progressBar, progress) {
+ if (!progressBar) return;
+ progressBar.firstChild.style.width = progress + '%';
+ },
+ updateProgressBarUnknown: function(progressBar) {
+ if (!progressBar) return;
+ progressBar.firstChild.style.width = '100%';
+ }
+});
+
+// Foundation 3 Specific Theme
+JSONEditor.defaults.themes.foundation3 = JSONEditor.defaults.themes.foundation.extend({
+ getHeaderButtonHolder: function() {
+ var el = this._super();
+ el.style.fontSize = '.6em';
+ return el;
+ },
+ getFormInputLabel: function(text) {
+ var el = this._super(text);
+ el.style.fontWeight = 'bold';
+ return el;
+ },
+ getTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.className = 'row';
+ el.innerHTML = '<dl class="tabs vertical two columns" id="' + pName + '"></dl><div class="tabs-content ten columns" id="' + pName + '"></div>';
+ return el;
+ },
+ getTopTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.className = 'row';
+ el.innerHTML = '<dl class="tabs horizontal" style="padding-left: 10px; margin-left: 10px;" id="' + pName + '"></dl><div class="tabs-content twelve columns" style="padding: 10px; margin-left: 10px;" id="' + pName + '"></div>';
+ return el;
+ },
+ setGridColumnSize: function(el,size) {
+ var sizes = ['zero','one','two','three','four','five','six','seven','eight','nine','ten','eleven','twelve'];
+ el.className = 'columns '+sizes[size];
+ },
+ getTab: function(text, tabId) {
+ var el = document.createElement('dd');
+ var a = document.createElement('a');
+ a.setAttribute('href','#'+tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ getTopTab: function(text, tabId) {
+ var el = document.createElement('dd');
+ var a = document.createElement('a');
+ a.setAttribute('href','#'+tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ getTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1];
+ },
+ getTopTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1];
+ },
+ getTabContent: function() {
+ var el = document.createElement('div');
+ el.className = 'content active';
+ el.style.paddingLeft = '5px';
+ return el;
+ },
+ getTopTabContent: function() {
+ var el = document.createElement('div');
+ el.className = 'content active';
+ el.style.paddingLeft = '5px';
+ return el;
+ },
+ markTabActive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?active/g,'');
+ row.tab.className += ' active';
+ row.container.style.display = '';
+ },
+ markTabInactive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?active/g,'');
+ row.container.style.display = 'none';
+ },
+ addTab: function(holder, tab) {
+ holder.children[0].appendChild(tab);
+ },
+ addTopTab: function(holder, tab) {
+ holder.children[0].appendChild(tab);
+ }
+});
+
+// Foundation 4 Specific Theme
+JSONEditor.defaults.themes.foundation4 = JSONEditor.defaults.themes.foundation.extend({
+ getHeaderButtonHolder: function() {
+ var el = this._super();
+ el.style.fontSize = '.6em';
+ return el;
+ },
+ setGridColumnSize: function(el,size) {
+ el.className = 'columns large-'+size;
+ },
+ getFormInputDescription: function(text) {
+ var el = this._super(text);
+ el.style.fontSize = '.8rem';
+ return el;
+ },
+ getFormInputLabel: function(text) {
+ var el = this._super(text);
+ el.style.fontWeight = 'bold';
+ return el;
+ }
+});
+
+// Foundation 5 Specific Theme
+JSONEditor.defaults.themes.foundation5 = JSONEditor.defaults.themes.foundation.extend({
+ getFormInputDescription: function(text) {
+ var el = this._super(text);
+ el.style.fontSize = '.8rem';
+ return el;
+ },
+ setGridColumnSize: function(el,size) {
+ el.className = 'columns medium-'+size;
+ },
+ getButton: function(text, icon, title) {
+ var el = this._super(text,icon,title);
+ el.className = el.className.replace(/\s*small/g,'') + ' tiny';
+ return el;
+ },
+ getTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.innerHTML = '<dl class="tabs vertical" id="' + pName + '"></dl><div class="tabs-content vertical" id="' + pName + '"></div>';
+ return el;
+ },
+ getTopTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.className = 'row';
+ el.innerHTML = '<dl class="tabs horizontal" style="padding-left: 10px;" id="' + pName + '"></dl><div class="tabs-content horizontal" style="padding: 10px;" id="' + pName + '"></div>';
+ return el;
+ },
+ getTab: function(text, tabId) {
+ var el = document.createElement('dd');
+ var a = document.createElement('a');
+ a.setAttribute('href','#'+tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ getTopTab: function(text, tabId) {
+ var el = document.createElement('dd');
+ var a = document.createElement('a');
+ a.setAttribute('href','#'+tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ getTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1];
+ },
+ getTopTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1];
+ },
+ getTabContent: function() {
+ var el = document.createElement('div');
+ el.className = 'tab-content active';
+ el.style.paddingLeft = '5px';
+ return el;
+ },
+ getTopTabContent: function() {
+ var el = document.createElement('div');
+ el.className = 'tab-content active';
+ el.style.paddingLeft = '5px';
+ return el;
+ },
+ markTabActive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?active/g,'');
+ row.tab.className += ' active';
+ row.container.style.display = '';
+ },
+ markTabInactive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?active/g,'');
+ row.container.style.display = 'none';
+ },
+ addTab: function(holder, tab) {
+ holder.children[0].appendChild(tab);
+ },
+ addTopTab: function(holder, tab) {
+ holder.children[0].appendChild(tab);
+ }
+
+});
+
+JSONEditor.defaults.themes.foundation6 = JSONEditor.defaults.themes.foundation5.extend({
+ getIndentedPanel: function() {
+ var el = document.createElement('div');
+ el.className = 'callout secondary';
+ el.className.style = 'padding-left: 10px; margin-left: 10px;';
+ return el;
+ },
+ getButtonHolder: function() {
+ var el = document.createElement('div');
+ el.className = 'button-group tiny';
+ el.style.marginBottom = 0;
+ return el;
+ },
+ getFormInputLabel: function(text) {
+ var el = this._super(text);
+ el.style.display = 'block';
+ return el;
+ },
+ getFormControl: function(label, input, description, infoText) {
+ var el = document.createElement('div');
+ el.className = 'form-control';
+ if(label) el.appendChild(label);
+ if(input.type === 'checkbox') {
+ label.insertBefore(input,label.firstChild);
+ }
+ else if (label) {
+ if(infoText) label.appendChild(infoText);
+ label.appendChild(input);
+ } else {
+ if(infoText) el.appendChild(infoText);
+ el.appendChild(input);
+ }
+
+ if(description) label.appendChild(description);
+ return el;
+ },
+ addInputError: function(input,text) {
+ if(!input.group) return;
+ input.group.className += ' error';
+
+ if(!input.errmsg) {
+ var errorEl = document.createElement('span');
+ errorEl.className = 'form-error is-visible';
+ input.group.getElementsByTagName('label')[0].appendChild(errorEl);
+
+ input.className = input.className + ' is-invalid-input';
+
+ input.errmsg = errorEl;
+ }
+ else {
+ input.errmsg.style.display = '';
+ input.className = '';
+ }
+
+ input.errmsg.textContent = text;
+ },
+ removeInputError: function(input) {
+ if(!input.errmsg) return;
+ input.className = input.className.replace(/ is-invalid-input/g,'');
+ if(input.errmsg.parentNode) {
+ input.errmsg.parentNode.removeChild(input.errmsg);
+ }
+ },
+ getTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.className = 'grid-x';
+ el.innerHTML = '<div class="medium-2 cell" style="float: left;"><ul class="vertical tabs" data-tabs id="' + pName + '"></ul></div><div class="medium-10 cell" style="float: left;"><div class="tabs-content" data-tabs-content="'+pName+'"></div></div>';
+ return el;
+ },
+ getTopTabHolder: function(propertyName) {
+ var pName = (typeof propertyName === 'undefined')? "" : propertyName;
+ var el = document.createElement('div');
+ el.className = 'grid-y';
+ el.innerHTML = '<div className="cell"><ul class="tabs" data-tabs id="' + pName + '"></ul><div class="tabs-content" data-tabs-content="' + pName + '"></div></div>';
+ return el;
+
+
+ },
+ insertBasicTopTab: function(tab, newTabs_holder ) {
+ newTabs_holder.firstChild.firstChild.insertBefore(tab,newTabs_holder.firstChild.firstChild.firstChild);
+ },
+ getTab: function(text, tabId) {
+ var el = document.createElement('li');
+ el.className = 'tabs-title';
+ var a = document.createElement('a');
+ a.setAttribute('href','#'+tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ getTopTab: function(text, tabId) {
+ var el = document.createElement('li');
+ el.className = 'tabs-title';
+ var a = document.createElement('a');
+ a.setAttribute('href','#' + tabId);
+ a.appendChild(text);
+ el.appendChild(a);
+ return el;
+ },
+ getTabContentHolder: function(tab_holder) {
+ return tab_holder.children[1].firstChild;
+ },
+ getTopTabContentHolder: function(tab_holder) {
+ return tab_holder.firstChild.children[1];
+ },
+ getTabContent: function() {
+ var el = document.createElement('div');
+ el.className = 'tabs-panel';
+ el.style.paddingLeft = '5px';
+ return el;
+ },
+ getTopTabContent: function() {
+ var el = document.createElement('div');
+ el.className = 'tabs-panel';
+ el.style.paddingLeft = '5px';
+ return el;
+ },
+ markTabActive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?is-active/g,'');
+ row.tab.className += ' is-active';
+ row.tab.firstChild.setAttribute('aria-selected', 'true');
+
+ row.container.className = row.container.className.replace(/\s?is-active/g,'');
+ row.container.className += ' is-active';
+ row.container.setAttribute('aria-selected', 'true');
+ },
+ markTabInactive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?is-active/g,'');
+ row.tab.firstChild.removeAttribute('aria-selected');
+
+ row.container.className = row.container.className.replace(/\s?is-active/g,'');
+ row.container.removeAttribute('aria-selected');
+ },
+ addTab: function(holder, tab) {
+ holder.children[0].firstChild.appendChild(tab);
+ },
+ addTopTab: function(holder, tab) {
+ holder.firstChild.children[0].appendChild(tab);
+ },
+ getFirstTab: function(holder){
+ return holder.firstChild.firstChild.firstChild;
+ }
+});
+
+JSONEditor.defaults.themes.html = JSONEditor.AbstractTheme.extend({
+ getFormInputLabel: function(text) {
+ var el = this._super(text);
+ el.style.display = 'block';
+ el.style.marginBottom = '3px';
+ el.style.fontWeight = 'bold';
+ return el;
+ },
+ getFormInputDescription: function(text) {
+ var el = this._super(text);
+ el.style.fontSize = '.8em';
+ el.style.margin = 0;
+ el.style.display = 'inline-block';
+ el.style.fontStyle = 'italic';
+ return el;
+ },
+ getIndentedPanel: function() {
+ var el = this._super();
+ el.style.border = '1px solid #ddd';
+ el.style.padding = '5px';
+ el.style.margin = '10px';
+ el.style.borderRadius = '3px';
+ return el;
+ },
+ getTopIndentedPanel: function() {
+ return this.getIndentedPanel();
+ },
+ getChildEditorHolder: function() {
+ var el = this._super();
+ el.style.marginBottom = '8px';
+ return el;
+ },
+ getHeaderButtonHolder: function() {
+ var el = this.getButtonHolder();
+ el.style.display = 'inline-block';
+ el.style.marginLeft = '10px';
+ el.style.fontSize = '.8em';
+ el.style.verticalAlign = 'middle';
+ return el;
+ },
+ getTable: function() {
+ var el = this._super();
+ el.style.borderBottom = '1px solid #ccc';
+ el.style.marginBottom = '5px';
+ return el;
+ },
+ addInputError: function(input, text) {
+ input.style.borderColor = 'red';
+
+ if(!input.errmsg) {
+ var group = this.closest(input,'.form-control');
+ input.errmsg = document.createElement('div');
+ input.errmsg.setAttribute('class','errmsg');
+ input.errmsg.style = input.errmsg.style || {};
+ input.errmsg.style.color = 'red';
+ group.appendChild(input.errmsg);
+ }
+ else {
+ input.errmsg.style.display = 'block';
+ }
+
+ input.errmsg.innerHTML = '';
+ input.errmsg.appendChild(document.createTextNode(text));
+ },
+ removeInputError: function(input) {
+ input.style.borderColor = '';
+ if(input.errmsg) input.errmsg.style.display = 'none';
+ },
+ getProgressBar: function() {
+ var max = 100, start = 0;
+
+ var progressBar = document.createElement('progress');
+ progressBar.setAttribute('max', max);
+ progressBar.setAttribute('value', start);
+ return progressBar;
+ },
+ updateProgressBar: function(progressBar, progress) {
+ if (!progressBar) return;
+ progressBar.setAttribute('value', progress);
+ },
+ updateProgressBarUnknown: function(progressBar) {
+ if (!progressBar) return;
+ progressBar.removeAttribute('value');
+ }
+});
+
+JSONEditor.defaults.themes.jqueryui = JSONEditor.AbstractTheme.extend({
+ getTable: function() {
+ var el = this._super();
+ el.setAttribute('cellpadding',5);
+ el.setAttribute('cellspacing',0);
+ return el;
+ },
+ getTableHeaderCell: function(text) {
+ var el = this._super(text);
+ el.className = 'ui-state-active';
+ el.style.fontWeight = 'bold';
+ return el;
+ },
+ getTableCell: function() {
+ var el = this._super();
+ el.className = 'ui-widget-content';
+ return el;
+ },
+ getHeaderButtonHolder: function() {
+ var el = this.getButtonHolder();
+ el.style.marginLeft = '10px';
+ el.style.fontSize = '.6em';
+ el.style.display = 'inline-block';
+ return el;
+ },
+ getFormInputDescription: function(text) {
+ var el = this.getDescription(text);
+ el.style.marginLeft = '10px';
+ el.style.display = 'inline-block';
+ return el;
+ },
+ getFormControl: function(label, input, description, infoText) {
+ var el = this._super(label,input,description, infoText);
+ if(input.type === 'checkbox') {
+ el.style.lineHeight = '25px';
+
+ el.style.padding = '3px 0';
+ }
+ else {
+ el.style.padding = '4px';
+ }
+ return el;
+ },
+ getDescription: function(text) {
+ var el = document.createElement('span');
+ el.style.fontSize = '.8em';
+ el.style.fontStyle = 'italic';
+ el.textContent = text;
+ return el;
+ },
+ getButtonHolder: function() {
+ var el = document.createElement('div');
+ el.className = 'ui-buttonset';
+ el.style.fontSize = '.7em';
+ return el;
+ },
+ getFormInputLabel: function(text) {
+ var el = document.createElement('label');
+ el.style.fontWeight = 'bold';
+ el.style.display = 'block';
+ el.textContent = text;
+ return el;
+ },
+ getButton: function(text, icon, title) {
+ var button = document.createElement("button");
+ button.className = 'ui-button ui-widget ui-state-default ui-corner-all';
+
+ // Icon only
+ if(icon && !text) {
+ button.className += ' ui-button-icon-only';
+ icon.className += ' ui-button-icon-primary ui-icon-primary';
+ button.appendChild(icon);
+ }
+ // Icon and Text
+ else if(icon) {
+ button.className += ' ui-button-text-icon-primary';
+ icon.className += ' ui-button-icon-primary ui-icon-primary';
+ button.appendChild(icon);
+ }
+ // Text only
+ else {
+ button.className += ' ui-button-text-only';
+ }
+
+ var el = document.createElement('span');
+ el.className = 'ui-button-text';
+ el.textContent = text||title||".";
+ button.appendChild(el);
+
+ button.setAttribute('title',title);
+
+ return button;
+ },
+ setButtonText: function(button,text, icon, title) {
+ button.innerHTML = '';
+ button.className = 'ui-button ui-widget ui-state-default ui-corner-all';
+
+ // Icon only
+ if(icon && !text) {
+ button.className += ' ui-button-icon-only';
+ icon.className += ' ui-button-icon-primary ui-icon-primary';
+ button.appendChild(icon);
+ }
+ // Icon and Text
+ else if(icon) {
+ button.className += ' ui-button-text-icon-primary';
+ icon.className += ' ui-button-icon-primary ui-icon-primary';
+ button.appendChild(icon);
+ }
+ // Text only
+ else {
+ button.className += ' ui-button-text-only';
+ }
+
+ var el = document.createElement('span');
+ el.className = 'ui-button-text';
+ el.textContent = text||title||".";
+ button.appendChild(el);
+
+ button.setAttribute('title',title);
+ },
+ getIndentedPanel: function() {
+ var el = document.createElement('div');
+ el.className = 'ui-widget-content ui-corner-all';
+ el.style.padding = '1em 1.4em';
+ el.style.marginBottom = '20px';
+ return el;
+ },
+ afterInputReady: function(input) {
+ if(input.controls) return;
+ input.controls = this.closest(input,'.form-control');
+ if (this.queuedInputErrorText) {
+ var text = this.queuedInputErrorText;
+ delete this.queuedInputErrorText;
+ this.addInputError(input,text);
+ }
+ },
+ addInputError: function(input,text) {
+ if(!input.controls) {
+ this.queuedInputErrorText = text;
+ return;
+ }
+ if(!input.errmsg) {
+ input.errmsg = document.createElement('div');
+ input.errmsg.className = 'ui-state-error';
+ input.controls.appendChild(input.errmsg);
+ }
+ else {
+ input.errmsg.style.display = '';
+ }
+
+ input.errmsg.textContent = text;
+ },
+ removeInputError: function(input) {
+ if(!input.controls) {
+ delete this.queuedInputErrorText;
+ }
+ if(!input.errmsg) return;
+ input.errmsg.style.display = 'none';
+ },
+ markTabActive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?ui-widget-header/g,'').replace(/\s?ui-state-active/g,'')+' ui-state-active';
+ row.container.style.display = '';
+ },
+ markTabInactive: function(row) {
+ row.tab.className = row.tab.className.replace(/\s?ui-state-active/g,'').replace(/\s?ui-widget-header/g,'')+' ui-widget-header';
+ row.container.style.display = 'none';
+ }
+});
+
+JSONEditor.defaults.themes.barebones = JSONEditor.AbstractTheme.extend({
+ getFormInputLabel: function (text) {
+ var el = this._super(text);
+ return el;
+ },
+ getFormInputDescription: function (text) {
+ var el = this._super(text);
+ return el;
+ },
+ getIndentedPanel: function () {
+ var el = this._super();
+ return el;
+ },
+ getChildEditorHolder: function () {
+ var el = this._super();
+ return el;
+ },
+ getHeaderButtonHolder: function () {
+ var el = this.getButtonHolder();
+ return el;
+ },
+ getTable: function () {
+ var el = this._super();
+ return el;
+ },
+ addInputError: function (input, text) {
+ if (!input.errmsg) {
+ var group = this.closest(input, '.form-control');
+ input.errmsg = document.createElement('div');
+ input.errmsg.setAttribute('class', 'errmsg');
+ group.appendChild(input.errmsg);
+ }
+ else {
+ input.errmsg.style.display = 'block';
+ }
+
+ input.errmsg.innerHTML = '';
+ input.errmsg.appendChild(document.createTextNode(text));
+ },
+ removeInputError: function (input) {
+ input.style.borderColor = '';
+ if (input.errmsg) input.errmsg.style.display = 'none';
+ },
+ getProgressBar: function () {
+ var max = 100, start = 0;
+
+ var progressBar = document.createElement('progress');
+ progressBar.setAttribute('max', max);
+ progressBar.setAttribute('value', start);
+ return progressBar;
+ },
+ updateProgressBar: function (progressBar, progress) {
+ if (!progressBar) return;
+ progressBar.setAttribute('value', progress);
+ },
+ updateProgressBarUnknown: function (progressBar) {
+ if (!progressBar) return;
+ progressBar.removeAttribute('value');
+ }
+});
+
+JSONEditor.defaults.themes.materialize = JSONEditor.AbstractTheme.extend({
+
+ /**
+ * Applies grid size to specified element.
+ *
+ * @param {HTMLElement} el The DOM element to have specified size applied.
+ * @param {int} size The grid column size.
+ * @see http://materializecss.com/grid.html
+ */
+ setGridColumnSize: function(el, size) {
+ el.className = 'col s' + size;
+ },
+
+ /**
+ * Gets a wrapped button element for a header.
+ *
+ * @returns {HTMLElement} The wrapped button element.
+ */
+ getHeaderButtonHolder: function() {
+ return this.getButtonHolder();
+ },
+
+ /**
+ * Gets a wrapped button element.
+ *
+ * @returns {HTMLElement} The wrapped button element.
+ */
+ getButtonHolder: function() {
+ return document.createElement('span');
+ },
+
+ /**
+ * Gets a single button element.
+ *
+ * @param {string} text The button text.
+ * @param {HTMLElement} icon The icon object.
+ * @param {string} title The button title.
+ * @returns {HTMLElement} The button object.
+ * @see http://materializecss.com/buttons.html
+ */
+ getButton: function(text, icon, title) {
+
+ // Prepare icon.
+ if (text) {
+ icon.className += ' left';
+ icon.style.marginRight = '5px';
+ }
+
+ // Create and return button.
+ var el = this._super(text, icon, title);
+ el.className = 'waves-effect waves-light btn';
+ el.style.fontSize = '0.75rem';
+ el.style.height = '20px';
+ el.style.lineHeight = '20px';
+ el.style.marginLeft = '4px';
+ el.style.padding = '0 0.5rem';
+ return el;
+
+ },
+
+ /**
+ * Gets a form control object consisiting of several sub objects.
+ *
+ * @param {HTMLElement} label The label element.
+ * @param {HTMLElement} input The input element.
+ * @param {string} description The element description.
+ * @param {string} infoText The element information text.
+ * @returns {HTMLElement} The assembled DOM element.
+ * @see http://materializecss.com/forms.html
+ */
+ getFormControl: function(label, input, description, infoText) {
+
+ var ctrl,
+ type = input.type;
+
+ // Checkboxes get wrapped in p elements.
+ if (type && type === 'checkbox') {
+
+ ctrl = document.createElement('p');
+ ctrl.appendChild(input);
+ if (label) {
+ label.setAttribute('for', input.id);
+ ctrl.appendChild(label);
+ }
+ return ctrl;
+
+ }
+
+ // Anything else gets wrapped in divs.
+ ctrl = this._super(label, input, description, infoText);
+
+ // Not .input-field for select wrappers.
+ if (!type || !type.startsWith('select'))
+ ctrl.className = 'input-field';
+
+ // Color needs special attention.
+ if (type && type === 'color') {
+ input.style.height = '3rem';
+ input.style.width = '100%';
+ input.style.margin = '5px 0 20px 0';
+ input.style.padding = '3px';
+
+ if (label) {
+ label.style.transform = 'translateY(-14px) scale(0.8)';
+ label.style['-webkit-transform'] = 'translateY(-14px) scale(0.8)';
+ label.style['-webkit-transform-origin'] = '0 0';
+ label.style['transform-origin'] = '0 0';
+ }
+ }
+
+ return ctrl;
+
+ },
+
+ getDescription: function(text) {
+ var el = document.createElement('div');
+ el.className = 'grey-text';
+ el.style.marginTop = '-15px';
+ el.innerHTML = text;
+ return el;
+ },
+
+ /**
+ * Gets a header element.
+ *
+ * @param {string|HTMLElement} text The header text or element.
+ * @returns {HTMLElement} The header element.
+ */
+ getHeader: function(text) {
+
+ var el = document.createElement('h5');
+
+ if (typeof text === 'string') {
+ el.textContent = text;
+ } else {
+ el.appendChild(text);
+ }
+
+ return el;
+
+ },
+
+ getChildEditorHolder: function() {
+
+ var el = document.createElement('div');
+ el.marginBottom = '10px';
+ return el;
+
+ },
+
+ getIndentedPanel: function() {
+ var el = document.createElement("div");
+ el.className = "card-panel";
+ return el;
+ },
+
+ getTable: function() {
+
+ var el = document.createElement('table');
+ el.className = 'striped bordered';
+ el.style.marginBottom = '10px';
+ return el;
+
+ },
+
+ getTableRow: function() {
+ return document.createElement('tr');
+ },
+
+ getTableHead: function() {
+ return document.createElement('thead');
+ },
+
+ getTableBody: function() {
+ return document.createElement('tbody');
+ },
+
+ getTableHeaderCell: function(text) {
+
+ var el = document.createElement('th');
+ el.textContent = text;
+ return el;
+
+ },
+
+ getTableCell: function() {
+
+ var el = document.createElement('td');
+ return el;
+
+ },
+
+ /**
+ * Gets the tab holder element.
+ *
+ * @returns {HTMLElement} The tab holder component.
+ * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
+ */
+ getTabHolder: function() {
+
+ var html = [
+ '<div class="col s2">',
+ ' <ul class="tabs" style="height: auto; margin-top: 0.82rem; -ms-flex-direction: column; -webkit-flex-direction: column; flex-direction: column; display: -webkit-flex; display: flex;">',
+ ' </ul>',
+ '</div>',
+ '<div class="col s10">',
+ '<div>'
+ ].join("\n");
+
+ var el = document.createElement('div');
+ el.className = 'row card-panel';
+ el.innerHTML = html;
+ return el;
+
+ },
+
+ /**
+ * Add specified tab to specified holder element.
+ *
+ * @param {HTMLElement} holder The tab holder element.
+ * @param {HTMLElement} tab The tab to add.
+ */
+ addTab: function(holder, tab) {
+ holder.children[0].children[0].appendChild(tab);
+ },
+
+ /**
+ * Gets a single tab element.
+ *
+ * @param {HTMLElement} span The tab's content.
+ * @returns {HTMLElement} The tab element.
+ * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
+ */
+ getTab: function(span) {
+
+ var el = document.createElement('li');
+ el.className = 'tab';
+ this.applyStyles(el, {
+ width: '100%',
+ textAlign: 'left',
+ lineHeight: '24px',
+ height: '24px',
+ fontSize: '14px',
+ cursor: 'pointer'
+ });
+ el.appendChild(span);
+ return el;
+ },
+
+ /**
+ * Marks specified tab as active.
+ *
+ * @returns {HTMLElement} The tab element.
+ * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
+ */
+ markTabActive: function(tab) {
+
+ this.applyStyles(tab, {
+ width: '100%',
+ textAlign: 'left',
+ lineHeight: '24px',
+ height: '24px',
+ fontSize: '14px',
+ cursor: 'pointer',
+ color: 'rgba(238,110,115,1)',
+ transition: 'border-color .5s ease',
+ borderRight: '3px solid #424242'
+ });
+
+ },
+
+ /**
+ * Marks specified tab as inactive.
+ *
+ * @returns {HTMLElement} The tab element.
+ * @see https://github.com/Dogfalo/materialize/issues/2542#issuecomment-233458602
+ */
+ markTabInactive: function(tab) {
+
+ this.applyStyles(tab, {
+ width: '100%',
+ textAlign: 'left',
+ lineHeight: '24px',
+ height: '24px',
+ fontSize: '14px',
+ cursor: 'pointer',
+ color: 'rgba(238,110,115,0.7)'
+ });
+
+ },
+
+ /**
+ * Returns the element that holds the tab contents.
+ *
+ * @param {HTMLElement} tabHolder The full tab holder element.
+ * @returns {HTMLElement} The content element inside specified tab holder.
+ */
+ getTabContentHolder: function(tabHolder) {
+ return tabHolder.children[1];
+ },
+
+ /**
+ * Creates and returns a tab content element.
+ *
+ * @returns {HTMLElement} The new tab content element.
+ */
+ getTabContent: function() {
+ return document.createElement('div');
+ },
+
+ /**
+ * Adds an error message to the specified input element.
+ *
+ * @param {HTMLElement} input The input element that caused the error.
+ * @param {string} text The error message.
+ */
+ addInputError: function(input, text) {
+
+ // Get the parent element. Should most likely be a <div class="input-field" ... />.
+ var parent = input.parentNode,
+ el;
+
+ if (!parent) return;
+
+ // Remove any previous error.
+ this.removeInputError(input);
+
+ // Append an error message div.
+ el = document.createElement('div');
+ el.className = 'error-text red-text';
+ el.textContent = text;
+ parent.appendChild(el);
+
+ },
+
+ /**
+ * Removes any error message from the specified input element.
+ *
+ * @param {HTMLElement} input The input element that previously caused the error.
+ */
+ removeInputError: function(input) {
+
+ // Get the parent element. Should most likely be a <div class="input-field" ... />.
+ var parent = input.parentElement,
+ els;
+
+ if (!parent) return;
+
+ // Remove all elements having class .error-text.
+ els = parent.getElementsByClassName('error-text');
+ for (var i = 0; i < els.length; i++)
+ parent.removeChild(els[i]);
+
+ },
+
+ addTableRowError: function(row) {
+ },
+
+ removeTableRowError: function(row) {
+ },
+
+ /**
+ * Gets a select DOM element.
+ *
+ * @param {object} options The option values.
+ * @return {HTMLElement} The DOM element.
+ * @see http://materializecss.com/forms.html#select
+ */
+ getSelectInput: function(options) {
+
+ var select = this._super(options);
+ select.className = 'browser-default';
+ return select;
+
+ },
+
+ /**
+ * Gets a textarea DOM element.
+ *
+ * @returns {HTMLElement} The DOM element.
+ * @see http://materializecss.com/forms.html#textarea
+ */
+ getTextareaInput: function() {
+ var el = document.createElement('textarea');
+ el.style.marginBottom = '5px';
+ el.style.fontSize = '1rem';
+ el.style.fontFamily = 'monospace';
+ return el;
+ },
+
+ getCheckbox: function() {
+
+ var el = this.getFormInputField('checkbox');
+ el.id = this.createUuid();
+ return el;
+
+ },
+
+ /**
+ * Gets the modal element for displaying Edit JSON and Properties dialogs.
+ *
+ * @returns {HTMLElement} The modal DOM element.
+ * @see http://materializecss.com/cards.html
+ */
+ getModal: function() {
+
+ var el = document.createElement('div');
+ el.className = 'card-panel z-depth-3';
+ el.style.padding = '5px';
+ el.style.position = 'absolute';
+ el.style.zIndex = '10';
+ el.style.display = 'none';
+ return el;
+
+ },
+
+ /**
+ * Creates and returns a RFC4122 version 4 compliant unique id.
+ *
+ * @returns {string} A GUID.
+ * @see https://stackoverflow.com/a/2117523
+ */
+ createUuid: function() {
+
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+ var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
+ return v.toString(16);
+ });
+
+ }
+
+});
+
+JSONEditor.AbstractIconLib = Class.extend({
+ mapping: {
+ collapse: '',
+ expand: '',
+ "delete": '',
+ edit: '',
+ add: '',
+ cancel: '',
+ save: '',
+ moveup: '',
+ movedown: ''
+ },
+ icon_prefix: '',
+ getIconClass: function(key) {
+ if(this.mapping[key]) return this.icon_prefix+this.mapping[key];
+ else return null;
+ },
+ getIcon: function(key) {
+ var iconclass = this.getIconClass(key);
+
+ if(!iconclass) return null;
+
+ var i = document.createElement('i');
+ i.className = iconclass;
+ return i;
+ }
+});
+
+JSONEditor.defaults.iconlibs.bootstrap2 = JSONEditor.AbstractIconLib.extend({
+ mapping: {
+ collapse: 'chevron-down',
+ expand: 'chevron-up',
+ "delete": 'trash',
+ edit: 'pencil',
+ add: 'plus',
+ cancel: 'ban-circle',
+ save: 'ok',
+ moveup: 'arrow-up',
+ movedown: 'arrow-down'
+ },
+ icon_prefix: 'glyphicon glyphicon-'
+});
+
+JSONEditor.defaults.iconlibs.bootstrap3 = JSONEditor.AbstractIconLib.extend({
+ mapping: {
+ collapse: 'chevron-down',
+ expand: 'chevron-right',
+ "delete": 'remove',
+ edit: 'pencil',
+ add: 'plus',
+ cancel: 'floppy-remove',
+ save: 'floppy-saved',
+ moveup: 'arrow-up',
+ movedown: 'arrow-down'
+ },
+ icon_prefix: 'glyphicon glyphicon-'
+});
+
+JSONEditor.defaults.iconlibs.fontawesome3 = JSONEditor.AbstractIconLib.extend({
+ mapping: {
+ collapse: 'chevron-down',
+ expand: 'chevron-right',
+ "delete": 'remove',
+ edit: 'pencil',
+ add: 'plus',
+ cancel: 'ban-circle',
+ save: 'save',
+ moveup: 'arrow-up',
+ movedown: 'arrow-down'
+ },
+ icon_prefix: 'icon-'
+});
+
+JSONEditor.defaults.iconlibs.fontawesome4 = JSONEditor.AbstractIconLib.extend({
+ mapping: {
+ collapse: 'caret-square-o-down',
+ expand: 'caret-square-o-right',
+ "delete": 'times',
+ edit: 'pencil',
+ add: 'plus',
+ cancel: 'ban',
+ save: 'save',
+ moveup: 'arrow-up',
+ movedown: 'arrow-down',
+ copy: 'files-o'
+ },
+ icon_prefix: 'fa fa-'
+});
+
+JSONEditor.defaults.iconlibs.foundation2 = JSONEditor.AbstractIconLib.extend({
+ mapping: {
+ collapse: 'minus',
+ expand: 'plus',
+ "delete": 'remove',
+ edit: 'edit',
+ add: 'add-doc',
+ cancel: 'error',
+ save: 'checkmark',
+ moveup: 'up-arrow',
+ movedown: 'down-arrow'
+ },
+ icon_prefix: 'foundicon-'
+});
+
+JSONEditor.defaults.iconlibs.foundation3 = JSONEditor.AbstractIconLib.extend({
+ mapping: {
+ collapse: 'minus',
+ expand: 'plus',
+ "delete": 'x',
+ edit: 'pencil',
+ add: 'page-add',
+ cancel: 'x-circle',
+ save: 'save',
+ moveup: 'arrow-up',
+ movedown: 'arrow-down'
+ },
+ icon_prefix: 'fi-'
+});
+
+JSONEditor.defaults.iconlibs.jqueryui = JSONEditor.AbstractIconLib.extend({
+ mapping: {
+ collapse: 'triangle-1-s',
+ expand: 'triangle-1-e',
+ "delete": 'trash',
+ edit: 'pencil',
+ add: 'plusthick',
+ cancel: 'closethick',
+ save: 'disk',
+ moveup: 'arrowthick-1-n',
+ movedown: 'arrowthick-1-s'
+ },
+ icon_prefix: 'ui-icon ui-icon-'
+});
+
+JSONEditor.defaults.iconlibs.materialicons = JSONEditor.AbstractIconLib.extend({
+
+ mapping: {
+ collapse: 'arrow_drop_up',
+ expand: 'arrow_drop_down',
+ "delete": 'delete',
+ edit: 'edit',
+ add: 'add',
+ cancel: 'cancel',
+ save: 'save',
+ moveup: 'arrow_upward',
+ movedown: 'arrow_downward',
+ copy: 'content_copy'
+ },
+
+ icon_class: 'material-icons',
+ icon_prefix: '',
+
+ getIconClass: function(key) {
+
+ // This method is unused.
+
+ return this.icon_class;
+ },
+
+ getIcon: function(key) {
+
+ // Get the mapping.
+ var mapping = this.mapping[key];
+ if (!mapping) return null;
+
+ // @see http://materializecss.com/icons.html
+ var i = document.createElement('i');
+ i.className = this.icon_class;
+ var t = document.createTextNode(mapping);
+ i.appendChild(t);
+ return i;
+
+ }
+});
+
+JSONEditor.defaults.templates["default"] = function() {
+ return {
+ compile: function(template) {
+ var matches = template.match(/{{\s*([a-zA-Z0-9\-_ \.]+)\s*}}/g);
+ var l = matches && matches.length;
+
+ // Shortcut if the template contains no variables
+ if(!l) return function() { return template; };
+
+ // Pre-compute the search/replace functions
+ // This drastically speeds up template execution
+ var replacements = [];
+ var get_replacement = function(i) {
+ var p = matches[i].replace(/[{}]+/g,'').trim().split('.');
+ var n = p.length;
+ var func;
+
+ if(n > 1) {
+ var cur;
+ func = function(vars) {
+ cur = vars;
+ for(i=0; i<n; i++) {
+ cur = cur[p[i]];
+ if(!cur) break;
+ }
+ return cur;
+ };
+ }
+ else {
+ p = p[0];
+ func = function(vars) {
+ return vars[p];
+ };
+ }
+
+ replacements.push({
+ s: matches[i],
+ r: func
+ });
+ };
+ for(var i=0; i<l; i++) {
+ get_replacement(i);
+ }
+
+ // The compiled function
+ return function(vars) {
+ var ret = template+"";
+ var r;
+ for(i=0; i<l; i++) {
+ r = replacements[i];
+ ret = ret.replace(r.s, r.r(vars));
+ }
+ return ret;
+ };
+ }
+ };
+};
+
+JSONEditor.defaults.templates.ejs = function() {
+ if(!window.EJS) return false;
+
+ return {
+ compile: function(template) {
+ var compiled = new window.EJS({
+ text: template
+ });
+
+ return function(context) {
+ return compiled.render(context);
+ };
+ }
+ };
+};
+
+JSONEditor.defaults.templates.handlebars = function() {
+ return window.Handlebars;
+};
+
+JSONEditor.defaults.templates.hogan = function() {
+ if(!window.Hogan) return false;
+
+ return {
+ compile: function(template) {
+ var compiled = window.Hogan.compile(template);
+ return function(context) {
+ return compiled.render(context);
+ };
+ }
+ };
+};
+
+JSONEditor.defaults.templates.lodash = function() {
+ if(!window._) return false;
+
+ return {
+ compile: function(template) {
+ return function(context) {
+ return window._.template(template)(context);
+ };
+ }
+ };
+};
+
+JSONEditor.defaults.templates.markup = function() {
+ if(!window.Mark || !window.Mark.up) return false;
+
+ return {
+ compile: function(template) {
+ return function(context) {
+ return window.Mark.up(template,context);
+ };
+ }
+ };
+};
+
+JSONEditor.defaults.templates.mustache = function() {
+ if(!window.Mustache) return false;
+
+ return {
+ compile: function(template) {
+ return function(view) {
+ return window.Mustache.render(template, view);
+ };
+ }
+ };
+};
+
+JSONEditor.defaults.templates.swig = function() {
+ return window.swig;
+};
+
+JSONEditor.defaults.templates.underscore = function() {
+ if(!window._) return false;
+
+ return {
+ compile: function(template) {
+ return function(context) {
+ return window._.template(template, context);
+ };
+ }
+ };
+};
+
+// Set the default theme
+JSONEditor.defaults.theme = 'html';
+
+// Set the default template engine
+JSONEditor.defaults.template = 'default';
+
+// Default options when initializing JSON Editor
+JSONEditor.defaults.options = {};
+
+JSONEditor.defaults.options.prompt_before_delete = true;
+
+// String translate function
+JSONEditor.defaults.translate = function(key, variables) {
+ var lang = JSONEditor.defaults.languages[JSONEditor.defaults.language];
+ if(!lang) throw "Unknown language "+JSONEditor.defaults.language;
+
+ var string = lang[key] || JSONEditor.defaults.languages[JSONEditor.defaults.default_language][key];
+
+ if(typeof string === "undefined") throw "Unknown translate string "+key;
+
+ if(variables) {
+ for(var i=0; i<variables.length; i++) {
+ string = string.replace(new RegExp('\\{\\{'+i+'}}','g'),variables[i]);
+ }
+ }
+
+ return string;
+};
+
+// Translation strings and default languages
+JSONEditor.defaults.default_language = 'en';
+JSONEditor.defaults.language = JSONEditor.defaults.default_language;
+JSONEditor.defaults.languages.en = {
+ /**
+ * When a property is not set
+ */
+ error_notset: 'Please populate the required property "{{0}}"',
+ /**
+ * When a string must not be empty
+ */
+ error_notempty: 'Please populate the required property "{{0}}"',
+ /**
+ * When a value is not one of the enumerated values
+ */
+ error_enum: "{{0}} must be one of the enumerated values",
+ /**
+ * When a value doesn't validate any schema of a 'anyOf' combination
+ */
+ error_anyOf: "Value must validate against at least one of the provided schemas",
+ /**
+ * When a value doesn't validate
+ * @variables This key takes one variable: The number of schemas the value does not validate
+ */
+ error_oneOf: 'Value must validate against exactly one of the provided schemas. It currently validates against {{0}} of the schemas.',
+ /**
+ * When a value does not validate a 'not' schema
+ */
+ error_not: "Value must not validate against the provided schema",
+ /**
+ * When a value does not match any of the provided types
+ */
+ error_type_union: "Value must be one of the provided types",
+ /**
+ * When a value does not match the given type
+ * @variables This key takes one variable: The type the value should be of
+ */
+ error_type: "Value must be of type {{0}}",
+ /**
+ * When the value validates one of the disallowed types
+ */
+ error_disallow_union: "Value must not be one of the provided disallowed types",
+ /**
+ * When the value validates a disallowed type
+ * @variables This key takes one variable: The type the value should not be of
+ */
+ error_disallow: "Value must not be of type {{0}}",
+ /**
+ * When a value is not a multiple of or divisible by a given number
+ * @variables This key takes one variable: The number mentioned above
+ */
+ error_multipleOf: "Value must be a multiple of {{0}}",
+ /**
+ * When a value is greater than it's supposed to be (exclusive)
+ * @variables This key takes one variable: The maximum
+ */
+ error_maximum_excl: "{{0}} must be less than {{1}}",
+ /**
+ * When a value is greater than it's supposed to be (inclusive)
+ * @variables This key takes one variable: The maximum
+ */
+ error_maximum_incl: "{{0}} must be at most {{1}}",
+ /**
+ * When a value is lesser than it's supposed to be (exclusive)
+ * @variables This key takes one variable: The minimum
+ */
+ error_minimum_excl: "{{0}} must be greater than {{1}}",
+ /**
+ * When a value is lesser than it's supposed to be (inclusive)
+ * @variables This key takes one variable: The minimum
+ */
+ error_minimum_incl: "{{0}} must be at least {{1}}",
+ /**
+ * When a value have too many characters
+ * @variables This key takes one variable: The maximum character count
+ */
+ error_maxLength: "{{0}} must be at most {{1}} characters long",
+ /**
+ * When a value does not have enough characters
+ * @variables This key takes one variable: The minimum character count
+ */
+ error_minLength: "{{0}} must be at least {{1}} characters long",
+ /**
+ * When a value does not match a given pattern
+ */
+ error_pattern: "{{0}} must match the pattern {{1}}",
+ /**
+ * When an array has additional items whereas it is not supposed to
+ */
+ error_additionalItems: "No additional items allowed in this array",
+ /**
+ * When there are to many items in an array
+ * @variables This key takes one variable: The maximum item count
+ */
+ error_maxItems: "{{0}} must have at most {{1}} items",
+ /**
+ * When there are not enough items in an array
+ * @variables This key takes one variable: The minimum item count
+ */
+ error_minItems: "{{0}} must have at least {{1}} items",
+ /**
+ * When an array is supposed to have unique items but has duplicates
+ */
+ error_uniqueItems: "Each tab of {{0}} must specify a unique combination of parameters",
+ /**
+ * When there are too many properties in an object
+ * @variables This key takes one variable: The maximum property count
+ */
+ error_maxProperties: "Object must have at most {{0}} properties",
+ /**
+ * When there are not enough properties in an object
+ * @variables This key takes one variable: The minimum property count
+ */
+ error_minProperties: "Object must have at least {{0}} properties",
+ /**
+ * When a required property is not defined
+ * @variables This key takes one variable: The name of the missing property
+ */
+ error_required: 'Please populate the required property "{{0}}"',
+ /**
+ * When there is an additional property is set whereas there should be none
+ * @variables This key takes one variable: The name of the additional property
+ */
+ error_additional_properties: "No additional properties allowed, but property {{0}} is set",
+ /**
+ * When a dependency is not resolved
+ * @variables This key takes one variable: The name of the missing property for the dependency
+ */
+ error_dependency: "Must have property {{0}}",
+ /**
+ * Text on Delete All buttons
+ */
+ button_delete_all: "All",
+ /**
+ * Title on Delete All buttons
+ */
+ button_delete_all_title: "Delete All",
+ /**
+ * Text on Delete Last buttons
+ * @variable This key takes one variable: The title of object to delete
+ */
+ button_delete_last: "Last {{0}}",
+ /**
+ * Title on Delete Last buttons
+ * @variable This key takes one variable: The title of object to delete
+ */
+ button_delete_last_title: "Delete Last {{0}}",
+ /**
+ * Title on Add Row buttons
+ * @variable This key takes one variable: The title of object to add
+ */
+ button_add_row_title: "Add {{0}}",
+ /**
+ * Title on Move Down buttons
+ */
+ button_move_down_title: "Move down",
+ /**
+ * Title on Move Up buttons
+ */
+ button_move_up_title: "Move up",
+ /**
+ * Title on Delete Row buttons
+ * @variable This key takes one variable: The title of object to delete
+ */
+ button_delete_row_title: "Delete {{0}}",
+ /**
+ * Title on Delete Row buttons, short version (no parameter with the object title)
+ */
+ button_delete_row_title_short: "Delete",
+ /**
+ * Title on Collapse buttons
+ */
+ button_collapse: "Collapse",
+ /**
+ * Title on Expand buttons
+ */
+ button_expand: "Expand"
+};
+
+// Miscellaneous Plugin Settings
+JSONEditor.plugins = {
+ ace: {
+ theme: ''
+ },
+ SimpleMDE: {
+
+ },
+ sceditor: {
+
+ },
+ select2: {
+
+ },
+ selectize: {
+ }
+};
+
+// Default per-editor options
+$each(JSONEditor.defaults.editors, function(i,editor) {
+ JSONEditor.defaults.editors[i].options = editor.options || {};
+});
+
+// Set the default resolvers
+// Use "multiple" as a fall back for everything
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ if(schema.type === "qbldr") return "qbldr";
+});
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ if(typeof schema.type !== "string") return "multiple";
+});
+// If the type is not set but properties are defined, we can infer the type is actually object
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ // If the schema is a simple type
+ if(!schema.type && schema.properties ) return "object";
+});
+// If the type is set and it's a basic type, use the primitive editor
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ // If the schema is a simple type
+ if(typeof schema.type === "string") return schema.type;
+});
+// Use a specialized editor for ratings
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ if(schema.type === "integer" && schema.format === "rating") return "rating";
+});
+// Use the select editor for all boolean values
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ if(schema.type === 'boolean') {
+ // If explicitly set to 'checkbox', use that
+ if(schema.format === "checkbox" || (schema.options && schema.options.checkbox)) {
+ return "checkbox";
+ }
+ // Otherwise, default to select menu
+ return (JSONEditor.plugins.selectize.enable) ? 'selectize' : 'select';
+ }
+});
+// Use the multiple editor for schemas where the `type` is set to "any"
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ // If the schema can be of any type
+ if(schema.type === "any") return "multiple";
+});
+// Editor for base64 encoded files
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ // If the schema can be of any type
+ if(schema.type === "string" && schema.media && schema.media.binaryEncoding==="base64") {
+ return "base64";
+ }
+});
+// Editor for uploading files
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ if(schema.type === "string" && schema.format === "url" && schema.options && schema.options.upload === true) {
+ if(window.FileReader) return "upload";
+ }
+});
+// Use the table editor for arrays with the format set to `table`
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ // Type `array` with format set to `table`
+ if(schema.type === "array" && schema.format === "table") {
+ return "table";
+ }
+});
+// Use the `select` editor for dynamic enumSource enums
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ if(schema.enumSource) return (JSONEditor.plugins.selectize.enable) ? 'selectize' : 'select';
+});
+// Use the `enum` or `select` editors for schemas with enumerated properties
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ if(schema["enum"]) {
+ if(schema.type === "array" || schema.type === "object") {
+ return "enum";
+ }
+ else if(schema.type === "number" || schema.type === "integer" || schema.type === "string") {
+ return (JSONEditor.plugins.selectize.enable) ? 'selectize' : 'select';
+ }
+ }
+});
+// Specialized editors for arrays of strings
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ if(schema.type === "array" && schema.items && !(Array.isArray(schema.items)) && schema.uniqueItems && ['string','number','integer'].indexOf(schema.items.type) >= 0) {
+ // For enumerated strings, number, or integers
+ if(schema.items.enum) {
+ return 'multiselect';
+ }
+ // For non-enumerated strings (tag editor)
+ else if(JSONEditor.plugins.selectize.enable && schema.items.type === "string") {
+ return 'arraySelectize';
+ }
+ }
+});
+// Use the multiple editor for schemas with `oneOf` set
+JSONEditor.defaults.resolvers.unshift(function(schema) {
+ // If this schema uses `oneOf` or `anyOf`
+ if(schema.oneOf || schema.anyOf) return "multiple";
+});
+
+/**
+ * This is a small wrapper for using JSON Editor like a typical jQuery plugin.
+ */
+(function() {
+ if(window.jQuery || window.Zepto) {
+ var $ = window.jQuery || window.Zepto;
+ $.jsoneditor = JSONEditor.defaults;
+
+ $.fn.jsoneditor = function(options) {
+ var self = this;
+ var editor = this.data('jsoneditor');
+ if(options === 'value') {
+ if(!editor) throw "Must initialize jsoneditor before getting/setting the value";
+
+ // Set value
+ if(arguments.length > 1) {
+ editor.setValue(arguments[1]);
+ }
+ // Get value
+ else {
+ return editor.getValue();
+ }
+ }
+ else if(options === 'validate') {
+ if(!editor) throw "Must initialize jsoneditor before validating";
+
+ // Validate a specific value
+ if(arguments.length > 1) {
+ return editor.validate(arguments[1]);
+ }
+ // Validate current value
+ else {
+ return editor.validate();
+ }
+ }
+ else if(options === 'destroy') {
+ if(editor) {
+ editor.destroy();
+ this.data('jsoneditor',null);
+ }
+ }
+ else {
+ // Destroy first
+ if(editor) {
+ editor.destroy();
+ }
+
+ // Create editor
+ editor = new JSONEditor(this.get(0),options);
+ this.data('jsoneditor',editor);
+
+ // Setup event listeners
+ editor.on('change',function() {
+ self.trigger('change');
+ });
+ editor.on('ready',function() {
+ self.trigger('ready');
+ });
+ }
+
+ return this;
+ };
+ }
+})();
+
+ window.JSONEditor = JSONEditor;
+})();
diff --git a/src/main/resources/META-INF/resources/designer/lib/query-builder.standalone.js b/src/main/resources/META-INF/resources/designer/lib/query-builder.standalone.js
new file mode 100644
index 000000000..169b28787
--- /dev/null
+++ b/src/main/resources/META-INF/resources/designer/lib/query-builder.standalone.js
@@ -0,0 +1,6541 @@
+/*!
+ * jQuery.extendext 0.1.2
+ *
+ * Copyright 2014-2016 Damien "Mistic" Sorel (http://www.strangeplanet.fr)
+ * Licensed under MIT (http://opensource.org/licenses/MIT)
+ *
+ * Based on jQuery.extend by jQuery Foundation, Inc. and other contributors
+ */
+
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define('jQuery.extendext', ['jquery'], factory);
+ }
+ else if (typeof module === 'object' && module.exports) {
+ module.exports = factory(require('jquery'));
+ }
+ else {
+ factory(root.jQuery);
+ }
+}(this, function ($) {
+ "use strict";
+
+ $.extendext = function () {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false,
+ arrayMode = 'default';
+
+ // Handle a deep copy situation
+ if (typeof target === "boolean") {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[i++] || {};
+ }
+
+ // Handle array mode parameter
+ if (typeof target === "string") {
+ arrayMode = target.toLowerCase();
+ if (arrayMode !== 'concat' && arrayMode !== 'replace' && arrayMode !== 'extend') {
+ arrayMode = 'default';
+ }
+
+ // Skip the string param
+ target = arguments[i++] || {};
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if (typeof target !== "object" && !$.isFunction(target)) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if (i === length) {
+ target = this;
+ i--;
+ }
+
+ for (; i < length; i++) {
+ // Only deal with non-null/undefined values
+ if ((options = arguments[i]) !== null) {
+ // Special operations for arrays
+ if ($.isArray(options) && arrayMode !== 'default') {
+ clone = target && $.isArray(target) ? target : [];
+
+ switch (arrayMode) {
+ case 'concat':
+ target = clone.concat($.extend(deep, [], options));
+ break;
+
+ case 'replace':
+ target = $.extend(deep, [], options);
+ break;
+
+ case 'extend':
+ options.forEach(function (e, i) {
+ if (typeof e === 'object') {
+ var type = $.isArray(e) ? [] : {};
+ clone[i] = $.extendext(deep, arrayMode, clone[i] || type, e);
+
+ } else if (clone.indexOf(e) === -1) {
+ clone.push(e);
+ }
+ });
+
+ target = clone;
+ break;
+ }
+
+ } else {
+ // Extend the base object
+ for (name in options) {
+ src = target[name];
+ copy = options[name];
+
+ // Prevent never-ending loop
+ if (target === copy) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if (deep && copy && ( $.isPlainObject(copy) ||
+ (copyIsArray = $.isArray(copy)) )) {
+
+ if (copyIsArray) {
+ copyIsArray = false;
+ clone = src && $.isArray(src) ? src : [];
+
+ } else {
+ clone = src && $.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[name] = $.extendext(deep, arrayMode, clone, copy);
+
+ // Don't bring in undefined values
+ } else if (copy !== undefined) {
+ target[name] = copy;
+ }
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+ };
+}));
+
+// doT.js
+// 2011-2014, Laura Doktorova, https://github.com/olado/doT
+// Licensed under the MIT license.
+
+(function () {
+ "use strict";
+
+ var doT = {
+ name: "doT",
+ version: "1.1.1",
+ templateSettings: {
+ evaluate: /\{\{([\s\S]+?(\}?)+)\}\}/g,
+ interpolate: /\{\{=([\s\S]+?)\}\}/g,
+ encode: /\{\{!([\s\S]+?)\}\}/g,
+ use: /\{\{#([\s\S]+?)\}\}/g,
+ useParams: /(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g,
+ define: /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g,
+ defineParams:/^\s*([\w$]+):([\s\S]+)/,
+ conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g,
+ iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g,
+ varname: "it",
+ strip: true,
+ append: true,
+ selfcontained: false,
+ doNotSkipEncoded: false
+ },
+ template: undefined, //fn, compile template
+ compile: undefined, //fn, for express
+ log: true
+ }, _globals;
+
+ doT.encodeHTMLSource = function(doNotSkipEncoded) {
+ var encodeHTMLRules = { "&": "&#38;", "<": "&#60;", ">": "&#62;", '"': "&#34;", "'": "&#39;", "/": "&#47;" },
+ matchHTML = doNotSkipEncoded ? /[&<>"'\/]/g : /&(?!#?\w+;)|<|>|"|'|\//g;
+ return function(code) {
+ return code ? code.toString().replace(matchHTML, function(m) {return encodeHTMLRules[m] || m;}) : "";
+ };
+ };
+
+ _globals = (function(){ return this || (0,eval)("this"); }());
+
+ /* istanbul ignore else */
+ if (typeof module !== "undefined" && module.exports) {
+ module.exports = doT;
+ } else if (typeof define === "function" && define.amd) {
+ define('doT', function(){return doT;});
+ } else {
+ _globals.doT = doT;
+ }
+
+ var startend = {
+ append: { start: "'+(", end: ")+'", startencode: "'+encodeHTML(" },
+ split: { start: "';out+=(", end: ");out+='", startencode: "';out+=encodeHTML(" }
+ }, skip = /$^/;
+
+ function resolveDefs(c, block, def) {
+ return ((typeof block === "string") ? block : block.toString())
+ .replace(c.define || skip, function(m, code, assign, value) {
+ if (code.indexOf("def.") === 0) {
+ code = code.substring(4);
+ }
+ if (!(code in def)) {
+ if (assign === ":") {
+ if (c.defineParams) value.replace(c.defineParams, function(m, param, v) {
+ def[code] = {arg: param, text: v};
+ });
+ if (!(code in def)) def[code]= value;
+ } else {
+ new Function("def", "def['"+code+"']=" + value)(def);
+ }
+ }
+ return "";
+ })
+ .replace(c.use || skip, function(m, code) {
+ if (c.useParams) code = code.replace(c.useParams, function(m, s, d, param) {
+ if (def[d] && def[d].arg && param) {
+ var rw = (d+":"+param).replace(/'|\\/g, "_");
+ def.__exp = def.__exp || {};
+ def.__exp[rw] = def[d].text.replace(new RegExp("(^|[^\\w$])" + def[d].arg + "([^\\w$])", "g"), "$1" + param + "$2");
+ return s + "def.__exp['"+rw+"']";
+ }
+ });
+ var v = new Function("def", "return " + code)(def);
+ return v ? resolveDefs(c, v, def) : v;
+ });
+ }
+
+ function unescape(code) {
+ return code.replace(/\\('|\\)/g, "$1").replace(/[\r\t\n]/g, " ");
+ }
+
+ doT.template = function(tmpl, c, def) {
+ c = c || doT.templateSettings;
+ var cse = c.append ? startend.append : startend.split, needhtmlencode, sid = 0, indv,
+ str = (c.use || c.define) ? resolveDefs(c, tmpl, def || {}) : tmpl;
+
+ str = ("var out='" + (c.strip ? str.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ")
+ .replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""): str)
+ .replace(/'|\\/g, "\\$&")
+ .replace(c.interpolate || skip, function(m, code) {
+ return cse.start + unescape(code) + cse.end;
+ })
+ .replace(c.encode || skip, function(m, code) {
+ needhtmlencode = true;
+ return cse.startencode + unescape(code) + cse.end;
+ })
+ .replace(c.conditional || skip, function(m, elsecase, code) {
+ return elsecase ?
+ (code ? "';}else if(" + unescape(code) + "){out+='" : "';}else{out+='") :
+ (code ? "';if(" + unescape(code) + "){out+='" : "';}out+='");
+ })
+ .replace(c.iterate || skip, function(m, iterate, vname, iname) {
+ if (!iterate) return "';} } out+='";
+ sid+=1; indv=iname || "i"+sid; iterate=unescape(iterate);
+ return "';var arr"+sid+"="+iterate+";if(arr"+sid+"){var "+vname+","+indv+"=-1,l"+sid+"=arr"+sid+".length-1;while("+indv+"<l"+sid+"){"
+ +vname+"=arr"+sid+"["+indv+"+=1];out+='";
+ })
+ .replace(c.evaluate || skip, function(m, code) {
+ return "';" + unescape(code) + "out+='";
+ })
+ + "';return out;")
+ .replace(/\n/g, "\\n").replace(/\t/g, '\\t').replace(/\r/g, "\\r")
+ .replace(/(\s|;|\}|^|\{)out\+='';/g, '$1').replace(/\+''/g, "");
+ //.replace(/(\s|;|\}|^|\{)out\+=''\+/g,'$1out+=');
+
+ if (needhtmlencode) {
+ if (!c.selfcontained && _globals && !_globals._encodeHTML) _globals._encodeHTML = doT.encodeHTMLSource(c.doNotSkipEncoded);
+ str = "var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : ("
+ + doT.encodeHTMLSource.toString() + "(" + (c.doNotSkipEncoded || '') + "));"
+ + str;
+ }
+ try {
+ return new Function(c.varname, str);
+ } catch (e) {
+ /* istanbul ignore else */
+ if (typeof console !== "undefined") console.log("Could not create a template function: " + str);
+ throw e;
+ }
+ };
+
+ doT.compile = function(tmpl, def) {
+ return doT.template(tmpl, null, def);
+ };
+}());
+
+
+/*!
+ * jQuery QueryBuilder 2.5.2
+ * Copyright 2014-2018 Damien "Mistic" Sorel (http://www.strangeplanet.fr)
+ * Licensed under MIT (https://opensource.org/licenses/MIT)
+ */
+(function(root, factory) {
+ if (typeof define == 'function' && define.amd) {
+ define('query-builder', ['jquery', 'dot/doT', 'jquery-extendext'], factory);
+ }
+ else if (typeof module === 'object' && module.exports) {
+ module.exports = factory(require('jquery'), require('dot/doT'), require('jquery-extendext'));
+ }
+ else {
+ factory(root.jQuery, root.doT);
+ }
+}(this, function($, doT) {
+"use strict";
+
+/**
+ * @typedef {object} Filter
+ * @memberof QueryBuilder
+ * @description See {@link http://querybuilder.js.org/index.html#filters}
+ */
+
+/**
+ * @typedef {object} Operator
+ * @memberof QueryBuilder
+ * @description See {@link http://querybuilder.js.org/index.html#operators}
+ */
+
+/**
+ * @param {jQuery} $el
+ * @param {object} options - see {@link http://querybuilder.js.org/#options}
+ * @constructor
+ */
+var QueryBuilder = function($el, options) {
+ $el[0].queryBuilder = this;
+
+ /**
+ * Element container
+ * @member {jQuery}
+ * @readonly
+ */
+ this.$el = $el;
+
+ /**
+ * Configuration object
+ * @member {object}
+ * @readonly
+ */
+ this.settings = $.extendext(true, 'replace', {}, QueryBuilder.DEFAULTS, options);
+
+ /**
+ * Internal model
+ * @member {Model}
+ * @readonly
+ */
+ this.model = new Model();
+
+ /**
+ * Internal status
+ * @member {object}
+ * @property {string} id - id of the container
+ * @property {boolean} generated_id - if the container id has been generated
+ * @property {int} group_id - current group id
+ * @property {int} rule_id - current rule id
+ * @property {boolean} has_optgroup - if filters have optgroups
+ * @property {boolean} has_operator_optgroup - if operators have optgroups
+ * @readonly
+ * @private
+ */
+ this.status = {
+ id: null,
+ generated_id: false,
+ group_id: 0,
+ rule_id: 0,
+ has_optgroup: false,
+ has_operator_optgroup: false
+ };
+
+ /**
+ * List of filters
+ * @member {QueryBuilder.Filter[]}
+ * @readonly
+ */
+ this.filters = this.settings.filters;
+
+ /**
+ * List of icons
+ * @member {object.<string, string>}
+ * @readonly
+ */
+ this.icons = this.settings.icons;
+
+ /**
+ * List of operators
+ * @member {QueryBuilder.Operator[]}
+ * @readonly
+ */
+ this.operators = this.settings.operators;
+
+ /**
+ * List of templates
+ * @member {object.<string, function>}
+ * @readonly
+ */
+ this.templates = this.settings.templates;
+
+ /**
+ * Plugins configuration
+ * @member {object.<string, object>}
+ * @readonly
+ */
+ this.plugins = this.settings.plugins;
+
+ /**
+ * Translations object
+ * @member {object}
+ * @readonly
+ */
+ this.lang = null;
+
+ // translations : english << 'lang_code' << custom
+ if (QueryBuilder.regional['en'] === undefined) {
+ Utils.error('Config', '"i18n/en.js" not loaded.');
+ }
+ this.lang = $.extendext(true, 'replace', {}, QueryBuilder.regional['en'], QueryBuilder.regional[this.settings.lang_code], this.settings.lang);
+
+ // "allow_groups" can be boolean or int
+ if (this.settings.allow_groups === false) {
+ this.settings.allow_groups = 0;
+ }
+ else if (this.settings.allow_groups === true) {
+ this.settings.allow_groups = -1;
+ }
+
+ // init templates
+ Object.keys(this.templates).forEach(function(tpl) {
+ if (!this.templates[tpl]) {
+ this.templates[tpl] = QueryBuilder.templates[tpl];
+ }
+ if (typeof this.templates[tpl] == 'string') {
+ this.templates[tpl] = doT.template(this.templates[tpl]);
+ }
+ }, this);
+
+ // ensure we have a container id
+ if (!this.$el.attr('id')) {
+ this.$el.attr('id', 'qb_' + Math.floor(Math.random() * 99999));
+ this.status.generated_id = true;
+ }
+ this.status.id = this.$el.attr('id');
+
+ // INIT
+ this.$el.addClass('query-builder form-inline');
+
+ this.filters = this.checkFilters(this.filters);
+ this.operators = this.checkOperators(this.operators);
+ this.bindEvents();
+ this.initPlugins();
+};
+
+$.extend(QueryBuilder.prototype, /** @lends QueryBuilder.prototype */ {
+ /**
+ * Triggers an event on the builder container
+ * @param {string} type
+ * @returns {$.Event}
+ */
+ trigger: function(type) {
+ var event = new $.Event(this._tojQueryEvent(type), {
+ builder: this
+ });
+
+ this.$el.triggerHandler(event, Array.prototype.slice.call(arguments, 1));
+
+ return event;
+ },
+
+ /**
+ * Triggers an event on the builder container and returns the modified value
+ * @param {string} type
+ * @param {*} value
+ * @returns {*}
+ */
+ change: function(type, value) {
+ var event = new $.Event(this._tojQueryEvent(type, true), {
+ builder: this,
+ value: value
+ });
+
+ this.$el.triggerHandler(event, Array.prototype.slice.call(arguments, 2));
+
+ return event.value;
+ },
+
+ /**
+ * Attaches an event listener on the builder container
+ * @param {string} type
+ * @param {function} cb
+ * @returns {QueryBuilder}
+ */
+ on: function(type, cb) {
+ this.$el.on(this._tojQueryEvent(type), cb);
+ return this;
+ },
+
+ /**
+ * Removes an event listener from the builder container
+ * @param {string} type
+ * @param {function} [cb]
+ * @returns {QueryBuilder}
+ */
+ off: function(type, cb) {
+ this.$el.off(this._tojQueryEvent(type), cb);
+ return this;
+ },
+
+ /**
+ * Attaches an event listener called once on the builder container
+ * @param {string} type
+ * @param {function} cb
+ * @returns {QueryBuilder}
+ */
+ once: function(type, cb) {
+ this.$el.one(this._tojQueryEvent(type), cb);
+ return this;
+ },
+
+ /**
+ * Appends `.queryBuilder` and optionally `.filter` to the events names
+ * @param {string} name
+ * @param {boolean} [filter=false]
+ * @returns {string}
+ * @private
+ */
+ _tojQueryEvent: function(name, filter) {
+ return name.split(' ').map(function(type) {
+ return type + '.queryBuilder' + (filter ? '.filter' : '');
+ }).join(' ');
+ }
+});
+
+
+/**
+ * Allowed types and their internal representation
+ * @type {object.<string, string>}
+ * @readonly
+ * @private
+ */
+QueryBuilder.types = {
+ 'string': 'string',
+ 'integer': 'number',
+ 'double': 'number',
+ 'date': 'datetime',
+ 'time': 'datetime',
+ 'datetime': 'datetime',
+ 'boolean': 'boolean',
+ 'map': 'map'
+};
+
+/**
+ * Allowed inputs
+ * @type {string[]}
+ * @readonly
+ * @private
+ */
+QueryBuilder.inputs = [
+ 'text',
+ 'number',
+ 'textarea',
+ 'radio',
+ 'checkbox',
+ 'select'
+];
+
+/**
+ * Runtime modifiable options with `setOptions` method
+ * @type {string[]}
+ * @readonly
+ * @private
+ */
+QueryBuilder.modifiable_options = [
+ 'display_errors',
+ 'allow_groups',
+ 'allow_empty',
+ 'default_condition',
+ 'default_filter'
+];
+
+/**
+ * CSS selectors for common components
+ * @type {object.<string, string>}
+ * @readonly
+ */
+QueryBuilder.selectors = {
+ group_container: '.rules-group-container',
+ rule_container: '.rule-container',
+ filter_container: '.rule-filter-container',
+ operator_container: '.rule-operator-container',
+ value_container: '.rule-value-container',
+ error_container: '.error-container',
+ condition_container: '.rules-group-header .group-conditions',
+
+ rule_header: '.rule-header',
+ group_header: '.rules-group-header',
+ group_actions: '.group-actions',
+ rule_actions: '.rule-actions',
+
+ rules_list: '.rules-group-body>.rules-list',
+
+ group_condition: '.rules-group-header [name$=_cond]',
+ rule_filter: '.rule-filter-container [name$=_filter]',
+ rule_operator: '.rule-operator-container [name$=_operator]',
+ rule_value: '.rule-value-container [name*=_value_]',
+
+ add_rule: '[data-add=rule]',
+ delete_rule: '[data-delete=rule]',
+ add_group: '[data-add=group]',
+ delete_group: '[data-delete=group]'
+};
+
+/**
+ * Template strings (see template.js)
+ * @type {object.<string, string>}
+ * @readonly
+ */
+QueryBuilder.templates = {};
+
+/**
+ * Localized strings (see i18n/)
+ * @type {object.<string, object>}
+ * @readonly
+ */
+QueryBuilder.regional = {};
+
+/**
+ * Default operators
+ * @type {object.<string, object>}
+ * @readonly
+ */
+QueryBuilder.OPERATORS = {
+ equal: { type: 'equal', nb_inputs: 1, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean', 'map'] },
+ not_equal: { type: 'not_equal', nb_inputs: 1, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean', 'map'] },
+ in: { type: 'in', nb_inputs: 1, multiple: true, apply_to: ['string', 'number', 'datetime', 'map'] },
+ not_in: { type: 'not_in', nb_inputs: 1, multiple: true, apply_to: ['string', 'number', 'datetime', 'map'] },
+ less: { type: 'less', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] },
+ less_or_equal: { type: 'less_or_equal', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] },
+ greater: { type: 'greater', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] },
+ greater_or_equal: { type: 'greater_or_equal', nb_inputs: 1, multiple: false, apply_to: ['number', 'datetime'] },
+ between: { type: 'between', nb_inputs: 2, multiple: false, apply_to: ['number', 'datetime'] },
+ not_between: { type: 'not_between', nb_inputs: 2, multiple: false, apply_to: ['number', 'datetime'] },
+ begins_with: { type: 'begins_with', nb_inputs: 1, multiple: false, apply_to: ['string', 'map'] },
+ not_begins_with: { type: 'not_begins_with', nb_inputs: 1, multiple: false, apply_to: ['string', 'map'] },
+ contains: { type: 'contains', nb_inputs: 1, multiple: false, apply_to: ['string', 'map'] },
+ not_contains: { type: 'not_contains', nb_inputs: 1, multiple: false, apply_to: ['string', 'map'] },
+ ends_with: { type: 'ends_with', nb_inputs: 1, multiple: false, apply_to: ['string', 'map'] },
+ not_ends_with: { type: 'not_ends_with', nb_inputs: 1, multiple: false, apply_to: ['string', 'map'] },
+ is_empty: { type: 'is_empty', nb_inputs: 0, multiple: false, apply_to: ['string', 'map'] },
+ is_not_empty: { type: 'is_not_empty', nb_inputs: 0, multiple: false, apply_to: ['string', 'map'] },
+ is_null: { type: 'is_null', nb_inputs: 0, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean', 'map'] },
+ is_not_null: { type: 'is_not_null', nb_inputs: 0, multiple: false, apply_to: ['string', 'number', 'datetime', 'boolean', 'map'] }
+};
+
+/**
+ * Default configuration
+ * @type {object}
+ * @readonly
+ */
+QueryBuilder.DEFAULTS = {
+ filters: [],
+ plugins: [],
+
+ sort_filters: false,
+ display_errors: true,
+ allow_groups: -1,
+ allow_empty: true,
+ conditions: ['AND', 'OR'],
+ default_condition: 'AND',
+ inputs_separator: ' , ',
+ select_placeholder: '------',
+ display_empty_filter: true,
+ default_filter: null,
+ optgroups: {},
+
+ default_rule_flags: {
+ filter_readonly: false,
+ operator_readonly: false,
+ value_readonly: false,
+ no_delete: false
+ },
+
+ default_group_flags: {
+ condition_readonly: false,
+ no_add_rule: false,
+ no_add_group: false,
+ no_delete: false
+ },
+
+ templates: {
+ group: null,
+ rule: null,
+ filterSelect: null,
+ operatorSelect: null,
+ ruleValueSelect: null
+ },
+
+ lang_code: 'en',
+ lang: {},
+
+ operators: [
+ 'equal',
+ 'not_equal',
+ 'in',
+ 'not_in',
+ 'less',
+ 'less_or_equal',
+ 'greater',
+ 'greater_or_equal',
+ 'between',
+ 'not_between',
+ 'begins_with',
+ 'not_begins_with',
+ 'contains',
+ 'not_contains',
+ 'ends_with',
+ 'not_ends_with',
+ 'is_empty',
+ 'is_not_empty',
+ 'is_null',
+ 'is_not_null'
+ ],
+
+ icons: {
+ add_group: 'glyphicon glyphicon-plus-sign',
+ add_rule: 'glyphicon glyphicon-plus',
+ remove_group: 'glyphicon glyphicon-trash',
+ remove_rule: 'glyphicon glyphicon-trash',
+ error: 'glyphicon glyphicon-warning-sign'
+ }
+};
+
+
+/**
+ * @module plugins
+ */
+
+/**
+ * Definition of available plugins
+ * @type {object.<String, object>}
+ */
+QueryBuilder.plugins = {};
+
+/**
+ * Gets or extends the default configuration
+ * @param {object} [options] - new configuration
+ * @returns {undefined|object} nothing or configuration object (copy)
+ */
+QueryBuilder.defaults = function(options) {
+ if (typeof options == 'object') {
+ $.extendext(true, 'replace', QueryBuilder.DEFAULTS, options);
+ }
+ else if (typeof options == 'string') {
+ if (typeof QueryBuilder.DEFAULTS[options] == 'object') {
+ return $.extend(true, {}, QueryBuilder.DEFAULTS[options]);
+ }
+ else {
+ return QueryBuilder.DEFAULTS[options];
+ }
+ }
+ else {
+ return $.extend(true, {}, QueryBuilder.DEFAULTS);
+ }
+};
+
+/**
+ * Registers a new plugin
+ * @param {string} name
+ * @param {function} fct - init function
+ * @param {object} [def] - default options
+ */
+QueryBuilder.define = function(name, fct, def) {
+ QueryBuilder.plugins[name] = {
+ fct: fct,
+ def: def || {}
+ };
+};
+
+/**
+ * Adds new methods to QueryBuilder prototype
+ * @param {object.<string, function>} methods
+ */
+QueryBuilder.extend = function(methods) {
+ $.extend(QueryBuilder.prototype, methods);
+};
+
+/**
+ * Initializes plugins for an instance
+ * @throws ConfigError
+ * @private
+ */
+QueryBuilder.prototype.initPlugins = function() {
+ if (!this.plugins) {
+ return;
+ }
+
+ if ($.isArray(this.plugins)) {
+ var tmp = {};
+ this.plugins.forEach(function(plugin) {
+ tmp[plugin] = null;
+ });
+ this.plugins = tmp;
+ }
+
+ Object.keys(this.plugins).forEach(function(plugin) {
+ if (plugin in QueryBuilder.plugins) {
+ this.plugins[plugin] = $.extend(true, {},
+ QueryBuilder.plugins[plugin].def,
+ this.plugins[plugin] || {}
+ );
+
+ QueryBuilder.plugins[plugin].fct.call(this, this.plugins[plugin]);
+ }
+ else {
+ Utils.error('Config', 'Unable to find plugin "{0}"', plugin);
+ }
+ }, this);
+};
+
+/**
+ * Returns the config of a plugin, if the plugin is not loaded, returns the default config.
+ * @param {string} name
+ * @param {string} [property]
+ * @throws ConfigError
+ * @returns {*}
+ */
+QueryBuilder.prototype.getPluginOptions = function(name, property) {
+ var plugin;
+ if (this.plugins && this.plugins[name]) {
+ plugin = this.plugins[name];
+ }
+ else if (QueryBuilder.plugins[name]) {
+ plugin = QueryBuilder.plugins[name].def;
+ }
+
+ if (plugin) {
+ if (property) {
+ return plugin[property];
+ }
+ else {
+ return plugin;
+ }
+ }
+ else {
+ Utils.error('Config', 'Unable to find plugin "{0}"', name);
+ }
+};
+
+
+/**
+ * Final initialisation of the builder
+ * @param {object} [rules]
+ * @fires QueryBuilder.afterInit
+ * @private
+ */
+QueryBuilder.prototype.init = function(rules) {
+ /**
+ * When the initilization is done, just before creating the root group
+ * @event afterInit
+ * @memberof QueryBuilder
+ */
+ this.trigger('afterInit');
+
+ if (rules) {
+ this.setRules(rules);
+ delete this.settings.rules;
+ }
+ else {
+ this.setRoot(true);
+ }
+};
+
+/**
+ * Checks the configuration of each filter
+ * @param {QueryBuilder.Filter[]} filters
+ * @returns {QueryBuilder.Filter[]}
+ * @throws ConfigError
+ */
+QueryBuilder.prototype.checkFilters = function(filters) {
+ var definedFilters = [];
+
+ if (!filters || filters.length === 0) {
+ Utils.error('Config', 'Missing filters list');
+ }
+
+ filters.forEach(function(filter, i) {
+ if (!filter.id) {
+ Utils.error('Config', 'Missing filter {0} id', i);
+ }
+ if (definedFilters.indexOf(filter.id) != -1) {
+ Utils.error('Config', 'Filter "{0}" already defined', filter.id);
+ }
+ definedFilters.push(filter.id);
+
+ if (!filter.type) {
+ filter.type = 'string';
+ }
+ else if (!QueryBuilder.types[filter.type]) {
+ Utils.error('Config', 'Invalid type "{0}"', filter.type);
+ }
+
+ if (!filter.input) {
+ filter.input = QueryBuilder.types[filter.type] === 'number' ? 'number' : 'text';
+ }
+ else if (typeof filter.input != 'function' && QueryBuilder.inputs.indexOf(filter.input) == -1) {
+ Utils.error('Config', 'Invalid input "{0}"', filter.input);
+ }
+
+ if (filter.operators) {
+ filter.operators.forEach(function(operator) {
+ if (typeof operator != 'string') {
+ Utils.error('Config', 'Filter operators must be global operators types (string)');
+ }
+ });
+ }
+
+ if (!filter.field) {
+ filter.field = filter.id;
+ }
+ if (!filter.label) {
+ filter.label = filter.field;
+ }
+
+ if (!filter.optgroup) {
+ filter.optgroup = null;
+ }
+ else {
+ this.status.has_optgroup = true;
+
+ // register optgroup if needed
+ if (!this.settings.optgroups[filter.optgroup]) {
+ this.settings.optgroups[filter.optgroup] = filter.optgroup;
+ }
+ }
+
+ switch (filter.input) {
+ case 'radio':
+ case 'checkbox':
+ if (!filter.values || filter.values.length < 1) {
+ Utils.error('Config', 'Missing filter "{0}" values', filter.id);
+ }
+ break;
+
+ case 'select':
+ var cleanValues = [];
+ filter.has_optgroup = false;
+
+ Utils.iterateOptions(filter.values, function(value, label, optgroup) {
+ cleanValues.push({
+ value: value,
+ label: label,
+ optgroup: optgroup || null
+ });
+
+ if (optgroup) {
+ filter.has_optgroup = true;
+
+ // register optgroup if needed
+ if (!this.settings.optgroups[optgroup]) {
+ this.settings.optgroups[optgroup] = optgroup;
+ }
+ }
+ }.bind(this));
+
+ if (filter.has_optgroup) {
+ filter.values = Utils.groupSort(cleanValues, 'optgroup');
+ }
+ else {
+ filter.values = cleanValues;
+ }
+
+ if (filter.placeholder) {
+ if (filter.placeholder_value === undefined) {
+ filter.placeholder_value = -1;
+ }
+
+ filter.values.forEach(function(entry) {
+ if (entry.value == filter.placeholder_value) {
+ Utils.error('Config', 'Placeholder of filter "{0}" overlaps with one of its values', filter.id);
+ }
+ });
+ }
+ break;
+ }
+ }, this);
+
+ if (this.settings.sort_filters) {
+ if (typeof this.settings.sort_filters == 'function') {
+ filters.sort(this.settings.sort_filters);
+ }
+ else {
+ var self = this;
+ filters.sort(function(a, b) {
+ return self.translate(a.label).localeCompare(self.translate(b.label));
+ });
+ }
+ }
+
+ if (this.status.has_optgroup) {
+ filters = Utils.groupSort(filters, 'optgroup');
+ }
+
+ return filters;
+};
+
+/**
+ * Checks the configuration of each operator
+ * @param {QueryBuilder.Operator[]} operators
+ * @returns {QueryBuilder.Operator[]}
+ * @throws ConfigError
+ */
+QueryBuilder.prototype.checkOperators = function(operators) {
+ var definedOperators = [];
+
+ operators.forEach(function(operator, i) {
+ if (typeof operator == 'string') {
+ if (!QueryBuilder.OPERATORS[operator]) {
+ Utils.error('Config', 'Unknown operator "{0}"', operator);
+ }
+
+ operators[i] = operator = $.extendext(true, 'replace', {}, QueryBuilder.OPERATORS[operator]);
+ }
+ else {
+ if (!operator.type) {
+ Utils.error('Config', 'Missing "type" for operator {0}', i);
+ }
+
+ if (QueryBuilder.OPERATORS[operator.type]) {
+ operators[i] = operator = $.extendext(true, 'replace', {}, QueryBuilder.OPERATORS[operator.type], operator);
+ }
+
+ if (operator.nb_inputs === undefined || operator.apply_to === undefined) {
+ Utils.error('Config', 'Missing "nb_inputs" and/or "apply_to" for operator "{0}"', operator.type);
+ }
+ }
+
+ if (definedOperators.indexOf(operator.type) != -1) {
+ Utils.error('Config', 'Operator "{0}" already defined', operator.type);
+ }
+ definedOperators.push(operator.type);
+
+ if (!operator.optgroup) {
+ operator.optgroup = null;
+ }
+ else {
+ this.status.has_operator_optgroup = true;
+
+ // register optgroup if needed
+ if (!this.settings.optgroups[operator.optgroup]) {
+ this.settings.optgroups[operator.optgroup] = operator.optgroup;
+ }
+ }
+ }, this);
+
+ if (this.status.has_operator_optgroup) {
+ operators = Utils.groupSort(operators, 'optgroup');
+ }
+
+ return operators;
+};
+
+/**
+ * Adds all events listeners to the builder
+ * @private
+ */
+QueryBuilder.prototype.bindEvents = function() {
+ var self = this;
+ var Selectors = QueryBuilder.selectors;
+
+ // group condition change
+ this.$el.on('change.queryBuilder', Selectors.group_condition, function() {
+ if ($(this).is(':checked')) {
+ var $group = $(this).closest(Selectors.group_container);
+ self.getModel($group).condition = $(this).val();
+ }
+ });
+
+ // rule filter change
+ this.$el.on('change.queryBuilder', Selectors.rule_filter, function() {
+ var $rule = $(this).closest(Selectors.rule_container);
+ self.getModel($rule).filter = self.getFilterById($(this).val());
+ });
+
+ // rule operator change
+ this.$el.on('change.queryBuilder', Selectors.rule_operator, function() {
+ var $rule = $(this).closest(Selectors.rule_container);
+ self.getModel($rule).operator = self.getOperatorByType($(this).val());
+ });
+
+ // add rule button
+ this.$el.on('click.queryBuilder', Selectors.add_rule, function() {
+ var $group = $(this).closest(Selectors.group_container);
+ self.addRule(self.getModel($group));
+ });
+
+ // delete rule button
+ this.$el.on('click.queryBuilder', Selectors.delete_rule, function() {
+ var $rule = $(this).closest(Selectors.rule_container);
+ self.deleteRule(self.getModel($rule));
+ });
+
+ if (this.settings.allow_groups !== 0) {
+ // add group button
+ this.$el.on('click.queryBuilder', Selectors.add_group, function() {
+ var $group = $(this).closest(Selectors.group_container);
+ self.addGroup(self.getModel($group));
+ });
+
+ // delete group button
+ this.$el.on('click.queryBuilder', Selectors.delete_group, function() {
+ var $group = $(this).closest(Selectors.group_container);
+ self.deleteGroup(self.getModel($group));
+ });
+ }
+
+ // model events
+ this.model.on({
+ 'drop': function(e, node) {
+ node.$el.remove();
+ self.refreshGroupsConditions();
+ },
+ 'add': function(e, parent, node, index) {
+ if (index === 0) {
+ node.$el.prependTo(parent.$el.find('>' + QueryBuilder.selectors.rules_list));
+ }
+ else {
+ node.$el.insertAfter(parent.rules[index - 1].$el);
+ }
+ self.refreshGroupsConditions();
+ },
+ 'move': function(e, node, group, index) {
+ node.$el.detach();
+
+ if (index === 0) {
+ node.$el.prependTo(group.$el.find('>' + QueryBuilder.selectors.rules_list));
+ }
+ else {
+ node.$el.insertAfter(group.rules[index - 1].$el);
+ }
+ self.refreshGroupsConditions();
+ },
+ 'update': function(e, node, field, value, oldValue) {
+ if (node instanceof Rule) {
+ switch (field) {
+ case 'error':
+ self.updateError(node);
+ break;
+
+ case 'flags':
+ self.applyRuleFlags(node);
+ break;
+
+ case 'filter':
+ self.updateRuleFilter(node, oldValue);
+ break;
+
+ case 'operator':
+ self.updateRuleOperator(node, oldValue);
+ break;
+
+ case 'value':
+ self.updateRuleValue(node, oldValue);
+ break;
+ }
+ }
+ else {
+ switch (field) {
+ case 'error':
+ self.updateError(node);
+ break;
+
+ case 'flags':
+ self.applyGroupFlags(node);
+ break;
+
+ case 'condition':
+ self.updateGroupCondition(node, oldValue);
+ break;
+ }
+ }
+ }
+ });
+};
+
+/**
+ * Creates the root group
+ * @param {boolean} [addRule=true] - adds a default empty rule
+ * @param {object} [data] - group custom data
+ * @param {object} [flags] - flags to apply to the group
+ * @returns {Group} root group
+ * @fires QueryBuilder.afterAddGroup
+ */
+QueryBuilder.prototype.setRoot = function(addRule, data, flags) {
+ addRule = (addRule === undefined || addRule === true);
+
+ var group_id = this.nextGroupId();
+ var $group = $(this.getGroupTemplate(group_id, 1));
+
+ this.$el.append($group);
+ this.model.root = new Group(null, $group);
+ this.model.root.model = this.model;
+
+ this.model.root.data = data;
+ this.model.root.flags = $.extend({}, this.settings.default_group_flags, flags);
+ this.model.root.condition = this.settings.default_condition;
+
+ this.trigger('afterAddGroup', this.model.root);
+
+ if (addRule) {
+ this.addRule(this.model.root);
+ }
+
+ return this.model.root;
+};
+
+/**
+ * Adds a new group
+ * @param {Group} parent
+ * @param {boolean} [addRule=true] - adds a default empty rule
+ * @param {object} [data] - group custom data
+ * @param {object} [flags] - flags to apply to the group
+ * @returns {Group}
+ * @fires QueryBuilder.beforeAddGroup
+ * @fires QueryBuilder.afterAddGroup
+ */
+QueryBuilder.prototype.addGroup = function(parent, addRule, data, flags) {
+ addRule = (addRule === undefined || addRule === true);
+
+ var level = parent.level + 1;
+
+ /**
+ * Just before adding a group, can be prevented.
+ * @event beforeAddGroup
+ * @memberof QueryBuilder
+ * @param {Group} parent
+ * @param {boolean} addRule - if an empty rule will be added in the group
+ * @param {int} level - nesting level of the group, 1 is the root group
+ */
+ var e = this.trigger('beforeAddGroup', parent, addRule, level);
+ if (e.isDefaultPrevented()) {
+ return null;
+ }
+
+ var group_id = this.nextGroupId();
+ var $group = $(this.getGroupTemplate(group_id, level));
+ var model = parent.addGroup($group);
+
+ model.data = data;
+ model.flags = $.extend({}, this.settings.default_group_flags, flags);
+ model.condition = this.settings.default_condition;
+
+ /**
+ * Just after adding a group
+ * @event afterAddGroup
+ * @memberof QueryBuilder
+ * @param {Group} group
+ */
+ this.trigger('afterAddGroup', model);
+
+ /**
+ * After any change in the rules
+ * @event rulesChanged
+ * @memberof QueryBuilder
+ */
+ this.trigger('rulesChanged');
+
+ if (addRule) {
+ this.addRule(model);
+ }
+
+ return model;
+};
+
+/**
+ * Tries to delete a group. The group is not deleted if at least one rule is flagged `no_delete`.
+ * @param {Group} group
+ * @returns {boolean} if the group has been deleted
+ * @fires QueryBuilder.beforeDeleteGroup
+ * @fires QueryBuilder.afterDeleteGroup
+ */
+QueryBuilder.prototype.deleteGroup = function(group) {
+ if (group.isRoot()) {
+ return false;
+ }
+
+ /**
+ * Just before deleting a group, can be prevented
+ * @event beforeDeleteGroup
+ * @memberof QueryBuilder
+ * @param {Group} parent
+ */
+ var e = this.trigger('beforeDeleteGroup', group);
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+
+ var del = true;
+
+ group.each('reverse', function(rule) {
+ del &= this.deleteRule(rule);
+ }, function(group) {
+ del &= this.deleteGroup(group);
+ }, this);
+
+ if (del) {
+ group.drop();
+
+ /**
+ * Just after deleting a group
+ * @event afterDeleteGroup
+ * @memberof QueryBuilder
+ */
+ this.trigger('afterDeleteGroup');
+
+ this.trigger('rulesChanged');
+ }
+
+ return del;
+};
+
+/**
+ * Performs actions when a group's condition changes
+ * @param {Group} group
+ * @param {object} previousCondition
+ * @fires QueryBuilder.afterUpdateGroupCondition
+ * @private
+ */
+QueryBuilder.prototype.updateGroupCondition = function(group, previousCondition) {
+ group.$el.find('>' + QueryBuilder.selectors.group_condition).each(function() {
+ var $this = $(this);
+ $this.prop('checked', $this.val() === group.condition);
+ $this.parent().toggleClass('active', $this.val() === group.condition);
+ });
+
+ /**
+ * After the group condition has been modified
+ * @event afterUpdateGroupCondition
+ * @memberof QueryBuilder
+ * @param {Group} group
+ * @param {object} previousCondition
+ */
+ this.trigger('afterUpdateGroupCondition', group, previousCondition);
+
+ this.trigger('rulesChanged');
+};
+
+/**
+ * Updates the visibility of conditions based on number of rules inside each group
+ * @private
+ */
+QueryBuilder.prototype.refreshGroupsConditions = function() {
+ (function walk(group) {
+ if (!group.flags || (group.flags && !group.flags.condition_readonly)) {
+ group.$el.find('>' + QueryBuilder.selectors.group_condition).prop('disabled', group.rules.length <= 1)
+ .parent().toggleClass('disabled', group.rules.length <= 1);
+ }
+
+ group.each(null, function(group) {
+ walk(group);
+ }, this);
+ }(this.model.root));
+};
+
+/**
+ * Adds a new rule
+ * @param {Group} parent
+ * @param {object} [data] - rule custom data
+ * @param {object} [flags] - flags to apply to the rule
+ * @returns {Rule}
+ * @fires QueryBuilder.beforeAddRule
+ * @fires QueryBuilder.afterAddRule
+ * @fires QueryBuilder.changer:getDefaultFilter
+ */
+QueryBuilder.prototype.addRule = function(parent, data, flags) {
+ /**
+ * Just before adding a rule, can be prevented
+ * @event beforeAddRule
+ * @memberof QueryBuilder
+ * @param {Group} parent
+ */
+ var e = this.trigger('beforeAddRule', parent);
+ if (e.isDefaultPrevented()) {
+ return null;
+ }
+
+ var rule_id = this.nextRuleId();
+ var $rule = $(this.getRuleTemplate(rule_id));
+ var model = parent.addRule($rule);
+
+ model.data = data;
+ model.flags = $.extend({}, this.settings.default_rule_flags, flags);
+
+ /**
+ * Just after adding a rule
+ * @event afterAddRule
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ */
+ this.trigger('afterAddRule', model);
+
+ this.trigger('rulesChanged');
+
+ this.createRuleFilters(model);
+
+ if (this.settings.default_filter || !this.settings.display_empty_filter) {
+ /**
+ * Modifies the default filter for a rule
+ * @event changer:getDefaultFilter
+ * @memberof QueryBuilder
+ * @param {QueryBuilder.Filter} filter
+ * @param {Rule} rule
+ * @returns {QueryBuilder.Filter}
+ */
+ model.filter = this.change('getDefaultFilter',
+ this.getFilterById(this.settings.default_filter || this.filters[0].id),
+ model
+ );
+ }
+
+ return model;
+};
+
+/**
+ * Tries to delete a rule
+ * @param {Rule} rule
+ * @returns {boolean} if the rule has been deleted
+ * @fires QueryBuilder.beforeDeleteRule
+ * @fires QueryBuilder.afterDeleteRule
+ */
+QueryBuilder.prototype.deleteRule = function(rule) {
+ if (rule.flags.no_delete) {
+ return false;
+ }
+
+ /**
+ * Just before deleting a rule, can be prevented
+ * @event beforeDeleteRule
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ */
+ var e = this.trigger('beforeDeleteRule', rule);
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+
+ rule.drop();
+
+ /**
+ * Just after deleting a rule
+ * @event afterDeleteRule
+ * @memberof QueryBuilder
+ */
+ this.trigger('afterDeleteRule');
+
+ this.trigger('rulesChanged');
+
+ return true;
+};
+
+/**
+ * Creates the filters for a rule
+ * @param {Rule} rule
+ * @fires QueryBuilder.changer:getRuleFilters
+ * @fires QueryBuilder.afterCreateRuleFilters
+ * @private
+ */
+QueryBuilder.prototype.createRuleFilters = function(rule) {
+ /**
+ * Modifies the list a filters available for a rule
+ * @event changer:getRuleFilters
+ * @memberof QueryBuilder
+ * @param {QueryBuilder.Filter[]} filters
+ * @param {Rule} rule
+ * @returns {QueryBuilder.Filter[]}
+ */
+ var filters = this.change('getRuleFilters', this.filters, rule);
+ var $filterSelect = $(this.getRuleFilterSelect(rule, filters));
+
+ rule.$el.find(QueryBuilder.selectors.filter_container).html($filterSelect);
+
+ /**
+ * After creating the dropdown for filters
+ * @event afterCreateRuleFilters
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ */
+ this.trigger('afterCreateRuleFilters', rule);
+
+ this.applyRuleFlags(rule);
+};
+
+/**
+ * Creates the operators for a rule and init the rule operator
+ * @param {Rule} rule
+ * @fires QueryBuilder.afterCreateRuleOperators
+ * @private
+ */
+QueryBuilder.prototype.createRuleOperators = function(rule) {
+ var $operatorContainer = rule.$el.find(QueryBuilder.selectors.operator_container).empty();
+
+ if (!rule.filter) {
+ return;
+ }
+
+ var operators = this.getOperators(rule.filter);
+ var $operatorSelect = $(this.getRuleOperatorSelect(rule, operators));
+
+ $operatorContainer.html($operatorSelect);
+
+ // set the operator without triggering update event
+ if (rule.filter.default_operator) {
+ rule.__.operator = this.getOperatorByType(rule.filter.default_operator);
+ }
+ else {
+ rule.__.operator = operators[0];
+ }
+
+ rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type);
+
+ /**
+ * After creating the dropdown for operators
+ * @event afterCreateRuleOperators
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ * @param {QueryBuilder.Operator[]} operators - allowed operators for this rule
+ */
+ this.trigger('afterCreateRuleOperators', rule, operators);
+
+ this.applyRuleFlags(rule);
+};
+
+/**
+ * Creates the main input for a rule
+ * @param {Rule} rule
+ * @fires QueryBuilder.afterCreateRuleInput
+ * @private
+ */
+QueryBuilder.prototype.createRuleInput = function(rule) {
+ var $valueContainer = rule.$el.find(QueryBuilder.selectors.value_container).empty();
+
+ rule.__.value = undefined;
+
+ if (!rule.filter || !rule.operator || rule.operator.nb_inputs === 0) {
+ return;
+ }
+
+ var self = this;
+ var $inputs = $();
+ var filter = rule.filter;
+
+ if(filter.type === 'map') {
+ for (var i = 0; i < 2; i++) {
+ var $ruleInput = $(this.getRuleInput(rule, i));
+ if (i > 0) $valueContainer.append('|');
+ $valueContainer.append($ruleInput);
+ $inputs = $inputs.add($ruleInput);
+ }
+ } else {
+ for (var i = 0; i < rule.operator.nb_inputs; i++) {
+ var $ruleInput = $(this.getRuleInput(rule, i));
+ if (i > 0) $valueContainer.append(this.settings.inputs_separator);
+ $valueContainer.append($ruleInput);
+ $inputs = $inputs.add($ruleInput);
+ }
+ }
+
+ $valueContainer.css('display', '');
+
+ $inputs.on('change ' + (filter.input_event || ''), function() {
+ if (!rule._updating_input) {
+ rule._updating_value = true;
+ rule.value = self.getRuleInputValue(rule);
+ rule._updating_value = false;
+ }
+ });
+
+ if (filter.plugin) {
+ $inputs[filter.plugin](filter.plugin_config || {});
+ }
+
+ /**
+ * After creating the input for a rule and initializing optional plugin
+ * @event afterCreateRuleInput
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ */
+ this.trigger('afterCreateRuleInput', rule);
+
+ if (filter.default_value !== undefined) {
+ rule.value = filter.default_value;
+ }
+ else {
+ rule._updating_value = true;
+ rule.value = self.getRuleInputValue(rule);
+ rule._updating_value = false;
+ }
+
+ this.applyRuleFlags(rule);
+};
+
+/**
+ * Performs action when a rule's filter changes
+ * @param {Rule} rule
+ * @param {object} previousFilter
+ * @fires QueryBuilder.afterUpdateRuleFilter
+ * @private
+ */
+QueryBuilder.prototype.updateRuleFilter = function(rule, previousFilter) {
+ this.createRuleOperators(rule);
+ this.createRuleInput(rule);
+
+ rule.$el.find(QueryBuilder.selectors.rule_filter).val(rule.filter ? rule.filter.id : '-1');
+
+ // clear rule data if the filter changed
+ if (previousFilter && rule.filter && previousFilter.id !== rule.filter.id) {
+ rule.data = undefined;
+ }
+
+ /**
+ * After the filter has been updated and the operators and input re-created
+ * @event afterUpdateRuleFilter
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ * @param {object} previousFilter
+ */
+ this.trigger('afterUpdateRuleFilter', rule, previousFilter);
+
+ this.trigger('rulesChanged');
+};
+
+/**
+ * Performs actions when a rule's operator changes
+ * @param {Rule} rule
+ * @param {object} previousOperator
+ * @fires QueryBuilder.afterUpdateRuleOperator
+ * @private
+ */
+QueryBuilder.prototype.updateRuleOperator = function(rule, previousOperator) {
+ var $valueContainer = rule.$el.find(QueryBuilder.selectors.value_container);
+
+ if (!rule.operator || rule.operator.nb_inputs === 0) {
+ $valueContainer.hide();
+
+ rule.__.value = undefined;
+ }
+ else {
+ $valueContainer.css('display', '');
+
+ if ($valueContainer.is(':empty') || !previousOperator ||
+ rule.operator.nb_inputs !== previousOperator.nb_inputs ||
+ rule.operator.optgroup !== previousOperator.optgroup
+ ) {
+ this.createRuleInput(rule);
+ }
+ }
+
+ if (rule.operator) {
+ rule.$el.find(QueryBuilder.selectors.rule_operator).val(rule.operator.type);
+
+ // refresh value if the format changed for this operator
+ rule.__.value = this.getRuleInputValue(rule);
+ }
+
+ /**
+ * After the operator has been updated and the input optionally re-created
+ * @event afterUpdateRuleOperator
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ * @param {object} previousOperator
+ */
+ this.trigger('afterUpdateRuleOperator', rule, previousOperator);
+
+ this.trigger('rulesChanged');
+};
+
+/**
+ * Performs actions when rule's value changes
+ * @param {Rule} rule
+ * @param {object} previousValue
+ * @fires QueryBuilder.afterUpdateRuleValue
+ * @private
+ */
+QueryBuilder.prototype.updateRuleValue = function(rule, previousValue) {
+ if (!rule._updating_value) {
+ this.setRuleInputValue(rule, rule.value);
+ }
+
+ /**
+ * After the rule value has been modified
+ * @event afterUpdateRuleValue
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ * @param {*} previousValue
+ */
+ this.trigger('afterUpdateRuleValue', rule, previousValue);
+
+ this.trigger('rulesChanged');
+};
+
+/**
+ * Changes a rule's properties depending on its flags
+ * @param {Rule} rule
+ * @fires QueryBuilder.afterApplyRuleFlags
+ * @private
+ */
+QueryBuilder.prototype.applyRuleFlags = function(rule) {
+ var flags = rule.flags;
+ var Selectors = QueryBuilder.selectors;
+
+ rule.$el.find(Selectors.rule_filter).prop('disabled', flags.filter_readonly);
+ rule.$el.find(Selectors.rule_operator).prop('disabled', flags.operator_readonly);
+ rule.$el.find(Selectors.rule_value).prop('disabled', flags.value_readonly);
+
+ if (flags.no_delete) {
+ rule.$el.find(Selectors.delete_rule).remove();
+ }
+
+ /**
+ * After rule's flags has been applied
+ * @event afterApplyRuleFlags
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ */
+ this.trigger('afterApplyRuleFlags', rule);
+};
+
+/**
+ * Changes group's properties depending on its flags
+ * @param {Group} group
+ * @fires QueryBuilder.afterApplyGroupFlags
+ * @private
+ */
+QueryBuilder.prototype.applyGroupFlags = function(group) {
+ var flags = group.flags;
+ var Selectors = QueryBuilder.selectors;
+
+ group.$el.find('>' + Selectors.group_condition).prop('disabled', flags.condition_readonly)
+ .parent().toggleClass('readonly', flags.condition_readonly);
+
+ if (flags.no_add_rule) {
+ group.$el.find(Selectors.add_rule).remove();
+ }
+ if (flags.no_add_group) {
+ group.$el.find(Selectors.add_group).remove();
+ }
+ if (flags.no_delete) {
+ group.$el.find(Selectors.delete_group).remove();
+ }
+
+ /**
+ * After group's flags has been applied
+ * @event afterApplyGroupFlags
+ * @memberof QueryBuilder
+ * @param {Group} group
+ */
+ this.trigger('afterApplyGroupFlags', group);
+};
+
+/**
+ * Clears all errors markers
+ * @param {Node} [node] default is root Group
+ */
+QueryBuilder.prototype.clearErrors = function(node) {
+ node = node || this.model.root;
+
+ if (!node) {
+ return;
+ }
+
+ node.error = null;
+
+ if (node instanceof Group) {
+ node.each(function(rule) {
+ rule.error = null;
+ }, function(group) {
+ this.clearErrors(group);
+ }, this);
+ }
+};
+
+/**
+ * Adds/Removes error on a Rule or Group
+ * @param {Node} node
+ * @fires QueryBuilder.changer:displayError
+ * @private
+ */
+QueryBuilder.prototype.updateError = function(node) {
+ if (this.settings.display_errors) {
+ if (node.error === null) {
+ node.$el.removeClass('has-error');
+ }
+ else {
+ var errorMessage = this.translate('errors', node.error[0]);
+ errorMessage = Utils.fmt(errorMessage, node.error.slice(1));
+
+ /**
+ * Modifies an error message before display
+ * @event changer:displayError
+ * @memberof QueryBuilder
+ * @param {string} errorMessage - the error message (translated and formatted)
+ * @param {array} error - the raw error array (error code and optional arguments)
+ * @param {Node} node
+ * @returns {string}
+ */
+ errorMessage = this.change('displayError', errorMessage, node.error, node);
+
+ node.$el.addClass('has-error')
+ .find(QueryBuilder.selectors.error_container).eq(0)
+ .attr('title', errorMessage);
+ }
+ }
+};
+
+/**
+ * Triggers a validation error event
+ * @param {Node} node
+ * @param {string|array} error
+ * @param {*} value
+ * @fires QueryBuilder.validationError
+ * @private
+ */
+QueryBuilder.prototype.triggerValidationError = function(node, error, value) {
+ if (!$.isArray(error)) {
+ error = [error];
+ }
+
+ /**
+ * Fired when a validation error occurred, can be prevented
+ * @event validationError
+ * @memberof QueryBuilder
+ * @param {Node} node
+ * @param {string} error
+ * @param {*} value
+ */
+ var e = this.trigger('validationError', node, error, value);
+ if (!e.isDefaultPrevented()) {
+ node.error = error;
+ }
+};
+
+
+/**
+ * Destroys the builder
+ * @fires QueryBuilder.beforeDestroy
+ */
+QueryBuilder.prototype.destroy = function() {
+ /**
+ * Before the {@link QueryBuilder#destroy} method
+ * @event beforeDestroy
+ * @memberof QueryBuilder
+ */
+ this.trigger('beforeDestroy');
+
+ if (this.status.generated_id) {
+ this.$el.removeAttr('id');
+ }
+
+ this.clear();
+ this.model = null;
+
+ this.$el
+ .off('.queryBuilder')
+ .removeClass('query-builder')
+ .removeData('queryBuilder');
+
+ delete this.$el[0].queryBuilder;
+};
+
+/**
+ * Clear all rules and resets the root group
+ * @fires QueryBuilder.beforeReset
+ * @fires QueryBuilder.afterReset
+ */
+QueryBuilder.prototype.reset = function() {
+ /**
+ * Before the {@link QueryBuilder#reset} method, can be prevented
+ * @event beforeReset
+ * @memberof QueryBuilder
+ */
+ var e = this.trigger('beforeReset');
+ if (e.isDefaultPrevented()) {
+ return;
+ }
+
+ this.status.group_id = 1;
+ this.status.rule_id = 0;
+
+ this.model.root.empty();
+
+ this.model.root.data = undefined;
+ this.model.root.flags = $.extend({}, this.settings.default_group_flags);
+ this.model.root.condition = this.settings.default_condition;
+
+ this.addRule(this.model.root);
+
+ /**
+ * After the {@link QueryBuilder#reset} method
+ * @event afterReset
+ * @memberof QueryBuilder
+ */
+ this.trigger('afterReset');
+
+ this.trigger('rulesChanged');
+};
+
+/**
+ * Clears all rules and removes the root group
+ * @fires QueryBuilder.beforeClear
+ * @fires QueryBuilder.afterClear
+ */
+QueryBuilder.prototype.clear = function() {
+ /**
+ * Before the {@link QueryBuilder#clear} method, can be prevented
+ * @event beforeClear
+ * @memberof QueryBuilder
+ */
+ var e = this.trigger('beforeClear');
+ if (e.isDefaultPrevented()) {
+ return;
+ }
+
+ this.status.group_id = 0;
+ this.status.rule_id = 0;
+
+ if (this.model.root) {
+ this.model.root.drop();
+ this.model.root = null;
+ }
+
+ /**
+ * After the {@link QueryBuilder#clear} method
+ * @event afterClear
+ * @memberof QueryBuilder
+ */
+ this.trigger('afterClear');
+
+ this.trigger('rulesChanged');
+};
+
+/**
+ * Modifies the builder configuration.<br>
+ * Only options defined in QueryBuilder.modifiable_options are modifiable
+ * @param {object} options
+ */
+QueryBuilder.prototype.setOptions = function(options) {
+ $.each(options, function(opt, value) {
+ if (QueryBuilder.modifiable_options.indexOf(opt) !== -1) {
+ this.settings[opt] = value;
+ }
+ }.bind(this));
+};
+
+/**
+ * Returns the model associated to a DOM object, or the root model
+ * @param {jQuery} [target]
+ * @returns {Node}
+ */
+QueryBuilder.prototype.getModel = function(target) {
+ if (!target) {
+ return this.model.root;
+ }
+ else if (target instanceof Node) {
+ return target;
+ }
+ else {
+ return $(target).data('queryBuilderModel');
+ }
+};
+
+/**
+ * Validates the whole builder
+ * @param {object} [options]
+ * @param {boolean} [options.skip_empty=false] - skips validating rules that have no filter selected
+ * @returns {boolean}
+ * @fires QueryBuilder.changer:validate
+ */
+QueryBuilder.prototype.validate = function(options) {
+ options = $.extend({
+ skip_empty: false
+ }, options);
+
+ this.clearErrors();
+
+ var self = this;
+
+ var valid = (function parse(group) {
+ var done = 0;
+ var errors = 0;
+
+ group.each(function(rule) {
+ if (!rule.filter && options.skip_empty) {
+ return;
+ }
+
+ if (!rule.filter) {
+ self.triggerValidationError(rule, 'no_filter', null);
+ errors++;
+ return;
+ }
+
+ if (!rule.operator) {
+ self.triggerValidationError(rule, 'no_operator', null);
+ errors++;
+ return;
+ }
+
+ if (rule.operator.nb_inputs !== 0) {
+ var valid = self.validateValue(rule, rule.value);
+
+ if (valid !== true) {
+ self.triggerValidationError(rule, valid, rule.value);
+ errors++;
+ return;
+ }
+ }
+
+ done++;
+
+ }, function(group) {
+ var res = parse(group);
+ if (res === true) {
+ done++;
+ }
+ else if (res === false) {
+ errors++;
+ }
+ });
+
+ if (errors > 0) {
+ return false;
+ }
+ else if (done === 0 && !group.isRoot() && options.skip_empty) {
+ return null;
+ }
+ else if (done === 0 && (!self.settings.allow_empty || !group.isRoot())) {
+ self.triggerValidationError(group, 'empty_group', null);
+ return false;
+ }
+
+ return true;
+
+ }(this.model.root));
+
+ /**
+ * Modifies the result of the {@link QueryBuilder#validate} method
+ * @event changer:validate
+ * @memberof QueryBuilder
+ * @param {boolean} valid
+ * @returns {boolean}
+ */
+ return this.change('validate', valid);
+};
+
+/**
+ * Gets an object representing current rules
+ * @param {object} [options]
+ * @param {boolean|string} [options.get_flags=false] - export flags, true: only changes from default flags or 'all'
+ * @param {boolean} [options.allow_invalid=false] - returns rules even if they are invalid
+ * @param {boolean} [options.skip_empty=false] - remove rules that have no filter selected
+ * @returns {object}
+ * @fires QueryBuilder.changer:ruleToJson
+ * @fires QueryBuilder.changer:groupToJson
+ * @fires QueryBuilder.changer:getRules
+ */
+QueryBuilder.prototype.getRules = function(options) {
+ options = $.extend({
+ get_flags: false,
+ allow_invalid: false,
+ skip_empty: false
+ }, options);
+
+ var valid = this.validate(options);
+ if (!valid && !options.allow_invalid) {
+ return null;
+ }
+
+ var self = this;
+
+ var out = (function parse(group) {
+ var groupData = {
+ condition: group.condition,
+ rules: []
+ };
+
+ if (group.data) {
+ groupData.data = $.extendext(true, 'replace', {}, group.data);
+ }
+
+ if (options.get_flags) {
+ var flags = self.getGroupFlags(group.flags, options.get_flags === 'all');
+ if (!$.isEmptyObject(flags)) {
+ groupData.flags = flags;
+ }
+ }
+
+ group.each(function(rule) {
+ if (!rule.filter && options.skip_empty) {
+ return;
+ }
+
+ var value = null;
+ if (!rule.operator || rule.operator.nb_inputs !== 0) {
+ value = rule.value;
+ }
+
+ var ruleData = {
+ id: rule.filter ? rule.filter.id : null,
+ field: rule.filter ? rule.filter.field : null,
+ type: rule.filter ? rule.filter.type : null,
+ input: rule.filter ? rule.filter.input : null,
+ operator: rule.operator ? rule.operator.type : null,
+ value: value
+ };
+
+ if (rule.filter && rule.filter.data || rule.data) {
+ ruleData.data = $.extendext(true, 'replace', {}, rule.filter.data, rule.data);
+ }
+
+ if (options.get_flags) {
+ var flags = self.getRuleFlags(rule.flags, options.get_flags === 'all');
+ if (!$.isEmptyObject(flags)) {
+ ruleData.flags = flags;
+ }
+ }
+
+ /**
+ * Modifies the JSON generated from a Rule object
+ * @event changer:ruleToJson
+ * @memberof QueryBuilder
+ * @param {object} json
+ * @param {Rule} rule
+ * @returns {object}
+ */
+ groupData.rules.push(self.change('ruleToJson', ruleData, rule));
+
+ }, function(model) {
+ var data = parse(model);
+ if (data.rules.length !== 0 || !options.skip_empty) {
+ groupData.rules.push(data);
+ }
+ }, this);
+
+ /**
+ * Modifies the JSON generated from a Group object
+ * @event changer:groupToJson
+ * @memberof QueryBuilder
+ * @param {object} json
+ * @param {Group} group
+ * @returns {object}
+ */
+ return self.change('groupToJson', groupData, group);
+
+ }(this.model.root));
+
+ out.valid = valid;
+
+ /**
+ * Modifies the result of the {@link QueryBuilder#getRules} method
+ * @event changer:getRules
+ * @memberof QueryBuilder
+ * @param {object} json
+ * @returns {object}
+ */
+ return this.change('getRules', out);
+};
+
+/**
+ * Sets rules from object
+ * @param {object} data
+ * @param {object} [options]
+ * @param {boolean} [options.allow_invalid=false] - silent-fail if the data are invalid
+ * @throws RulesError, UndefinedConditionError
+ * @fires QueryBuilder.changer:setRules
+ * @fires QueryBuilder.changer:jsonToRule
+ * @fires QueryBuilder.changer:jsonToGroup
+ * @fires QueryBuilder.afterSetRules
+ */
+QueryBuilder.prototype.setRules = function(data, options) {
+ options = $.extend({
+ allow_invalid: false
+ }, options);
+
+ if ($.isArray(data)) {
+ data = {
+ condition: this.settings.default_condition,
+ rules: data
+ };
+ }
+
+ if (!data || !data.rules || (data.rules.length === 0 && !this.settings.allow_empty)) {
+ Utils.error('RulesParse', 'Incorrect data object passed');
+ }
+
+ this.clear();
+ this.setRoot(false, data.data, this.parseGroupFlags(data));
+
+ /**
+ * Modifies data before the {@link QueryBuilder#setRules} method
+ * @event changer:setRules
+ * @memberof QueryBuilder
+ * @param {object} json
+ * @param {object} options
+ * @returns {object}
+ */
+ data = this.change('setRules', data, options);
+
+ var self = this;
+
+ (function add(data, group) {
+ if (group === null) {
+ return;
+ }
+
+ if (data.condition === undefined) {
+ data.condition = self.settings.default_condition;
+ }
+ else if (self.settings.conditions.indexOf(data.condition) == -1) {
+ Utils.error(!options.allow_invalid, 'UndefinedCondition', 'Invalid condition "{0}"', data.condition);
+ data.condition = self.settings.default_condition;
+ }
+
+ group.condition = data.condition;
+
+ data.rules.forEach(function(item) {
+ var model;
+
+ if (item.rules !== undefined) {
+ if (self.settings.allow_groups !== -1 && self.settings.allow_groups < group.level) {
+ Utils.error(!options.allow_invalid, 'RulesParse', 'No more than {0} groups are allowed', self.settings.allow_groups);
+ self.reset();
+ }
+ else {
+ model = self.addGroup(group, false, item.data, self.parseGroupFlags(item));
+ if (model === null) {
+ return;
+ }
+
+ add(item, model);
+ }
+ }
+ else {
+ if (!item.empty) {
+ if (item.id === undefined) {
+ Utils.error(!options.allow_invalid, 'RulesParse', 'Missing rule field id');
+ item.empty = true;
+ }
+ if (item.operator === undefined) {
+ item.operator = 'equal';
+ }
+ }
+
+ model = self.addRule(group, item.data, self.parseRuleFlags(item));
+ if (model === null) {
+ return;
+ }
+
+ if (!item.empty) {
+ model.filter = self.getFilterById(item.id, !options.allow_invalid);
+ }
+
+ if (model.filter) {
+ model.operator = self.getOperatorByType(item.operator, !options.allow_invalid);
+
+ if (!model.operator) {
+ model.operator = self.getOperators(model.filter)[0];
+ }
+ }
+
+ if (model.operator && model.operator.nb_inputs !== 0) {
+ if (item.value !== undefined) {
+ if(model.filter.type === 'map') {
+ model.value = item.value.split('|')
+ } else if (model.filter.type === 'datetime') {
+ if (!('moment' in window)) {
+ Utils.error('MissingLibrary', 'MomentJS is required for Date/Time validation. Get it here http://momentjs.com');
+ }
+ model.value = moment(item.value * 1000).format('YYYY/MM/DD HH:mm:ss');
+ } else {
+ model.value = item.value;
+ }
+ }
+ else if (model.filter.default_value !== undefined) {
+ model.value = model.filter.default_value;
+ }
+ }
+
+ /**
+ * Modifies the Rule object generated from the JSON
+ * @event changer:jsonToRule
+ * @memberof QueryBuilder
+ * @param {Rule} rule
+ * @param {object} json
+ * @returns {Rule} the same rule
+ */
+ if (self.change('jsonToRule', model, item) != model) {
+ Utils.error('RulesParse', 'Plugin tried to change rule reference');
+ }
+ }
+ });
+
+ /**
+ * Modifies the Group object generated from the JSON
+ * @event changer:jsonToGroup
+ * @memberof QueryBuilder
+ * @param {Group} group
+ * @param {object} json
+ * @returns {Group} the same group
+ */
+ if (self.change('jsonToGroup', group, data) != group) {
+ Utils.error('RulesParse', 'Plugin tried to change group reference');
+ }
+
+ }(data, this.model.root));
+
+ /**
+ * After the {@link QueryBuilder#setRules} method
+ * @event afterSetRules
+ * @memberof QueryBuilder
+ */
+ this.trigger('afterSetRules');
+};
+
+
+/**
+ * Performs value validation
+ * @param {Rule} rule
+ * @param {string|string[]} value
+ * @returns {array|boolean} true or error array
+ * @fires QueryBuilder.changer:validateValue
+ */
+QueryBuilder.prototype.validateValue = function(rule, value) {
+ var validation = rule.filter.validation || {};
+ var result = true;
+
+ if (validation.callback) {
+ result = validation.callback.call(this, value, rule);
+ }
+ else {
+ result = this._validateValue(rule, value);
+ }
+
+ /**
+ * Modifies the result of the rule validation method
+ * @event changer:validateValue
+ * @memberof QueryBuilder
+ * @param {array|boolean} result - true or an error array
+ * @param {*} value
+ * @param {Rule} rule
+ * @returns {array|boolean}
+ */
+ return this.change('validateValue', result, value, rule);
+};
+
+/**
+ * Default validation function
+ * @param {Rule} rule
+ * @param {string|string[]} value
+ * @returns {array|boolean} true or error array
+ * @throws ConfigError
+ * @private
+ */
+QueryBuilder.prototype._validateValue = function(rule, value) {
+ var filter = rule.filter;
+ var operator = rule.operator;
+ var validation = filter.validation || {};
+ var result = true;
+ var tmp, tempValue;
+ var numOfInputs = operator.nb_inputs;
+ if(filter.type === 'map') {
+ numOfInputs = 2;
+ }
+
+ if (numOfInputs === 1) {
+ value = [value];
+ }
+
+ for (var i = 0; i < numOfInputs; i++) {
+ if (!operator.multiple && $.isArray(value[i]) && value[i].length > 1) {
+ result = ['operator_not_multiple', operator.type, this.translate('operators', operator.type)];
+ break;
+ }
+
+ switch (filter.input) {
+ case 'radio':
+ if (value[i] === undefined || value[i].length === 0) {
+ if (!validation.allow_empty_value) {
+ result = ['radio_empty'];
+ }
+ break;
+ }
+ break;
+
+ case 'checkbox':
+ if (value[i] === undefined || value[i].length === 0) {
+ if (!validation.allow_empty_value) {
+ result = ['checkbox_empty'];
+ }
+ break;
+ }
+ break;
+
+ case 'select':
+ if (value[i] === undefined || value[i].length === 0 || (filter.placeholder && value[i] == filter.placeholder_value)) {
+ if (!validation.allow_empty_value) {
+ result = ['select_empty'];
+ }
+ break;
+ }
+ break;
+
+ default:
+ tempValue = $.isArray(value[i]) ? value[i] : [value[i]];
+
+ for (var j = 0; j < tempValue.length; j++) {
+ switch (QueryBuilder.types[filter.type]) {
+ case 'string':
+ case 'map':
+ if (tempValue[j] === undefined || tempValue[j].length === 0) {
+ if (!validation.allow_empty_value) {
+ result = ['string_empty'];
+ }
+ break;
+ }
+ if (validation.min !== undefined) {
+ if (tempValue[j].length < parseInt(validation.min)) {
+ result = [this.getValidationMessage(validation, 'min', 'string_exceed_min_length'), validation.min];
+ break;
+ }
+ }
+ if (validation.max !== undefined) {
+ if (tempValue[j].length > parseInt(validation.max)) {
+ result = [this.getValidationMessage(validation, 'max', 'string_exceed_max_length'), validation.max];
+ break;
+ }
+ }
+ if (validation.format) {
+ if (typeof validation.format == 'string') {
+ validation.format = new RegExp(validation.format);
+ }
+ if (!validation.format.test(tempValue[j])) {
+ result = [this.getValidationMessage(validation, 'format', 'string_invalid_format'), validation.format];
+ break;
+ }
+ }
+ break;
+
+ case 'number':
+ if (tempValue[j] === undefined || tempValue[j].length === 0) {
+ if (!validation.allow_empty_value) {
+ result = ['number_nan'];
+ }
+ break;
+ }
+ if (isNaN(tempValue[j])) {
+ result = ['number_nan'];
+ break;
+ }
+ if (filter.type == 'integer') {
+ if (parseInt(tempValue[j]) != tempValue[j]) {
+ result = ['number_not_integer'];
+ break;
+ }
+ }
+ else {
+ if (parseFloat(tempValue[j]) != tempValue[j]) {
+ result = ['number_not_double'];
+ break;
+ }
+ }
+ if (validation.min !== undefined) {
+ if (tempValue[j] < parseFloat(validation.min)) {
+ result = [this.getValidationMessage(validation, 'min', 'number_exceed_min'), validation.min];
+ break;
+ }
+ }
+ if (validation.max !== undefined) {
+ if (tempValue[j] > parseFloat(validation.max)) {
+ result = [this.getValidationMessage(validation, 'max', 'number_exceed_max'), validation.max];
+ break;
+ }
+ }
+ if (validation.step !== undefined && validation.step !== 'any') {
+ var v = (tempValue[j] / validation.step).toPrecision(14);
+ if (parseInt(v) != v) {
+ result = [this.getValidationMessage(validation, 'step', 'number_wrong_step'), validation.step];
+ break;
+ }
+ }
+ break;
+
+ case 'datetime':
+ if (tempValue[j] === undefined || tempValue[j].length === 0) {
+ if (!validation.allow_empty_value) {
+ result = ['datetime_empty'];
+ }
+ break;
+ }
+
+ // we need MomentJS
+ if (validation.format) {
+ if (!('moment' in window)) {
+ Utils.error('MissingLibrary', 'MomentJS is required for Date/Time validation. Get it here http://momentjs.com');
+ }
+
+ var datetime = moment.utc(tempValue[j], validation.format, true);
+ if (!datetime.isValid()) {
+ result = [this.getValidationMessage(validation, 'format', 'datetime_invalid'), validation.format];
+ break;
+ }
+ else {
+ if (validation.min) {
+ if (datetime < moment.utc(validation.min, validation.format, true)) {
+ result = [this.getValidationMessage(validation, 'min', 'datetime_exceed_min'), validation.min];
+ break;
+ }
+ }
+ if (validation.max) {
+ if (datetime > moment.utc(validation.max, validation.format, true)) {
+ result = [this.getValidationMessage(validation, 'max', 'datetime_exceed_max'), validation.max];
+ break;
+ }
+ }
+ }
+ }
+ break;
+
+ case 'boolean':
+ if (tempValue[j] === undefined || tempValue[j].length === 0) {
+ if (!validation.allow_empty_value) {
+ result = ['boolean_not_valid'];
+ }
+ break;
+ }
+ tmp = ('' + tempValue[j]).trim().toLowerCase();
+ if (tmp !== 'true' && tmp !== 'false' && tmp !== '1' && tmp !== '0' && tempValue[j] !== 1 && tempValue[j] !== 0) {
+ result = ['boolean_not_valid'];
+ break;
+ }
+ }
+
+ if (result !== true) {
+ break;
+ }
+ }
+ }
+
+ if (result !== true) {
+ break;
+ }
+ }
+
+ if ((rule.operator.type === 'between' || rule.operator.type === 'not_between') && value.length === 2) {
+ switch (QueryBuilder.types[filter.type]) {
+ case 'number':
+ if (value[0] > value[1]) {
+ result = ['number_between_invalid', value[0], value[1]];
+ }
+ break;
+
+ case 'datetime':
+ // we need MomentJS
+ if (validation.format) {
+ if (!('moment' in window)) {
+ Utils.error('MissingLibrary', 'MomentJS is required for Date/Time validation. Get it here http://momentjs.com');
+ }
+
+ if (moment.utc(value[0], validation.format, true).isAfter(moment.utc(value[1], validation.format, true))) {
+ result = ['datetime_between_invalid', value[0], value[1]];
+ }
+ }
+ break;
+ }
+ }
+
+ return result;
+};
+
+/**
+ * Returns an incremented group ID
+ * @returns {string}
+ * @private
+ */
+QueryBuilder.prototype.nextGroupId = function() {
+ return this.status.id + '_group_' + (this.status.group_id++);
+};
+
+/**
+ * Returns an incremented rule ID
+ * @returns {string}
+ * @private
+ */
+QueryBuilder.prototype.nextRuleId = function() {
+ return this.status.id + '_rule_' + (this.status.rule_id++);
+};
+
+/**
+ * Returns the operators for a filter
+ * @param {string|object} filter - filter id or filter object
+ * @returns {object[]}
+ * @fires QueryBuilder.changer:getOperators
+ * @private
+ */
+QueryBuilder.prototype.getOperators = function(filter) {
+ if (typeof filter == 'string') {
+ filter = this.getFilterById(filter);
+ }
+
+ var result = [];
+
+ for (var i = 0, l = this.operators.length; i < l; i++) {
+ // filter operators check
+ if (filter.operators) {
+ if (filter.operators.indexOf(this.operators[i].type) == -1) {
+ continue;
+ }
+ }
+ // type check
+ else if (this.operators[i].apply_to.indexOf(QueryBuilder.types[filter.type]) == -1) {
+ continue;
+ }
+
+ result.push(this.operators[i]);
+ }
+
+ // keep sort order defined for the filter
+ if (filter.operators) {
+ result.sort(function(a, b) {
+ return filter.operators.indexOf(a.type) - filter.operators.indexOf(b.type);
+ });
+ }
+
+ /**
+ * Modifies the operators available for a filter
+ * @event changer:getOperators
+ * @memberof QueryBuilder
+ * @param {QueryBuilder.Operator[]} operators
+ * @param {QueryBuilder.Filter} filter
+ * @returns {QueryBuilder.Operator[]}
+ */
+ return this.change('getOperators', result, filter);
+};
+
+/**
+ * Returns a particular filter by its id
+ * @param {string} id
+ * @param {boolean} [doThrow=true]
+ * @returns {object|null}
+ * @throws UndefinedFilterError
+ * @private
+ */
+QueryBuilder.prototype.getFilterById = function(id, doThrow) {
+ if (id == '-1') {
+ return null;
+ }
+
+ for (var i = 0, l = this.filters.length; i < l; i++) {
+ if (this.filters[i].id == id) {
+ return this.filters[i];
+ }
+ }
+
+ Utils.error(doThrow !== false, 'UndefinedFilter', 'Undefined filter "{0}"', id);
+
+ return null;
+};
+
+/**
+ * Returns a particular operator by its type
+ * @param {string} type
+ * @param {boolean} [doThrow=true]
+ * @returns {object|null}
+ * @throws UndefinedOperatorError
+ * @private
+ */
+QueryBuilder.prototype.getOperatorByType = function(type, doThrow) {
+ if (type == '-1') {
+ return null;
+ }
+
+ for (var i = 0, l = this.operators.length; i < l; i++) {
+ if (this.operators[i].type == type) {
+ return this.operators[i];
+ }
+ }
+
+ Utils.error(doThrow !== false, 'UndefinedOperator', 'Undefined operator "{0}"', type);
+
+ return null;
+};
+
+/**
+ * Returns rule's current input value
+ * @param {Rule} rule
+ * @returns {*}
+ * @fires QueryBuilder.changer:getRuleValue
+ * @private
+ */
+QueryBuilder.prototype.getRuleInputValue = function(rule) {
+ var filter = rule.filter;
+ var operator = rule.operator;
+ var numOfInputs = operator.nb_inputs;
+ if(filter.type === 'map') {
+ numOfInputs = 2;
+ }
+ var value = [];
+
+ if (filter.valueGetter) {
+ value = filter.valueGetter.call(this, rule);
+ }
+ else {
+ var $value = rule.$el.find(QueryBuilder.selectors.value_container);
+
+ for (var i = 0; i < numOfInputs; i++) {
+ var name = Utils.escapeElementId(rule.id + '_value_' + i);
+ var tmp;
+
+ switch (filter.input) {
+ case 'radio':
+ value.push($value.find('[name=' + name + ']:checked').val());
+ break;
+
+ case 'checkbox':
+ tmp = [];
+ // jshint loopfunc:true
+ $value.find('[name=' + name + ']:checked').each(function() {
+ tmp.push($(this).val());
+ });
+ // jshint loopfunc:false
+ value.push(tmp);
+ break;
+
+ case 'select':
+ if (filter.multiple) {
+ tmp = [];
+ // jshint loopfunc:true
+ $value.find('[name=' + name + '] option:selected').each(function() {
+ tmp.push($(this).val());
+ });
+ // jshint loopfunc:false
+ value.push(tmp);
+ }
+ else {
+ value.push($value.find('[name=' + name + '] option:selected').val());
+ }
+ break;
+
+ default:
+ value.push($value.find('[name=' + name + ']').val());
+ }
+ }
+
+ value = value.map(function(val) {
+ if (operator.multiple && filter.value_separator && typeof val == 'string') {
+ val = val.split(filter.value_separator);
+ }
+
+ if ($.isArray(val)) {
+ return val.map(function(subval) {
+ return Utils.changeType(subval, filter.type);
+ });
+ }
+ else {
+ return Utils.changeType(val, filter.type);
+ }
+ });
+
+ if (numOfInputs === 1) {
+ value = value[0];
+ }
+
+ // @deprecated
+ if (filter.valueParser) {
+ value = filter.valueParser.call(this, rule, value);
+ }
+ }
+
+ /**
+ * Modifies the rule's value grabbed from the DOM
+ * @event changer:getRuleValue
+ * @memberof QueryBuilder
+ * @param {*} value
+ * @param {Rule} rule
+ * @returns {*}
+ */
+ return this.change('getRuleValue', value, rule);
+};
+
+/**
+ * Sets the value of a rule's input
+ * @param {Rule} rule
+ * @param {*} value
+ * @private
+ */
+QueryBuilder.prototype.setRuleInputValue = function(rule, value) {
+ var filter = rule.filter;
+ var operator = rule.operator;
+ var numOfInputs = operator.nb_inputs;
+ if(filter.type === 'map') {
+ numOfInputs = 2;
+ }
+
+ if (!filter || !operator) {
+ return;
+ }
+
+ rule._updating_input = true;
+
+ if (filter.valueSetter) {
+ filter.valueSetter.call(this, rule, value);
+ }
+ else {
+ var $value = rule.$el.find(QueryBuilder.selectors.value_container);
+
+ if (numOfInputs == 1) {
+ value = [value];
+ }
+
+ for (var i = 0; i < numOfInputs; i++) {
+ var name = Utils.escapeElementId(rule.id + '_value_' + i);
+
+ switch (filter.input) {
+ case 'radio':
+ $value.find('[name=' + name + '][value="' + value[i] + '"]').prop('checked', true).trigger('change');
+ break;
+
+ case 'checkbox':
+ if (!$.isArray(value[i])) {
+ value[i] = [value[i]];
+ }
+ // jshint loopfunc:true
+ value[i].forEach(function(value) {
+ $value.find('[name=' + name + '][value="' + value + '"]').prop('checked', true).trigger('change');
+ });
+ // jshint loopfunc:false
+ break;
+
+ default:
+ if (operator.multiple && filter.value_separator && $.isArray(value[i])) {
+ value[i] = value[i].join(filter.value_separator);
+ }
+ $value.find('[name=' + name + ']').val(value[i]).trigger('change');
+ break;
+ }
+ }
+ }
+
+ rule._updating_input = false;
+};
+
+/**
+ * Parses rule flags
+ * @param {object} rule
+ * @returns {object}
+ * @fires QueryBuilder.changer:parseRuleFlags
+ * @private
+ */
+QueryBuilder.prototype.parseRuleFlags = function(rule) {
+ var flags = $.extend({}, this.settings.default_rule_flags);
+
+ if (rule.readonly) {
+ $.extend(flags, {
+ filter_readonly: true,
+ operator_readonly: true,
+ value_readonly: true,
+ no_delete: true
+ });
+ }
+
+ if (rule.flags) {
+ $.extend(flags, rule.flags);
+ }
+
+ /**
+ * Modifies the consolidated rule's flags
+ * @event changer:parseRuleFlags
+ * @memberof QueryBuilder
+ * @param {object} flags
+ * @param {object} rule - <b>not</b> a Rule object
+ * @returns {object}
+ */
+ return this.change('parseRuleFlags', flags, rule);
+};
+
+/**
+ * Gets a copy of flags of a rule
+ * @param {object} flags
+ * @param {boolean} [all=false] - return all flags or only changes from default flags
+ * @returns {object}
+ * @private
+ */
+QueryBuilder.prototype.getRuleFlags = function(flags, all) {
+ if (all) {
+ return $.extend({}, flags);
+ }
+ else {
+ var ret = {};
+ $.each(this.settings.default_rule_flags, function(key, value) {
+ if (flags[key] !== value) {
+ ret[key] = flags[key];
+ }
+ });
+ return ret;
+ }
+};
+
+/**
+ * Parses group flags
+ * @param {object} group
+ * @returns {object}
+ * @fires QueryBuilder.changer:parseGroupFlags
+ * @private
+ */
+QueryBuilder.prototype.parseGroupFlags = function(group) {
+ var flags = $.extend({}, this.settings.default_group_flags);
+
+ if (group.readonly) {
+ $.extend(flags, {
+ condition_readonly: true,
+ no_add_rule: true,
+ no_add_group: true,
+ no_delete: true
+ });
+ }
+
+ if (group.flags) {
+ $.extend(flags, group.flags);
+ }
+
+ /**
+ * Modifies the consolidated group's flags
+ * @event changer:parseGroupFlags
+ * @memberof QueryBuilder
+ * @param {object} flags
+ * @param {object} group - <b>not</b> a Group object
+ * @returns {object}
+ */
+ return this.change('parseGroupFlags', flags, group);
+};
+
+/**
+ * Gets a copy of flags of a group
+ * @param {object} flags
+ * @param {boolean} [all=false] - return all flags or only changes from default flags
+ * @returns {object}
+ * @private
+ */
+QueryBuilder.prototype.getGroupFlags = function(flags, all) {
+ if (all) {
+ return $.extend({}, flags);
+ }
+ else {
+ var ret = {};
+ $.each(this.settings.default_group_flags, function(key, value) {
+ if (flags[key] !== value) {
+ ret[key] = flags[key];
+ }
+ });
+ return ret;
+ }
+};
+
+/**
+ * Translate a label either by looking in the `lang` object or in itself if it's an object where keys are language codes
+ * @param {string} [category]
+ * @param {string|object} key
+ * @returns {string}
+ * @fires QueryBuilder.changer:translate
+ */
+QueryBuilder.prototype.translate = function(category, key) {
+ if (!key) {
+ key = category;
+ category = undefined;
+ }
+
+ var translation;
+ if (typeof key === 'object') {
+ translation = key[this.settings.lang_code] || key['en'];
+ }
+ else {
+ translation = (category ? this.lang[category] : this.lang)[key] || key;
+ }
+
+ /**
+ * Modifies the translated label
+ * @event changer:translate
+ * @memberof QueryBuilder
+ * @param {string} translation
+ * @param {string|object} key
+ * @param {string} [category]
+ * @returns {string}
+ */
+ return this.change('translate', translation, key, category);
+};
+
+/**
+ * Returns a validation message
+ * @param {object} validation
+ * @param {string} type
+ * @param {string} def
+ * @returns {string}
+ * @private
+ */
+QueryBuilder.prototype.getValidationMessage = function(validation, type, def) {
+ return validation.messages && validation.messages[type] || def;
+};
+
+
+QueryBuilder.templates.group = '\
+<div id="{{= it.group_id }}" class="rules-group-container"> \
+ <div class="rules-group-header"> \
+ <div class="btn-group pull-right group-actions"> \
+ <button type="button" class="btn btn-xs btn-clamp" data-add="rule"> \
+ <i class="{{= it.icons.add_rule }}"></i> {{= it.translate("add_rule") }} \
+ </button> \
+ {{? it.settings.allow_groups===-1 || it.settings.allow_groups>=it.level }} \
+ <button type="button" class="btn btn-xs btn-clamp" data-add="group"> \
+ <i class="{{= it.icons.add_group }}"></i> {{= it.translate("add_group") }} \
+ </button> \
+ {{?}} \
+ {{? it.level>1 }} \
+ <button type="button" class="btn btn-xs btn-clamp" data-delete="group"> \
+ <i class="{{= it.icons.remove_group }}"></i> {{= it.translate("delete_group") }} \
+ </button> \
+ {{?}} \
+ </div> \
+ <div class="btn-group group-conditions"> \
+ {{~ it.conditions: condition }} \
+ <label class="btn btn-xs btn-primary"> \
+ <input type="radio" name="{{= it.group_id }}_cond" value="{{= condition }}"> {{= it.translate("conditions", condition) }} \
+ </label> \
+ {{~}} \
+ </div> \
+ {{? it.settings.display_errors }} \
+ <div class="error-container"><i class="{{= it.icons.error }}"></i></div> \
+ {{?}} \
+ </div> \
+ <div class=rules-group-body> \
+ <div class=rules-list></div> \
+ </div> \
+</div>';
+
+QueryBuilder.templates.rule = '\
+<div id="{{= it.rule_id }}" class="rule-container"> \
+ <div class="rule-header"> \
+ <div class="btn-group pull-right rule-actions"> \
+ <button type="button" class="btn btn-xs btn-clamp" data-delete="rule"> \
+ <i class="{{= it.icons.remove_rule }}"></i> {{= it.translate("delete_rule") }} \
+ </button> \
+ </div> \
+ </div> \
+ {{? it.settings.display_errors }} \
+ <div class="error-container"><i class="{{= it.icons.error }}"></i></div> \
+ {{?}} \
+ <div class="rule-filter-container"></div> \
+ <div class="rule-operator-container"></div> \
+ <div class="rule-value-container"></div> \
+</div>';
+
+QueryBuilder.templates.filterSelect = '\
+{{ var optgroup = null; }} \
+<select class="form-control" name="{{= it.rule.id }}_filter"> \
+ {{? it.settings.display_empty_filter }} \
+ <option value="-1">{{= it.settings.select_placeholder }}</option> \
+ {{?}} \
+ {{~ it.filters: filter }} \
+ {{? optgroup !== filter.optgroup }} \
+ {{? optgroup !== null }}</optgroup>{{?}} \
+ {{? (optgroup = filter.optgroup) !== null }} \
+ <optgroup label="{{= it.translate(it.settings.optgroups[optgroup]) }}"> \
+ {{?}} \
+ {{?}} \
+ <option value="{{= filter.id }}" {{? filter.icon}}data-icon="{{= filter.icon}}"{{?}}>{{= it.translate(filter.label) }}</option> \
+ {{~}} \
+ {{? optgroup !== null }}</optgroup>{{?}} \
+</select>';
+
+QueryBuilder.templates.operatorSelect = '\
+{{? it.operators.length === 1 }} \
+<span> \
+{{= it.translate("operators", it.operators[0].type) }} \
+</span> \
+{{?}} \
+{{ var optgroup = null; }} \
+<select class="form-control {{? it.operators.length === 1 }}hide{{?}}" name="{{= it.rule.id }}_operator"> \
+ {{~ it.operators: operator }} \
+ {{? optgroup !== operator.optgroup }} \
+ {{? optgroup !== null }}</optgroup>{{?}} \
+ {{? (optgroup = operator.optgroup) !== null }} \
+ <optgroup label="{{= it.translate(it.settings.optgroups[optgroup]) }}"> \
+ {{?}} \
+ {{?}} \
+ <option value="{{= operator.type }}" {{? operator.icon}}data-icon="{{= operator.icon}}"{{?}}>{{= it.translate("operators", operator.type) }}</option> \
+ {{~}} \
+ {{? optgroup !== null }}</optgroup>{{?}} \
+</select>';
+
+QueryBuilder.templates.ruleValueSelect = '\
+{{ var optgroup = null; }} \
+<select class="form-control" name="{{= it.name }}" {{? it.rule.filter.multiple }}multiple{{?}}> \
+ {{? it.rule.filter.placeholder }} \
+ <option value="{{= it.rule.filter.placeholder_value }}" disabled selected>{{= it.rule.filter.placeholder }}</option> \
+ {{?}} \
+ {{~ it.rule.filter.values: entry }} \
+ {{? optgroup !== entry.optgroup }} \
+ {{? optgroup !== null }}</optgroup>{{?}} \
+ {{? (optgroup = entry.optgroup) !== null }} \
+ <optgroup label="{{= it.translate(it.settings.optgroups[optgroup]) }}"> \
+ {{?}} \
+ {{?}} \
+ <option value="{{= entry.value }}">{{= entry.label }}</option> \
+ {{~}} \
+ {{? optgroup !== null }}</optgroup>{{?}} \
+</select>';
+
+/**
+ * Returns group's HTML
+ * @param {string} group_id
+ * @param {int} level
+ * @returns {string}
+ * @fires QueryBuilder.changer:getGroupTemplate
+ * @private
+ */
+QueryBuilder.prototype.getGroupTemplate = function(group_id, level) {
+ var h = this.templates.group({
+ builder: this,
+ group_id: group_id,
+ level: level,
+ conditions: this.settings.conditions,
+ icons: this.icons,
+ settings: this.settings,
+ translate: this.translate.bind(this)
+ });
+
+ /**
+ * Modifies the raw HTML of a group
+ * @event changer:getGroupTemplate
+ * @memberof QueryBuilder
+ * @param {string} html
+ * @param {int} level
+ * @returns {string}
+ */
+ return this.change('getGroupTemplate', h, level);
+};
+
+/**
+ * Returns rule's HTML
+ * @param {string} rule_id
+ * @returns {string}
+ * @fires QueryBuilder.changer:getRuleTemplate
+ * @private
+ */
+QueryBuilder.prototype.getRuleTemplate = function(rule_id) {
+ var h = this.templates.rule({
+ builder: this,
+ rule_id: rule_id,
+ icons: this.icons,
+ settings: this.settings,
+ translate: this.translate.bind(this)
+ });
+
+ /**
+ * Modifies the raw HTML of a rule
+ * @event changer:getRuleTemplate
+ * @memberof QueryBuilder
+ * @param {string} html
+ * @returns {string}
+ */
+ return this.change('getRuleTemplate', h);
+};
+
+/**
+ * Returns rule's filter HTML
+ * @param {Rule} rule
+ * @param {object[]} filters
+ * @returns {string}
+ * @fires QueryBuilder.changer:getRuleFilterTemplate
+ * @private
+ */
+QueryBuilder.prototype.getRuleFilterSelect = function(rule, filters) {
+ var h = this.templates.filterSelect({
+ builder: this,
+ rule: rule,
+ filters: filters,
+ icons: this.icons,
+ settings: this.settings,
+ translate: this.translate.bind(this)
+ });
+
+ /**
+ * Modifies the raw HTML of the rule's filter dropdown
+ * @event changer:getRuleFilterSelect
+ * @memberof QueryBuilder
+ * @param {string} html
+ * @param {Rule} rule
+ * @param {QueryBuilder.Filter[]} filters
+ * @returns {string}
+ */
+ return this.change('getRuleFilterSelect', h, rule, filters);
+};
+
+/**
+ * Returns rule's operator HTML
+ * @param {Rule} rule
+ * @param {object[]} operators
+ * @returns {string}
+ * @fires QueryBuilder.changer:getRuleOperatorTemplate
+ * @private
+ */
+QueryBuilder.prototype.getRuleOperatorSelect = function(rule, operators) {
+ var h = this.templates.operatorSelect({
+ builder: this,
+ rule: rule,
+ operators: operators,
+ icons: this.icons,
+ settings: this.settings,
+ translate: this.translate.bind(this)
+ });
+
+ /**
+ * Modifies the raw HTML of the rule's operator dropdown
+ * @event changer:getRuleOperatorSelect
+ * @memberof QueryBuilder
+ * @param {string} html
+ * @param {Rule} rule
+ * @param {QueryBuilder.Operator[]} operators
+ * @returns {string}
+ */
+ return this.change('getRuleOperatorSelect', h, rule, operators);
+};
+
+/**
+ * Returns the rule's value select HTML
+ * @param {string} name
+ * @param {Rule} rule
+ * @returns {string}
+ * @fires QueryBuilder.changer:getRuleValueSelect
+ * @private
+ */
+QueryBuilder.prototype.getRuleValueSelect = function(name, rule) {
+ var h = this.templates.ruleValueSelect({
+ builder: this,
+ name: name,
+ rule: rule,
+ icons: this.icons,
+ settings: this.settings,
+ translate: this.translate.bind(this)
+ });
+
+ /**
+ * Modifies the raw HTML of the rule's value dropdown (in case of a "select filter)
+ * @event changer:getRuleValueSelect
+ * @memberof QueryBuilder
+ * @param {string} html
+ * @param [string} name
+ * @param {Rule} rule
+ * @returns {string}
+ */
+ return this.change('getRuleValueSelect', h, name, rule);
+};
+
+/**
+ * Returns the rule's value HTML
+ * @param {Rule} rule
+ * @param {int} value_id
+ * @returns {string}
+ * @fires QueryBuilder.changer:getRuleInput
+ * @private
+ */
+QueryBuilder.prototype.getRuleInput = function(rule, value_id) {
+ var filter = rule.filter;
+ var validation = rule.filter.validation || {};
+ var name = rule.id + '_value_' + value_id;
+ var c = filter.vertical ? ' class=block' : '';
+ var h = '';
+
+ if (typeof filter.input == 'function') {
+ h = filter.input.call(this, rule, name);
+ }
+ else {
+ switch (filter.input) {
+ case 'radio':
+ case 'checkbox':
+ Utils.iterateOptions(filter.values, function(key, val) {
+ h += '<label' + c + '><input type="' + filter.input + '" name="' + name + '" value="' + key + '"> ' + val + '</label> ';
+ });
+ break;
+
+ case 'select':
+ h = this.getRuleValueSelect(name, rule);
+ break;
+
+ case 'textarea':
+ h += '<textarea class="form-control" name="' + name + '"';
+ if (filter.size) h += ' cols="' + filter.size + '"';
+ if (filter.rows) h += ' rows="' + filter.rows + '"';
+ if (validation.min !== undefined) h += ' minlength="' + validation.min + '"';
+ if (validation.max !== undefined) h += ' maxlength="' + validation.max + '"';
+ if (filter.placeholder) h += ' placeholder="' + filter.placeholder + '"';
+ h += '></textarea>';
+ break;
+
+ case 'number':
+ h += '<input class="form-control" type="number" name="' + name + '"';
+ if (validation.step !== undefined) h += ' step="' + validation.step + '"';
+ if (validation.min !== undefined) h += ' min="' + validation.min + '"';
+ if (validation.max !== undefined) h += ' max="' + validation.max + '"';
+ if (filter.placeholder) h += ' placeholder="' + filter.placeholder + '"';
+ if (filter.size) h += ' size="' + filter.size + '"';
+ h += '>';
+ break;
+
+ default:
+ h += '<input class="form-control" type="text" name="' + name + '"';
+ if (filter.placeholder) h += ' placeholder="' + filter.placeholder + '"';
+ if (filter.type === 'string' && validation.min !== undefined) h += ' minlength="' + validation.min + '"';
+ if (filter.type === 'string' && validation.max !== undefined) h += ' maxlength="' + validation.max + '"';
+ if (filter.size) h += ' size="' + filter.size + '"';
+ h += '>';
+ }
+ }
+
+ /**
+ * Modifies the raw HTML of the rule's input
+ * @event changer:getRuleInput
+ * @memberof QueryBuilder
+ * @param {string} html
+ * @param {Rule} rule
+ * @param {string} name - the name that the input must have
+ * @returns {string}
+ */
+ return this.change('getRuleInput', h, rule, name);
+};
+
+
+/**
+ * @namespace
+ */
+var Utils = {};
+
+/**
+ * @member {object}
+ * @memberof QueryBuilder
+ * @see Utils
+ */
+QueryBuilder.utils = Utils;
+
+/**
+ * @callback Utils#OptionsIteratee
+ * @param {string} key
+ * @param {string} value
+ * @param {string} [optgroup]
+ */
+
+/**
+ * Iterates over radio/checkbox/selection options, it accept four formats
+ *
+ * @example
+ * // array of values
+ * options = ['one', 'two', 'three']
+ * @example
+ * // simple key-value map
+ * options = {1: 'one', 2: 'two', 3: 'three'}
+ * @example
+ * // array of 1-element maps
+ * options = [{1: 'one'}, {2: 'two'}, {3: 'three'}]
+ * @example
+ * // array of elements
+ * options = [{value: 1, label: 'one', optgroup: 'group'}, {value: 2, label: 'two'}]
+ *
+ * @param {object|array} options
+ * @param {Utils#OptionsIteratee} tpl
+ */
+Utils.iterateOptions = function(options, tpl) {
+ if (options) {
+ if ($.isArray(options)) {
+ options.forEach(function(entry) {
+ if ($.isPlainObject(entry)) {
+ // array of elements
+ if ('value' in entry) {
+ tpl(entry.value, entry.label || entry.value, entry.optgroup);
+ }
+ // array of one-element maps
+ else {
+ $.each(entry, function(key, val) {
+ tpl(key, val);
+ return false; // break after first entry
+ });
+ }
+ }
+ // array of values
+ else {
+ tpl(entry, entry);
+ }
+ });
+ }
+ // unordered map
+ else {
+ $.each(options, function(key, val) {
+ tpl(key, val);
+ });
+ }
+ }
+};
+
+/**
+ * Replaces {0}, {1}, ... in a string
+ * @param {string} str
+ * @param {...*} args
+ * @returns {string}
+ */
+Utils.fmt = function(str, args) {
+ if (!Array.isArray(args)) {
+ args = Array.prototype.slice.call(arguments, 1);
+ }
+
+ return str.replace(/{([0-9]+)}/g, function(m, i) {
+ return args[parseInt(i)];
+ });
+};
+
+/**
+ * Throws an Error object with custom name or logs an error
+ * @param {boolean} [doThrow=true]
+ * @param {string} type
+ * @param {string} message
+ * @param {...*} args
+ */
+Utils.error = function() {
+ var i = 0;
+ var doThrow = typeof arguments[i] === 'boolean' ? arguments[i++] : true;
+ var type = arguments[i++];
+ var message = arguments[i++];
+ var args = Array.isArray(arguments[i]) ? arguments[i] : Array.prototype.slice.call(arguments, i);
+
+ if (doThrow) {
+ var err = new Error(Utils.fmt(message, args));
+ err.name = type + 'Error';
+ err.args = args;
+ throw err;
+ }
+ else {
+ console.error(type + 'Error: ' + Utils.fmt(message, args));
+ }
+};
+
+/**
+ * Changes the type of a value to int, float or bool
+ * @param {*} value
+ * @param {string} type - 'integer', 'double', 'boolean' or anything else (passthrough)
+ * @returns {*}
+ */
+Utils.changeType = function(value, type) {
+ if (value === '' || value === undefined) {
+ return undefined;
+ }
+
+ switch (type) {
+ // @formatter:off
+ case 'integer':
+ if (typeof value === 'string' && !/^-?\d+$/.test(value)) {
+ return value;
+ }
+ return parseInt(value);
+ case 'double':
+ if (typeof value === 'string' && !/^-?\d+\.?\d*$/.test(value)) {
+ return value;
+ }
+ return parseFloat(value);
+ case 'boolean':
+ if (typeof value === 'string' && !/^(0|1|true|false){1}$/i.test(value)) {
+ return value;
+ }
+ return value === true || value === 1 || value.toLowerCase() === 'true' || value === '1';
+ default: return value;
+ // @formatter:on
+ }
+};
+
+/**
+ * Escapes a string like PHP's mysql_real_escape_string does
+ * @param {string} value
+ * @returns {string}
+ */
+Utils.escapeString = function(value) {
+ if (typeof value != 'string') {
+ return value;
+ }
+
+ return value
+ .replace(/[\0\n\r\b\\\'\"]/g, function(s) {
+ switch (s) {
+ // @formatter:off
+ case '\0': return '\\0';
+ case '\n': return '\\n';
+ case '\r': return '\\r';
+ case '\b': return '\\b';
+ default: return '\\' + s;
+ // @formatter:off
+ }
+ })
+ // uglify compliant
+ .replace(/\t/g, '\\t')
+ .replace(/\x1a/g, '\\Z');
+};
+
+/**
+ * Escapes a string for use in regex
+ * @param {string} str
+ * @returns {string}
+ */
+Utils.escapeRegExp = function(str) {
+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
+};
+
+/**
+ * Escapes a string for use in HTML element id
+ * @param {string} str
+ * @returns {string}
+ */
+Utils.escapeElementId = function(str) {
+ // Regex based on that suggested by:
+ // https://learn.jquery.com/using-jquery-core/faq/how-do-i-select-an-element-by-an-id-that-has-characters-used-in-css-notation/
+ // - escapes : . [ ] ,
+ // - avoids escaping already escaped values
+ return (str) ? str.replace(/(\\)?([:.\[\],])/g,
+ function( $0, $1, $2 ) { return $1 ? $0 : '\\' + $2; }) : str;
+};
+
+/**
+ * Sorts objects by grouping them by `key`, preserving initial order when possible
+ * @param {object[]} items
+ * @param {string} key
+ * @returns {object[]}
+ */
+Utils.groupSort = function(items, key) {
+ var optgroups = [];
+ var newItems = [];
+
+ items.forEach(function(item) {
+ var idx;
+
+ if (item[key]) {
+ idx = optgroups.lastIndexOf(item[key]);
+
+ if (idx == -1) {
+ idx = optgroups.length;
+ }
+ else {
+ idx++;
+ }
+ }
+ else {
+ idx = optgroups.length;
+ }
+
+ optgroups.splice(idx, 0, item[key]);
+ newItems.splice(idx, 0, item);
+ });
+
+ return newItems;
+};
+
+/**
+ * Defines properties on an Node prototype with getter and setter.<br>
+ * Update events are emitted in the setter through root Model (if any).<br>
+ * The object must have a `__` object, non enumerable property to store values.
+ * @param {function} obj
+ * @param {string[]} fields
+ */
+Utils.defineModelProperties = function(obj, fields) {
+ fields.forEach(function(field) {
+ Object.defineProperty(obj.prototype, field, {
+ enumerable: true,
+ get: function() {
+ return this.__[field];
+ },
+ set: function(value) {
+ var previousValue = (this.__[field] !== null && typeof this.__[field] == 'object') ?
+ $.extend({}, this.__[field]) :
+ this.__[field];
+
+ this.__[field] = value;
+
+ if (this.model !== null) {
+ /**
+ * After a value of the model changed
+ * @event model:update
+ * @memberof Model
+ * @param {Node} node
+ * @param {string} field
+ * @param {*} value
+ * @param {*} previousValue
+ */
+ this.model.trigger('update', this, field, value, previousValue);
+ }
+ }
+ });
+ });
+};
+
+
+/**
+ * Main object storing data model and emitting model events
+ * @constructor
+ */
+function Model() {
+ /**
+ * @member {Group}
+ * @readonly
+ */
+ this.root = null;
+
+ /**
+ * Base for event emitting
+ * @member {jQuery}
+ * @readonly
+ * @private
+ */
+ this.$ = $(this);
+}
+
+$.extend(Model.prototype, /** @lends Model.prototype */ {
+ /**
+ * Triggers an event on the model
+ * @param {string} type
+ * @returns {$.Event}
+ */
+ trigger: function(type) {
+ var event = new $.Event(type);
+ this.$.triggerHandler(event, Array.prototype.slice.call(arguments, 1));
+ return event;
+ },
+
+ /**
+ * Attaches an event listener on the model
+ * @param {string} type
+ * @param {function} cb
+ * @returns {Model}
+ */
+ on: function() {
+ this.$.on.apply(this.$, Array.prototype.slice.call(arguments));
+ return this;
+ },
+
+ /**
+ * Removes an event listener from the model
+ * @param {string} type
+ * @param {function} [cb]
+ * @returns {Model}
+ */
+ off: function() {
+ this.$.off.apply(this.$, Array.prototype.slice.call(arguments));
+ return this;
+ },
+
+ /**
+ * Attaches an event listener called once on the model
+ * @param {string} type
+ * @param {function} cb
+ * @returns {Model}
+ */
+ once: function() {
+ this.$.one.apply(this.$, Array.prototype.slice.call(arguments));
+ return this;
+ }
+});
+
+
+/**
+ * Root abstract object
+ * @constructor
+ * @param {Node} [parent]
+ * @param {jQuery} $el
+ */
+var Node = function(parent, $el) {
+ if (!(this instanceof Node)) {
+ return new Node(parent, $el);
+ }
+
+ Object.defineProperty(this, '__', { value: {} });
+
+ $el.data('queryBuilderModel', this);
+
+ /**
+ * @name level
+ * @member {int}
+ * @memberof Node
+ * @instance
+ * @readonly
+ */
+ this.__.level = 1;
+
+ /**
+ * @name error
+ * @member {string}
+ * @memberof Node
+ * @instance
+ */
+ this.__.error = null;
+
+ /**
+ * @name flags
+ * @member {object}
+ * @memberof Node
+ * @instance
+ * @readonly
+ */
+ this.__.flags = {};
+
+ /**
+ * @name data
+ * @member {object}
+ * @memberof Node
+ * @instance
+ */
+ this.__.data = undefined;
+
+ /**
+ * @member {jQuery}
+ * @readonly
+ */
+ this.$el = $el;
+
+ /**
+ * @member {string}
+ * @readonly
+ */
+ this.id = $el[0].id;
+
+ /**
+ * @member {Model}
+ * @readonly
+ */
+ this.model = null;
+
+ /**
+ * @member {Group}
+ * @readonly
+ */
+ this.parent = parent;
+};
+
+Utils.defineModelProperties(Node, ['level', 'error', 'data', 'flags']);
+
+Object.defineProperty(Node.prototype, 'parent', {
+ enumerable: true,
+ get: function() {
+ return this.__.parent;
+ },
+ set: function(value) {
+ this.__.parent = value;
+ this.level = value === null ? 1 : value.level + 1;
+ this.model = value === null ? null : value.model;
+ }
+});
+
+/**
+ * Checks if this Node is the root
+ * @returns {boolean}
+ */
+Node.prototype.isRoot = function() {
+ return (this.level === 1);
+};
+
+/**
+ * Returns the node position inside its parent
+ * @returns {int}
+ */
+Node.prototype.getPos = function() {
+ if (this.isRoot()) {
+ return -1;
+ }
+ else {
+ return this.parent.getNodePos(this);
+ }
+};
+
+/**
+ * Deletes self
+ * @fires Model.model:drop
+ */
+Node.prototype.drop = function() {
+ var model = this.model;
+
+ if (!!this.parent) {
+ this.parent.removeNode(this);
+ }
+
+ this.$el.removeData('queryBuilderModel');
+
+ if (model !== null) {
+ /**
+ * After a node of the model has been removed
+ * @event model:drop
+ * @memberof Model
+ * @param {Node} node
+ */
+ model.trigger('drop', this);
+ }
+};
+
+/**
+ * Moves itself after another Node
+ * @param {Node} target
+ * @fires Model.model:move
+ */
+Node.prototype.moveAfter = function(target) {
+ if (!this.isRoot()) {
+ this.move(target.parent, target.getPos() + 1);
+ }
+};
+
+/**
+ * Moves itself at the beginning of parent or another Group
+ * @param {Group} [target]
+ * @fires Model.model:move
+ */
+Node.prototype.moveAtBegin = function(target) {
+ if (!this.isRoot()) {
+ if (target === undefined) {
+ target = this.parent;
+ }
+
+ this.move(target, 0);
+ }
+};
+
+/**
+ * Moves itself at the end of parent or another Group
+ * @param {Group} [target]
+ * @fires Model.model:move
+ */
+Node.prototype.moveAtEnd = function(target) {
+ if (!this.isRoot()) {
+ if (target === undefined) {
+ target = this.parent;
+ }
+
+ this.move(target, target.length() === 0 ? 0 : target.length() - 1);
+ }
+};
+
+/**
+ * Moves itself at specific position of Group
+ * @param {Group} target
+ * @param {int} index
+ * @fires Model.model:move
+ */
+Node.prototype.move = function(target, index) {
+ if (!this.isRoot()) {
+ if (typeof target === 'number') {
+ index = target;
+ target = this.parent;
+ }
+
+ this.parent.removeNode(this);
+ target.insertNode(this, index, false);
+
+ if (this.model !== null) {
+ /**
+ * After a node of the model has been moved
+ * @event model:move
+ * @memberof Model
+ * @param {Node} node
+ * @param {Node} target
+ * @param {int} index
+ */
+ this.model.trigger('move', this, target, index);
+ }
+ }
+};
+
+
+/**
+ * Group object
+ * @constructor
+ * @extends Node
+ * @param {Group} [parent]
+ * @param {jQuery} $el
+ */
+var Group = function(parent, $el) {
+ if (!(this instanceof Group)) {
+ return new Group(parent, $el);
+ }
+
+ Node.call(this, parent, $el);
+
+ /**
+ * @member {object[]}
+ * @readonly
+ */
+ this.rules = [];
+
+ /**
+ * @name condition
+ * @member {string}
+ * @memberof Group
+ * @instance
+ */
+ this.__.condition = null;
+};
+
+Group.prototype = Object.create(Node.prototype);
+Group.prototype.constructor = Group;
+
+Utils.defineModelProperties(Group, ['condition']);
+
+/**
+ * Removes group's content
+ */
+Group.prototype.empty = function() {
+ this.each('reverse', function(rule) {
+ rule.drop();
+ }, function(group) {
+ group.drop();
+ });
+};
+
+/**
+ * Deletes self
+ */
+Group.prototype.drop = function() {
+ this.empty();
+ Node.prototype.drop.call(this);
+};
+
+/**
+ * Returns the number of children
+ * @returns {int}
+ */
+Group.prototype.length = function() {
+ return this.rules.length;
+};
+
+/**
+ * Adds a Node at specified index
+ * @param {Node} node
+ * @param {int} [index=end]
+ * @param {boolean} [trigger=false] - fire 'add' event
+ * @returns {Node} the inserted node
+ * @fires Model.model:add
+ */
+Group.prototype.insertNode = function(node, index, trigger) {
+ if (index === undefined) {
+ index = this.length();
+ }
+
+ this.rules.splice(index, 0, node);
+ node.parent = this;
+
+ if (trigger && this.model !== null) {
+ /**
+ * After a node of the model has been added
+ * @event model:add
+ * @memberof Model
+ * @param {Node} parent
+ * @param {Node} node
+ * @param {int} index
+ */
+ this.model.trigger('add', this, node, index);
+ }
+
+ return node;
+};
+
+/**
+ * Adds a new Group at specified index
+ * @param {jQuery} $el
+ * @param {int} [index=end]
+ * @returns {Group}
+ * @fires Model.model:add
+ */
+Group.prototype.addGroup = function($el, index) {
+ return this.insertNode(new Group(this, $el), index, true);
+};
+
+/**
+ * Adds a new Rule at specified index
+ * @param {jQuery} $el
+ * @param {int} [index=end]
+ * @returns {Rule}
+ * @fires Model.model:add
+ */
+Group.prototype.addRule = function($el, index) {
+ return this.insertNode(new Rule(this, $el), index, true);
+};
+
+/**
+ * Deletes a specific Node
+ * @param {Node} node
+ */
+Group.prototype.removeNode = function(node) {
+ var index = this.getNodePos(node);
+ if (index !== -1) {
+ node.parent = null;
+ this.rules.splice(index, 1);
+ }
+};
+
+/**
+ * Returns the position of a child Node
+ * @param {Node} node
+ * @returns {int}
+ */
+Group.prototype.getNodePos = function(node) {
+ return this.rules.indexOf(node);
+};
+
+/**
+ * @callback Model#GroupIteratee
+ * @param {Node} node
+ * @returns {boolean} stop the iteration
+ */
+
+/**
+ * Iterate over all Nodes
+ * @param {boolean} [reverse=false] - iterate in reverse order, required if you delete nodes
+ * @param {Model#GroupIteratee} cbRule - callback for Rules (can be `null` but not omitted)
+ * @param {Model#GroupIteratee} [cbGroup] - callback for Groups
+ * @param {object} [context] - context for callbacks
+ * @returns {boolean} if the iteration has been stopped by a callback
+ */
+Group.prototype.each = function(reverse, cbRule, cbGroup, context) {
+ if (typeof reverse !== 'boolean' && typeof reverse !== 'string') {
+ context = cbGroup;
+ cbGroup = cbRule;
+ cbRule = reverse;
+ reverse = false;
+ }
+ context = context === undefined ? null : context;
+
+ var i = reverse ? this.rules.length - 1 : 0;
+ var l = reverse ? 0 : this.rules.length - 1;
+ var c = reverse ? -1 : 1;
+ var next = function() {
+ return reverse ? i >= l : i <= l;
+ };
+ var stop = false;
+
+ for (; next(); i += c) {
+ if (this.rules[i] instanceof Group) {
+ if (!!cbGroup) {
+ stop = cbGroup.call(context, this.rules[i]) === false;
+ }
+ }
+ else if (!!cbRule) {
+ stop = cbRule.call(context, this.rules[i]) === false;
+ }
+
+ if (stop) {
+ break;
+ }
+ }
+
+ return !stop;
+};
+
+/**
+ * Checks if the group contains a particular Node
+ * @param {Node} node
+ * @param {boolean} [recursive=false]
+ * @returns {boolean}
+ */
+Group.prototype.contains = function(node, recursive) {
+ if (this.getNodePos(node) !== -1) {
+ return true;
+ }
+ else if (!recursive) {
+ return false;
+ }
+ else {
+ // the loop will return with false as soon as the Node is found
+ return !this.each(function() {
+ return true;
+ }, function(group) {
+ return !group.contains(node, true);
+ });
+ }
+};
+
+
+/**
+ * Rule object
+ * @constructor
+ * @extends Node
+ * @param {Group} parent
+ * @param {jQuery} $el
+ */
+var Rule = function(parent, $el) {
+ if (!(this instanceof Rule)) {
+ return new Rule(parent, $el);
+ }
+
+ Node.call(this, parent, $el);
+
+ this._updating_value = false;
+ this._updating_input = false;
+
+ /**
+ * @name filter
+ * @member {QueryBuilder.Filter}
+ * @memberof Rule
+ * @instance
+ */
+ this.__.filter = null;
+
+ /**
+ * @name operator
+ * @member {QueryBuilder.Operator}
+ * @memberof Rule
+ * @instance
+ */
+ this.__.operator = null;
+
+ /**
+ * @name value
+ * @member {*}
+ * @memberof Rule
+ * @instance
+ */
+ this.__.value = undefined;
+};
+
+Rule.prototype = Object.create(Node.prototype);
+Rule.prototype.constructor = Rule;
+
+Utils.defineModelProperties(Rule, ['filter', 'operator', 'value']);
+
+/**
+ * Checks if this Node is the root
+ * @returns {boolean} always false
+ */
+Rule.prototype.isRoot = function() {
+ return false;
+};
+
+
+/**
+ * @member {function}
+ * @memberof QueryBuilder
+ * @see Group
+ */
+QueryBuilder.Group = Group;
+
+/**
+ * @member {function}
+ * @memberof QueryBuilder
+ * @see Rule
+ */
+QueryBuilder.Rule = Rule;
+
+
+/**
+ * The {@link http://learn.jquery.com/plugins/|jQuery Plugins} namespace
+ * @external "jQuery.fn"
+ */
+
+/**
+ * Instanciates or accesses the {@link QueryBuilder} on an element
+ * @function
+ * @memberof external:"jQuery.fn"
+ * @param {*} option - initial configuration or method name
+ * @param {...*} args - method arguments
+ *
+ * @example
+ * $('#builder').queryBuilder({ /** configuration object *\/ });
+ * @example
+ * $('#builder').queryBuilder('methodName', methodParam1, methodParam2);
+ */
+$.fn.queryBuilder = function(option) {
+ if (this.length === 0) {
+ Utils.error('Config', 'No target defined');
+ }
+ if (this.length > 1) {
+ Utils.error('Config', 'Unable to initialize on multiple target');
+ }
+
+ var data = this.data('queryBuilder');
+ var options = (typeof option == 'object' && option) || {};
+
+ if (!data && option == 'destroy') {
+ return this;
+ }
+ if (!data) {
+ var builder = new QueryBuilder(this, options);
+ this.data('queryBuilder', builder);
+ builder.init(options.rules);
+ }
+ if (typeof option == 'string') {
+ return data[option].apply(data, Array.prototype.slice.call(arguments, 1));
+ }
+
+ return this;
+};
+
+/**
+ * @function
+ * @memberof external:"jQuery.fn"
+ * @see QueryBuilder
+ */
+$.fn.queryBuilder.constructor = QueryBuilder;
+
+/**
+ * @function
+ * @memberof external:"jQuery.fn"
+ * @see QueryBuilder.defaults
+ */
+$.fn.queryBuilder.defaults = QueryBuilder.defaults;
+
+/**
+ * @function
+ * @memberof external:"jQuery.fn"
+ * @see QueryBuilder.defaults
+ */
+$.fn.queryBuilder.extend = QueryBuilder.extend;
+
+/**
+ * @function
+ * @memberof external:"jQuery.fn"
+ * @see QueryBuilder.define
+ */
+$.fn.queryBuilder.define = QueryBuilder.define;
+
+/**
+ * @function
+ * @memberof external:"jQuery.fn"
+ * @see QueryBuilder.regional
+ */
+$.fn.queryBuilder.regional = QueryBuilder.regional;
+
+
+/**
+ * @class BtCheckbox
+ * @memberof module:plugins
+ * @description Applies Awesome Bootstrap Checkbox for checkbox and radio inputs.
+ * @param {object} [options]
+ * @param {string} [options.font='glyphicons']
+ * @param {string} [options.color='default']
+ */
+QueryBuilder.define('bt-checkbox', function(options) {
+ if (options.font == 'glyphicons') {
+ this.$el.addClass('bt-checkbox-glyphicons');
+ }
+
+ this.on('getRuleInput.filter', function(h, rule, name) {
+ var filter = rule.filter;
+
+ if ((filter.input === 'radio' || filter.input === 'checkbox') && !filter.plugin) {
+ h.value = '';
+
+ if (!filter.colors) {
+ filter.colors = {};
+ }
+ if (filter.color) {
+ filter.colors._def_ = filter.color;
+ }
+
+ var style = filter.vertical ? ' style="display:block"' : '';
+ var i = 0;
+
+ Utils.iterateOptions(filter.values, function(key, val) {
+ var color = filter.colors[key] || filter.colors._def_ || options.color;
+ var id = name + '_' + (i++);
+
+ h.value+= '\
+<div' + style + ' class="' + filter.input + ' ' + filter.input + '-' + color + '"> \
+ <input type="' + filter.input + '" name="' + name + '" id="' + id + '" value="' + key + '"> \
+ <label for="' + id + '">' + val + '</label> \
+</div>';
+ });
+ }
+ });
+}, {
+ font: 'glyphicons',
+ color: 'default'
+});
+
+
+/**
+ * @class BtSelectpicker
+ * @memberof module:plugins
+ * @descriptioon Applies Bootstrap Select on filters and operators combo-boxes.
+ * @param {object} [options]
+ * @param {string} [options.container='body']
+ * @param {string} [options.style='btn-inverse btn-xs']
+ * @param {int|string} [options.width='auto']
+ * @param {boolean} [options.showIcon=false]
+ * @throws MissingLibraryError
+ */
+QueryBuilder.define('bt-selectpicker', function(options) {
+ if (!$.fn.selectpicker || !$.fn.selectpicker.Constructor) {
+ Utils.error('MissingLibrary', 'Bootstrap Select is required to use "bt-selectpicker" plugin. Get it here: http://silviomoreto.github.io/bootstrap-select');
+ }
+
+ var Selectors = QueryBuilder.selectors;
+
+ // init selectpicker
+ this.on('afterCreateRuleFilters', function(e, rule) {
+ rule.$el.find(Selectors.rule_filter).removeClass('form-control').selectpicker(options);
+ });
+
+ this.on('afterCreateRuleOperators', function(e, rule) {
+ rule.$el.find(Selectors.rule_operator).removeClass('form-control').selectpicker(options);
+ });
+
+ // update selectpicker on change
+ this.on('afterUpdateRuleFilter', function(e, rule) {
+ rule.$el.find(Selectors.rule_filter).selectpicker('render');
+ });
+
+ this.on('afterUpdateRuleOperator', function(e, rule) {
+ rule.$el.find(Selectors.rule_operator).selectpicker('render');
+ });
+
+ this.on('beforeDeleteRule', function(e, rule) {
+ rule.$el.find(Selectors.rule_filter).selectpicker('destroy');
+ rule.$el.find(Selectors.rule_operator).selectpicker('destroy');
+ });
+}, {
+ container: 'body',
+ style: 'btn-inverse btn-xs',
+ width: 'auto',
+ showIcon: false
+});
+
+
+/**
+ * @class BtTooltipErrors
+ * @memberof module:plugins
+ * @description Applies Bootstrap Tooltips on validation error messages.
+ * @param {object} [options]
+ * @param {string} [options.placement='right']
+ * @throws MissingLibraryError
+ */
+QueryBuilder.define('bt-tooltip-errors', function(options) {
+ if (!$.fn.tooltip || !$.fn.tooltip.Constructor || !$.fn.tooltip.Constructor.prototype.fixTitle) {
+ Utils.error('MissingLibrary', 'Bootstrap Tooltip is required to use "bt-tooltip-errors" plugin. Get it here: http://getbootstrap.com');
+ }
+
+ var self = this;
+
+ // add BT Tooltip data
+ this.on('getRuleTemplate.filter getGroupTemplate.filter', function(h) {
+ var $h = $(h.value);
+ $h.find(QueryBuilder.selectors.error_container).attr('data-toggle', 'tooltip');
+ h.value = $h.prop('outerHTML');
+ });
+
+ // init/refresh tooltip when title changes
+ this.model.on('update', function(e, node, field) {
+ if (field == 'error' && self.settings.display_errors) {
+ node.$el.find(QueryBuilder.selectors.error_container).eq(0)
+ .tooltip(options)
+ .tooltip('hide')
+ .tooltip('fixTitle');
+ }
+ });
+}, {
+ placement: 'right'
+});
+
+
+/**
+ * @class ChangeFilters
+ * @memberof module:plugins
+ * @description Allows to change available filters after plugin initialization.
+ */
+
+QueryBuilder.extend(/** @lends module:plugins.ChangeFilters.prototype */ {
+ /**
+ * Change the filters of the builder
+ * @param {boolean} [deleteOrphans=false] - delete rules using old filters
+ * @param {QueryBuilder[]} filters
+ * @fires module:plugins.ChangeFilters.changer:setFilters
+ * @fires module:plugins.ChangeFilters.afterSetFilters
+ * @throws ChangeFilterError
+ */
+ setFilters: function(deleteOrphans, filters) {
+ var self = this;
+
+ if (filters === undefined) {
+ filters = deleteOrphans;
+ deleteOrphans = false;
+ }
+
+ filters = this.checkFilters(filters);
+
+ /**
+ * Modifies the filters before {@link module:plugins.ChangeFilters.setFilters} method
+ * @event changer:setFilters
+ * @memberof module:plugins.ChangeFilters
+ * @param {QueryBuilder.Filter[]} filters
+ * @returns {QueryBuilder.Filter[]}
+ */
+ filters = this.change('setFilters', filters);
+
+ var filtersIds = filters.map(function(filter) {
+ return filter.id;
+ });
+
+ // check for orphans
+ if (!deleteOrphans) {
+ (function checkOrphans(node) {
+ node.each(
+ function(rule) {
+ if (rule.filter && filtersIds.indexOf(rule.filter.id) === -1) {
+ Utils.error('ChangeFilter', 'A rule is using filter "{0}"', rule.filter.id);
+ }
+ },
+ checkOrphans
+ );
+ }(this.model.root));
+ }
+
+ // replace filters
+ this.filters = filters;
+
+ // apply on existing DOM
+ (function updateBuilder(node) {
+ node.each(true,
+ function(rule) {
+ if (rule.filter && filtersIds.indexOf(rule.filter.id) === -1) {
+ rule.drop();
+
+ self.trigger('rulesChanged');
+ }
+ else {
+ self.createRuleFilters(rule);
+
+ rule.$el.find(QueryBuilder.selectors.rule_filter).val(rule.filter ? rule.filter.id : '-1');
+ self.trigger('afterUpdateRuleFilter', rule);
+ }
+ },
+ updateBuilder
+ );
+ }(this.model.root));
+
+ // update plugins
+ if (this.settings.plugins) {
+ if (this.settings.plugins['unique-filter']) {
+ this.updateDisabledFilters();
+ }
+ if (this.settings.plugins['bt-selectpicker']) {
+ this.$el.find(QueryBuilder.selectors.rule_filter).selectpicker('render');
+ }
+ }
+
+ // reset the default_filter if does not exist anymore
+ if (this.settings.default_filter) {
+ try {
+ this.getFilterById(this.settings.default_filter);
+ }
+ catch (e) {
+ this.settings.default_filter = null;
+ }
+ }
+
+ /**
+ * After {@link module:plugins.ChangeFilters.setFilters} method
+ * @event afterSetFilters
+ * @memberof module:plugins.ChangeFilters
+ * @param {QueryBuilder.Filter[]} filters
+ */
+ this.trigger('afterSetFilters', filters);
+ },
+
+ /**
+ * Adds a new filter to the builder
+ * @param {QueryBuilder.Filter|Filter[]} newFilters
+ * @param {int|string} [position=#end] - index or '#start' or '#end'
+ * @fires module:plugins.ChangeFilters.changer:setFilters
+ * @fires module:plugins.ChangeFilters.afterSetFilters
+ * @throws ChangeFilterError
+ */
+ addFilter: function(newFilters, position) {
+ if (position === undefined || position == '#end') {
+ position = this.filters.length;
+ }
+ else if (position == '#start') {
+ position = 0;
+ }
+
+ if (!$.isArray(newFilters)) {
+ newFilters = [newFilters];
+ }
+
+ var filters = $.extend(true, [], this.filters);
+
+ // numeric position
+ if (parseInt(position) == position) {
+ Array.prototype.splice.apply(filters, [position, 0].concat(newFilters));
+ }
+ else {
+ // after filter by its id
+ if (this.filters.some(function(filter, index) {
+ if (filter.id == position) {
+ position = index + 1;
+ return true;
+ }
+ })
+ ) {
+ Array.prototype.splice.apply(filters, [position, 0].concat(newFilters));
+ }
+ // defaults to end of list
+ else {
+ Array.prototype.push.apply(filters, newFilters);
+ }
+ }
+
+ this.setFilters(filters);
+ },
+
+ /**
+ * Removes a filter from the builder
+ * @param {string|string[]} filterIds
+ * @param {boolean} [deleteOrphans=false] delete rules using old filters
+ * @fires module:plugins.ChangeFilters.changer:setFilters
+ * @fires module:plugins.ChangeFilters.afterSetFilters
+ * @throws ChangeFilterError
+ */
+ removeFilter: function(filterIds, deleteOrphans) {
+ var filters = $.extend(true, [], this.filters);
+ if (typeof filterIds === 'string') {
+ filterIds = [filterIds];
+ }
+
+ filters = filters.filter(function(filter) {
+ return filterIds.indexOf(filter.id) === -1;
+ });
+
+ this.setFilters(deleteOrphans, filters);
+ }
+});
+
+
+/**
+ * @class ChosenSelectpicker
+ * @memberof module:plugins
+ * @descriptioon Applies chosen-js Select on filters and operators combo-boxes.
+ * @param {object} [options] Supports all the options for chosen
+ * @throws MissingLibraryError
+ */
+QueryBuilder.define('chosen-selectpicker', function(options) {
+
+ if (!$.fn.chosen) {
+ Utils.error('MissingLibrary', 'chosen is required to use "chosen-selectpicker" plugin. Get it here: https://github.com/harvesthq/chosen');
+ }
+
+ if (this.settings.plugins['bt-selectpicker']) {
+ Utils.error('Conflict', 'bt-selectpicker is already selected as the dropdown plugin. Please remove chosen-selectpicker from the plugin list');
+ }
+
+ var Selectors = QueryBuilder.selectors;
+
+ // init selectpicker
+ this.on('afterCreateRuleFilters', function(e, rule) {
+ rule.$el.find(Selectors.rule_filter).removeClass('form-control').chosen(options);
+ });
+
+ this.on('afterCreateRuleOperators', function(e, rule) {
+ rule.$el.find(Selectors.rule_operator).removeClass('form-control').chosen(options);
+ });
+
+ // update selectpicker on change
+ this.on('afterUpdateRuleFilter', function(e, rule) {
+ rule.$el.find(Selectors.rule_filter).trigger('chosen:updated');
+ });
+
+ this.on('afterUpdateRuleOperator', function(e, rule) {
+ rule.$el.find(Selectors.rule_operator).trigger('chosen:updated');
+ });
+
+ this.on('beforeDeleteRule', function(e, rule) {
+ rule.$el.find(Selectors.rule_filter).chosen('destroy');
+ rule.$el.find(Selectors.rule_operator).chosen('destroy');
+ });
+});
+
+
+/**
+ * @class FilterDescription
+ * @memberof module:plugins
+ * @description Provides three ways to display a description about a filter: inline, Bootsrap Popover or Bootbox.
+ * @param {object} [options]
+ * @param {string} [options.icon='glyphicon glyphicon-info-sign']
+ * @param {string} [options.mode='popover'] - inline, popover or bootbox
+ * @throws ConfigError
+ */
+QueryBuilder.define('filter-description', function(options) {
+ // INLINE
+ if (options.mode === 'inline') {
+ this.on('afterUpdateRuleFilter afterUpdateRuleOperator', function(e, rule) {
+ var $p = rule.$el.find('p.filter-description');
+ var description = e.builder.getFilterDescription(rule.filter, rule);
+
+ if (!description) {
+ $p.hide();
+ }
+ else {
+ if ($p.length === 0) {
+ $p = $('<p class="filter-description"></p>');
+ $p.appendTo(rule.$el);
+ }
+ else {
+ $p.css('display', '');
+ }
+
+ $p.html('<i class="' + options.icon + '"></i> ' + description);
+ }
+ });
+ }
+ // POPOVER
+ else if (options.mode === 'popover') {
+ if (!$.fn.popover || !$.fn.popover.Constructor || !$.fn.popover.Constructor.prototype.fixTitle) {
+ Utils.error('MissingLibrary', 'Bootstrap Popover is required to use "filter-description" plugin. Get it here: http://getbootstrap.com');
+ }
+
+ this.on('afterUpdateRuleFilter afterUpdateRuleOperator', function(e, rule) {
+ var $b = rule.$el.find('button.filter-description');
+ var description = e.builder.getFilterDescription(rule.filter, rule);
+
+ if (!description) {
+ $b.hide();
+
+ if ($b.data('bs.popover')) {
+ $b.popover('hide');
+ }
+ }
+ else {
+ if ($b.length === 0) {
+ $b = $('<button type="button" class="btn btn-xs btn-info filter-description" data-toggle="popover"><i class="' + options.icon + '"></i></button>');
+ $b.prependTo(rule.$el.find(QueryBuilder.selectors.rule_actions));
+
+ $b.popover({
+ placement: 'left',
+ container: 'body',
+ html: true
+ });
+
+ $b.on('mouseout', function() {
+ $b.popover('hide');
+ });
+ }
+ else {
+ $b.css('display', '');
+ }
+
+ $b.data('bs.popover').options.content = description;
+
+ if ($b.attr('aria-describedby')) {
+ $b.popover('show');
+ }
+ }
+ });
+ }
+ // BOOTBOX
+ else if (options.mode === 'bootbox') {
+ if (!('bootbox' in window)) {
+ Utils.error('MissingLibrary', 'Bootbox is required to use "filter-description" plugin. Get it here: http://bootboxjs.com');
+ }
+
+ this.on('afterUpdateRuleFilter afterUpdateRuleOperator', function(e, rule) {
+ var $b = rule.$el.find('button.filter-description');
+ var description = e.builder.getFilterDescription(rule.filter, rule);
+
+ if (!description) {
+ $b.hide();
+ }
+ else {
+ if ($b.length === 0) {
+ $b = $('<button type="button" class="btn btn-xs btn-info filter-description" data-toggle="bootbox"><i class="' + options.icon + '"></i></button>');
+ $b.prependTo(rule.$el.find(QueryBuilder.selectors.rule_actions));
+
+ $b.on('click', function() {
+ bootbox.alert($b.data('description'));
+ });
+ }
+ else {
+ $b.css('display', '');
+ }
+
+ $b.data('description', description);
+ }
+ });
+ }
+}, {
+ icon: 'glyphicon glyphicon-info-sign',
+ mode: 'popover'
+});
+
+QueryBuilder.extend(/** @lends module:plugins.FilterDescription.prototype */ {
+ /**
+ * Returns the description of a filter for a particular rule (if present)
+ * @param {object} filter
+ * @param {Rule} [rule]
+ * @returns {string}
+ * @private
+ */
+ getFilterDescription: function(filter, rule) {
+ if (!filter) {
+ return undefined;
+ }
+ else if (typeof filter.description == 'function') {
+ return filter.description.call(this, rule);
+ }
+ else {
+ return filter.description;
+ }
+ }
+});
+
+
+/**
+ * @class Invert
+ * @memberof module:plugins
+ * @description Allows to invert a rule operator, a group condition or the entire builder.
+ * @param {object} [options]
+ * @param {string} [options.icon='glyphicon glyphicon-random']
+ * @param {boolean} [options.recursive=true]
+ * @param {boolean} [options.invert_rules=true]
+ * @param {boolean} [options.display_rules_button=false]
+ * @param {boolean} [options.silent_fail=false]
+ */
+QueryBuilder.define('invert', function(options) {
+ var self = this;
+ var Selectors = QueryBuilder.selectors;
+
+ // Bind events
+ this.on('afterInit', function() {
+ self.$el.on('click.queryBuilder', '[data-invert=group]', function() {
+ var $group = $(this).closest(Selectors.group_container);
+ self.invert(self.getModel($group), options);
+ });
+
+ if (options.display_rules_button && options.invert_rules) {
+ self.$el.on('click.queryBuilder', '[data-invert=rule]', function() {
+ var $rule = $(this).closest(Selectors.rule_container);
+ self.invert(self.getModel($rule), options);
+ });
+ }
+ });
+
+ // Modify templates
+ if (!options.disable_template) {
+ this.on('getGroupTemplate.filter', function(h) {
+ var $h = $(h.value);
+ $h.find(Selectors.condition_container).after(
+ '<button type="button" class="btn btn-xs btn-default" data-invert="group">' +
+ '<i class="' + options.icon + '"></i> ' + self.translate('invert') +
+ '</button>'
+ );
+ h.value = $h.prop('outerHTML');
+ });
+
+ if (options.display_rules_button && options.invert_rules) {
+ this.on('getRuleTemplate.filter', function(h) {
+ var $h = $(h.value);
+ $h.find(Selectors.rule_actions).prepend(
+ '<button type="button" class="btn btn-xs btn-default" data-invert="rule">' +
+ '<i class="' + options.icon + '"></i> ' + self.translate('invert') +
+ '</button>'
+ );
+ h.value = $h.prop('outerHTML');
+ });
+ }
+ }
+}, {
+ icon: 'glyphicon glyphicon-random',
+ recursive: true,
+ invert_rules: true,
+ display_rules_button: false,
+ silent_fail: false,
+ disable_template: false
+});
+
+QueryBuilder.defaults({
+ operatorOpposites: {
+ 'equal': 'not_equal',
+ 'not_equal': 'equal',
+ 'in': 'not_in',
+ 'not_in': 'in',
+ 'less': 'greater_or_equal',
+ 'less_or_equal': 'greater',
+ 'greater': 'less_or_equal',
+ 'greater_or_equal': 'less',
+ 'between': 'not_between',
+ 'not_between': 'between',
+ 'begins_with': 'not_begins_with',
+ 'not_begins_with': 'begins_with',
+ 'contains': 'not_contains',
+ 'not_contains': 'contains',
+ 'ends_with': 'not_ends_with',
+ 'not_ends_with': 'ends_with',
+ 'is_empty': 'is_not_empty',
+ 'is_not_empty': 'is_empty',
+ 'is_null': 'is_not_null',
+ 'is_not_null': 'is_null'
+ },
+
+ conditionOpposites: {
+ 'AND': 'OR',
+ 'OR': 'AND'
+ }
+});
+
+QueryBuilder.extend(/** @lends module:plugins.Invert.prototype */ {
+ /**
+ * Invert a Group, a Rule or the whole builder
+ * @param {Node} [node]
+ * @param {object} [options] {@link module:plugins.Invert}
+ * @fires module:plugins.Invert.afterInvert
+ * @throws InvertConditionError, InvertOperatorError
+ */
+ invert: function(node, options) {
+ if (!(node instanceof Node)) {
+ if (!this.model.root) return;
+ options = node;
+ node = this.model.root;
+ }
+
+ if (typeof options != 'object') options = {};
+ if (options.recursive === undefined) options.recursive = true;
+ if (options.invert_rules === undefined) options.invert_rules = true;
+ if (options.silent_fail === undefined) options.silent_fail = false;
+ if (options.trigger === undefined) options.trigger = true;
+
+ if (node instanceof Group) {
+ // invert group condition
+ if (this.settings.conditionOpposites[node.condition]) {
+ node.condition = this.settings.conditionOpposites[node.condition];
+ }
+ else if (!options.silent_fail) {
+ Utils.error('InvertCondition', 'Unknown inverse of condition "{0}"', node.condition);
+ }
+
+ // recursive call
+ if (options.recursive) {
+ var tempOpts = $.extend({}, options, { trigger: false });
+ node.each(function(rule) {
+ if (options.invert_rules) {
+ this.invert(rule, tempOpts);
+ }
+ }, function(group) {
+ this.invert(group, tempOpts);
+ }, this);
+ }
+ }
+ else if (node instanceof Rule) {
+ if (node.operator && !node.filter.no_invert) {
+ // invert rule operator
+ if (this.settings.operatorOpposites[node.operator.type]) {
+ var invert = this.settings.operatorOpposites[node.operator.type];
+ // check if the invert is "authorized"
+ if (!node.filter.operators || node.filter.operators.indexOf(invert) != -1) {
+ node.operator = this.getOperatorByType(invert);
+ }
+ }
+ else if (!options.silent_fail) {
+ Utils.error('InvertOperator', 'Unknown inverse of operator "{0}"', node.operator.type);
+ }
+ }
+ }
+
+ if (options.trigger) {
+ /**
+ * After {@link module:plugins.Invert.invert} method
+ * @event afterInvert
+ * @memberof module:plugins.Invert
+ * @param {Node} node - the main group or rule that has been modified
+ * @param {object} options
+ */
+ this.trigger('afterInvert', node, options);
+
+ this.trigger('rulesChanged');
+ }
+ }
+});
+
+
+/**
+ * @class MongoDbSupport
+ * @memberof module:plugins
+ * @description Allows to export rules as a MongoDB find object as well as populating the builder from a MongoDB object.
+ */
+
+QueryBuilder.defaults({
+ mongoOperators: {
+ // @formatter:off
+ equal: function(v) { return v[0]; },
+ not_equal: function(v) { return { '$ne': v[0] }; },
+ in: function(v) { return { '$in': v }; },
+ not_in: function(v) { return { '$nin': v }; },
+ less: function(v) { return { '$lt': v[0] }; },
+ less_or_equal: function(v) { return { '$lte': v[0] }; },
+ greater: function(v) { return { '$gt': v[0] }; },
+ greater_or_equal: function(v) { return { '$gte': v[0] }; },
+ between: function(v) { return { '$gte': v[0], '$lte': v[1] }; },
+ not_between: function(v) { return { '$lt': v[0], '$gt': v[1] }; },
+ begins_with: function(v) { return { '$regex': '^' + Utils.escapeRegExp(v[0]) }; },
+ not_begins_with: function(v) { return { '$regex': '^(?!' + Utils.escapeRegExp(v[0]) + ')' }; },
+ contains: function(v) { return { '$regex': Utils.escapeRegExp(v[0]) }; },
+ not_contains: function(v) { return { '$regex': '^((?!' + Utils.escapeRegExp(v[0]) + ').)*$', '$options': 's' }; },
+ ends_with: function(v) { return { '$regex': Utils.escapeRegExp(v[0]) + '$' }; },
+ not_ends_with: function(v) { return { '$regex': '(?<!' + Utils.escapeRegExp(v[0]) + ')$' }; },
+ is_empty: function(v) { return ''; },
+ is_not_empty: function(v) { return { '$ne': '' }; },
+ is_null: function(v) { return null; },
+ is_not_null: function(v) { return { '$ne': null }; }
+ // @formatter:on
+ },
+
+ mongoRuleOperators: {
+ $eq: function(v) {
+ return {
+ 'val': v,
+ 'op': v === null ? 'is_null' : (v === '' ? 'is_empty' : 'equal')
+ };
+ },
+ $ne: function(v) {
+ v = v.$ne;
+ return {
+ 'val': v,
+ 'op': v === null ? 'is_not_null' : (v === '' ? 'is_not_empty' : 'not_equal')
+ };
+ },
+ $regex: function(v) {
+ v = v.$regex;
+ if (v.slice(0, 4) == '^(?!' && v.slice(-1) == ')') {
+ return { 'val': v.slice(4, -1), 'op': 'not_begins_with' };
+ }
+ else if (v.slice(0, 5) == '^((?!' && v.slice(-5) == ').)*$') {
+ return { 'val': v.slice(5, -5), 'op': 'not_contains' };
+ }
+ else if (v.slice(0, 4) == '(?<!' && v.slice(-2) == ')$') {
+ return { 'val': v.slice(4, -2), 'op': 'not_ends_with' };
+ }
+ else if (v.slice(-1) == '$') {
+ return { 'val': v.slice(0, -1), 'op': 'ends_with' };
+ }
+ else if (v.slice(0, 1) == '^') {
+ return { 'val': v.slice(1), 'op': 'begins_with' };
+ }
+ else {
+ return { 'val': v, 'op': 'contains' };
+ }
+ },
+ between: function(v) {
+ return { 'val': [v.$gte, v.$lte], 'op': 'between' };
+ },
+ not_between: function(v) {
+ return { 'val': [v.$lt, v.$gt], 'op': 'not_between' };
+ },
+ $in: function(v) {
+ return { 'val': v.$in, 'op': 'in' };
+ },
+ $nin: function(v) {
+ return { 'val': v.$nin, 'op': 'not_in' };
+ },
+ $lt: function(v) {
+ return { 'val': v.$lt, 'op': 'less' };
+ },
+ $lte: function(v) {
+ return { 'val': v.$lte, 'op': 'less_or_equal' };
+ },
+ $gt: function(v) {
+ return { 'val': v.$gt, 'op': 'greater' };
+ },
+ $gte: function(v) {
+ return { 'val': v.$gte, 'op': 'greater_or_equal' };
+ }
+ }
+});
+
+QueryBuilder.extend(/** @lends module:plugins.MongoDbSupport.prototype */ {
+ /**
+ * Returns rules as a MongoDB query
+ * @param {object} [data] - current rules by default
+ * @returns {object}
+ * @fires module:plugins.MongoDbSupport.changer:getMongoDBField
+ * @fires module:plugins.MongoDbSupport.changer:ruleToMongo
+ * @fires module:plugins.MongoDbSupport.changer:groupToMongo
+ * @throws UndefinedMongoConditionError, UndefinedMongoOperatorError
+ */
+ getMongo: function(data) {
+ data = (data === undefined) ? this.getRules() : data;
+
+ if (!data) {
+ return null;
+ }
+
+ var self = this;
+
+ return (function parse(group) {
+ if (!group.condition) {
+ group.condition = self.settings.default_condition;
+ }
+ if (['AND', 'OR'].indexOf(group.condition.toUpperCase()) === -1) {
+ Utils.error('UndefinedMongoCondition', 'Unable to build MongoDB query with condition "{0}"', group.condition);
+ }
+
+ if (!group.rules) {
+ return {};
+ }
+
+ var parts = [];
+
+ group.rules.forEach(function(rule) {
+ if (rule.rules && rule.rules.length > 0) {
+ parts.push(parse(rule));
+ }
+ else {
+ var mdb = self.settings.mongoOperators[rule.operator];
+ var ope = self.getOperatorByType(rule.operator);
+
+ if (mdb === undefined) {
+ Utils.error('UndefinedMongoOperator', 'Unknown MongoDB operation for operator "{0}"', rule.operator);
+ }
+
+ if (ope.nb_inputs !== 0) {
+ if (!(rule.value instanceof Array)) {
+ rule.value = [rule.value];
+ }
+ }
+
+ /**
+ * Modifies the MongoDB field used by a rule
+ * @event changer:getMongoDBField
+ * @memberof module:plugins.MongoDbSupport
+ * @param {string} field
+ * @param {Rule} rule
+ * @returns {string}
+ */
+ var field = self.change('getMongoDBField', rule.field, rule);
+
+ var ruleExpression = {};
+ ruleExpression[field] = mdb.call(self, rule.value);
+
+ /**
+ * Modifies the MongoDB expression generated for a rul
+ * @event changer:ruleToMongo
+ * @memberof module:plugins.MongoDbSupport
+ * @param {object} expression
+ * @param {Rule} rule
+ * @param {*} value
+ * @param {function} valueWrapper - function that takes the value and adds the operator
+ * @returns {object}
+ */
+ parts.push(self.change('ruleToMongo', ruleExpression, rule, rule.value, mdb));
+ }
+ });
+
+ var groupExpression = {};
+ groupExpression['$' + group.condition.toLowerCase()] = parts;
+
+ /**
+ * Modifies the MongoDB expression generated for a group
+ * @event changer:groupToMongo
+ * @memberof module:plugins.MongoDbSupport
+ * @param {object} expression
+ * @param {Group} group
+ * @returns {object}
+ */
+ return self.change('groupToMongo', groupExpression, group);
+ }(data));
+ },
+
+ /**
+ * Converts a MongoDB query to rules
+ * @param {object} query
+ * @returns {object}
+ * @fires module:plugins.MongoDbSupport.changer:parseMongoNode
+ * @fires module:plugins.MongoDbSupport.changer:getMongoDBFieldID
+ * @fires module:plugins.MongoDbSupport.changer:mongoToRule
+ * @fires module:plugins.MongoDbSupport.changer:mongoToGroup
+ * @throws MongoParseError, UndefinedMongoConditionError, UndefinedMongoOperatorError
+ */
+ getRulesFromMongo: function(query) {
+ if (query === undefined || query === null) {
+ return null;
+ }
+
+ var self = this;
+
+ /**
+ * Custom parsing of a MongoDB expression, you can return a sub-part of the expression, or a well formed group or rule JSON
+ * @event changer:parseMongoNode
+ * @memberof module:plugins.MongoDbSupport
+ * @param {object} expression
+ * @returns {object} expression, rule or group
+ */
+ query = self.change('parseMongoNode', query);
+
+ // a plugin returned a group
+ if ('rules' in query && 'condition' in query) {
+ return query;
+ }
+
+ // a plugin returned a rule
+ if ('id' in query && 'operator' in query && 'value' in query) {
+ return {
+ condition: this.settings.default_condition,
+ rules: [query]
+ };
+ }
+
+ var key = self.getMongoCondition(query);
+ if (!key) {
+ Utils.error('MongoParse', 'Invalid MongoDB query format');
+ }
+
+ return (function parse(data, topKey) {
+ var rules = data[topKey];
+ var parts = [];
+
+ rules.forEach(function(data) {
+ // allow plugins to manually parse or handle special cases
+ data = self.change('parseMongoNode', data);
+
+ // a plugin returned a group
+ if ('rules' in data && 'condition' in data) {
+ parts.push(data);
+ return;
+ }
+
+ // a plugin returned a rule
+ if ('id' in data && 'operator' in data && 'value' in data) {
+ parts.push(data);
+ return;
+ }
+
+ var key = self.getMongoCondition(data);
+ if (key) {
+ parts.push(parse(data, key));
+ }
+ else {
+ var field = Object.keys(data)[0];
+ var value = data[field];
+
+ var operator = self.getMongoOperator(value);
+ if (operator === undefined) {
+ Utils.error('MongoParse', 'Invalid MongoDB query format');
+ }
+
+ var mdbrl = self.settings.mongoRuleOperators[operator];
+ if (mdbrl === undefined) {
+ Utils.error('UndefinedMongoOperator', 'JSON Rule operation unknown for operator "{0}"', operator);
+ }
+
+ var opVal = mdbrl.call(self, value);
+
+ var id = self.getMongoDBFieldID(field, value);
+
+ /**
+ * Modifies the rule generated from the MongoDB expression
+ * @event changer:mongoToRule
+ * @memberof module:plugins.MongoDbSupport
+ * @param {object} rule
+ * @param {object} expression
+ * @returns {object}
+ */
+ var rule = self.change('mongoToRule', {
+ id: id,
+ field: field,
+ operator: opVal.op,
+ value: opVal.val
+ }, data);
+
+ parts.push(rule);
+ }
+ });
+
+ /**
+ * Modifies the group generated from the MongoDB expression
+ * @event changer:mongoToGroup
+ * @memberof module:plugins.MongoDbSupport
+ * @param {object} group
+ * @param {object} expression
+ * @returns {object}
+ */
+ return self.change('mongoToGroup', {
+ condition: topKey.replace('$', '').toUpperCase(),
+ rules: parts
+ }, data);
+ }(query, key));
+ },
+
+ /**
+ * Sets rules a from MongoDB query
+ * @see module:plugins.MongoDbSupport.getRulesFromMongo
+ */
+ setRulesFromMongo: function(query) {
+ this.setRules(this.getRulesFromMongo(query));
+ },
+
+ /**
+ * Returns a filter identifier from the MongoDB field.
+ * Automatically use the only one filter with a matching field, fires a changer otherwise.
+ * @param {string} field
+ * @param {*} value
+ * @fires module:plugins.MongoDbSupport:changer:getMongoDBFieldID
+ * @returns {string}
+ * @private
+ */
+ getMongoDBFieldID: function(field, value) {
+ var matchingFilters = this.filters.filter(function(filter) {
+ return filter.field === field;
+ });
+
+ var id;
+ if (matchingFilters.length === 1) {
+ id = matchingFilters[0].id;
+ }
+ else {
+ /**
+ * Returns a filter identifier from the MongoDB field
+ * @event changer:getMongoDBFieldID
+ * @memberof module:plugins.MongoDbSupport
+ * @param {string} field
+ * @param {*} value
+ * @returns {string}
+ */
+ id = this.change('getMongoDBFieldID', field, value);
+ }
+
+ return id;
+ },
+
+ /**
+ * Finds which operator is used in a MongoDB sub-object
+ * @param {*} data
+ * @returns {string|undefined}
+ * @private
+ */
+ getMongoOperator: function(data) {
+ if (data !== null && typeof data === 'object') {
+ if (data.$gte !== undefined && data.$lte !== undefined) {
+ return 'between';
+ }
+ if (data.$lt !== undefined && data.$gt !== undefined) {
+ return 'not_between';
+ }
+
+ var knownKeys = Object.keys(data).filter(function(key) {
+ return !!this.settings.mongoRuleOperators[key];
+ }.bind(this));
+
+ if (knownKeys.length === 1) {
+ return knownKeys[0];
+ }
+ }
+ else {
+ return '$eq';
+ }
+ },
+
+
+ /**
+ * Returns the key corresponding to "$or" or "$and"
+ * @param {object} data
+ * @returns {string|undefined}
+ * @private
+ */
+ getMongoCondition: function(data) {
+ var keys = Object.keys(data);
+
+ for (var i = 0, l = keys.length; i < l; i++) {
+ if (keys[i].toLowerCase() === '$or' || keys[i].toLowerCase() === '$and') {
+ return keys[i];
+ }
+ }
+ }
+});
+
+
+/**
+ * @class NotGroup
+ * @memberof module:plugins
+ * @description Adds a "Not" checkbox in front of group conditions.
+ * @param {object} [options]
+ * @param {string} [options.icon_checked='glyphicon glyphicon-checked']
+ * @param {string} [options.icon_unchecked='glyphicon glyphicon-unchecked']
+ */
+QueryBuilder.define('not-group', function(options) {
+ var self = this;
+
+ // Bind events
+ this.on('afterInit', function() {
+ self.$el.on('click.queryBuilder', '[data-not=group]', function() {
+ var $group = $(this).closest(QueryBuilder.selectors.group_container);
+ var group = self.getModel($group);
+ group.not = !group.not;
+ });
+
+ self.model.on('update', function(e, node, field) {
+ if (node instanceof Group && field === 'not') {
+ self.updateGroupNot(node);
+ }
+ });
+ });
+
+ // Init "not" property
+ this.on('afterAddGroup', function(e, group) {
+ group.__.not = false;
+ });
+
+ // Modify templates
+ if (!options.disable_template) {
+ this.on('getGroupTemplate.filter', function(h) {
+ var $h = $(h.value);
+ $h.find(QueryBuilder.selectors.condition_container).prepend(
+ '<button type="button" class="btn btn-xs btn-default" data-not="group">' +
+ '<i class="' + options.icon_unchecked + '"></i> ' + self.translate('NOT') +
+ '</button>'
+ );
+ h.value = $h.prop('outerHTML');
+ });
+ }
+
+ // Export "not" to JSON
+ this.on('groupToJson.filter', function(e, group) {
+ e.value.not = group.not;
+ });
+
+ // Read "not" from JSON
+ this.on('jsonToGroup.filter', function(e, json) {
+ e.value.not = !!json.not;
+ });
+
+ // Export "not" to SQL
+ this.on('groupToSQL.filter', function(e, group) {
+ if (group.not) {
+ e.value = 'NOT ( ' + e.value + ' )';
+ }
+ });
+
+ // Parse "NOT" function from sqlparser
+ this.on('parseSQLNode.filter', function(e) {
+ if (e.value.name && e.value.name.toUpperCase() == 'NOT') {
+ e.value = e.value.arguments.value[0];
+
+ // if the there is no sub-group, create one
+ if (['AND', 'OR'].indexOf(e.value.operation.toUpperCase()) === -1) {
+ e.value = new SQLParser.nodes.Op(
+ self.settings.default_condition,
+ e.value,
+ null
+ );
+ }
+
+ e.value.not = true;
+ }
+ });
+
+ // Request to create sub-group if the "not" flag is set
+ this.on('sqlGroupsDistinct.filter', function(e, group, data, i) {
+ if (data.not && i > 0) {
+ e.value = true;
+ }
+ });
+
+ // Read "not" from parsed SQL
+ this.on('sqlToGroup.filter', function(e, data) {
+ e.value.not = !!data.not;
+ });
+
+ // Export "not" to Mongo
+ this.on('groupToMongo.filter', function(e, group) {
+ var key = '$' + group.condition.toLowerCase();
+ if (group.not && e.value[key]) {
+ e.value = { '$nor': [e.value] };
+ }
+ });
+
+ // Parse "$nor" operator from Mongo
+ this.on('parseMongoNode.filter', function(e) {
+ var keys = Object.keys(e.value);
+
+ if (keys[0] == '$nor') {
+ e.value = e.value[keys[0]][0];
+ e.value.not = true;
+ }
+ });
+
+ // Read "not" from parsed Mongo
+ this.on('mongoToGroup.filter', function(e, data) {
+ e.value.not = !!data.not;
+ });
+}, {
+ icon_unchecked: 'glyphicon glyphicon-unchecked',
+ icon_checked: 'glyphicon glyphicon-check',
+ disable_template: false
+});
+
+/**
+ * From {@link module:plugins.NotGroup}
+ * @name not
+ * @member {boolean}
+ * @memberof Group
+ * @instance
+ */
+Utils.defineModelProperties(Group, ['not']);
+
+QueryBuilder.selectors.group_not = QueryBuilder.selectors.group_header + ' [data-not=group]';
+
+QueryBuilder.extend(/** @lends module:plugins.NotGroup.prototype */ {
+ /**
+ * Performs actions when a group's not changes
+ * @param {Group} group
+ * @fires module:plugins.NotGroup.afterUpdateGroupNot
+ * @private
+ */
+ updateGroupNot: function(group) {
+ var options = this.plugins['not-group'];
+ group.$el.find('>' + QueryBuilder.selectors.group_not)
+ .toggleClass('active', group.not)
+ .find('i').attr('class', group.not ? options.icon_checked : options.icon_unchecked);
+
+ /**
+ * After the group's not flag has been modified
+ * @event afterUpdateGroupNot
+ * @memberof module:plugins.NotGroup
+ * @param {Group} group
+ */
+ this.trigger('afterUpdateGroupNot', group);
+
+ this.trigger('rulesChanged');
+ }
+});
+
+
+/**
+ * @class Sortable
+ * @memberof module:plugins
+ * @description Enables drag & drop sort of rules.
+ * @param {object} [options]
+ * @param {boolean} [options.inherit_no_drop=true]
+ * @param {boolean} [options.inherit_no_sortable=true]
+ * @param {string} [options.icon='glyphicon glyphicon-sort']
+ * @throws MissingLibraryError, ConfigError
+ */
+QueryBuilder.define('sortable', function(options) {
+ if (!('interact' in window)) {
+ Utils.error('MissingLibrary', 'interact.js is required to use "sortable" plugin. Get it here: http://interactjs.io');
+ }
+
+ if (options.default_no_sortable !== undefined) {
+ Utils.error(false, 'Config', 'Sortable plugin : "default_no_sortable" options is deprecated, use standard "default_rule_flags" and "default_group_flags" instead');
+ this.settings.default_rule_flags.no_sortable = this.settings.default_group_flags.no_sortable = options.default_no_sortable;
+ }
+
+ // recompute drop-zones during drag (when a rule is hidden)
+ interact.dynamicDrop(true);
+
+ // set move threshold to 10px
+ interact.pointerMoveTolerance(10);
+
+ var placeholder;
+ var ghost;
+ var src;
+ var moved;
+
+ // Init drag and drop
+ this.on('afterAddRule afterAddGroup', function(e, node) {
+ if (node == placeholder) {
+ return;
+ }
+
+ var self = e.builder;
+
+ // Inherit flags
+ if (options.inherit_no_sortable && node.parent && node.parent.flags.no_sortable) {
+ node.flags.no_sortable = true;
+ }
+ if (options.inherit_no_drop && node.parent && node.parent.flags.no_drop) {
+ node.flags.no_drop = true;
+ }
+
+ // Configure drag
+ if (!node.flags.no_sortable) {
+ interact(node.$el[0])
+ .draggable({
+ allowFrom: QueryBuilder.selectors.drag_handle,
+ onstart: function(event) {
+ moved = false;
+
+ // get model of dragged element
+ src = self.getModel(event.target);
+
+ // create ghost
+ ghost = src.$el.clone()
+ .appendTo(src.$el.parent())
+ .width(src.$el.outerWidth())
+ .addClass('dragging');
+
+ // create drop placeholder
+ var ph = $('<div class="rule-placeholder">&nbsp;</div>')
+ .height(src.$el.outerHeight());
+
+ placeholder = src.parent.addRule(ph, src.getPos());
+
+ // hide dragged element
+ src.$el.hide();
+ },
+ onmove: function(event) {
+ // make the ghost follow the cursor
+ ghost[0].style.top = event.clientY - 15 + 'px';
+ ghost[0].style.left = event.clientX - 15 + 'px';
+ },
+ onend: function(event) {
+ // starting from Interact 1.3.3, onend is called before ondrop
+ if (event.dropzone) {
+ moveSortableToTarget(src, $(event.relatedTarget), self);
+ moved = true;
+ }
+
+ // remove ghost
+ ghost.remove();
+ ghost = undefined;
+
+ // remove placeholder
+ placeholder.drop();
+ placeholder = undefined;
+
+ // show element
+ src.$el.css('display', '');
+
+ /**
+ * After a node has been moved with {@link module:plugins.Sortable}
+ * @event afterMove
+ * @memberof module:plugins.Sortable
+ * @param {Node} node
+ */
+ self.trigger('afterMove', src);
+
+ self.trigger('rulesChanged');
+ }
+ });
+ }
+
+ if (!node.flags.no_drop) {
+ // Configure drop on groups and rules
+ interact(node.$el[0])
+ .dropzone({
+ accept: QueryBuilder.selectors.rule_and_group_containers,
+ ondragenter: function(event) {
+ moveSortableToTarget(placeholder, $(event.target), self);
+ },
+ ondrop: function(event) {
+ if (!moved) {
+ moveSortableToTarget(src, $(event.target), self);
+ }
+ }
+ });
+
+ // Configure drop on group headers
+ if (node instanceof Group) {
+ interact(node.$el.find(QueryBuilder.selectors.group_header)[0])
+ .dropzone({
+ accept: QueryBuilder.selectors.rule_and_group_containers,
+ ondragenter: function(event) {
+ moveSortableToTarget(placeholder, $(event.target), self);
+ },
+ ondrop: function(event) {
+ if (!moved) {
+ moveSortableToTarget(src, $(event.target), self);
+ }
+ }
+ });
+ }
+ }
+ });
+
+ // Detach interactables
+ this.on('beforeDeleteRule beforeDeleteGroup', function(e, node) {
+ if (!e.isDefaultPrevented()) {
+ interact(node.$el[0]).unset();
+
+ if (node instanceof Group) {
+ interact(node.$el.find(QueryBuilder.selectors.group_header)[0]).unset();
+ }
+ }
+ });
+
+ // Remove drag handle from non-sortable items
+ this.on('afterApplyRuleFlags afterApplyGroupFlags', function(e, node) {
+ if (node.flags.no_sortable) {
+ node.$el.find('.drag-handle').remove();
+ }
+ });
+
+ // Modify templates
+ if (!options.disable_template) {
+ this.on('getGroupTemplate.filter', function(h, level) {
+ if (level > 1) {
+ var $h = $(h.value);
+ $h.find(QueryBuilder.selectors.condition_container).after('<div class="drag-handle"><i class="' + options.icon + '"></i></div>');
+ h.value = $h.prop('outerHTML');
+ }
+ });
+
+ this.on('getRuleTemplate.filter', function(h) {
+ var $h = $(h.value);
+ $h.find(QueryBuilder.selectors.rule_header).after('<div class="drag-handle"><i class="' + options.icon + '"></i></div>');
+ h.value = $h.prop('outerHTML');
+ });
+ }
+}, {
+ inherit_no_sortable: true,
+ inherit_no_drop: true,
+ icon: 'glyphicon glyphicon-sort',
+ disable_template: false
+});
+
+QueryBuilder.selectors.rule_and_group_containers = QueryBuilder.selectors.rule_container + ', ' + QueryBuilder.selectors.group_container;
+QueryBuilder.selectors.drag_handle = '.drag-handle';
+
+QueryBuilder.defaults({
+ default_rule_flags: {
+ no_sortable: false,
+ no_drop: false
+ },
+ default_group_flags: {
+ no_sortable: false,
+ no_drop: false
+ }
+});
+
+/**
+ * Moves an element (placeholder or actual object) depending on active target
+ * @memberof module:plugins.Sortable
+ * @param {Node} node
+ * @param {jQuery} target
+ * @param {QueryBuilder} [builder]
+ * @private
+ */
+function moveSortableToTarget(node, target, builder) {
+ var parent, method;
+ var Selectors = QueryBuilder.selectors;
+
+ // on rule
+ parent = target.closest(Selectors.rule_container);
+ if (parent.length) {
+ method = 'moveAfter';
+ }
+
+ // on group header
+ if (!method) {
+ parent = target.closest(Selectors.group_header);
+ if (parent.length) {
+ parent = target.closest(Selectors.group_container);
+ method = 'moveAtBegin';
+ }
+ }
+
+ // on group
+ if (!method) {
+ parent = target.closest(Selectors.group_container);
+ if (parent.length) {
+ method = 'moveAtEnd';
+ }
+ }
+
+ if (method) {
+ node[method](builder.getModel(parent));
+
+ // refresh radio value
+ if (builder && node instanceof Rule) {
+ builder.setRuleInputValue(node, node.value);
+ }
+ }
+}
+
+
+/**
+ * @class SqlSupport
+ * @memberof module:plugins
+ * @description Allows to export rules as a SQL WHERE statement as well as populating the builder from an SQL query.
+ * @param {object} [options]
+ * @param {boolean} [options.boolean_as_integer=true] - `true` to convert boolean values to integer in the SQL output
+ */
+QueryBuilder.define('sql-support', function(options) {
+
+}, {
+ boolean_as_integer: true
+});
+
+QueryBuilder.defaults({
+ // operators for internal -> SQL conversion
+ sqlOperators: {
+ equal: { op: '= ?' },
+ not_equal: { op: '!= ?' },
+ in: { op: 'IN(?)', sep: ', ' },
+ not_in: { op: 'NOT IN(?)', sep: ', ' },
+ less: { op: '< ?' },
+ less_or_equal: { op: '<= ?' },
+ greater: { op: '> ?' },
+ greater_or_equal: { op: '>= ?' },
+ between: { op: 'BETWEEN ?', sep: ' AND ' },
+ not_between: { op: 'NOT BETWEEN ?', sep: ' AND ' },
+ begins_with: { op: 'LIKE(?)', mod: '{0}%' },
+ not_begins_with: { op: 'NOT LIKE(?)', mod: '{0}%' },
+ contains: { op: 'LIKE(?)', mod: '%{0}%' },
+ not_contains: { op: 'NOT LIKE(?)', mod: '%{0}%' },
+ ends_with: { op: 'LIKE(?)', mod: '%{0}' },
+ not_ends_with: { op: 'NOT LIKE(?)', mod: '%{0}' },
+ is_empty: { op: '= \'\'' },
+ is_not_empty: { op: '!= \'\'' },
+ is_null: { op: 'IS NULL' },
+ is_not_null: { op: 'IS NOT NULL' }
+ },
+
+ // operators for SQL -> internal conversion
+ sqlRuleOperator: {
+ '=': function(v) {
+ return {
+ val: v,
+ op: v === '' ? 'is_empty' : 'equal'
+ };
+ },
+ '!=': function(v) {
+ return {
+ val: v,
+ op: v === '' ? 'is_not_empty' : 'not_equal'
+ };
+ },
+ 'LIKE': function(v) {
+ if (v.slice(0, 1) == '%' && v.slice(-1) == '%') {
+ return {
+ val: v.slice(1, -1),
+ op: 'contains'
+ };
+ }
+ else if (v.slice(0, 1) == '%') {
+ return {
+ val: v.slice(1),
+ op: 'ends_with'
+ };
+ }
+ else if (v.slice(-1) == '%') {
+ return {
+ val: v.slice(0, -1),
+ op: 'begins_with'
+ };
+ }
+ else {
+ Utils.error('SQLParse', 'Invalid value for LIKE operator "{0}"', v);
+ }
+ },
+ 'NOT LIKE': function(v) {
+ if (v.slice(0, 1) == '%' && v.slice(-1) == '%') {
+ return {
+ val: v.slice(1, -1),
+ op: 'not_contains'
+ };
+ }
+ else if (v.slice(0, 1) == '%') {
+ return {
+ val: v.slice(1),
+ op: 'not_ends_with'
+ };
+ }
+ else if (v.slice(-1) == '%') {
+ return {
+ val: v.slice(0, -1),
+ op: 'not_begins_with'
+ };
+ }
+ else {
+ Utils.error('SQLParse', 'Invalid value for NOT LIKE operator "{0}"', v);
+ }
+ },
+ 'IN': function(v) {
+ return { val: v, op: 'in' };
+ },
+ 'NOT IN': function(v) {
+ return { val: v, op: 'not_in' };
+ },
+ '<': function(v) {
+ return { val: v, op: 'less' };
+ },
+ '<=': function(v) {
+ return { val: v, op: 'less_or_equal' };
+ },
+ '>': function(v) {
+ return { val: v, op: 'greater' };
+ },
+ '>=': function(v) {
+ return { val: v, op: 'greater_or_equal' };
+ },
+ 'BETWEEN': function(v) {
+ return { val: v, op: 'between' };
+ },
+ 'NOT BETWEEN': function(v) {
+ return { val: v, op: 'not_between' };
+ },
+ 'IS': function(v) {
+ if (v !== null) {
+ Utils.error('SQLParse', 'Invalid value for IS operator');
+ }
+ return { val: null, op: 'is_null' };
+ },
+ 'IS NOT': function(v) {
+ if (v !== null) {
+ Utils.error('SQLParse', 'Invalid value for IS operator');
+ }
+ return { val: null, op: 'is_not_null' };
+ }
+ },
+
+ // statements for internal -> SQL conversion
+ sqlStatements: {
+ 'question_mark': function() {
+ var params = [];
+ return {
+ add: function(rule, value) {
+ params.push(value);
+ return '?';
+ },
+ run: function() {
+ return params;
+ }
+ };
+ },
+
+ 'numbered': function(char) {
+ if (!char || char.length > 1) char = '$';
+ var index = 0;
+ var params = [];
+ return {
+ add: function(rule, value) {
+ params.push(value);
+ index++;
+ return char + index;
+ },
+ run: function() {
+ return params;
+ }
+ };
+ },
+
+ 'named': function(char) {
+ if (!char || char.length > 1) char = ':';
+ var indexes = {};
+ var params = {};
+ return {
+ add: function(rule, value) {
+ if (!indexes[rule.field]) indexes[rule.field] = 1;
+ var key = rule.field + '_' + (indexes[rule.field]++);
+ params[key] = value;
+ return char + key;
+ },
+ run: function() {
+ return params;
+ }
+ };
+ }
+ },
+
+ // statements for SQL -> internal conversion
+ sqlRuleStatement: {
+ 'question_mark': function(values) {
+ var index = 0;
+ return {
+ parse: function(v) {
+ return v == '?' ? values[index++] : v;
+ },
+ esc: function(sql) {
+ return sql.replace(/\?/g, '\'?\'');
+ }
+ };
+ },
+
+ 'numbered': function(values, char) {
+ if (!char || char.length > 1) char = '$';
+ var regex1 = new RegExp('^\\' + char + '[0-9]+$');
+ var regex2 = new RegExp('\\' + char + '([0-9]+)', 'g');
+ return {
+ parse: function(v) {
+ return regex1.test(v) ? values[v.slice(1) - 1] : v;
+ },
+ esc: function(sql) {
+ return sql.replace(regex2, '\'' + (char == '$' ? '$$' : char) + '$1\'');
+ }
+ };
+ },
+
+ 'named': function(values, char) {
+ if (!char || char.length > 1) char = ':';
+ var regex1 = new RegExp('^\\' + char);
+ var regex2 = new RegExp('\\' + char + '(' + Object.keys(values).join('|') + ')', 'g');
+ return {
+ parse: function(v) {
+ return regex1.test(v) ? values[v.slice(1)] : v;
+ },
+ esc: function(sql) {
+ return sql.replace(regex2, '\'' + (char == '$' ? '$$' : char) + '$1\'');
+ }
+ };
+ }
+ }
+});
+
+/**
+ * @typedef {object} SqlQuery
+ * @memberof module:plugins.SqlSupport
+ * @property {string} sql
+ * @property {object} params
+ */
+
+QueryBuilder.extend(/** @lends module:plugins.SqlSupport.prototype */ {
+ /**
+ * Returns rules as a SQL query
+ * @param {boolean|string} [stmt] - use prepared statements: false, 'question_mark', 'numbered', 'numbered(@)', 'named', 'named(@)'
+ * @param {boolean} [nl=false] output with new lines
+ * @param {object} [data] - current rules by default
+ * @returns {module:plugins.SqlSupport.SqlQuery}
+ * @fires module:plugins.SqlSupport.changer:getSQLField
+ * @fires module:plugins.SqlSupport.changer:ruleToSQL
+ * @fires module:plugins.SqlSupport.changer:groupToSQL
+ * @throws UndefinedSQLConditionError, UndefinedSQLOperatorError
+ */
+ getSQL: function(stmt, nl, data) {
+ data = (data === undefined) ? this.getRules() : data;
+
+ if (!data) {
+ return null;
+ }
+
+ nl = !!nl ? '\n' : ' ';
+ var boolean_as_integer = this.getPluginOptions('sql-support', 'boolean_as_integer');
+
+ if (stmt === true) {
+ stmt = 'question_mark';
+ }
+ if (typeof stmt == 'string') {
+ var config = getStmtConfig(stmt);
+ stmt = this.settings.sqlStatements[config[1]](config[2]);
+ }
+
+ var self = this;
+
+ var sql = (function parse(group) {
+ if (!group.condition) {
+ group.condition = self.settings.default_condition;
+ }
+ if (['AND', 'OR'].indexOf(group.condition.toUpperCase()) === -1) {
+ Utils.error('UndefinedSQLCondition', 'Unable to build SQL query with condition "{0}"', group.condition);
+ }
+
+ if (!group.rules) {
+ return '';
+ }
+
+ var parts = [];
+
+ group.rules.forEach(function(rule) {
+ if (rule.rules && rule.rules.length > 0) {
+ parts.push('(' + nl + parse(rule) + nl + ')' + nl);
+ }
+ else {
+ var sql = self.settings.sqlOperators[rule.operator];
+ var ope = self.getOperatorByType(rule.operator);
+ var value = '';
+
+ if (sql === undefined) {
+ Utils.error('UndefinedSQLOperator', 'Unknown SQL operation for operator "{0}"', rule.operator);
+ }
+
+ if (ope.nb_inputs !== 0) {
+ if (!(rule.value instanceof Array)) {
+ rule.value = [rule.value];
+ }
+
+ rule.value.forEach(function(v, i) {
+ if (i > 0) {
+ if (rule.type === 'map') {
+ value += "|";
+ } else {
+ value += sql.sep;
+ }
+ }
+
+ if (rule.type == 'boolean' && boolean_as_integer) {
+ v = v ? 1 : 0;
+ }
+ else if (!stmt && rule.type !== 'integer' && rule.type !== 'double' && rule.type !== 'boolean') {
+ v = Utils.escapeString(v);
+ }
+
+ if (rule.type == 'datetime') {
+ if (!('moment' in window)) {
+ Utils.error('MissingLibrary', 'MomentJS is required for Date/Time validation. Get it here http://momentjs.com');
+ }
+ v = moment(v, 'YYYY/MM/DD HH:mm:ss').utc().unix();
+ }
+
+ if (sql.mod) {
+ if ((rule.type !== 'map') || (rule.type === 'map' && i > 0)) {
+ v = Utils.fmt(sql.mod, v);
+ }
+ }
+
+ if (stmt) {
+ value += stmt.add(rule, v);
+ }
+ else {
+ if ( rule.type === 'map') {
+ if(i > 0) {
+ value += v;
+ value = '\'' + value + '\'';
+ } else{
+ value += v;
+ }
+ } else {
+ if (typeof v == 'string') {
+ v = '\'' + v + '\'';
+ }
+ value += v;
+ }
+ }
+ });
+ }
+
+ var sqlFn = function(v) {
+ return sql.op.replace('?', function() {
+ return v;
+ });
+ };
+
+ /**
+ * Modifies the SQL field used by a rule
+ * @event changer:getSQLField
+ * @memberof module:plugins.SqlSupport
+ * @param {string} field
+ * @param {Rule} rule
+ * @returns {string}
+ */
+ var field = self.change('getSQLField', rule.field, rule);
+
+ var ruleExpression = field + ' ' + sqlFn(value);
+
+ /**
+ * Modifies the SQL generated for a rule
+ * @event changer:ruleToSQL
+ * @memberof module:plugins.SqlSupport
+ * @param {string} expression
+ * @param {Rule} rule
+ * @param {*} value
+ * @param {function} valueWrapper - function that takes the value and adds the operator
+ * @returns {string}
+ */
+ parts.push(self.change('ruleToSQL', ruleExpression, rule, value, sqlFn));
+ }
+ });
+
+ var groupExpression = parts.join(' ' + group.condition + nl);
+
+ /**
+ * Modifies the SQL generated for a group
+ * @event changer:groupToSQL
+ * @memberof module:plugins.SqlSupport
+ * @param {string} expression
+ * @param {Group} group
+ * @returns {string}
+ */
+ return self.change('groupToSQL', groupExpression, group);
+ }(data));
+
+ if (stmt) {
+ return {
+ sql: sql,
+ params: stmt.run()
+ };
+ }
+ else {
+ return {
+ sql: sql
+ };
+ }
+ },
+
+ /**
+ * Convert a SQL query to rules
+ * @param {string|module:plugins.SqlSupport.SqlQuery} query
+ * @param {boolean|string} stmt
+ * @returns {object}
+ * @fires module:plugins.SqlSupport.changer:parseSQLNode
+ * @fires module:plugins.SqlSupport.changer:getSQLFieldID
+ * @fires module:plugins.SqlSupport.changer:sqlToRule
+ * @fires module:plugins.SqlSupport.changer:sqlToGroup
+ * @throws MissingLibraryError, SQLParseError, UndefinedSQLOperatorError
+ */
+ getRulesFromSQL: function(query, stmt) {
+ if (!('SQLParser' in window)) {
+ Utils.error('MissingLibrary', 'SQLParser is required to parse SQL queries. Get it here https://github.com/mistic100/sql-parser');
+ }
+
+ var self = this;
+
+ if (typeof query == 'string') {
+ query = { sql: query };
+ }
+
+ if (stmt === true) stmt = 'question_mark';
+ if (typeof stmt == 'string') {
+ var config = getStmtConfig(stmt);
+ stmt = this.settings.sqlRuleStatement[config[1]](query.params, config[2]);
+ }
+
+ if (stmt) {
+ query.sql = stmt.esc(query.sql);
+ }
+
+ if (query.sql.toUpperCase().indexOf('SELECT') !== 0) {
+ query.sql = 'SELECT * FROM table WHERE ' + query.sql;
+ }
+
+ var parsed = SQLParser.parse(query.sql);
+
+ if (!parsed.where) {
+ Utils.error('SQLParse', 'No WHERE clause found');
+ }
+
+ /**
+ * Custom parsing of an AST node generated by SQLParser, you can return a sub-part of the tree, or a well formed group or rule JSON
+ * @event changer:parseSQLNode
+ * @memberof module:plugins.SqlSupport
+ * @param {object} AST node
+ * @returns {object} tree, rule or group
+ */
+ var data = self.change('parseSQLNode', parsed.where.conditions);
+
+ // a plugin returned a group
+ if ('rules' in data && 'condition' in data) {
+ return data;
+ }
+
+ // a plugin returned a rule
+ if ('id' in data && 'operator' in data && 'value' in data) {
+ return {
+ condition: this.settings.default_condition,
+ rules: [data]
+ };
+ }
+
+ // create root group
+ var out = self.change('sqlToGroup', {
+ condition: this.settings.default_condition,
+ rules: []
+ }, data);
+
+ // keep track of current group
+ var curr = out;
+
+ (function flatten(data, i) {
+ if (data === null) {
+ return;
+ }
+
+ // allow plugins to manually parse or handle special cases
+ data = self.change('parseSQLNode', data);
+
+ // a plugin returned a group
+ if ('rules' in data && 'condition' in data) {
+ curr.rules.push(data);
+ return;
+ }
+
+ // a plugin returned a rule
+ if ('id' in data && 'operator' in data && 'value' in data) {
+ curr.rules.push(data);
+ return;
+ }
+
+ // data must be a SQL parser node
+ if (!('left' in data) || !('right' in data) || !('operation' in data)) {
+ Utils.error('SQLParse', 'Unable to parse WHERE clause');
+ }
+
+ // it's a node
+ if (['AND', 'OR'].indexOf(data.operation.toUpperCase()) !== -1) {
+ // create a sub-group if the condition is not the same and it's not the first level
+
+ /**
+ * Given an existing group and an AST node, determines if a sub-group must be created
+ * @event changer:sqlGroupsDistinct
+ * @memberof module:plugins.SqlSupport
+ * @param {boolean} create - true by default if the group condition is different
+ * @param {object} group
+ * @param {object} AST
+ * @param {int} current group level
+ * @returns {boolean}
+ */
+ var createGroup = self.change('sqlGroupsDistinct', i > 0 && curr.condition != data.operation.toUpperCase(), curr, data, i);
+
+ if (createGroup) {
+ /**
+ * Modifies the group generated from the SQL expression (this is called before the group is filled with rules)
+ * @event changer:sqlToGroup
+ * @memberof module:plugins.SqlSupport
+ * @param {object} group
+ * @param {object} AST
+ * @returns {object}
+ */
+ var group = self.change('sqlToGroup', {
+ condition: self.settings.default_condition,
+ rules: []
+ }, data);
+
+ curr.rules.push(group);
+ curr = group;
+ }
+
+ curr.condition = data.operation.toUpperCase();
+ i++;
+
+ // some magic !
+ var next = curr;
+ flatten(data.left, i);
+
+ curr = next;
+ flatten(data.right, i);
+ }
+ // it's a leaf
+ else {
+ if ($.isPlainObject(data.right.value)) {
+ Utils.error('SQLParse', 'Value format not supported for {0}.', data.left.value);
+ }
+
+ // convert array
+ var value;
+ if ($.isArray(data.right.value)) {
+ value = data.right.value.map(function(v) {
+ return v.value;
+ });
+ }
+ else {
+ value = data.right.value;
+ }
+
+ // get actual values
+ if (stmt) {
+ if ($.isArray(value)) {
+ value = value.map(stmt.parse);
+ }
+ else {
+ value = stmt.parse(value);
+ }
+ }
+
+ // convert operator
+ var operator = data.operation.toUpperCase();
+ if (operator == '<>') {
+ operator = '!=';
+ }
+
+ var sqlrl = self.settings.sqlRuleOperator[operator];
+ if (sqlrl === undefined) {
+ Utils.error('UndefinedSQLOperator', 'Invalid SQL operation "{0}".', data.operation);
+ }
+
+ // find field name
+ var field;
+ if ('values' in data.left) {
+ field = data.left.values.join('.');
+ }
+ else if ('value' in data.left) {
+ field = data.left.value;
+ }
+ else {
+ Utils.error('SQLParse', 'Cannot find field name in {0}', JSON.stringify(data.left));
+ }
+
+ var matchingFilter = self.filters.filter(function(filter) {
+ return filter.field.toLowerCase() === field.toLowerCase();
+ });
+
+ var opVal;
+ if(matchingFilter && matchingFilter[0].type === 'map') {
+ var tempVal = value.split('|')
+ opVal = sqlrl.call(this, tempVal[1], data.operation);
+ opVal.val = tempVal[0] + '|' + opVal.val;
+ } else {
+ opVal = sqlrl.call(this, value, data.operation);
+ }
+
+ var id = self.getSQLFieldID(field, value);
+
+ /**
+ * Modifies the rule generated from the SQL expression
+ * @event changer:sqlToRule
+ * @memberof module:plugins.SqlSupport
+ * @param {object} rule
+ * @param {object} AST
+ * @returns {object}
+ */
+ var rule = self.change('sqlToRule', {
+ id: id,
+ field: field,
+ operator: opVal.op,
+ value: opVal.val
+ }, data);
+
+ curr.rules.push(rule);
+ }
+ }(data, 0));
+
+ return out;
+ },
+
+ /**
+ * Sets the builder's rules from a SQL query
+ * @see module:plugins.SqlSupport.getRulesFromSQL
+ */
+ setRulesFromSQL: function(query, stmt) {
+ this.setRules(this.getRulesFromSQL(query, stmt));
+ },
+
+ /**
+ * Returns a filter identifier from the SQL field.
+ * Automatically use the only one filter with a matching field, fires a changer otherwise.
+ * @param {string} field
+ * @param {*} value
+ * @fires module:plugins.SqlSupport:changer:getSQLFieldID
+ * @returns {string}
+ * @private
+ */
+ getSQLFieldID: function(field, value) {
+ var matchingFilters = this.filters.filter(function(filter) {
+ return filter.field.toLowerCase() === field.toLowerCase();
+ });
+
+ var id;
+ if (matchingFilters.length === 1) {
+ id = matchingFilters[0].id;
+ }
+ else {
+ /**
+ * Returns a filter identifier from the SQL field
+ * @event changer:getSQLFieldID
+ * @memberof module:plugins.SqlSupport
+ * @param {string} field
+ * @param {*} value
+ * @returns {string}
+ */
+ id = this.change('getSQLFieldID', field, value);
+ }
+
+ return id;
+ }
+});
+
+/**
+ * Parses the statement configuration
+ * @memberof module:plugins.SqlSupport
+ * @param {string} stmt
+ * @returns {Array} null, mode, option
+ * @private
+ */
+function getStmtConfig(stmt) {
+ var config = stmt.match(/(question_mark|numbered|named)(?:\((.)\))?/);
+ if (!config) config = [null, 'question_mark', undefined];
+ return config;
+}
+
+
+/**
+ * @class UniqueFilter
+ * @memberof module:plugins
+ * @description Allows to define some filters as "unique": ie which can be used for only one rule, globally or in the same group.
+ */
+QueryBuilder.define('unique-filter', function() {
+ this.status.used_filters = {};
+
+ this.on('afterUpdateRuleFilter', this.updateDisabledFilters);
+ this.on('afterDeleteRule', this.updateDisabledFilters);
+ this.on('afterCreateRuleFilters', this.applyDisabledFilters);
+ this.on('afterReset', this.clearDisabledFilters);
+ this.on('afterClear', this.clearDisabledFilters);
+
+ // Ensure that the default filter is not already used if unique
+ this.on('getDefaultFilter.filter', function(e, model) {
+ var self = e.builder;
+
+ self.updateDisabledFilters();
+
+ if (e.value.id in self.status.used_filters) {
+ var found = self.filters.some(function(filter) {
+ if (!(filter.id in self.status.used_filters) || self.status.used_filters[filter.id].length > 0 && self.status.used_filters[filter.id].indexOf(model.parent) === -1) {
+ e.value = filter;
+ return true;
+ }
+ });
+
+ if (!found) {
+ Utils.error(false, 'UniqueFilter', 'No more non-unique filters available');
+ e.value = undefined;
+ }
+ }
+ });
+});
+
+QueryBuilder.extend(/** @lends module:plugins.UniqueFilter.prototype */ {
+ /**
+ * Updates the list of used filters
+ * @param {$.Event} [e]
+ * @private
+ */
+ updateDisabledFilters: function(e) {
+ var self = e ? e.builder : this;
+
+ self.status.used_filters = {};
+
+ if (!self.model) {
+ return;
+ }
+
+ // get used filters
+ (function walk(group) {
+ group.each(function(rule) {
+ if (rule.filter && rule.filter.unique) {
+ if (!self.status.used_filters[rule.filter.id]) {
+ self.status.used_filters[rule.filter.id] = [];
+ }
+ if (rule.filter.unique == 'group') {
+ self.status.used_filters[rule.filter.id].push(rule.parent);
+ }
+ }
+ }, function(group) {
+ walk(group);
+ });
+ }(self.model.root));
+
+ self.applyDisabledFilters(e);
+ },
+
+ /**
+ * Clear the list of used filters
+ * @param {$.Event} [e]
+ * @private
+ */
+ clearDisabledFilters: function(e) {
+ var self = e ? e.builder : this;
+
+ self.status.used_filters = {};
+
+ self.applyDisabledFilters(e);
+ },
+
+ /**
+ * Disabled filters depending on the list of used ones
+ * @param {$.Event} [e]
+ * @private
+ */
+ applyDisabledFilters: function(e) {
+ var self = e ? e.builder : this;
+
+ // re-enable everything
+ self.$el.find(QueryBuilder.selectors.filter_container + ' option').prop('disabled', false);
+
+ // disable some
+ $.each(self.status.used_filters, function(filterId, groups) {
+ if (groups.length === 0) {
+ self.$el.find(QueryBuilder.selectors.filter_container + ' option[value="' + filterId + '"]:not(:selected)').prop('disabled', true);
+ }
+ else {
+ groups.forEach(function(group) {
+ group.each(function(rule) {
+ rule.$el.find(QueryBuilder.selectors.filter_container + ' option[value="' + filterId + '"]:not(:selected)').prop('disabled', true);
+ });
+ });
+ }
+ });
+
+ // update Selectpicker
+ if (self.settings.plugins && self.settings.plugins['bt-selectpicker']) {
+ self.$el.find(QueryBuilder.selectors.rule_filter).selectpicker('render');
+ }
+ }
+});
+
+
+/*!
+ * jQuery QueryBuilder 2.5.2
+ * Locale: English (en)
+ * Author: Damien "Mistic" Sorel, http://www.strangeplanet.fr
+ * Licensed under MIT (https://opensource.org/licenses/MIT)
+ */
+
+QueryBuilder.regional['en'] = {
+ "__locale": "English (en)",
+ "__author": "Damien \"Mistic\" Sorel, http://www.strangeplanet.fr",
+ "add_rule": "Add rule",
+ "add_group": "Add group",
+ "delete_rule": "Delete",
+ "delete_group": "Delete",
+ "conditions": {
+ "AND": "AND",
+ "OR": "OR"
+ },
+ "operators": {
+ "equal": "equal",
+ "not_equal": "not equal",
+ "in": "in",
+ "not_in": "not in",
+ "less": "less",
+ "less_or_equal": "less or equal",
+ "greater": "greater",
+ "greater_or_equal": "greater or equal",
+ "between": "between",
+ "not_between": "not between",
+ "begins_with": "begins with",
+ "not_begins_with": "doesn't begin with",
+ "contains": "contains",
+ "not_contains": "doesn't contain",
+ "ends_with": "ends with",
+ "not_ends_with": "doesn't end with",
+ "is_empty": "is empty",
+ "is_not_empty": "is not empty",
+ "is_null": "is null",
+ "is_not_null": "is not null"
+ },
+ "errors": {
+ "no_filter": "No filter selected",
+ "empty_group": "The group is empty",
+ "radio_empty": "No value selected",
+ "checkbox_empty": "No value selected",
+ "select_empty": "No value selected",
+ "string_empty": "Empty value",
+ "string_exceed_min_length": "Must contain at least {0} characters",
+ "string_exceed_max_length": "Must not contain more than {0} characters",
+ "string_invalid_format": "Invalid format ({0})",
+ "number_nan": "Not a number",
+ "number_not_integer": "Not an integer",
+ "number_not_double": "Not a real number",
+ "number_exceed_min": "Must be greater than {0}",
+ "number_exceed_max": "Must be lower than {0}",
+ "number_wrong_step": "Must be a multiple of {0}",
+ "number_between_invalid": "Invalid values, {0} is greater than {1}",
+ "datetime_empty": "Empty value",
+ "datetime_invalid": "Invalid date format ({0})",
+ "datetime_exceed_min": "Must be after {0}",
+ "datetime_exceed_max": "Must be before {0}",
+ "datetime_between_invalid": "Invalid values, {0} is greater than {1}",
+ "boolean_not_valid": "Not a boolean",
+ "operator_not_multiple": "Operator \"{1}\" cannot accept multiple values"
+ },
+ "invert": "Invert",
+ "NOT": "NOT"
+};
+
+QueryBuilder.defaults({ lang_code: 'en' });
+return QueryBuilder;
+
+})); \ No newline at end of file
diff --git a/src/main/resources/META-INF/resources/designer/partials/menu.html b/src/main/resources/META-INF/resources/designer/partials/menu.html
index d3ffe3861..b8db03470 100644
--- a/src/main/resources/META-INF/resources/designer/partials/menu.html
+++ b/src/main/resources/META-INF/resources/designer/partials/menu.html
@@ -99,14 +99,6 @@
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
-
- <li ng-repeat="section in tabs[dropDownName]"
- ng-if="section.name==='Create CL'"><a
- id="{{section.name}}" role="presentation"
- ng-click="emptyMenuClick(section.link,section.name)"
- ng-class="{true:'ThisLink', false:''}[!(userInfo['permissionUpdateCl'])]">{{section.name}}</a>
- </li>
-
<li ng-repeat="section in tabs[dropDownName]"
ng-if="section.name==='Open CL'"><a
id="{{section.name}}" role="presentation"
@@ -114,7 +106,7 @@
</li>
<li ng-repeat="section in tabs[dropDownName]"
- ng-if="section.name != 'Create CL' && section.name != 'Open CL' && section.name != 'ECOMP User Guide - Design Overview' && section.name != 'ECOMP User Guide - Closed Loop Design' && section.name != 'ECOMP User Guide - CLAMP' && section.name != 'User Info'"><a
+ ng-if="section.name != 'Open CL' && section.name != 'ECOMP User Guide - Design Overview' && section.name != 'ECOMP User Guide - Closed Loop Design' && section.name != 'ECOMP User Guide - CLAMP' && section.name != 'User Info'"><a
id="{{section.name}}" role="presentation"
ng-click="emptyMenuClick(section.link,section.name)"
class="ThisLink">{{section.name}}</a>
diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/clds_create_model_off_Template.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/clds_create_model_off_Template.html
deleted file mode 100644
index b2698a7ff..000000000
--- a/src/main/resources/META-INF/resources/designer/partials/portfolios/clds_create_model_off_Template.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
- ============LICENSE_START=======================================================
- ONAP CLAMP
- ================================================================================
- Copyright (C) 2017 AT&T Intellectual Property. All rights
- reserved.
- ================================================================================
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ============LICENSE_END============================================
- ===================================================================
-
- -->
-
-<div attribute-test="cldsmodelofftemplate" id="configure-widgets">
- <div attribute-test="cldsmodelofftemplate" class="modal-header">
- <button type="button" class="close" ng-click="close(false)" aria-hidden="true" style="margin-top: -3px">&times;</button>
- <h4>Model Creation</h4>
- </div>
- <div attribute-test="cldsmodelofftemplate" class="modal-body" >
-
- <ul style="margin-bottom:15px;" class="nav nav-tabs">
- <li ng-class="{active : typeModel == 'template'}" ng-click="setTypeModel('template');"><a href="#">Template</a></li>
- <li ng-class="{active : typeModel == 'clone'}" ng-click="setTypeModel('clone');"><a href="#">Clone</a></li>
- </ul>
- <div ng-show="error.flag">{{error.message}} </div>
- <div ng-show="(typeModel=='template')">
- <form name="model" class="form-horizontal" novalidate>
- <div class="form-group">
- <label for="modelName" class="col-sm-3 control-label">Model Name</label>
- <div class="col-sm-8">
- <input type="text" class="form-control" id="modelName" name="modelName" ng-model="modelName" placeholder="Model Name" ng-change="checkExisting();" autofocus="autofocus" ng-pattern="/^\s*[\w\-]*\s*$/" required ng-trim="true">
- <div role="alert"><span ng-show="model.modelName.$error.pattern" style="color: red">Special Characters are not allowed in Model name.</span> <span ng-show="nameinUse" style="color: red"> Model Name Already In Use</span></div>
- </div>
- </div>
- <div class="form-group">
- <label for="modelName" class="col-sm-3 control-label">Templates</label>
- <div class="col-sm-8">
- <select class="form-control" id="templateName" name="templateName" autofocus="autofocus" required ng-trim="true">
- <option ng-repeat="x in templateNamel" value="{{x}}">{{x}}</option>
- </select>
- </div>
- </div>
- </form>
- </div>
- <div ng-show="(typeModel=='clone')">
- <form name="model" class="form-horizontal" novalidate>
- <div class="form-group">
- <label for="modelName" class="col-sm-3 control-label">Model Name</label>
- <div class="col-sm-8">
- <input type="text" class="form-control" id="modelName" name="modelName" ng-model="modelName" placeholder="Model Name" ng-change="checkExisting()" autofocus="autofocus" ng-pattern="/^\s*[\w\-]*\s*$/" required ng-trim="true">
- <div role="alert"><span ng-show="model.modelName.$error.pattern" style="color: red">Special Characters are not allowed in Model name.</span> <span ng-show="nameinUse" style="color: red"> Model Name Already In Use</span></div>
- </div>
- </div>
- <div class="form-group">
- <label for="modelName" class="col-sm-3 control-label">Clone</label>
- <div class="col-sm-8">
- <select class="form-control" id="modelList" name="modelList" autofocus="autofocus" required ng-trim="true">
- <option ng-repeat="x in modelNamel" value="{{x}}">{{x}}</option>
- </select>
- </div>
- </div>
- </form>
- </div>
- </div>
- <div ng-show="(typeModel=='template')">
- <div class="modal-footer">
- <button ng-click="createNewModelOffTemplate(model)" class="btn btn-primary" ng-disabled="spcl || nameinUse" class="btn btn-primary">Create</button>
- <button ng-click="close(true)" class="btn btn-primary">Cancel</button>
- </div>
- </div>
- <div ng-show="(typeModel=='clone')">
- <div class="modal-footer">
- <button ng-click="cloneModel()" class="btn btn-primary" ng-disabled="model.modelName.$error.pattern || nameinUse" class="btn btn-primary">Clone</button>
- <button ng-click="close(true)" class="btn btn-primary">Cancel</button>
- </div>
- </div>
-</div> \ No newline at end of file
diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/global_properties.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/global_properties.html
index 811f6b716..c47e90a49 100644
--- a/src/main/resources/META-INF/resources/designer/partials/portfolios/global_properties.html
+++ b/src/main/resources/META-INF/resources/designer/partials/portfolios/global_properties.html
@@ -48,28 +48,6 @@
<div>
<div class="form-group clearfix">
- <label for="services" class="col-sm-4 control-label">Services</label>
-
- <div class="col-sm-8">
- <select class="form-control" name="service" id="service"
- onchange="propChangeAlert(this);">
- <!-- <option ng-repeat="(key, value) in services" value="{{key}}">{{value}}</option> -->
- </select>
- </div>
- </div>
- <div class="form-group clearfix">
- <label for="vf" class="col-sm-4 control-label"> Resource-VF</label>
-
- <div class="col-sm-8">
- <select class="form-control" id="vf" name="vf"
- onchange="propChangeAlert(this);">
-
- </select>
-
- </div>
- </div>
-
- <div class="form-group clearfix">
<label for="actionSet" class="col-sm-4 control-label">
Action Set</label>
@@ -125,63 +103,8 @@
<script>
//display message only if global was previously saved
- serDiff = false;
- vfDiff = false;
asDiff = false;
- (function() {
- $("#paramsWarn").hide();
- /*Below service method is called for checking the service is being loaded or not*/
- var intialize = intializeService;
- function intializeService() {
- $("#service").off('focus').off('change');
- $("#service").on('change', function() {
- var chosen = $(this).val();
- (function(spinner) {
- $("#ridinSpinners").show();
- setTimeout(spinner, 1);
- })(function() {
- loadSharedPropertyByService(chosen, null, intialize);
- if (elementMap["global"]) {
- if ($("#vf").val() == oldVf) {
- vfDiff = false;
- if ((!vfDiff) && (!asDiff) && (!serDiff)) {
- $(".propChangeWarn").hide();
- }
- ;
- } else {
- vfDiff = true;
- $(".propChangeWarn").show();
- }
- }
- $("#ridinSpinners").hide();
- });
- });
- }
- loadSharedPropertyByService(undefined, null, intialize);
- intializeService();
- $("#paramsRetry").on('click', function() {
- //$("#paramsWarn").hide();
- var currentValue = $("#service").val();
- $("#ridinSpinners").css("display", "")
- var bool = loadSharedPropertyByService(currentValue);
- $("#ridinSpinners").css("display", "none")
- });
- $("#paramsCancel").on('click', function() {
- loadSharedPropertyByServiceProperties();
- $("#paramsWarn").hide();
- });
- })();
- $(function() {
- if (elementMap["global"]) {
- for (var i = 0; i < elementMap["global"].length; i++) {
- if (elementMap["global"][i]["name"] == "vf") {
- oldVf = elementMap["global"][i]["value"];
- }
- }
- } else {
- oldVf = "";
- }
- });
+
function propChangeAlert(actionset) {
//throw warnings only if options were previously chosen
if (elementMap["global"]) {
@@ -191,12 +114,8 @@
if (elementMap["global"][i]["value"][0] == actionset.value) {
if (elementMap["global"][i]["name"] == "actionSet") {
asDiff = false;
- } else if (elementMap["global"][i]["name"] == "service") {
- serDiff = false;
- } else if (elementMap["global"][i]["name"] == "vf") {
- vfDiff = false;
}
- if ((!vfDiff) && (!asDiff) && (!serDiff)) {
+ if (!asDiff) {
$(".propChangeWarn").hide();
}
;
@@ -204,12 +123,7 @@
} else {
if (elementMap["global"][i]["name"] == "actionSet") {
asDiff = true;
- } else if (elementMap["global"][i]["name"] == "service") {
- serDiff = true;
- } else if (elementMap["global"][i]["name"] == "vf") {
- vfDiff = true;
- }
- ;
+ };
$(".propChangeWarn").show();
}
break loop1;
diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/refresh_asdc.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/refresh_asdc.html
deleted file mode 100644
index 441766d42..000000000
--- a/src/main/resources/META-INF/resources/designer/partials/portfolios/refresh_asdc.html
+++ /dev/null
@@ -1,146 +0,0 @@
-<!--
- ============LICENSE_START=======================================================
- ONAP CLAMP
- ================================================================================
- Copyright (C) 2017 AT&T Intellectual Property. All rights
- reserved.
- ================================================================================
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ============LICENSE_END============================================
- ===================================================================
-
- -->
-
-<style>
-#paramsWarnrefresh {
- display: none;
-}
-
-</style>
-<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
-<div attribute-test="refreshasdc" id="configure-widgets">
- <div attribute-test="refreshasdch" class="modal-header">
- <button type="button" class="close" ng-click="close(false)"
- aria-hidden="true" style="margin-top: -3px">&times;</button>
- <h4>Model Properties</h4>
- </div>
- <div class="modal-body" style="height: 280px">
- <div style="height: 10px"></div>
- <div class="alert alert-danger refreshASDC" role="alert" id='paramsWarnrefresh'>
- <strong>Ooops!</strong> Unable to load properties for <span id='servName'>. Would you like to</span>
- <a href="javascript:void(0);" ng-click="paramsRetry();" class="btn-link" id='paramsRetry'>Retry </a> /
- <a href="javascript:void(0);" ng-click="paramsCancel();" class="btn-link" id='paramsCancel'>Cancel</a>
- </div>
- <form id="saveProps" >
- <div>
-
- <div class="form-group">
- <label for="services" class="col-sm-4 control-label" >Refresh ASDC services?</label>
-
-
- </div>
-
- </div>
-
- </form>
- <i hidden id="ridinSpinners" class="fa fa-spinner fa-spin" style="display:none;width:100%;text-align:center;font-size:24px;color:black;"></i>
-
- </div>
- <div attribute-test="refreshasdcf" class="modal-footer">
- <!--<button ng-click="reset()" class="btn btn-primary" style="float:left">Reset</button>-->
- <button ng-click="refreshASDC()" class="btn btn-primary">refresh</button>
- <button ng-click="close(true)" id="close_button"
- class="btn btn-primary">Cancel</button>
-
- </div>
- <script>
-// $.ajax({
-// async:false,
-// dataType: "json",
-// url: '/restservices/clds/v1/clds/asdc/services/',
-// success: function(data){
-// vf_Services=data;
-// },
-// error:function(s,a,err){
-// console.log(err)
-// console.log(s)
-// console.log(a)
-// },
-// timeout:100000
-// });
-// var services=vf_Services.service
-// console.log(elementMap["global"])
-// for(k in services){
-// console.log("lol")
-// $("#service").append("<option value="+k+">"+services[k]+"</option>")
-// }
-// loadSharedPropertyByService()
-// var el = elementMap["global"];
-// $("#status").val($("#activity_modeler").text())
-// if (el !== undefined) {
-// for (var i = 0; i < el.length; i++) {
-// $("#" + el[i].name).val(el[i].value);
-// }
-// }
- var previous;
- (function () {
-
- $("#service").on('focus', function () {
- // Store the current value on focus and on change
- previous = this.value;
- console.log("hello")
- }).change(function(){
- $("#ridinSpinners").css("display","")
- var bool=loadSharedPropertyByService($(this).val())
- $("#ridinSpinners").css("display","none")
- if(!bool)
- $(this).val(previous)
- });
-
- })();
-// $("#service").on("change",function(){
-// $("#ridinSpinners").css("display","")
-// loadSharedPropertyByService($(this).val())
-// $("#ridinSpinners").css("display","none")
-// })
- function noRepeats(form){
- var select={};
- for(var i=0;i<form.length;i++){
- if(select[form[i].name]===undefined)
- select[form[i].name]=[]
- select[form[i].name].push(form[i].value);
- }
- var arr=[]
- for(s in select){
- var f={}
- f.name=s
- f.value=select[s]
- arr.push(f)
- }
- return arr
- }
-
- $("#saveProps").on('submit', function(event) {
- saveGlobalProperties(noRepeats($(this).serializeArray()))
- event.preventDefault();
-
- $("#close_button").click();
-
- })
- $("#savePropsBtn").click(function(event) {
- //alert($("#CProp_Target").val())
- $("#saveProps").submit();
- })
- </script>
-</div>
-
diff --git a/src/main/resources/META-INF/resources/designer/partials/portfolios/tosca_model_properties.html b/src/main/resources/META-INF/resources/designer/partials/portfolios/tosca_model_properties.html
new file mode 100644
index 000000000..b053b24ed
--- /dev/null
+++ b/src/main/resources/META-INF/resources/designer/partials/portfolios/tosca_model_properties.html
@@ -0,0 +1,80 @@
+<!--
+ ============LICENSE_START=======================================================
+ ONAP CLAMP
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property. All rights
+ reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+-->
+
+<style>
+#paramsWarn {
+ display: none;
+}
+
+.modal-dialog {
+ width: 1100px;
+}
+
+</style>
+
+<div id="configure-widgets">
+ <div class="modal-header">
+ <button type="button" class="close" data-ng-click="close(false)"
+ aria-hidden="true" style="margin-top: -3px">&times;</button>
+ <h4>{{ toscaModelName }}</h4>
+ </div>
+
+ <div class="modal-body" style="display:block; height:600px; overflow:auto;">
+ <i hidden id="ridinSpinners" class="fa fa-spinner fa-spin"
+ style="display: none; margin-bottom: 10px; width: 100%; text-align: center; font-size: 24px; color: black;"></i>
+ <form id="saveProps">
+ <!-- <div ng-if="(simpleModel!==true)"> -->
+ <div class="alert alert-danger" role="alert" id='paramsWarn'>
+ <strong>Ooops!</strong> Unable to load properties for <span
+ id='servName'>. Would you like to</span> <a
+ href="javascript:void(0)" class="btn-link" id='paramsRetry'>Retry
+ </a> / <a href="javascript:void(0)" class="btn-link" id='paramsCancel'>Cancel</a>
+ </div>
+ <div class="form-group clearfix" data-ng-if="policytypes">
+ <label for="policytypes" class="col-sm-4 control-label">
+ Policy Types<span id="locationErr"
+ style="display: none; color: red;">&nbsp;*Required*</span>
+ </label>
+
+ <div class="col-sm-8">
+ <select class="form-control" id="policytype" data-ng-change = "jsonByPolicyType(selectedHPPolicy, '{{selectedHPPolicy}}', '')" data-ng-model ="$parent.selectedHPPolicy">
+ <option data-ng-repeat="pt in policytypes" value="{{pt}}">{{pt}}</option>
+ </select>
+ </div>
+ </div>
+ </form>
+ <div class="alert alert-warning propChangeWarn" style="display: none;">
+ <strong>Warning!</strong> Property changes will reset all associated
+ GUI fields.
+ </div>
+ <div class="modal-body" id="form1" style="display: none">
+ <div class="container-fluid">
+ <div class="row">
+ <div id="editor"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<div class="modal-footer">
+ <button data-ng-click="saveToscaProps()" id="savePropsBtn" class="btn btn-primary">Done</button>
+ <button data-ng-click="close(true)" id="close_button" class="btn btn-primary">Cancel</button>
+</div>
diff --git a/src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js b/src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js
index 98e8443ee..0e44aec16 100644
--- a/src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js
+++ b/src/main/resources/META-INF/resources/designer/scripts/CldsModelService.js
@@ -27,24 +27,36 @@ app
'alertService',
'$http',
'$q',
- function(alertService, $http, $q) {
-
- function checkIfElementType(name) {
-
- // This will open the methods located in the app.js
- if (undefined == name) {
- return;
- }
- mapping = {
- 'tca' : TCAWindow,
- 'policy' : PolicyWindow,
- 'vescollector' : VesCollectorWindow,
- 'holmes' : HolmesWindow,
- };
- key = name.split('_')[0].toLowerCase()
- if (key in mapping) {
- mapping[key]();
- }
+ '$rootScope',
+ function(alertService, $http, $q, $rootScope) {
+
+ function checkIfElementType(name, isSimple) {
+
+ //This will open the methods located in the app.js
+ if (isSimple){
+ if (undefined == name) {
+ return;
+ }else if (name.toLowerCase().indexOf("policy") >= 0){
+ PolicyWindow();
+ } else {
+ $rootScope.selectedBoxName = name.toLowerCase();
+ ToscaModelWindow();
+ }
+ } else {
+ if (undefined == name) {
+ return;
+ }
+ mapping = {
+ 'tca' : TCAWindow,
+ 'policy' : PolicyWindow,
+ 'vescollector' : VesCollectorWindow,
+ 'holmes' : HolmesWindow,
+ };
+ key = name.split('_')[0].toLowerCase()
+ if (key in mapping) {
+ mapping[key]();
+ }
+ };
}
function handleQueryToBackend(def, svcAction, svcUrl, svcPayload) {
@@ -105,34 +117,6 @@ app
handleQueryToBackend(def, action, deployUrl, requestData);
return def.promise;
};
- this.getASDCServices = function() {
-
- var def = $q.defer();
- var sets = [];
- var svcUrl = "/restservices/clds/v1/clds/sdc/services/";
- $http.get(svcUrl).success(function(data) {
-
- def.resolve(data);
- }).error(function(data) {
-
- def.reject("sdc Services not found");
- });
- return def.promise;
- };
- this.getASDCService = function(uuid) {
-
- var def = $q.defer();
- var sets = [];
- var svcUrl = "/restservices/clds/v1/clds/sdc/services/" + uuid;
- $http.get(svcUrl).success(function(data) {
-
- def.resolve(data);
- }).error(function(data) {
-
- def.reject("SDC service not found");
- });
- return def.promise;
- };
this.getModel = function(modelName) {
var def = $q.defer();
@@ -242,7 +226,7 @@ app
document.getElementById(menuText).classList.add('ThisLink');
}
};
- this.processActionResponse = function(modelName, pars) {
+ this.processActionResponse = function(modelName, pars, simple) {
// populate control name (prefix and uuid here)
var controlNamePrefix = pars.controlNamePrefix;
@@ -260,7 +244,7 @@ app
document.getElementById("modeler_name").textContent = headerText;
document.getElementById("templa_name").textContent = ("Template Used - " + selected_template);
setStatus(pars)
- addSVG(pars);
+ disableBPMNAddSVG(pars, simple);
this.enableDisableMenuOptions(pars);
};
this.processRefresh = function(pars) {
@@ -309,7 +293,7 @@ app
'<span id="status_clds" style="position: absolute; left: 61%;top: 151px; font-size:20px;">Status: '
+ statusMsg + '</span>');
}
- function addSVG(pars) {
+ function disableBPMNAddSVG(pars, simple) {
var svg = pars.imageText.substring(pars.imageText.indexOf("<svg"))
if ($("#svgContainer").length > 0)
@@ -330,7 +314,7 @@ app
var name = $($(event.target).parent()).attr("data-element-id")
lastElementSelected = $($(event.target).parent()).attr(
"data-element-id")
- checkIfElementType(name)
+ checkIfElementType(name, simple)
});
}
this.enableDisableMenuOptions = function(pars) {
@@ -345,14 +329,11 @@ app
document.getElementById('Close Model').classList
.remove('ThisLink');
// disable models options
- document.getElementById('Create CL').classList.add('ThisLink');
document.getElementById('Save CL').classList.add('ThisLink');
document.getElementById('Revert Model Changes').classList
.add('ThisLink');
} else {
// enable menu options
- document.getElementById('Create CL').classList
- .remove('ThisLink');
document.getElementById('Save CL').classList.remove('ThisLink');
document.getElementById('Properties CL').classList
.remove('ThisLink');
@@ -364,8 +345,6 @@ app
.remove('ThisLink');
document.getElementById('Refresh Status').classList
.remove('ThisLink');
- document.getElementById('Refresh ASDC').classList
- .remove('ThisLink');
}
// enable/disable menu options based on permittedActionCd
// list
@@ -383,10 +362,4 @@ app
this.checkPermittedActionCd(permittedActionCd, 'UnDeploy',
'UNDEPLOY');
}
- this.getASDCServices().then(function(pars) {
-
- var obj = JSON.parse(pars);
- var services = obj.service;
- asdc_Services = services
- });
} ]);
diff --git a/src/main/resources/META-INF/resources/designer/scripts/CldsOpenModelCtrl.js b/src/main/resources/META-INF/resources/designer/scripts/CldsOpenModelCtrl.js
index 2d1eeaa80..2b7c62589 100644
--- a/src/main/resources/META-INF/resources/designer/scripts/CldsOpenModelCtrl.js
+++ b/src/main/resources/META-INF/resources/designer/scripts/CldsOpenModelCtrl.js
@@ -26,12 +26,14 @@ app
[
'$scope',
'$rootScope',
+'$modalInstance',
+'$window',
'$uibModalInstance',
'cldsModelService',
'$location',
'dialogs',
'cldsTemplateService',
-function($scope, $rootScope, $uibModalInstance, cldsModelService, $location,
+function($scope, $rootScope, $modalInstance, $window, $uibModalInstance, cldsModelService, $location,
dialogs, cldsTemplateService) {
$scope.typeModel = 'template';
$scope.error = {
@@ -49,8 +51,6 @@ function($scope, $rootScope, $uibModalInstance, cldsModelService, $location,
});
$scope.paramsRetry = function() {
// $("#paramsWarn").hide();
- var currentValue = $("#service").val() == null ? previous : $(
- "#service").val();
$("#ridinSpinners").css("display", "")
loadSharedPropertyByService(currentValue, true, callBack);
$("#ridinSpinners").css("display", "none")
@@ -69,11 +69,6 @@ function($scope, $rootScope, $uibModalInstance, cldsModelService, $location,
$scope.close();
}
}
- $scope.refreshASDC = function() {
- $("#ridinSpinners").css("display", "")
- var bool = loadSharedPropertyByService(undefined, true, callBack);
- $("#ridinSpinners").css("display", "none");
- }
cldsTemplateService.getSavedTemplate().then(function(pars) {
$scope.templateNamel = []
for (var i = 0; i < pars.length; i++) {
@@ -92,14 +87,20 @@ function($scope, $rootScope, $uibModalInstance, cldsModelService, $location,
}
return false;
}
- $scope.checkExisting = function() {
- var name = $('#modelName').val();
- if (contains($scope.modelNamel, name)) {
- $scope.nameinUse = true;
+ $scope.checkExisting=function(checkVal, errPatt, num){
+ var name = checkVal;
+ if (!errPatt && (checkVal!== undefined)){
+ if(contains($scope.modelNamel,name)){
+ $scope["nameinUse"+num]=true;
+ return true;
+ }else{
+ $scope["nameinUse"+num]=false;
+ return false;
+ }
} else {
- $scope.nameinUse = false;
+ $scope["nameinUse"+num]=false;
+ return false;
}
- specialCharacters();
}
function specialCharacters() {
$scope.spcl = false;
@@ -117,126 +118,8 @@ function($scope, $rootScope, $uibModalInstance, cldsModelService, $location,
$rootScope.isNewClosed = false;
$uibModalInstance.close("closed");
};
- $scope.createNewModelOffTemplate = function(formModel) {
- reloadDefaultVariables(false)
- var modelName = document.getElementById("modelName").value;
- var templateName = document.getElementById("templateName").value;
- if (!modelName) {
- $scope.error.flag = true;
- $scope.error.message = "Please enter any closed template name for proceeding";
- return false;
- }
- // init UTM items
- $scope.utmModelsArray = [];
- $scope.selectedParent = {};
- $scope.currentUTMModel = {};
- $scope.currentUTMModel.selectedParent = {};
- $rootScope.oldUTMModels = [];
- $rootScope.projectName = "clds_default_project";
- var utmModels = {};
- utmModels.name = modelName;
- utmModels.subModels = [];
- $rootScope.utmModels = utmModels;
- cldsTemplateService.getTemplate(templateName).then(function(pars) {
- var tempImageText = pars.imageText;
- var authorizedToUp = pars.userAuthorizedToUpdate;
- pars = {}
- pars.imageText = tempImageText
- pars.status = "DESIGN";
- if (readMOnly) {
- pars.permittedActionCd = [ "" ];
- } else {
- pars.permittedActionCd = [ "TEST", "SUBMIT" ];
- }
- selected_template = templateName
- selected_model = modelName;
- cldsModelService.processActionResponse(modelName, pars);
- // set model bpmn and open diagram
- $rootScope.isPalette = true;
- }, function(data) {
- // alert("getModel failed");
- });
- allPolicies = {};
- elementMap = {};
- $uibModalInstance.close("closed");
- }
- $scope.cloneModel = function() {
- reloadDefaultVariables(false)
- var modelName = document.getElementById("modelName").value;
- var originalModel = document.getElementById("modelList").value;
- if (!modelName) {
- $scope.error.flag = true;
- $scope.error.message = "Please enter any name for proceeding";
- return false;
- }
- // init UTM items
- $scope.utmModelsArray = [];
- $scope.selectedParent = {};
- $scope.currentUTMModel = {};
- $scope.currentUTMModel.selectedParent = {};
- $rootScope.oldUTMModels = [];
- $rootScope.projectName = "clds_default_project";
- var utmModels = {};
- utmModels.name = modelName;
- utmModels.subModels = [];
- $rootScope.utmModels = utmModels;
- cldsModelService.getModel(originalModel).then(function(pars) {
- // process data returned
- var propText = pars.propText;
- var status = pars.status;
- var controlNamePrefix = pars.controlNamePrefix;
- var controlNameUuid = pars.controlNameUuid;
- selected_template = pars.templateName;
- typeID = pars.typeId;
- pars.status = "DESIGN";
- if (readMOnly) {
- pars.permittedActionCd = [ "" ];
- } else {
- pars.permittedActionCd = [ "TEST", "SUBMIT" ];
- }
- pars.controlNameUuid = "";
- modelEventService = pars.event;
- // actionCd = pars.event.actionCd;
- actionStateCd = pars.event.actionStateCd;
- deploymentId = pars.deploymentId;
- var authorizedToUp = pars.userAuthorizedToUpdate;
- cldsModelService.processActionResponse(modelName, pars);
- // deserialize model properties
- if (propText == null) {
- } else {
- elementMap = JSON.parse(propText);
- }
- selected_model = modelName;
- // set model bpmn and open diagram
- $rootScope.isPalette = true;
- }, function(data) {
- });
- $uibModalInstance.close("closed");
- }
- $scope.createNewModel = function() {
- reloadDefaultVariables(false)
- var modelName = document.getElementById("modelName").value;
- // BEGIN env
- // init UTM items
- $scope.utmModelsArray = [];
- $scope.selectedParent = {};
- $scope.currentUTMModel = {};
- $scope.currentUTMModel.selectedParent = {};
- $rootScope.oldUTMModels = [];
- $rootScope.projectName = "clds_default_project";
- var utmModels = {};
- utmModels.name = modelName;
- utmModels.subModels = [];
- $rootScope.utmModels = utmModels;
- // enable appropriate menu options
- var pars = {
- status : "DESIGN"
- };
- cldsModelService.processActionResponse(modelName, pars);
- selected_model = modelName;
- // set model bpmn and open diagram
- $rootScope.isPalette = true;
- $uibModalInstance.close("closed");
+ $scope.closeDiagram=function(){
+ $window.location.reload();
}
$scope.revertChanges = function() {
$scope.openModel();
@@ -257,6 +140,7 @@ function($scope, $rootScope, $uibModalInstance, cldsModelService, $location,
var utmModels = {};
utmModels.name = modelName;
utmModels.subModels = [];
+ utmModels.type = 'Model';
$rootScope.utmModels = utmModels;
cldsModelService.getModel(modelName).then(function(pars) {
// process data returned
@@ -273,13 +157,16 @@ function($scope, $rootScope, $uibModalInstance, cldsModelService, $location,
if (readMOnly) {
pars.permittedActionCd = [ "" ];
}
- cldsModelService.processActionResponse(modelName, pars);
+
// deserialize model properties
if (propText == null) {
} else {
elementMap = JSON.parse(propText);
}
+ var simple = elementMap.simpleModel;
+ $rootScope.isSimpleModel = simple;
selected_model = modelName;
+ cldsModelService.processActionResponse(modelName, pars, simple);
// set model bpmn and open diagram
$rootScope.isPalette = true;
}, function(data) {
diff --git a/src/main/resources/META-INF/resources/designer/scripts/GlobalPropertiesCtrl.js b/src/main/resources/META-INF/resources/designer/scripts/GlobalPropertiesCtrl.js
index f4c658ce1..21572a5f2 100644
--- a/src/main/resources/META-INF/resources/designer/scripts/GlobalPropertiesCtrl.js
+++ b/src/main/resources/META-INF/resources/designer/scripts/GlobalPropertiesCtrl.js
@@ -31,15 +31,9 @@ app.controller('GlobalPropertiesCtrl', [
function($scope, $rootScope, $uibModalInstance, cldsModelService, $location,
dialogs, cldsTemplateService) {
$scope.$watch('name', function(newValue, oldValue) {
- var services = asdc_Services
+
setASDCFields()
- // add blank service item as the default service, to force user chose
- // the correct service by themselves
- $("#service").append("<option></option>")
- for (k in services) {
- $("#service").append(
- "<option value=" + k + ">" + services[k] + "</option>")
- }
+
var el = elementMap["global"];
if (el !== undefined) {
for (var i = 0; i < el.length; i++) {
diff --git a/src/main/resources/META-INF/resources/designer/scripts/ToscaModelCtrl.js b/src/main/resources/META-INF/resources/designer/scripts/ToscaModelCtrl.js
new file mode 100644
index 000000000..f43161ec0
--- /dev/null
+++ b/src/main/resources/META-INF/resources/designer/scripts/ToscaModelCtrl.js
@@ -0,0 +1,156 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+app.controller('ToscaModelCtrl',
+ ['$scope', '$rootScope', '$modalInstance', '$location', 'dialogs', 'toscaModelService',
+ function($scope, $rootScope, $modalInstance, $location, dialogs, toscaModelService) {
+
+ $scope.jsonByPolicyType = function(selectedPolicy, oldSelectedPolicy, editorData){
+ if (selectedPolicy && selectedPolicy != '') {
+ toscaModelService.getHpModelJsonByPolicyType(selectedPolicy).then(function(response) {
+ $('#editor').empty();
+ // get the list of available policies
+ $scope.getPolicyList();
+ var toscaModel = JSON.parse(response.body.toscaModelJson);
+ if($scope.policyList && toscaModel.schema.properties && toscaModel.schema.properties.policyList){
+ toscaModel.schema.properties.policyList.enum = $scope.policyList;
+ }
+
+ JSONEditor.defaults.options.theme = 'bootstrap3';
+ JSONEditor.defaults.options.iconlib = 'bootstrap2';
+ JSONEditor.defaults.options.object_layout = 'grid';
+ JSONEditor.defaults.options.disable_properties = true;
+ JSONEditor.defaults.options.disable_edit_json = true;
+ JSONEditor.defaults.options.disable_array_reorder = true;
+ JSONEditor.defaults.options.disable_array_delete_last_row = true;
+ JSONEditor.defaults.options.disable_array_delete_all_rows = false;
+ JSONEditor.defaults.options.show_errors = 'always';
+
+ if($scope.editor) { $scope.editor.destroy(); }
+ $scope.editor = new JSONEditor(document.getElementById("editor"),
+ { schema: toscaModel.schema, startval: editorData });
+ $scope.editor.watch('root.policy.recipe',function() {
+
+ });
+ $('#form1').show();
+ });
+ } else {
+ $('#editor').empty();
+ $('#form1').hide();
+ }
+ }
+
+ $scope.getPolicyList = function(){
+ var policyNameList = [];
+ if (typeof elementMap !== 'undefined'){
+ for (key in elementMap){
+ if (key.indexOf('Policy')>-1){
+ angular.forEach(Object.keys(elementMap[key]), function(text, val){
+ for (policyKey in elementMap[key][text]){
+ if(elementMap[key][text][policyKey].name == 'pname'){
+ policyNameList.push(elementMap[key][text][policyKey].value);
+ }
+ }
+ });
+ }
+ }
+ };
+ $scope.policyList = policyNameList;
+ }
+
+ if($rootScope.selectedBoxName) {
+ var policyType = $rootScope.selectedBoxName.split('_')[0].toLowerCase();
+ $scope.toscaModelName = policyType.toUpperCase() + " Microservice";
+ if(elementMap[lastElementSelected]) {
+ $scope.jsonByPolicyType(policyType, '', elementMap[lastElementSelected][policyType]);
+ }else{
+ $scope.jsonByPolicyType(policyType, '', '');
+ }
+ }
+
+ $scope.getEditorData = function(){
+ if(!$scope.editor){
+ return null;
+ }
+ var errors = $scope.editor.validate();
+ var editorData = $scope.editor.getValue();
+
+ if(errors.length) {
+ $scope.displayErrorMessage(errors);
+ return null;
+ }
+ else{
+ console.log("there are NO validation errors........");
+ }
+ return editorData;
+ }
+
+ $scope.saveToscaProps = function(){
+ var policyType = $rootScope.selectedBoxName.split('_')[0].toLowerCase();
+ var data = $scope.getEditorData();
+
+ if(data !== null) {
+ data = {[policyType]: data};
+ saveProperties(data);
+ if($scope.editor) { $scope.editor.destroy(); $scope.editor = null; }
+ $modalInstance.close('closed');
+ }
+ }
+
+ $scope.displayErrorMessage = function(errors){
+ console.log("there are validation errors.....");
+ var all_errs = "Please address the following issues before selecting 'Done' or 'Policy Types':\n";
+ for (var i = 0; i < errors.length; i++) {
+ if(all_errs.indexOf(errors[i].message) < 0) {
+ all_errs += '\n' + errors[i].message;
+ }
+ }
+ window.alert(all_errs);
+ };
+
+ $scope.close = function(){
+ angular.copy(elementMap[lastElementSelected], $scope.hpPolicyList);
+ $modalInstance.close('closed');
+ if($scope.editor) { $scope.editor.destroy(); $scope.editor = null; }
+ }
+
+ $scope.checkDuplicateInObject = function(propertyName, inputArray) {
+ var seenDuplicate = false,
+ testObject = {};
+
+ inputArray.map(function(item) {
+ var itemPropertyName = item[propertyName];
+ if (itemPropertyName in testObject) {
+ testObject[itemPropertyName].duplicate = true;
+ item.duplicate = true;
+ seenDuplicate = true;
+ }
+ else {
+ testObject[itemPropertyName] = item;
+ delete item.duplicate;
+ }
+ });
+
+ return seenDuplicate;
+ }
+}
+]); \ No newline at end of file
diff --git a/src/main/resources/META-INF/resources/designer/scripts/ToscaModelService.js b/src/main/resources/META-INF/resources/designer/scripts/ToscaModelService.js
new file mode 100644
index 000000000..c99a4556b
--- /dev/null
+++ b/src/main/resources/META-INF/resources/designer/scripts/ToscaModelService.js
@@ -0,0 +1,38 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+app.service('toscaModelService', ['alertService','$http', '$q', '$rootScope', function (alertService,$http, $q, $rootScope) {
+
+ this.getHpModelJsonByPolicyType = function(policyType) {
+ var sets = [];
+ var svcUrl = "/restservices/clds/v1/tosca/models/policyType/" + policyType;
+ return $http({
+ method : "GET",
+ url : svcUrl
+ }).then(function successCallback(response) {
+ return response.data;
+ }, function errorCallback(response) {
+ //Open Model Unsuccessful
+ return response.data;
+ });
+ };
+ }]);
diff --git a/src/main/resources/META-INF/resources/designer/scripts/aOnBoot.js b/src/main/resources/META-INF/resources/designer/scripts/aOnBoot.js
index b69cfea08..11ad5fa95 100644
--- a/src/main/resources/META-INF/resources/designer/scripts/aOnBoot.js
+++ b/src/main/resources/META-INF/resources/designer/scripts/aOnBoot.js
@@ -142,56 +142,7 @@ function setMultiSelect() {
}
function loadSharedPropertyByService(onChangeUUID, refresh, callBack) {
- var uuid = onChangeUUID;
- if (uuid === undefined) {
- uuid = elementMap["global"] && elementMap["global"].length > 0 ?
- elementMap["global"][0].value : "";
- }
- var share = null,
- serviceUrl = '/restservices/clds/v1/clds/properties/' + uuid;
- if (refresh) {
- serviceUrl = '/restservices/clds/v1/clds/properties/' + uuid + '?refresh=true';
- }
-
- $.ajax({
- async: false,
- dataType: "json",
- url: serviceUrl,
- success: function(data) {
- vf_Services = JSON.parse(data);
setASDCFields()
- if (refresh) {
- $("#paramsWarnrefresh").hide();
- }
- if ($("#paramsWarn")) {
- $("#paramsWarn").hide();
- }
- if (callBack && _.isFunction(callBack)) {
- callBack(true);
- }
- },
- error: function(s, a, err) {
- if (refresh) {
- $("#paramsWarnrefresh").show();
- }
- if ($("#paramsWarn")) {
- $("#paramsWarn").show();
- }
-
- $('#servName').text($("#service option:selected").text());
- if (callBack && _.isFunction(callBack)) {
- callBack(false);
- }
- console.log(err)
- console.log(s)
- console.log(a)
- },
- timeout: 100000
-
- });
-
- //vf_Services=share['shared']['byService'][uuid];
- //location_values = share['global']['location'];
}
function loadSharedPropertyByServiceProperties(callBack) {
@@ -218,45 +169,8 @@ function loadSharedPropertyByServiceProperties(callBack) {
}
function setASDCFields() {
- if (vf_Services === null || vf_Services === undefined) {
- loadSharedPropertyByService()
- } else {
try {
- $("#vf").empty().multiselect("refresh");
- $("#location").empty().multiselect("refresh");
- $("#actionSet").empty().multiselect("refresh");
- $("#vfc").empty().multiselect("refresh");
- $("#paramsWarn").hide();
- var uuid = Object.keys(vf_Services['shared']['byService'])[0];
-
- var vf_values = vf_Services['shared']['byService'][uuid] &&
- vf_Services['shared']['byService'][uuid]['vf'] &&
- _.keys(vf_Services['shared']['byService'][uuid]['vf']).length > 0 ?
- vf_Services['shared']['byService'][uuid]['vf'] : null;
-
- var selectedVF = {}
- for (let e in elementMap["global"]) {
- if (elementMap['global'][e].name === "vf") {
- selectedVF = elementMap['global'][e].value[0]
- }
- }
-
- var vfc_values2 = selectedVF &&
- vf_Services['shared']['byVf'][selectedVF] &&
- vf_Services['shared']['byVf'][selectedVF]['vfc'] &&
- _.keys(vf_Services['shared']['byVf'][selectedVF]['vfc']).length > 0 ?
- vf_Services['shared']['byVf'][selectedVF]['vfc'] : null;
-
- if (vf_values) {
- for (key in vf_values) {
- if ($("#vf").length > 0) {
- $("#vf").append("<option value=\"" + key + "\">" + vf_values[key] + "</opton>")
- }
- }
- $("#vf").multiselect("rebuild");
- }
-
- var location_values = vf_Services['global']['location'];
+ var location_values = defaults_props['global']['location'];
if (location_values) {
for (key in location_values) {
if ($("#location").length > 0) {
@@ -266,7 +180,7 @@ function setASDCFields() {
$("#location").multiselect("rebuild");
}
- var actionSet_values = vf_Services['global']['actionSet'];
+ var actionSet_values = defaults_props['global']['actionSet'];
if (actionSet_values) {
for (key in actionSet_values) {
if ($("#actionSet").length > 0) {
@@ -275,22 +189,6 @@ function setASDCFields() {
}
$("#actionSet").multiselect("rebuild");
}
-
- if (vfc_values2) {
- $("#vfc").append("<option value=\"\"></opton>");
- for (key in vfc_values2) {
- if ($("#vfc").length > 0) {
- $("#vfc").append("<option value=\"" + key.split("\"").join("") + "\">" + vfc_values2[key] + "</opton>")
- }
- }
- $("#vfc").multiselect("rebuild");
- }
- if ($("#vfc").length > 0 && !vfc_values2) {
- showWarn();
- }
- if ($("#vf").length > 0 && !vf_values) {
- showWarn();
- }
if ($("#location").length > 0 && !location_values) {
showWarn();
}
@@ -302,7 +200,7 @@ function setASDCFields() {
} catch (e) {
console.log(e)
}
- }
+
}
//Typically used when opening a new model/template
diff --git a/src/main/resources/META-INF/resources/designer/scripts/app.js b/src/main/resources/META-INF/resources/designer/scripts/app.js
index 9dc104b1f..544756888 100644
--- a/src/main/resources/META-INF/resources/designer/scripts/app.js
+++ b/src/main/resources/META-INF/resources/designer/scripts/app.js
@@ -264,11 +264,6 @@ function($scope, $rootScope, $timeout, dialogs) {
$scope.cldsRevertModel();
} else if (name == "Close Model") {
$scope.cldsClose();
- } else if (name == "Refresh ASDC") {
- $scope.cldsRefreshASDC();
- } else if (name == "Create CL") {
- $rootScope.isNewClosed = true;
- $scope.cldsCreateModel();
} else if (name == "Open CL") {
$scope.cldsOpenModel();
} else if (name == "Save CL") {
@@ -308,9 +303,6 @@ function($scope, $rootScope, $timeout, dialogs) {
};
$scope.tabs = {
"Closed Loop" : [ {
- link : "/cldsCreateModel",
- name : "Create CL"
- }, {
link : "/cldsOpenModel",
name : "Open CL"
}, {
@@ -357,9 +349,6 @@ function($scope, $rootScope, $timeout, dialogs) {
"View" : [ {
link : "/refreshStatus",
name : "Refresh Status"
- }, {
- link : "/cldsRefreshASDC",
- name : "Refresh ASDC"
} ],
"Help" : [ {
link : "http://wiki.onap.org",
@@ -526,24 +515,6 @@ function($scope, $rootScope, $timeout, dialogs) {
callBack(null);
});
};
- $scope.cldsRefreshASDC = function() {
-
- var dlg = dialogs.create('partials/portfolios/refresh_asdc.html',
- 'CldsOpenModelCtrl', {
- closable : true,
- draggable : true
- }, {
- size : 'lg',
- keyboard : true,
- backdrop : 'static',
- windowClass : 'my-class'
- });
- dlg.result.then(function(name) {
-
- }, function() {
-
- });
- }
$scope.cldsRevertModel = function() {
var dlg = dialogs.create(
@@ -597,25 +568,6 @@ function($scope, $rootScope, $timeout, dialogs) {
});
};
- $scope.cldsCreateModel = function() {
-
- var dlg = dialogs.create(
- 'partials/portfolios/clds_create_model_off_Template.html',
- 'CldsOpenModelCtrl', {
- closable : true,
- draggable : true
- }, {
- size : 'lg',
- keyboard : true,
- backdrop : 'static',
- windowClass : 'my-class'
- });
- dlg.result.then(function(name) {
-
- }, function() {
-
- });
- };
$scope.extraUserInfo = function() {
var dlg = dialogs.create(
@@ -807,6 +759,13 @@ function($scope, $rootScope, $timeout, dialogs) {
});
};
+ $scope.ToscaModelWindow = function (tosca_model) {
+
+ var dlg = dialogs.create('partials/portfolios/tosca_model_properties.html','ToscaModelCtrl',{closable:true,draggable:true},{size:'lg',keyboard: true,backdrop: 'static',windowClass: 'my-class'});
+ dlg.result.then(function(name){
+ },function(){
+ });
+ };
$scope.PolicyWindow = function(policy) {
var dlg = dialogs.create(
@@ -935,6 +894,9 @@ function GOCWindow() {
angular.element(document.getElementById('navbar')).scope().GOCWindow();
}
+function ToscaModelWindow() {
+ angular.element(document.getElementById('navbar')).scope().ToscaModelWindow();
+};
function PolicyWindow(PolicyWin) {
angular.element(document.getElementById('navbar')).scope().PolicyWindow(
diff --git a/src/main/resources/META-INF/resources/swagger.html b/src/main/resources/META-INF/resources/swagger.html
index cf19bf6ee..e2bc77a20 100644
--- a/src/main/resources/META-INF/resources/swagger.html
+++ b/src/main/resources/META-INF/resources/swagger.html
@@ -439,7 +439,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</li>
<li><a href="#_paths">2. Paths</a>
<ul class="sectlevel2">
-<li><a href="#_route10">2.1. PUT /clds/action/{action}/{modelName}?test={test}</a>
+<li><a href="#_route66">2.1. PUT /clds/action/{action}/{modelName}?test={test}</a>
<ul class="sectlevel3">
<li><a href="#_parameters">2.1.1. Parameters</a></li>
<li><a href="#_responses">2.1.2. Responses</a></li>
@@ -447,19 +447,19 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<li><a href="#_produces">2.1.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route2">2.2. GET /clds/cldsDetails</a>
+<li><a href="#_route58">2.2. GET /clds/cldsDetails</a>
<ul class="sectlevel3">
<li><a href="#_responses_2">2.2.1. Responses</a></li>
<li><a href="#_produces_2">2.2.2. Produces</a></li>
</ul>
</li>
-<li><a href="#_route3">2.3. GET /clds/cldsInfo</a>
+<li><a href="#_route59">2.3. GET /clds/cldsInfo</a>
<ul class="sectlevel3">
<li><a href="#_responses_3">2.3.1. Responses</a></li>
<li><a href="#_produces_3">2.3.2. Produces</a></li>
</ul>
</li>
-<li><a href="#_route11">2.4. POST /clds/dcae/event?test={test}</a>
+<li><a href="#_route67">2.4. POST /clds/dcae/event?test={test}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_2">2.4.1. Parameters</a></li>
<li><a href="#_responses_4">2.4.2. Responses</a></li>
@@ -467,7 +467,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<li><a href="#_produces_4">2.4.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route15">2.5. PUT /clds/deploy/{modelName}</a>
+<li><a href="#_route69">2.5. PUT /clds/deploy/{modelName}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_3">2.5.1. Parameters</a></li>
<li><a href="#_responses_5">2.5.2. Responses</a></li>
@@ -475,34 +475,34 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<li><a href="#_produces_5">2.5.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route9">2.6. GET /clds/model-names</a>
+<li><a href="#_route65">2.6. GET /clds/model-names</a>
<ul class="sectlevel3">
<li><a href="#_responses_6">2.6.1. Responses</a></li>
<li><a href="#_produces_6">2.6.2. Produces</a></li>
</ul>
</li>
-<li><a href="#_route5">2.7. GET /clds/model/bpmn/{modelName}</a>
+<li><a href="#_route61">2.7. GET /clds/model/bpmn/{modelName}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_4">2.7.1. Parameters</a></li>
<li><a href="#_responses_7">2.7.2. Responses</a></li>
<li><a href="#_produces_7">2.7.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route6">2.8. GET /clds/model/image/{modelName}</a>
+<li><a href="#_route62">2.8. GET /clds/model/image/{modelName}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_5">2.8.1. Parameters</a></li>
<li><a href="#_responses_8">2.8.2. Responses</a></li>
<li><a href="#_produces_8">2.8.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route7">2.9. GET /clds/model/{modelName}</a>
+<li><a href="#_route63">2.9. GET /clds/model/{modelName}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_6">2.9.1. Parameters</a></li>
<li><a href="#_responses_9">2.9.2. Responses</a></li>
<li><a href="#_produces_9">2.9.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route8">2.10. PUT /clds/model/{modelName}</a>
+<li><a href="#_route64">2.10. PUT /clds/model/{modelName}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_7">2.10.1. Parameters</a></li>
<li><a href="#_responses_10">2.10.2. Responses</a></li>
@@ -510,135 +510,122 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<li><a href="#_produces_10">2.10.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route13">2.11. GET /clds/properties</a>
+<li><a href="#_route68">2.11. GET /clds/properties</a>
<ul class="sectlevel3">
<li><a href="#_responses_11">2.11.1. Responses</a></li>
<li><a href="#_produces_11">2.11.2. Produces</a></li>
</ul>
</li>
-<li><a href="#_route14">2.12. GET /clds/properties/{serviceInvariantUUID}?refresh={refresh}</a>
+<li><a href="#_route70">2.12. PUT /clds/undeploy/{modelName}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_8">2.12.1. Parameters</a></li>
<li><a href="#_responses_12">2.12.2. Responses</a></li>
-<li><a href="#_produces_12">2.12.3. Produces</a></li>
+<li><a href="#_consumes_5">2.12.3. Consumes</a></li>
+<li><a href="#_produces_12">2.12.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route12">2.13. GET /clds/sdc/services</a>
+<li><a href="#_route75">2.13. GET /cldsTempate/template-names</a>
<ul class="sectlevel3">
<li><a href="#_responses_13">2.13.1. Responses</a></li>
<li><a href="#_produces_13">2.13.2. Produces</a></li>
</ul>
</li>
-<li><a href="#_route16">2.14. PUT /clds/undeploy/{modelName}</a>
+<li><a href="#_route71">2.14. GET /cldsTempate/template/bpmn/{templateName}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_9">2.14.1. Parameters</a></li>
<li><a href="#_responses_14">2.14.2. Responses</a></li>
-<li><a href="#_consumes_5">2.14.3. Consumes</a></li>
-<li><a href="#_produces_14">2.14.4. Produces</a></li>
+<li><a href="#_produces_14">2.14.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route21">2.15. GET /cldsTempate/template-names</a>
+<li><a href="#_route72">2.15. GET /cldsTempate/template/image/{templateName}</a>
<ul class="sectlevel3">
-<li><a href="#_responses_15">2.15.1. Responses</a></li>
-<li><a href="#_produces_15">2.15.2. Produces</a></li>
+<li><a href="#_parameters_10">2.15.1. Parameters</a></li>
+<li><a href="#_responses_15">2.15.2. Responses</a></li>
+<li><a href="#_produces_15">2.15.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route17">2.16. GET /cldsTempate/template/bpmn/{templateName}</a>
+<li><a href="#_route73">2.16. GET /cldsTempate/template/{templateName}</a>
<ul class="sectlevel3">
-<li><a href="#_parameters_10">2.16.1. Parameters</a></li>
+<li><a href="#_parameters_11">2.16.1. Parameters</a></li>
<li><a href="#_responses_16">2.16.2. Responses</a></li>
<li><a href="#_produces_16">2.16.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route18">2.17. GET /cldsTempate/template/image/{templateName}</a>
+<li><a href="#_route74">2.17. PUT /cldsTempate/template/{templateName}</a>
<ul class="sectlevel3">
-<li><a href="#_parameters_11">2.17.1. Parameters</a></li>
+<li><a href="#_parameters_12">2.17.1. Parameters</a></li>
<li><a href="#_responses_17">2.17.2. Responses</a></li>
-<li><a href="#_produces_17">2.17.3. Produces</a></li>
+<li><a href="#_consumes_6">2.17.3. Consumes</a></li>
+<li><a href="#_produces_17">2.17.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route19">2.18. GET /cldsTempate/template/{templateName}</a>
+<li><a href="#_route81">2.18. GET /dictionary</a>
<ul class="sectlevel3">
-<li><a href="#_parameters_12">2.18.1. Parameters</a></li>
-<li><a href="#_responses_18">2.18.2. Responses</a></li>
-<li><a href="#_produces_18">2.18.3. Produces</a></li>
+<li><a href="#_responses_18">2.18.1. Responses</a></li>
+<li><a href="#_produces_18">2.18.2. Produces</a></li>
</ul>
</li>
-<li><a href="#_route20">2.19. PUT /cldsTempate/template/{templateName}</a>
+<li><a href="#_route80">2.19. PUT /dictionary/{dictionaryName}</a>
<ul class="sectlevel3">
<li><a href="#_parameters_13">2.19.1. Parameters</a></li>
<li><a href="#_responses_19">2.19.2. Responses</a></li>
-<li><a href="#_consumes_6">2.19.3. Consumes</a></li>
+<li><a href="#_consumes_7">2.19.3. Consumes</a></li>
<li><a href="#_produces_19">2.19.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route27">2.20. GET /dictionary</a>
+<li><a href="#_route83">2.20. GET /dictionary/{dictionaryName}/items</a>
<ul class="sectlevel3">
-<li><a href="#_responses_20">2.20.1. Responses</a></li>
-<li><a href="#_produces_20">2.20.2. Produces</a></li>
+<li><a href="#_parameters_14">2.20.1. Parameters</a></li>
+<li><a href="#_responses_20">2.20.2. Responses</a></li>
+<li><a href="#_produces_20">2.20.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route26">2.21. PUT /dictionary/{dictionaryName}</a>
+<li><a href="#_route82">2.21. PUT /dictionary/{dictionaryName}/items</a>
<ul class="sectlevel3">
-<li><a href="#_parameters_14">2.21.1. Parameters</a></li>
+<li><a href="#_parameters_15">2.21.1. Parameters</a></li>
<li><a href="#_responses_21">2.21.2. Responses</a></li>
-<li><a href="#_consumes_7">2.21.3. Consumes</a></li>
+<li><a href="#_consumes_8">2.21.3. Consumes</a></li>
<li><a href="#_produces_21">2.21.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route29">2.22. GET /dictionary/{dictionaryName}/items</a>
+<li><a href="#_route60">2.22. GET /healthcheck</a>
<ul class="sectlevel3">
-<li><a href="#_parameters_15">2.22.1. Parameters</a></li>
-<li><a href="#_responses_22">2.22.2. Responses</a></li>
-<li><a href="#_produces_22">2.22.3. Produces</a></li>
+<li><a href="#_responses_22">2.22.1. Responses</a></li>
+<li><a href="#_produces_22">2.22.2. Produces</a></li>
</ul>
</li>
-<li><a href="#_route28">2.23. PUT /dictionary/{dictionaryName}/items</a>
+<li><a href="#_route78">2.23. GET /tosca/models</a>
<ul class="sectlevel3">
-<li><a href="#_parameters_16">2.23.1. Parameters</a></li>
-<li><a href="#_responses_23">2.23.2. Responses</a></li>
-<li><a href="#_consumes_8">2.23.3. Consumes</a></li>
-<li><a href="#_produces_23">2.23.4. Produces</a></li>
+<li><a href="#_responses_23">2.23.1. Responses</a></li>
+<li><a href="#_produces_23">2.23.2. Produces</a></li>
</ul>
</li>
-<li><a href="#_route4">2.24. GET /healthcheck</a>
+<li><a href="#_route77">2.24. GET /tosca/models/policyType/{policyType}</a>
<ul class="sectlevel3">
-<li><a href="#_responses_24">2.24.1. Responses</a></li>
-<li><a href="#_produces_24">2.24.2. Produces</a></li>
+<li><a href="#_parameters_16">2.24.1. Parameters</a></li>
+<li><a href="#_responses_24">2.24.2. Responses</a></li>
+<li><a href="#_produces_24">2.24.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route24">2.25. GET /tosca/models</a>
+<li><a href="#_route79">2.25. GET /tosca/models/{toscaModelName}</a>
<ul class="sectlevel3">
-<li><a href="#_responses_25">2.25.1. Responses</a></li>
-<li><a href="#_produces_25">2.25.2. Produces</a></li>
+<li><a href="#_parameters_17">2.25.1. Parameters</a></li>
+<li><a href="#_responses_25">2.25.2. Responses</a></li>
+<li><a href="#_produces_25">2.25.3. Produces</a></li>
</ul>
</li>
-<li><a href="#_route23">2.26. GET /tosca/models/policyType/{policyType}</a>
+<li><a href="#_route76">2.26. PUT /tosca/models/{toscaModelName}</a>
<ul class="sectlevel3">
-<li><a href="#_parameters_17">2.26.1. Parameters</a></li>
+<li><a href="#_parameters_18">2.26.1. Parameters</a></li>
<li><a href="#_responses_26">2.26.2. Responses</a></li>
-<li><a href="#_produces_26">2.26.3. Produces</a></li>
+<li><a href="#_consumes_9">2.26.3. Consumes</a></li>
+<li><a href="#_produces_26">2.26.4. Produces</a></li>
</ul>
</li>
-<li><a href="#_route25">2.27. GET /tosca/models/{toscaModelName}</a>
+<li><a href="#_route84">2.27. GET /user/getUser</a>
<ul class="sectlevel3">
-<li><a href="#_parameters_18">2.27.1. Parameters</a></li>
-<li><a href="#_responses_27">2.27.2. Responses</a></li>
-<li><a href="#_produces_27">2.27.3. Produces</a></li>
-</ul>
-</li>
-<li><a href="#_route22">2.28. PUT /tosca/models/{toscaModelName}</a>
-<ul class="sectlevel3">
-<li><a href="#_parameters_19">2.28.1. Parameters</a></li>
-<li><a href="#_responses_28">2.28.2. Responses</a></li>
-<li><a href="#_consumes_9">2.28.3. Consumes</a></li>
-<li><a href="#_produces_28">2.28.4. Produces</a></li>
-</ul>
-</li>
-<li><a href="#_route30">2.29. GET /user/getUser</a>
-<ul class="sectlevel3">
-<li><a href="#_responses_29">2.29.1. Responses</a></li>
-<li><a href="#_produces_29">2.29.2. Produces</a></li>
+<li><a href="#_responses_27">2.27.1. Responses</a></li>
+<li><a href="#_produces_27">2.27.2. Produces</a></li>
</ul>
</li>
</ul>
@@ -668,7 +655,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<div class="sect2">
<h3 id="_version_information"><a class="anchor" href="#_version_information"></a><a class="link" href="#_version_information">1.1. Version information</a></h3>
<div class="paragraph">
-<p><em>Version</em> : 3.0.3-SNAPSHOT</p>
+<p><em>Version</em> : 4.0.0-SNAPSHOT</p>
</div>
</div>
<div class="sect2">
@@ -685,7 +672,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<h2 id="_paths"><a class="anchor" href="#_paths"></a><a class="link" href="#_paths">2. Paths</a></h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_route10"><a class="anchor" href="#_route10"></a><a class="link" href="#_route10">2.1. PUT /clds/action/{action}/{modelName}?test={test}</a></h3>
+<h3 id="_route66"><a class="anchor" href="#_route66"></a><a class="link" href="#_route66">2.1. PUT /clds/action/{action}/{modelName}?test={test}</a></h3>
<div class="sect3">
<h4 id="_parameters"><a class="anchor" href="#_parameters"></a><a class="link" href="#_parameters">2.1.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -766,7 +753,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route2"><a class="anchor" href="#_route2"></a><a class="link" href="#_route2">2.2. GET /clds/cldsDetails</a></h3>
+<h3 id="_route58"><a class="anchor" href="#_route58"></a><a class="link" href="#_route58">2.2. GET /clds/cldsDetails</a></h3>
<div class="sect3">
<h4 id="_responses_2"><a class="anchor" href="#_responses_2"></a><a class="link" href="#_responses_2">2.2.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -803,7 +790,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route3"><a class="anchor" href="#_route3"></a><a class="link" href="#_route3">2.3. GET /clds/cldsInfo</a></h3>
+<h3 id="_route59"><a class="anchor" href="#_route59"></a><a class="link" href="#_route59">2.3. GET /clds/cldsInfo</a></h3>
<div class="sect3">
<h4 id="_responses_3"><a class="anchor" href="#_responses_3"></a><a class="link" href="#_responses_3">2.3.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -840,7 +827,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route11"><a class="anchor" href="#_route11"></a><a class="link" href="#_route11">2.4. POST /clds/dcae/event?test={test}</a></h3>
+<h3 id="_route67"><a class="anchor" href="#_route67"></a><a class="link" href="#_route67">2.4. POST /clds/dcae/event?test={test}</a></h3>
<div class="sect3">
<h4 id="_parameters_2"><a class="anchor" href="#_parameters_2"></a><a class="link" href="#_parameters_2">2.4.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -909,7 +896,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route15"><a class="anchor" href="#_route15"></a><a class="link" href="#_route15">2.5. PUT /clds/deploy/{modelName}</a></h3>
+<h3 id="_route69"><a class="anchor" href="#_route69"></a><a class="link" href="#_route69">2.5. PUT /clds/deploy/{modelName}</a></h3>
<div class="sect3">
<h4 id="_parameters_3"><a class="anchor" href="#_parameters_3"></a><a class="link" href="#_parameters_3">2.5.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -984,7 +971,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route9"><a class="anchor" href="#_route9"></a><a class="link" href="#_route9">2.6. GET /clds/model-names</a></h3>
+<h3 id="_route65"><a class="anchor" href="#_route65"></a><a class="link" href="#_route65">2.6. GET /clds/model-names</a></h3>
<div class="sect3">
<h4 id="_responses_6"><a class="anchor" href="#_responses_6"></a><a class="link" href="#_responses_6">2.6.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -1021,7 +1008,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route5"><a class="anchor" href="#_route5"></a><a class="link" href="#_route5">2.7. GET /clds/model/bpmn/{modelName}</a></h3>
+<h3 id="_route61"><a class="anchor" href="#_route61"></a><a class="link" href="#_route61">2.7. GET /clds/model/bpmn/{modelName}</a></h3>
<div class="sect3">
<h4 id="_parameters_4"><a class="anchor" href="#_parameters_4"></a><a class="link" href="#_parameters_4">2.7.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -1080,7 +1067,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route6"><a class="anchor" href="#_route6"></a><a class="link" href="#_route6">2.8. GET /clds/model/image/{modelName}</a></h3>
+<h3 id="_route62"><a class="anchor" href="#_route62"></a><a class="link" href="#_route62">2.8. GET /clds/model/image/{modelName}</a></h3>
<div class="sect3">
<h4 id="_parameters_5"><a class="anchor" href="#_parameters_5"></a><a class="link" href="#_parameters_5">2.8.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -1139,7 +1126,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route7"><a class="anchor" href="#_route7"></a><a class="link" href="#_route7">2.9. GET /clds/model/{modelName}</a></h3>
+<h3 id="_route63"><a class="anchor" href="#_route63"></a><a class="link" href="#_route63">2.9. GET /clds/model/{modelName}</a></h3>
<div class="sect3">
<h4 id="_parameters_6"><a class="anchor" href="#_parameters_6"></a><a class="link" href="#_parameters_6">2.9.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -1201,7 +1188,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route8"><a class="anchor" href="#_route8"></a><a class="link" href="#_route8">2.10. PUT /clds/model/{modelName}</a></h3>
+<h3 id="_route64"><a class="anchor" href="#_route64"></a><a class="link" href="#_route64">2.10. PUT /clds/model/{modelName}</a></h3>
<div class="sect3">
<h4 id="_parameters_7"><a class="anchor" href="#_parameters_7"></a><a class="link" href="#_parameters_7">2.10.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -1279,7 +1266,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route13"><a class="anchor" href="#_route13"></a><a class="link" href="#_route13">2.11. GET /clds/properties</a></h3>
+<h3 id="_route68"><a class="anchor" href="#_route68"></a><a class="link" href="#_route68">2.11. GET /clds/properties</a></h3>
<div class="sect3">
<h4 id="_responses_11"><a class="anchor" href="#_responses_11"></a><a class="link" href="#_responses_11">2.11.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -1313,7 +1300,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route14"><a class="anchor" href="#_route14"></a><a class="link" href="#_route14">2.12. GET /clds/properties/{serviceInvariantUUID}?refresh={refresh}</a></h3>
+<h3 id="_route70"><a class="anchor" href="#_route70"></a><a class="link" href="#_route70">2.12. PUT /clds/undeploy/{modelName}</a></h3>
<div class="sect3">
<h4 id="_parameters_8"><a class="anchor" href="#_parameters_8"></a><a class="link" href="#_parameters_8">2.12.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
@@ -1332,99 +1319,6 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<tbody>
<tr>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Path</strong></p></td>
-<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>serviceInvariantUUID}?refresh={refresh</strong><br>
-<em>required</em></p></td>
-<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect3">
-<h4 id="_responses_12"><a class="anchor" href="#_responses_12"></a><a class="link" href="#_responses_12">2.12.2. Responses</a></h4>
-<table class="tableblock frame-all grid-all spread">
-<colgroup>
-<col style="width: 33.3333%;">
-<col style="width: 66.6667%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-middle">HTTP Code</th>
-<th class="tableblock halign-left valign-middle">Schema</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>200</strong></p></td>
-<td class="tableblock halign-left valign-middle"><p class="tableblock">No Content</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect3">
-<h4 id="_produces_12"><a class="anchor" href="#_produces_12"></a><a class="link" href="#_produces_12">2.12.3. Produces</a></h4>
-<div class="ulist">
-<ul>
-<li>
-<p><code>application/json</code></p>
-</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="_route12"><a class="anchor" href="#_route12"></a><a class="link" href="#_route12">2.13. GET /clds/sdc/services</a></h3>
-<div class="sect3">
-<h4 id="_responses_13"><a class="anchor" href="#_responses_13"></a><a class="link" href="#_responses_13">2.13.1. Responses</a></h4>
-<table class="tableblock frame-all grid-all spread">
-<colgroup>
-<col style="width: 33.3333%;">
-<col style="width: 66.6667%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-middle">HTTP Code</th>
-<th class="tableblock halign-left valign-middle">Schema</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>200</strong></p></td>
-<td class="tableblock halign-left valign-middle"><p class="tableblock">No Content</p></td>
-</tr>
-</tbody>
-</table>
-</div>
-<div class="sect3">
-<h4 id="_produces_13"><a class="anchor" href="#_produces_13"></a><a class="link" href="#_produces_13">2.13.2. Produces</a></h4>
-<div class="ulist">
-<ul>
-<li>
-<p><code>application/json</code></p>
-</li>
-</ul>
-</div>
-</div>
-</div>
-<div class="sect2">
-<h3 id="_route16"><a class="anchor" href="#_route16"></a><a class="link" href="#_route16">2.14. PUT /clds/undeploy/{modelName}</a></h3>
-<div class="sect3">
-<h4 id="_parameters_9"><a class="anchor" href="#_parameters_9"></a><a class="link" href="#_parameters_9">2.14.1. Parameters</a></h4>
-<table class="tableblock frame-all grid-all spread">
-<colgroup>
-<col style="width: 22.2222%;">
-<col style="width: 33.3333%;">
-<col style="width: 44.4445%;">
-</colgroup>
-<thead>
-<tr>
-<th class="tableblock halign-left valign-middle">Type</th>
-<th class="tableblock halign-left valign-middle">Name</th>
-<th class="tableblock halign-left valign-middle">Schema</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>Path</strong></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>modelName</strong><br>
<em>required</em></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
@@ -1439,7 +1333,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_14"><a class="anchor" href="#_responses_14"></a><a class="link" href="#_responses_14">2.14.2. Responses</a></h4>
+<h4 id="_responses_12"><a class="anchor" href="#_responses_12"></a><a class="link" href="#_responses_12">2.12.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
@@ -1460,7 +1354,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_consumes_5"><a class="anchor" href="#_consumes_5"></a><a class="link" href="#_consumes_5">2.14.3. Consumes</a></h4>
+<h4 id="_consumes_5"><a class="anchor" href="#_consumes_5"></a><a class="link" href="#_consumes_5">2.12.3. Consumes</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1470,7 +1364,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect3">
-<h4 id="_produces_14"><a class="anchor" href="#_produces_14"></a><a class="link" href="#_produces_14">2.14.4. Produces</a></h4>
+<h4 id="_produces_12"><a class="anchor" href="#_produces_12"></a><a class="link" href="#_produces_12">2.12.4. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1481,9 +1375,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route21"><a class="anchor" href="#_route21"></a><a class="link" href="#_route21">2.15. GET /cldsTempate/template-names</a></h3>
+<h3 id="_route75"><a class="anchor" href="#_route75"></a><a class="link" href="#_route75">2.13. GET /cldsTempate/template-names</a></h3>
<div class="sect3">
-<h4 id="_responses_15"><a class="anchor" href="#_responses_15"></a><a class="link" href="#_responses_15">2.15.1. Responses</a></h4>
+<h4 id="_responses_13"><a class="anchor" href="#_responses_13"></a><a class="link" href="#_responses_13">2.13.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -1507,7 +1401,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_15"><a class="anchor" href="#_produces_15"></a><a class="link" href="#_produces_15">2.15.2. Produces</a></h4>
+<h4 id="_produces_13"><a class="anchor" href="#_produces_13"></a><a class="link" href="#_produces_13">2.13.2. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1518,9 +1412,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route17"><a class="anchor" href="#_route17"></a><a class="link" href="#_route17">2.16. GET /cldsTempate/template/bpmn/{templateName}</a></h3>
+<h3 id="_route71"><a class="anchor" href="#_route71"></a><a class="link" href="#_route71">2.14. GET /cldsTempate/template/bpmn/{templateName}</a></h3>
<div class="sect3">
-<h4 id="_parameters_10"><a class="anchor" href="#_parameters_10"></a><a class="link" href="#_parameters_10">2.16.1. Parameters</a></h4>
+<h4 id="_parameters_9"><a class="anchor" href="#_parameters_9"></a><a class="link" href="#_parameters_9">2.14.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -1545,7 +1439,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_16"><a class="anchor" href="#_responses_16"></a><a class="link" href="#_responses_16">2.16.2. Responses</a></h4>
+<h4 id="_responses_14"><a class="anchor" href="#_responses_14"></a><a class="link" href="#_responses_14">2.14.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
@@ -1566,7 +1460,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_16"><a class="anchor" href="#_produces_16"></a><a class="link" href="#_produces_16">2.16.3. Produces</a></h4>
+<h4 id="_produces_14"><a class="anchor" href="#_produces_14"></a><a class="link" href="#_produces_14">2.14.3. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1577,9 +1471,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route18"><a class="anchor" href="#_route18"></a><a class="link" href="#_route18">2.17. GET /cldsTempate/template/image/{templateName}</a></h3>
+<h3 id="_route72"><a class="anchor" href="#_route72"></a><a class="link" href="#_route72">2.15. GET /cldsTempate/template/image/{templateName}</a></h3>
<div class="sect3">
-<h4 id="_parameters_11"><a class="anchor" href="#_parameters_11"></a><a class="link" href="#_parameters_11">2.17.1. Parameters</a></h4>
+<h4 id="_parameters_10"><a class="anchor" href="#_parameters_10"></a><a class="link" href="#_parameters_10">2.15.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -1604,7 +1498,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_17"><a class="anchor" href="#_responses_17"></a><a class="link" href="#_responses_17">2.17.2. Responses</a></h4>
+<h4 id="_responses_15"><a class="anchor" href="#_responses_15"></a><a class="link" href="#_responses_15">2.15.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
@@ -1625,7 +1519,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_17"><a class="anchor" href="#_produces_17"></a><a class="link" href="#_produces_17">2.17.3. Produces</a></h4>
+<h4 id="_produces_15"><a class="anchor" href="#_produces_15"></a><a class="link" href="#_produces_15">2.15.3. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1636,9 +1530,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route19"><a class="anchor" href="#_route19"></a><a class="link" href="#_route19">2.18. GET /cldsTempate/template/{templateName}</a></h3>
+<h3 id="_route73"><a class="anchor" href="#_route73"></a><a class="link" href="#_route73">2.16. GET /cldsTempate/template/{templateName}</a></h3>
<div class="sect3">
-<h4 id="_parameters_12"><a class="anchor" href="#_parameters_12"></a><a class="link" href="#_parameters_12">2.18.1. Parameters</a></h4>
+<h4 id="_parameters_11"><a class="anchor" href="#_parameters_11"></a><a class="link" href="#_parameters_11">2.16.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -1663,7 +1557,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_18"><a class="anchor" href="#_responses_18"></a><a class="link" href="#_responses_18">2.18.2. Responses</a></h4>
+<h4 id="_responses_16"><a class="anchor" href="#_responses_16"></a><a class="link" href="#_responses_16">2.16.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -1687,7 +1581,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_18"><a class="anchor" href="#_produces_18"></a><a class="link" href="#_produces_18">2.18.3. Produces</a></h4>
+<h4 id="_produces_16"><a class="anchor" href="#_produces_16"></a><a class="link" href="#_produces_16">2.16.3. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1698,9 +1592,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route20"><a class="anchor" href="#_route20"></a><a class="link" href="#_route20">2.19. PUT /cldsTempate/template/{templateName}</a></h3>
+<h3 id="_route74"><a class="anchor" href="#_route74"></a><a class="link" href="#_route74">2.17. PUT /cldsTempate/template/{templateName}</a></h3>
<div class="sect3">
-<h4 id="_parameters_13"><a class="anchor" href="#_parameters_13"></a><a class="link" href="#_parameters_13">2.19.1. Parameters</a></h4>
+<h4 id="_parameters_12"><a class="anchor" href="#_parameters_12"></a><a class="link" href="#_parameters_12">2.17.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -1731,7 +1625,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_19"><a class="anchor" href="#_responses_19"></a><a class="link" href="#_responses_19">2.19.2. Responses</a></h4>
+<h4 id="_responses_17"><a class="anchor" href="#_responses_17"></a><a class="link" href="#_responses_17">2.17.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -1755,7 +1649,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_consumes_6"><a class="anchor" href="#_consumes_6"></a><a class="link" href="#_consumes_6">2.19.3. Consumes</a></h4>
+<h4 id="_consumes_6"><a class="anchor" href="#_consumes_6"></a><a class="link" href="#_consumes_6">2.17.3. Consumes</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1765,7 +1659,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect3">
-<h4 id="_produces_19"><a class="anchor" href="#_produces_19"></a><a class="link" href="#_produces_19">2.19.4. Produces</a></h4>
+<h4 id="_produces_17"><a class="anchor" href="#_produces_17"></a><a class="link" href="#_produces_17">2.17.4. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1776,9 +1670,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route27"><a class="anchor" href="#_route27"></a><a class="link" href="#_route27">2.20. GET /dictionary</a></h3>
+<h3 id="_route81"><a class="anchor" href="#_route81"></a><a class="link" href="#_route81">2.18. GET /dictionary</a></h3>
<div class="sect3">
-<h4 id="_responses_20"><a class="anchor" href="#_responses_20"></a><a class="link" href="#_responses_20">2.20.1. Responses</a></h4>
+<h4 id="_responses_18"><a class="anchor" href="#_responses_18"></a><a class="link" href="#_responses_18">2.18.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -1802,7 +1696,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_20"><a class="anchor" href="#_produces_20"></a><a class="link" href="#_produces_20">2.20.2. Produces</a></h4>
+<h4 id="_produces_18"><a class="anchor" href="#_produces_18"></a><a class="link" href="#_produces_18">2.18.2. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1813,9 +1707,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route26"><a class="anchor" href="#_route26"></a><a class="link" href="#_route26">2.21. PUT /dictionary/{dictionaryName}</a></h3>
+<h3 id="_route80"><a class="anchor" href="#_route80"></a><a class="link" href="#_route80">2.19. PUT /dictionary/{dictionaryName}</a></h3>
<div class="sect3">
-<h4 id="_parameters_14"><a class="anchor" href="#_parameters_14"></a><a class="link" href="#_parameters_14">2.21.1. Parameters</a></h4>
+<h4 id="_parameters_13"><a class="anchor" href="#_parameters_13"></a><a class="link" href="#_parameters_13">2.19.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -1846,7 +1740,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_21"><a class="anchor" href="#_responses_21"></a><a class="link" href="#_responses_21">2.21.2. Responses</a></h4>
+<h4 id="_responses_19"><a class="anchor" href="#_responses_19"></a><a class="link" href="#_responses_19">2.19.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -1870,7 +1764,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_consumes_7"><a class="anchor" href="#_consumes_7"></a><a class="link" href="#_consumes_7">2.21.3. Consumes</a></h4>
+<h4 id="_consumes_7"><a class="anchor" href="#_consumes_7"></a><a class="link" href="#_consumes_7">2.19.3. Consumes</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1880,7 +1774,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect3">
-<h4 id="_produces_21"><a class="anchor" href="#_produces_21"></a><a class="link" href="#_produces_21">2.21.4. Produces</a></h4>
+<h4 id="_produces_19"><a class="anchor" href="#_produces_19"></a><a class="link" href="#_produces_19">2.19.4. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1891,9 +1785,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route29"><a class="anchor" href="#_route29"></a><a class="link" href="#_route29">2.22. GET /dictionary/{dictionaryName}/items</a></h3>
+<h3 id="_route83"><a class="anchor" href="#_route83"></a><a class="link" href="#_route83">2.20. GET /dictionary/{dictionaryName}/items</a></h3>
<div class="sect3">
-<h4 id="_parameters_15"><a class="anchor" href="#_parameters_15"></a><a class="link" href="#_parameters_15">2.22.1. Parameters</a></h4>
+<h4 id="_parameters_14"><a class="anchor" href="#_parameters_14"></a><a class="link" href="#_parameters_14">2.20.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -1918,7 +1812,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_22"><a class="anchor" href="#_responses_22"></a><a class="link" href="#_responses_22">2.22.2. Responses</a></h4>
+<h4 id="_responses_20"><a class="anchor" href="#_responses_20"></a><a class="link" href="#_responses_20">2.20.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -1942,7 +1836,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_22"><a class="anchor" href="#_produces_22"></a><a class="link" href="#_produces_22">2.22.3. Produces</a></h4>
+<h4 id="_produces_20"><a class="anchor" href="#_produces_20"></a><a class="link" href="#_produces_20">2.20.3. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -1953,9 +1847,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route28"><a class="anchor" href="#_route28"></a><a class="link" href="#_route28">2.23. PUT /dictionary/{dictionaryName}/items</a></h3>
+<h3 id="_route82"><a class="anchor" href="#_route82"></a><a class="link" href="#_route82">2.21. PUT /dictionary/{dictionaryName}/items</a></h3>
<div class="sect3">
-<h4 id="_parameters_16"><a class="anchor" href="#_parameters_16"></a><a class="link" href="#_parameters_16">2.23.1. Parameters</a></h4>
+<h4 id="_parameters_15"><a class="anchor" href="#_parameters_15"></a><a class="link" href="#_parameters_15">2.21.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -1986,7 +1880,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_23"><a class="anchor" href="#_responses_23"></a><a class="link" href="#_responses_23">2.23.2. Responses</a></h4>
+<h4 id="_responses_21"><a class="anchor" href="#_responses_21"></a><a class="link" href="#_responses_21">2.21.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -2010,7 +1904,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_consumes_8"><a class="anchor" href="#_consumes_8"></a><a class="link" href="#_consumes_8">2.23.3. Consumes</a></h4>
+<h4 id="_consumes_8"><a class="anchor" href="#_consumes_8"></a><a class="link" href="#_consumes_8">2.21.3. Consumes</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2020,7 +1914,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect3">
-<h4 id="_produces_23"><a class="anchor" href="#_produces_23"></a><a class="link" href="#_produces_23">2.23.4. Produces</a></h4>
+<h4 id="_produces_21"><a class="anchor" href="#_produces_21"></a><a class="link" href="#_produces_21">2.21.4. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2031,9 +1925,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route4"><a class="anchor" href="#_route4"></a><a class="link" href="#_route4">2.24. GET /healthcheck</a></h3>
+<h3 id="_route60"><a class="anchor" href="#_route60"></a><a class="link" href="#_route60">2.22. GET /healthcheck</a></h3>
<div class="sect3">
-<h4 id="_responses_24"><a class="anchor" href="#_responses_24"></a><a class="link" href="#_responses_24">2.24.1. Responses</a></h4>
+<h4 id="_responses_22"><a class="anchor" href="#_responses_22"></a><a class="link" href="#_responses_22">2.22.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
@@ -2054,7 +1948,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_24"><a class="anchor" href="#_produces_24"></a><a class="link" href="#_produces_24">2.24.2. Produces</a></h4>
+<h4 id="_produces_22"><a class="anchor" href="#_produces_22"></a><a class="link" href="#_produces_22">2.22.2. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2065,9 +1959,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route24"><a class="anchor" href="#_route24"></a><a class="link" href="#_route24">2.25. GET /tosca/models</a></h3>
+<h3 id="_route78"><a class="anchor" href="#_route78"></a><a class="link" href="#_route78">2.23. GET /tosca/models</a></h3>
<div class="sect3">
-<h4 id="_responses_25"><a class="anchor" href="#_responses_25"></a><a class="link" href="#_responses_25">2.25.1. Responses</a></h4>
+<h4 id="_responses_23"><a class="anchor" href="#_responses_23"></a><a class="link" href="#_responses_23">2.23.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -2091,7 +1985,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_25"><a class="anchor" href="#_produces_25"></a><a class="link" href="#_produces_25">2.25.2. Produces</a></h4>
+<h4 id="_produces_23"><a class="anchor" href="#_produces_23"></a><a class="link" href="#_produces_23">2.23.2. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2102,9 +1996,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route23"><a class="anchor" href="#_route23"></a><a class="link" href="#_route23">2.26. GET /tosca/models/policyType/{policyType}</a></h3>
+<h3 id="_route77"><a class="anchor" href="#_route77"></a><a class="link" href="#_route77">2.24. GET /tosca/models/policyType/{policyType}</a></h3>
<div class="sect3">
-<h4 id="_parameters_17"><a class="anchor" href="#_parameters_17"></a><a class="link" href="#_parameters_17">2.26.1. Parameters</a></h4>
+<h4 id="_parameters_16"><a class="anchor" href="#_parameters_16"></a><a class="link" href="#_parameters_16">2.24.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -2129,7 +2023,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_26"><a class="anchor" href="#_responses_26"></a><a class="link" href="#_responses_26">2.26.2. Responses</a></h4>
+<h4 id="_responses_24"><a class="anchor" href="#_responses_24"></a><a class="link" href="#_responses_24">2.24.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
@@ -2150,7 +2044,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_26"><a class="anchor" href="#_produces_26"></a><a class="link" href="#_produces_26">2.26.3. Produces</a></h4>
+<h4 id="_produces_24"><a class="anchor" href="#_produces_24"></a><a class="link" href="#_produces_24">2.24.3. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2161,9 +2055,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route25"><a class="anchor" href="#_route25"></a><a class="link" href="#_route25">2.27. GET /tosca/models/{toscaModelName}</a></h3>
+<h3 id="_route79"><a class="anchor" href="#_route79"></a><a class="link" href="#_route79">2.25. GET /tosca/models/{toscaModelName}</a></h3>
<div class="sect3">
-<h4 id="_parameters_18"><a class="anchor" href="#_parameters_18"></a><a class="link" href="#_parameters_18">2.27.1. Parameters</a></h4>
+<h4 id="_parameters_17"><a class="anchor" href="#_parameters_17"></a><a class="link" href="#_parameters_17">2.25.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -2188,7 +2082,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_27"><a class="anchor" href="#_responses_27"></a><a class="link" href="#_responses_27">2.27.2. Responses</a></h4>
+<h4 id="_responses_25"><a class="anchor" href="#_responses_25"></a><a class="link" href="#_responses_25">2.25.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 10%;">
@@ -2212,7 +2106,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_27"><a class="anchor" href="#_produces_27"></a><a class="link" href="#_produces_27">2.27.3. Produces</a></h4>
+<h4 id="_produces_25"><a class="anchor" href="#_produces_25"></a><a class="link" href="#_produces_25">2.25.3. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2223,9 +2117,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route22"><a class="anchor" href="#_route22"></a><a class="link" href="#_route22">2.28. PUT /tosca/models/{toscaModelName}</a></h3>
+<h3 id="_route76"><a class="anchor" href="#_route76"></a><a class="link" href="#_route76">2.26. PUT /tosca/models/{toscaModelName}</a></h3>
<div class="sect3">
-<h4 id="_parameters_19"><a class="anchor" href="#_parameters_19"></a><a class="link" href="#_parameters_19">2.28.1. Parameters</a></h4>
+<h4 id="_parameters_18"><a class="anchor" href="#_parameters_18"></a><a class="link" href="#_parameters_18">2.26.1. Parameters</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 22.2222%;">
@@ -2256,7 +2150,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_responses_28"><a class="anchor" href="#_responses_28"></a><a class="link" href="#_responses_28">2.28.2. Responses</a></h4>
+<h4 id="_responses_26"><a class="anchor" href="#_responses_26"></a><a class="link" href="#_responses_26">2.26.2. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
@@ -2277,7 +2171,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_consumes_9"><a class="anchor" href="#_consumes_9"></a><a class="link" href="#_consumes_9">2.28.3. Consumes</a></h4>
+<h4 id="_consumes_9"><a class="anchor" href="#_consumes_9"></a><a class="link" href="#_consumes_9">2.26.3. Consumes</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2287,7 +2181,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect3">
-<h4 id="_produces_28"><a class="anchor" href="#_produces_28"></a><a class="link" href="#_produces_28">2.28.4. Produces</a></h4>
+<h4 id="_produces_26"><a class="anchor" href="#_produces_26"></a><a class="link" href="#_produces_26">2.26.4. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2298,9 +2192,9 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
</div>
<div class="sect2">
-<h3 id="_route30"><a class="anchor" href="#_route30"></a><a class="link" href="#_route30">2.29. GET /user/getUser</a></h3>
+<h3 id="_route84"><a class="anchor" href="#_route84"></a><a class="link" href="#_route84">2.27. GET /user/getUser</a></h3>
<div class="sect3">
-<h4 id="_responses_29"><a class="anchor" href="#_responses_29"></a><a class="link" href="#_responses_29">2.29.1. Responses</a></h4>
+<h4 id="_responses_27"><a class="anchor" href="#_responses_27"></a><a class="link" href="#_responses_27">2.27.1. Responses</a></h4>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 33.3333%;">
@@ -2321,7 +2215,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</table>
</div>
<div class="sect3">
-<h4 id="_produces_29"><a class="anchor" href="#_produces_29"></a><a class="link" href="#_produces_29">2.29.2. Produces</a></h4>
+<h4 id="_produces_27"><a class="anchor" href="#_produces_27"></a><a class="link" href="#_produces_27">2.27.2. Produces</a></h4>
<div class="ulist">
<ul>
<li>
@@ -2728,6 +2622,11 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
</tr>
<tr>
+<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>modelId</strong><br>
+<em>optional</em></p></td>
+<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
+</tr>
+<tr>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><strong>modelName</strong><br>
<em>optional</em></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
@@ -2988,7 +2887,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
</div>
<div id="footer">
<div id="footer-text">
-Last updated 2018-08-27 13:47:59 +02:00
+Last updated 2018-07-05 16:29:36 +02:00
</div>
</div>
</body>
diff --git a/src/main/resources/application-noaaf.properties b/src/main/resources/application-noaaf.properties
index 2d34fba7b..4dbcd4592 100644
--- a/src/main/resources/application-noaaf.properties
+++ b/src/main/resources/application-noaaf.properties
@@ -116,11 +116,6 @@ clamp.config.files.sdcController=classpath:/clds/sdc-controllers-config.json
clamp.config.dcae.template=classpath:/clds/templates/dcae-template.json
clamp.config.dcae.deployment.template=classpath:/clds/templates/dcae-deployment-template.json
#
-# SDC request blueprint properties
-#
-clamp.config.sdc.template=classpath:/clds/templates/sdc-template.json
-clamp.config.sdc.decode.service_ids=classpath:/clds/templates/sdc-decode-service_ids.json
-#
#
# Configuration Settings for Policy Engine Components
clamp.config.policy.pdpUrl1=http://policy.api.simpledemo.onap.org:8081/pdp/ , testpdp, alpha123
@@ -171,18 +166,6 @@ clamp.config.op.controller=amsterdam
clamp.config.op.policy.appc=APPC
#
# Sdc service properties
-clamp.config.sdc.catalog.url=http://sdc.api.simpledemo.onap.org:8080/sdc/v1/catalog/
-clamp.config.sdc.hostUrl=http://sdc.api.simpledemo.onap.org:8080
-clamp.config.sdc.serviceUrl=http://sdc.api.simpledemo.onap.org:8080/sdc/v1/catalog/services
-clamp.config.sdc.serviceUsername=clamp
-clamp.config.sdc.servicePassword=b7acccda32b98c5bb7acccda32b98c5b05D511BD6D93626E90D18E9D24D9B78CD34C7EE8012F0A189A28763E82271E50A5D4EC10C7D93E06E0A2D27CAE66B981
-clamp.config.sdc.artifactLabel=blueprintclampcockpit
-clamp.config.sdc.sdcX-InstanceID=CLAMP
-clamp.config.sdc.artifactType=DCAE_INVENTORY_BLUEPRINT
-clamp.config.sdc.locationArtifactLabel=locationclampcockpit
-clamp.config.sdc.locationArtifactType=DCAE_INVENTORY_JSON
-clamp.config.sdc.InstanceID=X-ECOMP-InstanceID
-clamp.config.sdc.header.requestId = X-ECOMP-RequestID
#
clamp.config.sdc.csarFolder = /tmp/sdc-controllers
clamp.config.sdc.blueprint.parser.mapping = classpath:/clds/blueprint-parser-mapping.json
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index c492f74de..9852dc8c8 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -73,6 +73,7 @@ server.http-to-https-redirection.port=8080
server.servlet.context-path=/
#Modified engine-rest applicationpath
spring.profiles.active=clamp-default,clamp-aaf-authentication,clamp-sdc-controller
+spring.http.converters.preferred-json-mapper=gson
#The max number of active threads in this pool
server.tomcat.max-threads=200
@@ -133,11 +134,6 @@ clamp.config.files.sdcController=classpath:/clds/sdc-controllers-config.json
clamp.config.dcae.template=classpath:/clds/templates/dcae-template.json
clamp.config.dcae.deployment.template=classpath:/clds/templates/dcae-deployment-template.json
#
-# SDC request blueprint properties
-#
-clamp.config.sdc.template=classpath:/clds/templates/sdc-template.json
-clamp.config.sdc.decode.service_ids=classpath:/clds/templates/sdc-decode-service_ids.json
-#
#
# Configuration Settings for Policy Engine Components
clamp.config.policy.pdpUrl1=http://policy.api.simpledemo.onap.org:8081/pdp/ , testpdp, alpha123
@@ -188,19 +184,6 @@ clamp.config.op.controller=amsterdam
clamp.config.op.policy.appc=APPC
#
# Sdc service properties
-clamp.config.sdc.catalog.url=http://sdc.api.simpledemo.onap.org:8080/sdc/v1/catalog/
-clamp.config.sdc.hostUrl=http://sdc.api.simpledemo.onap.org:8080
-clamp.config.sdc.serviceUrl=http://sdc.api.simpledemo.onap.org:8080/sdc/v1/catalog/services
-clamp.config.sdc.serviceUsername=clamp
-clamp.config.sdc.servicePassword=b7acccda32b98c5bb7acccda32b98c5b05D511BD6D93626E90D18E9D24D9B78CD34C7EE8012F0A189A28763E82271E50A5D4EC10C7D93E06E0A2D27CAE66B981
-clamp.config.sdc.artifactLabel=blueprintclampcockpit
-clamp.config.sdc.sdcX-InstanceID=CLAMP
-clamp.config.sdc.artifactType=DCAE_INVENTORY_BLUEPRINT
-clamp.config.sdc.locationArtifactLabel=locationclampcockpit
-clamp.config.sdc.locationArtifactType=DCAE_INVENTORY_JSON
-clamp.config.sdc.InstanceID=X-ECOMP-InstanceID
-clamp.config.sdc.header.requestId = X-ECOMP-RequestID
-#
clamp.config.sdc.csarFolder = /tmp/sdc-controllers
clamp.config.sdc.blueprint.parser.mapping = classpath:/clds/blueprint-parser-mapping.json
#
diff --git a/src/main/resources/clds/camel/rest/clds-services.xml b/src/main/resources/clds/camel/rest/clds-services.xml
index 476816977..e4c4f4cbc 100644
--- a/src/main/resources/clds/camel/rest/clds-services.xml
+++ b/src/main/resources/clds/camel/rest/clds-services.xml
@@ -56,20 +56,10 @@
<to
uri="bean:org.onap.clamp.clds.service.CldsService?method=postDcaeEvent(${header.test},${body})" />
</post>
- <get uri="/clds/sdc/services" produces="application/json">
- <to
- uri="bean:org.onap.clamp.clds.service.CldsService?method=getSdcServices()" />
- </get>
<get uri="/clds/properties" produces="application/json">
<to
uri="bean:org.onap.clamp.clds.service.CldsService?method=getSdcProperties()" />
</get>
- <get
- uri="/clds/properties/{serviceInvariantUUID}?refresh={refresh}"
- produces="application/json">
- <to
- uri="bean:org.onap.clamp.clds.service.CldsService?method=getSdcPropertiesByServiceUUIDForRefresh(${header.serviceInvariantUUID},${header.refresh})" />
- </get>
<put uri="/clds/deploy/{modelName}"
type="org.onap.clamp.clds.model.CldsModel"
consumes="application/json" produces="application/json">
diff --git a/src/main/resources/clds/templates/sdc-decode-service_ids.json b/src/main/resources/clds/templates/sdc-decode-service_ids.json
deleted file mode 100644
index 9e26dfeeb..000000000
--- a/src/main/resources/clds/templates/sdc-decode-service_ids.json
+++ /dev/null
@@ -1 +0,0 @@
-{} \ No newline at end of file
diff --git a/src/main/resources/clds/templates/sdc-template.json b/src/main/resources/clds/templates/sdc-template.json
deleted file mode 100644
index 9e26dfeeb..000000000
--- a/src/main/resources/clds/templates/sdc-template.json
+++ /dev/null
@@ -1 +0,0 @@
-{} \ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java b/src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java
index c828f78a9..1b01f544b 100644
--- a/src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java
+++ b/src/test/java/org/onap/clamp/clds/client/DcaeDispatcherServicesTest.java
@@ -23,9 +23,8 @@
package org.onap.clamp.clds.client;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableMap;
+import com.google.gson.JsonObject;
import java.io.IOException;
import org.assertj.core.api.Assertions;
import org.junit.Before;
@@ -61,9 +60,13 @@ public class DcaeDispatcherServicesTest {
@InjectMocks
DcaeDispatcherServices dcaeDispatcherServices;
- private final String STATUS_RESPONSE_PROCESSING = "{\"operationType\": \"deploy\",\"status\": \"processing\"}";
- private final String STATUS_RESPONSE_ACTIVE = "{\"operationType\": \"deploy\",\"status\": \"succeeded\"}";
+ private static final String STATUS_RESPONSE_PROCESSING = "{\"operationType\": \"deploy\","
+ + "\"status\": \"processing\"}";
+ private static final String STATUS_RESPONSE_ACTIVE = "{\"operationType\": \"deploy\",\"status\": \"succeeded\"}";
+ /**
+ * Setup method.
+ */
@Before
public void setUp() {
ImmutableMap.<String, String>builder()
@@ -126,10 +129,10 @@ public class DcaeDispatcherServicesTest {
@Test
public void shouldTriggerDeploymentCreation() throws IOException {
//given
- String deploymentID = "closedLoop_152367c8-b172-47b3-9e58-c53add75d869_deploymentId";
+ String deploymentId = "closedLoop_152367c8-b172-47b3-9e58-c53add75d869_deploymentId";
String serviceTypeId = "e2ba40f7-bf42-41e7-acd7-48fd07586d90";
Mockito.when(clampProperties.getJsonTemplate("dcae.deployment.template"))
- .thenReturn(new ObjectMapper().readTree("{}"));
+ .thenReturn(new JsonObject());
Mockito.when(dcaeHttpConnectionManager
.doDcaeHttpQuery(DCAE_URL
@@ -138,11 +141,11 @@ public class DcaeDispatcherServicesTest {
"{\"serviceTypeId\":\"e2ba40f7-bf42-41e7-acd7-48fd07586d90\",\"inputs\":{}}",
"application/json"))
.thenReturn(DEPLOY_RESPONSE_STRING);
- JsonNode blueprintInputJson = new ObjectMapper().readTree("{}");
+ JsonObject blueprintInputJson = new JsonObject();
//when
String operationStatus = dcaeDispatcherServices
- .createNewDeployment(deploymentID, serviceTypeId, blueprintInputJson);
+ .createNewDeployment(deploymentId, serviceTypeId, blueprintInputJson);
//then
Assertions.assertThat(operationStatus).isEqualTo("http://deployment-handler.onap:8443/"
diff --git a/src/test/java/org/onap/clamp/clds/client/req/policy/GuardPolicyAttributesConstructorTest.java b/src/test/java/org/onap/clamp/clds/client/req/policy/GuardPolicyAttributesConstructorTest.java
index f16345676..317858012 100644
--- a/src/test/java/org/onap/clamp/clds/client/req/policy/GuardPolicyAttributesConstructorTest.java
+++ b/src/test/java/org/onap/clamp/clds/client/req/policy/GuardPolicyAttributesConstructorTest.java
@@ -44,6 +44,9 @@ public class GuardPolicyAttributesConstructorTest {
private ModelProperties modelProperties;
private List<PolicyChain> policyChains;
+ /**
+ * @throws Exception thrown if resources not found.
+ */
@Before
public void setUp() throws Exception {
String modelProp = ResourceFileUtil
diff --git a/src/test/java/org/onap/clamp/clds/client/req/policy/OperationalPolicyAttributesConstructorTest.java b/src/test/java/org/onap/clamp/clds/client/req/policy/OperationalPolicyAttributesConstructorTest.java
index 293f0e625..4d78cf816 100644
--- a/src/test/java/org/onap/clamp/clds/client/req/policy/OperationalPolicyAttributesConstructorTest.java
+++ b/src/test/java/org/onap/clamp/clds/client/req/policy/OperationalPolicyAttributesConstructorTest.java
@@ -23,14 +23,11 @@
package org.onap.clamp.clds.client.req.policy;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableMap;
-
+import com.google.gson.JsonElement;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.Map;
-
import org.assertj.core.api.Assertions;
import org.junit.Before;
import org.junit.Test;
@@ -39,6 +36,7 @@ import org.mockito.Mockito;
import org.onap.clamp.clds.config.ClampProperties;
import org.onap.clamp.clds.model.properties.ModelProperties;
import org.onap.clamp.clds.model.properties.PolicyChain;
+import org.onap.clamp.clds.util.JsonUtils;
import org.onap.clamp.clds.util.ResourceFileUtil;
import org.onap.policy.api.AttributeType;
import org.onap.policy.controlloop.policy.ControlLoopPolicy;
@@ -54,6 +52,9 @@ public class OperationalPolicyAttributesConstructorTest {
private ModelProperties modelProperties;
private PolicyChain policyChain;
+ /**
+ * @throws Exception thrown if resource not found.
+ */
@Before
public void setUp() throws Exception {
String modelProp = ResourceFileUtil
@@ -140,7 +141,7 @@ public class OperationalPolicyAttributesConstructorTest {
private PolicyChain readPolicyChainFromResources() throws IOException {
String policyChainText = ResourceFileUtil
.getResourceAsString("example/operational-policy/json-policy-chain.json");
- JsonNode policyChainNode = new ObjectMapper().readTree(policyChainText);
+ JsonElement policyChainNode = JsonUtils.GSON.fromJson(policyChainText, JsonElement.class);
return new PolicyChain(policyChainNode);
}
}
diff --git a/src/test/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatterTest.java b/src/test/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatterTest.java
new file mode 100644
index 000000000..095df9d84
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/client/req/tca/TcaRequestFormatterTest.java
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.client.req.tca;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import com.google.gson.JsonObject;
+import java.io.IOException;
+import org.junit.Test;
+import org.onap.clamp.clds.config.ClampProperties;
+import org.onap.clamp.clds.model.properties.ModelProperties;
+import org.onap.clamp.clds.model.properties.Tca;
+import org.onap.clamp.clds.model.properties.TcaItem;
+import org.onap.clamp.clds.util.JsonUtils;
+
+public class TcaRequestFormatterTest {
+
+ private static final String TCA_POLICY_PROPERTIES_TEMPLATE = "{"
+ + " \"domain\": \"measurementsForVfScaling\","
+ + " \"metricsPerEventName\": ["
+ + " {"
+ + " \"eventName\": \"???\","
+ + " \"controlLoopSchemaType\": \"VNF\","
+ + " \"policyScope\": \"DCAE\","
+ + " \"policyName\": \"???\","
+ + " \"policyVersion\": \"v0.0.1\","
+ + " \"thresholds\": ["
+ + " ]"
+ + " }"
+ + " ]"
+ + "}";
+
+ @Test
+ public void shouldReturnFormattedTcaPolicyRequest() throws IOException {
+ //given
+ String service = "TestService";
+ String policy = "TestService_scope.PolicyName";
+ ClampProperties clampProperties = mock(ClampProperties.class);
+ String expectedRequestText =
+ "{ "
+ + " \"domain\": \"measurementsForVfScaling\", "
+ + " \"metricsPerEventName\": [ "
+ + " { "
+ + " \"eventName\": \"vLoadBalancer\", "
+ + " \"controlLoopSchemaType\": \"VNF\", "
+ + " \"policyScope\": \"DCAE\", "
+ + " \"policyName\": \"TestService_scope.PolicyName\", "
+ + " \"policyVersion\": \"v0.0.1\", "
+ + " \"thresholds\": [] "
+ + " } "
+ + " ] "
+ + "}";
+
+ JsonObject tcaPolicyPropertiesTemplate = JsonUtils.GSON
+ .fromJson(TCA_POLICY_PROPERTIES_TEMPLATE, JsonObject.class);
+
+ JsonObject expectedRequest = JsonUtils.GSON.fromJson(expectedRequestText, JsonObject.class);
+
+ ModelProperties modelProperties = mock(ModelProperties.class);
+ Tca tca = mock(Tca.class);
+ TcaItem tcaItem = mock(TcaItem.class);
+ when(clampProperties.getJsonTemplate(any(), any())).thenReturn(tcaPolicyPropertiesTemplate);
+ when(tca.getTcaItem()).thenReturn(tcaItem);
+ when(tcaItem.getEventName()).thenReturn("vLoadBalancer");
+ when(tcaItem.getControlLoopSchemaType()).thenReturn("VNF");
+
+ //when
+ JsonObject policyContent = TcaRequestFormatter
+ .createPolicyContent(clampProperties, modelProperties, service, policy, tca);
+
+ //then
+ assertThat(expectedRequest).isEqualTo(policyContent);
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java b/src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java
index c04357ded..a32a60351 100644
--- a/src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java
+++ b/src/test/java/org/onap/clamp/clds/config/CldsUserJsonDecoderTest.java
@@ -25,10 +25,7 @@
package org.onap.clamp.clds.config;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import java.util.Collections;
import org.junit.Test;
import org.onap.clamp.clds.service.CldsUser;
diff --git a/src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java b/src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java
index 3f0a078bb..d27690bfa 100644
--- a/src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java
+++ b/src/test/java/org/onap/clamp/clds/config/sdc/SdcSingleControllerConfigurationTest.java
@@ -29,13 +29,13 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
+import com.google.gson.JsonObject;
import java.io.IOException;
-
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
import org.junit.Test;
import org.onap.clamp.clds.exception.sdc.controller.SdcParametersException;
+import org.onap.clamp.clds.util.JsonUtils;
import org.onap.clamp.clds.util.ResourceFileUtil;
/**
@@ -43,13 +43,19 @@ import org.onap.clamp.clds.util.ResourceFileUtil;
*/
public class SdcSingleControllerConfigurationTest {
+ /**
+ * @param fileName file for sdc controller configuration.
+ * @param sdcControllerName sdc controller name.
+ * @return instance of SdcSingleControllerConfiguration.
+ */
public static SdcSingleControllerConfiguration loadControllerConfiguration(String fileName,
- String sdcControllerName) throws IOException {
- JsonNode jsonNode = new ObjectMapper().readValue(ResourceFileUtil.getResourceAsStream(fileName),
- JsonNode.class);
- SdcSingleControllerConfiguration sdcSingleControllerConfiguration = new SdcSingleControllerConfiguration(
- jsonNode, sdcControllerName);
- return sdcSingleControllerConfiguration;
+ String sdcControllerName) {
+
+ InputStreamReader streamReader = new InputStreamReader(ResourceFileUtil.getResourceAsStream(fileName),
+ StandardCharsets.UTF_8);
+ JsonObject jsonNode = JsonUtils.GSON.fromJson(streamReader, JsonObject.class);
+
+ return new SdcSingleControllerConfiguration(jsonNode, sdcControllerName);
}
@Test
diff --git a/src/test/java/org/onap/clamp/clds/it/CldsDaoItCase.java b/src/test/java/org/onap/clamp/clds/it/CldsDaoItCase.java
index 12fa2932c..d4172c244 100644
--- a/src/test/java/org/onap/clamp/clds/it/CldsDaoItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/CldsDaoItCase.java
@@ -25,30 +25,24 @@ package org.onap.clamp.clds.it;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import java.io.IOException;
-import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.NotFoundException;
-import org.apache.commons.codec.DecoderException;
import org.apache.commons.lang3.RandomStringUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.onap.clamp.clds.client.req.sdc.SdcCatalogServices;
import org.onap.clamp.clds.dao.CldsDao;
-import org.onap.clamp.clds.model.CldsDbServiceCache;
import org.onap.clamp.clds.model.CldsEvent;
import org.onap.clamp.clds.model.CldsModel;
import org.onap.clamp.clds.model.CldsMonitoringDetails;
-import org.onap.clamp.clds.model.CldsServiceData;
import org.onap.clamp.clds.model.CldsTemplate;
import org.onap.clamp.clds.util.ResourceFileUtil;
import org.springframework.beans.factory.annotation.Autowired;
@@ -69,8 +63,6 @@ public class CldsDaoItCase {
private String bpmnText;
private String imageText;
private String bpmnPropText;
- @Autowired
- private SdcCatalogServices sdcCatalogServices;
/**
* Setup the variable before the tests execution.
@@ -165,30 +157,4 @@ public class CldsDaoItCase {
});
}
- @Test
- public void testCldsServiceCache() throws GeneralSecurityException, DecoderException, IOException {
- CldsServiceData cldsServiceData = sdcCatalogServices
- .getCldsServiceDataWithAlarmConditions("4cc5b45a-1f63-4194-8100-cd8e14248c92");
- // Test not in cache so should be null
- CldsServiceData cldsServiceDataCache = cldsDao.getCldsServiceCache("4cc5b45a-1f63-4194-8100-cd8e14248c92");
- assertNull(cldsServiceDataCache);
- cldsDao.setCldsServiceCache(new CldsDbServiceCache(cldsServiceData));
- cldsServiceDataCache = cldsDao.getCldsServiceCache("4cc5b45a-1f63-4194-8100-cd8e14248c92");
- assertNotNull(cldsServiceDataCache);
- assertEquals("56441b4b-0467-41dc-9a0e-e68613838219", cldsServiceDataCache.getServiceUUID());
- assertEquals("4cc5b45a-1f63-4194-8100-cd8e14248c92", cldsServiceDataCache.getServiceInvariantUUID());
- assertEquals(2, cldsServiceDataCache.getCldsVfs().size());
- assertNotNull(cldsServiceDataCache.getAgeOfRecord());
- assertEquals(4, cldsServiceDataCache.getCldsVfs().get(0).getCldsVfcs().size());
- assertEquals("07e266fc-49ab-4cd7-8378-ca4676f1b9ec",
- cldsServiceDataCache.getCldsVfs().get(0).getVfInvariantResourceUUID());
- assertEquals(0, cldsServiceDataCache.getCldsVfs().get(0).getCldsKPIList().size());
- // Second update
- cldsServiceData.setCldsVfs(null);
- cldsDao.setCldsServiceCache(new CldsDbServiceCache(cldsServiceData));
- cldsServiceDataCache = cldsDao.getCldsServiceCache("4cc5b45a-1f63-4194-8100-cd8e14248c92");
- assertNotNull(cldsServiceDataCache);
- assertNull(cldsServiceDataCache.getCldsVfs());
- cldsDao.clearServiceCache();
- }
}
diff --git a/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java b/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
index 85218abb5..347de4a78 100644
--- a/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
@@ -26,12 +26,10 @@ package org.onap.clamp.clds.it;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.InputStream;
-import java.security.GeneralSecurityException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
@@ -40,9 +38,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.NotFoundException;
import javax.xml.transform.TransformerException;
-import org.apache.commons.codec.DecoderException;
import org.apache.commons.lang3.RandomStringUtils;
-import org.json.JSONException;
import org.json.simple.parser.ParseException;
import org.junit.Before;
import org.junit.Test;
@@ -54,7 +50,6 @@ import org.onap.clamp.clds.model.CldsEvent;
import org.onap.clamp.clds.model.CldsInfo;
import org.onap.clamp.clds.model.CldsModel;
import org.onap.clamp.clds.model.CldsMonitoringDetails;
-import org.onap.clamp.clds.model.CldsServiceData;
import org.onap.clamp.clds.model.CldsTemplate;
import org.onap.clamp.clds.model.DcaeEvent;
import org.onap.clamp.clds.service.CldsService;
@@ -160,7 +155,7 @@ public class CldsServiceItCase {
}
@Test
- public void testGetCLDSDetails() throws IOException {
+ public void testGetCldsDetails() throws IOException {
List<CldsMonitoringDetails> cldsMonitoringDetailsList = cldsService.getCldsDetails();
assertNotNull(cldsMonitoringDetailsList);
}
@@ -281,35 +276,4 @@ public class CldsServiceItCase {
ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-global.json"),
cldsService.getSdcProperties(), true);
}
-
- @Test
- public void testGetSdcServices() throws GeneralSecurityException, DecoderException, JSONException, IOException {
- String result = cldsService.getSdcServices();
- JSONAssert.assertEquals(
- ResourceFileUtil.getResourceAsString("example/sdc/expected-result/all-sdc-services.json"), result, true);
- }
-
- @Test
- public void testGetSdcPropertiesByServiceUuidForRefresh()
- throws GeneralSecurityException, DecoderException, JSONException, IOException {
- SecurityContext securityContext = Mockito.mock(SecurityContext.class);
- Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
-
- cldsService.setSecurityContext(securityContext);
- // Test basic functionalities
- String result = cldsService.getSdcPropertiesByServiceUUIDForRefresh("4cc5b45a-1f63-4194-8100-cd8e14248c92",
- false);
- JSONAssert.assertEquals(
- ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-4cc5b45a.json"), result,
- true);
- // Now test the Cache effect
- CldsServiceData cldsServiceDataCache = cldsDao.getCldsServiceCache("c95b0e7c-c1f0-4287-9928-7964c5377a46");
- // Should not be there, so should be null
- assertNull(cldsServiceDataCache);
- cldsService.getSdcPropertiesByServiceUUIDForRefresh("c95b0e7c-c1f0-4287-9928-7964c5377a46", true);
- // Should be there now, so should NOT be null
- cldsServiceDataCache = cldsDao.getCldsServiceCache("c95b0e7c-c1f0-4287-9928-7964c5377a46");
- assertNotNull(cldsServiceDataCache);
- cldsDao.clearServiceCache();
- }
}
diff --git a/src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java b/src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java
index 12e8dd90d..8e03153a2 100644
--- a/src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/DcaeHttpConnectionManagerItCase.java
@@ -69,22 +69,22 @@ public class DcaeHttpConnectionManagerItCase {
@Autowired
DcaeHttpConnectionManager dcaeHttpConnectionManager;
- private static TrustManager[] trustAllCerts = new TrustManager[] {
- new X509TrustManager() {
+ private static TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
- @Override
- public java.security.cert.X509Certificate[] getAcceptedIssuers() {
- return null;
- }
+ @Override
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
- @Override
- public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
- }
+ @Override
+ public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+ }
- @Override
- public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
- }
+ @Override
+ public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
+ }
};
private void enableSslNoCheck() throws NoSuchAlgorithmException, KeyManagementException {
diff --git a/src/test/java/org/onap/clamp/clds/it/PolicyClientItCase.java b/src/test/java/org/onap/clamp/clds/it/PolicyClientItCase.java
index 31594cbac..3acc439a4 100644
--- a/src/test/java/org/onap/clamp/clds/it/PolicyClientItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/PolicyClientItCase.java
@@ -24,7 +24,9 @@
package org.onap.clamp.clds.it;
+import com.google.gson.reflect.TypeToken;
import java.io.IOException;
+import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
@@ -47,7 +49,7 @@ import org.onap.clamp.clds.model.properties.Policy;
import org.onap.clamp.clds.model.properties.PolicyItem;
import org.onap.clamp.clds.model.properties.Tca;
import org.onap.clamp.clds.transform.XslTransformer;
-import org.onap.clamp.clds.util.JacksonUtils;
+import org.onap.clamp.clds.util.JsonUtils;
import org.onap.clamp.clds.util.LoggingUtils;
import org.onap.clamp.clds.util.ResourceFileUtil;
import org.onap.policy.api.AttributeType;
@@ -67,6 +69,8 @@ import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
public class PolicyClientItCase {
+ private static final Type MAP_OF_STRING_TO_OBJECT_TYPE = new TypeToken<Map<String, Object>>() {}.getType();
+
@Autowired
private CldsDao cldsDao;
@Autowired
@@ -82,6 +86,11 @@ public class PolicyClientItCase {
String modelBpmnPropJson;
ModelProperties prop;
+ /**
+ * Setup method.
+ * @throws IOException thrown if resources not found
+ * @throws TransformerException thrown if invalid xml given to transformation
+ */
@Before
public void setUp() throws IOException, TransformerException {
modelProp = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/model-properties.json");
@@ -94,7 +103,7 @@ public class PolicyClientItCase {
}
@Test
- public void testSendGuardPolicy() throws TransformerException, IOException {
+ public void testSendGuardPolicy() {
// Normally there is only one Guard
List<PolicyItem> policyItems = GuardPolicyAttributesConstructor
.getAllPolicyGuardsFromPolicyChain(prop.getType(Policy.class).getPolicyChains().get(0));
@@ -105,8 +114,7 @@ public class PolicyClientItCase {
String response = policyClient.sendGuardPolicy(
GuardPolicyAttributesConstructor.formatAttributes(prop, policyItem), prop, LoggingUtils.getRequestId(),
policyItem);
- Map<String, Object> mapNodes = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree(response), Map.class);
+ Map<String, Object> mapNodes = JsonUtils.GSON.fromJson(response, MAP_OF_STRING_TO_OBJECT_TYPE);
Assertions.assertThat(mapNodes).contains(Assertions.entry("policyClass", "Decision"),
Assertions.entry("policyName",
modelName.replace("-", "_") + "." + controlName + "_Policy_12lup3h_0_Guard_6TtHGPq"),
@@ -124,14 +132,13 @@ public class PolicyClientItCase {
}
@Test
- public void testSendBrmsPolicy()
- throws TransformerException, BuilderException, IllegalArgumentException, IOException {
+ public void testSendBrmsPolicy() throws BuilderException, IllegalArgumentException, IOException {
Map<AttributeType, Map<String, String>> attributes = OperationalPolicyAttributesConstructor.formatAttributes(
refProp, prop, prop.getType(Policy.class).getId(), prop.getType(Policy.class).getPolicyChains().get(0));
String response = policyClient.sendBrmsPolicy(attributes, prop, LoggingUtils.getRequestId());
- Map<String, Object> mapNodes = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree(response), Map.class);
+ Map<String, Object> mapNodes = JsonUtils.GSON.fromJson(response, MAP_OF_STRING_TO_OBJECT_TYPE);
+
Assertions.assertThat(mapNodes).contains(Assertions.entry("policyClass", "Config"),
Assertions.entry("policyName", modelName.replace("-", "_") + "." + controlName + "_Policy_12lup3h_0"),
Assertions.entry("policyConfigType", PolicyConfigType.BRMS_PARAM.name()),
@@ -144,14 +151,13 @@ public class PolicyClientItCase {
}
@Test
- public void testSendMicroServiceInJson()
- throws TransformerException, BuilderException, IllegalArgumentException, IOException {
+ public void testSendMicroServiceInJson() throws IllegalArgumentException {
prop.setCurrentModelElementId(prop.getType(Policy.class).getId());
String jsonToSend = "{\"test\":\"test\"}";
String response = policyClient.sendMicroServiceInJson(jsonToSend, prop, LoggingUtils.getRequestId());
- Map<String, Object> mapNodes = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree(response), Map.class);
+ Map<String, Object> mapNodes = JsonUtils.GSON.fromJson(response, MAP_OF_STRING_TO_OBJECT_TYPE);
+
Assertions.assertThat(mapNodes).contains(Assertions.entry("policyClass", "Config"),
Assertions.entry("policyName", modelName.replace("-", "_") + "." + controlName + "_Policy_12lup3h"),
Assertions.entry("policyConfigType", PolicyConfigType.MicroService.name()),
@@ -165,8 +171,8 @@ public class PolicyClientItCase {
public void testSendBasePolicyInOther() throws IllegalArgumentException, IOException {
String body = "test";
String response = policyClient.sendBasePolicyInOther(body, "myPolicy", prop, LoggingUtils.getRequestId());
- Map<String, Object> mapNodes = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree(response), Map.class);
+ Map<String, Object> mapNodes = JsonUtils.GSON.fromJson(response, MAP_OF_STRING_TO_OBJECT_TYPE);
+
Assertions.assertThat(mapNodes).contains(Assertions.entry("policyClass", "Config"),
Assertions.entry("policyName", "myPolicy"),
Assertions.entry("policyConfigType", PolicyConfigType.Base.name()),
@@ -181,8 +187,8 @@ public class PolicyClientItCase {
String tcaJson = TcaRequestFormatter.createPolicyJson(refProp, prop);
String response = policyClient.sendMicroServiceInOther(tcaJson, prop);
- Map<String, Object> mapNodes = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree(response), Map.class);
+ Map<String, Object> mapNodes = JsonUtils.GSON.fromJson(response, MAP_OF_STRING_TO_OBJECT_TYPE);
+
Assertions.assertThat(mapNodes).contains(Assertions.entry("policyClass", "Config"),
Assertions.entry("policyName", modelName.replace("-", "_") + "." + controlName + "_TCA_1d13unw"),
Assertions.entry("policyConfigType", PolicyConfigType.MicroService.name()),
@@ -196,10 +202,10 @@ public class PolicyClientItCase {
String[] responses = policyClient.deleteMicrosService(prop).split("\\}\\{");
// There are 2 responses appended to the result, one for PDP one for PAP !
- Map<String, Object> mapNodesPdp = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree(responses[0] + "}"), Map.class);
- Map<String, Object> mapNodesPap = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree("{" + responses[1]), Map.class);
+ Map<String, Object> mapNodesPdp = JsonUtils.GSON.fromJson(responses[0] + "}",
+ MAP_OF_STRING_TO_OBJECT_TYPE);
+ Map<String, Object> mapNodesPap = JsonUtils.GSON.fromJson("{" + responses[1],
+ MAP_OF_STRING_TO_OBJECT_TYPE);
Assertions.assertThat(mapNodesPdp).contains(
Assertions.entry("policyName", modelName.replace("-", "_") + "." + controlName + "_TCA_1d13unw"),
@@ -221,11 +227,10 @@ public class PolicyClientItCase {
prop.setGuardUniqueId(policyItems.get(0).getId());
String[] responses = policyClient.deleteGuard(prop).split("\\}\\{");
- // There are 2 responses appended to the result, one for PDP one for PAP !
- Map<String, Object> mapNodesPdp = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree(responses[0] + "}"), Map.class);
- Map<String, Object> mapNodesPap = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree("{" + responses[1]), Map.class);
+ Map<String, Object> mapNodesPdp = JsonUtils.GSON.fromJson(responses[0] + "}",
+ MAP_OF_STRING_TO_OBJECT_TYPE);
+ Map<String, Object> mapNodesPap = JsonUtils.GSON.fromJson("{" + responses[1],
+ MAP_OF_STRING_TO_OBJECT_TYPE);
Assertions.assertThat(mapNodesPdp).contains(
Assertions.entry("policyName",
@@ -245,11 +250,10 @@ public class PolicyClientItCase {
prop.setCurrentModelElementId(prop.getType(Policy.class).getId());
String[] responses = policyClient.deleteBrms(prop).split("\\}\\{");
- // There are 2 responses appended to the result, one for PDP one for PAP !
- Map<String, Object> mapNodesPdp = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree(responses[0] + "}"), Map.class);
- Map<String, Object> mapNodesPap = JacksonUtils.getObjectMapperInstance()
- .convertValue(JacksonUtils.getObjectMapperInstance().readTree("{" + responses[1]), Map.class);
+ Map<String, Object> mapNodesPdp = JsonUtils.GSON.fromJson(responses[0] + "}",
+ MAP_OF_STRING_TO_OBJECT_TYPE);
+ Map<String, Object> mapNodesPap = JsonUtils.GSON.fromJson("{" + responses[1],
+ MAP_OF_STRING_TO_OBJECT_TYPE);
Assertions.assertThat(mapNodesPdp).contains(
Assertions.entry("policyName", modelName.replace("-", "_") + "." + controlName + "_Policy_12lup3h_0"),
@@ -273,7 +277,8 @@ public class PolicyClientItCase {
String tosca = policyClient.importToscaModel(cldsToscaModel);
Assertions.assertThat(tosca).contains(
- "{\"serviceName\":\"tca-policy-test\",\"description\":\"tca-policy-test\",\"requestID\":null,\"filePath\":\"/tmp/tosca-models/tca-policy-test.yml\",");
+ "{\"serviceName\":\"tca-policy-test\",\"description\":\"tca-policy-test\","
+ + "\"requestID\":null,\"filePath\":\"/tmp/tosca-models/tca-policy-test.yml\",");
Assertions.assertThat(tosca).contains(toscaModelYaml);
}
}
diff --git a/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesItCase.java b/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesItCase.java
deleted file mode 100644
index d36e14c2b..000000000
--- a/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesItCase.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * Modifications copyright (c) 2018 Nokia
- * ===================================================================
- *
- */
-
-package org.onap.clamp.clds.it;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertTrue;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mockito;
-import org.onap.clamp.clds.client.req.sdc.SdcCatalogServices;
-import org.onap.clamp.clds.config.ClampProperties;
-import org.onap.clamp.clds.model.CldsAlarmCondition;
-import org.onap.clamp.clds.model.CldsServiceData;
-import org.onap.clamp.clds.model.sdc.SdcResource;
-import org.onap.clamp.clds.model.sdc.SdcResourceBasicInfo;
-import org.onap.clamp.clds.model.sdc.SdcServiceInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-/**
- * Test SDC Catalog Service class by mocking the SDC answers.
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SdcCatalogServicesItCase {
-
- @Autowired
- private ClampProperties refProp;
- @Autowired
- private SdcCatalogServices sdcCatalogWired = new SdcCatalogServices();
-
- @Test
- public void removeDuplicateServicesTest() {
- SdcServiceInfo service1a = new SdcServiceInfo();
- service1a.setName("service1");
- service1a.setVersion("1.0");
- service1a.setInvariantUUID("invariantUUID1.0");
- List<SdcServiceInfo> rawCldsSdcServiceList = new LinkedList<>();
- rawCldsSdcServiceList.add(service1a);
- rawCldsSdcServiceList.add(service1a);
- SdcServiceInfo service1b = new SdcServiceInfo();
- service1b.setName("service1");
- service1b.setVersion("1.1");
- service1b.setInvariantUUID("invariantUUID1.1");
- rawCldsSdcServiceList.add(service1b);
- SdcServiceInfo service1c = new SdcServiceInfo();
- service1c.setName("service1");
- service1c.setVersion("1.2");
- service1c.setInvariantUUID("invariantUUID1.2");
- rawCldsSdcServiceList.add(service1c);
- SdcServiceInfo service2 = new SdcServiceInfo();
- service2.setName("service2");
- service2.setVersion("1.0");
- service2.setInvariantUUID("invariantUUID2.0");
- rawCldsSdcServiceList.add(service2);
- SdcCatalogServices catalogServices = new SdcCatalogServices();
- List<SdcServiceInfo> resultList = catalogServices.removeDuplicateServices(rawCldsSdcServiceList);
- assertTrue(resultList.size() == 2);
- SdcServiceInfo res1;
- SdcServiceInfo res2;
- if ("service1".equals(resultList.get(0).getName())) {
- res1 = resultList.get(0);
- res2 = resultList.get(1);
- } else {
- res1 = resultList.get(1);
- res2 = resultList.get(0);
- }
- assertTrue("service1".equals(res1.getName()));
- assertTrue("1.2".equals(res1.getVersion()));
- assertTrue("service2".equals(res2.getName()));
- assertTrue("1.0".equals(res2.getVersion()));
- }
-
- @Test
- public void removeDuplicateSdcResourceInstancesTest() {
- List<SdcResource> rawCldsSdcResourceList = new LinkedList<>();
- SdcResource sdcResource1a = new SdcResource();
- sdcResource1a.setResourceInstanceName("resource1");
- sdcResource1a.setResourceVersion("1.0");
- rawCldsSdcResourceList.add(sdcResource1a);
- SdcResource sdcResource1b = new SdcResource();
- sdcResource1b.setResourceInstanceName("resource1");
- sdcResource1b.setResourceVersion("1.1");
- rawCldsSdcResourceList.add(sdcResource1b);
- SdcResource sdcResource1c = new SdcResource();
- sdcResource1c.setResourceInstanceName("resource1");
- sdcResource1c.setResourceVersion("1.2");
- rawCldsSdcResourceList.add(sdcResource1c);
- SdcResource sdcResource2 = new SdcResource();
- sdcResource2.setResourceInstanceName("resource2");
- sdcResource2.setResourceVersion("1.0");
- rawCldsSdcResourceList.add(sdcResource2);
- SdcCatalogServices catalogServices = new SdcCatalogServices();
- List<SdcResource> resultList = catalogServices.removeDuplicateSdcResourceInstances(rawCldsSdcResourceList);
- SdcResource res1;
- SdcResource res2;
- if ("resource1".equals(resultList.get(0).getResourceInstanceName())) {
- res1 = resultList.get(0);
- res2 = resultList.get(1);
- } else {
- res1 = resultList.get(1);
- res2 = resultList.get(0);
- }
- assertTrue("resource1".equals(res1.getResourceInstanceName()));
- assertTrue("1.2".equals(res1.getResourceVersion()));
- assertTrue("resource2".equals(res2.getResourceInstanceName()));
- assertTrue("1.0".equals(res2.getResourceVersion()));
- }
-
- @Test
- public void removeDuplicateSdcResourceBasicInfoTest() {
- List<SdcResourceBasicInfo> rawCldsSdcResourceList = new LinkedList<>();
- SdcResourceBasicInfo sdcResource1a = new SdcResourceBasicInfo();
- sdcResource1a.setName("resource1");
- sdcResource1a.setVersion("1.0");
- rawCldsSdcResourceList.add(sdcResource1a);
- SdcResourceBasicInfo sdcResource1b = new SdcResourceBasicInfo();
- sdcResource1b.setName("resource1");
- sdcResource1b.setVersion("1.1");
- rawCldsSdcResourceList.add(sdcResource1b);
- SdcResourceBasicInfo sdcResource1c = new SdcResourceBasicInfo();
- sdcResource1c.setName("resource1");
- sdcResource1c.setVersion("1.2");
- rawCldsSdcResourceList.add(sdcResource1c);
- SdcResourceBasicInfo sdcResource2 = new SdcResourceBasicInfo();
- sdcResource2.setName("resource2");
- sdcResource2.setVersion("1.0");
- rawCldsSdcResourceList.add(sdcResource2);
- SdcCatalogServices catalogServices = new SdcCatalogServices();
- List<SdcResourceBasicInfo> resultList = catalogServices
- .removeDuplicateSdcResourceBasicInfo(rawCldsSdcResourceList);
- SdcResourceBasicInfo res1;
- SdcResourceBasicInfo res2;
- if ("resource1".equals(resultList.get(0).getName())) {
- res1 = resultList.get(0);
- res2 = resultList.get(1);
- } else {
- res1 = resultList.get(1);
- res2 = resultList.get(0);
- }
- assertTrue("resource1".equals(res1.getName()));
- assertTrue("1.2".equals(res1.getVersion()));
- assertTrue("resource2".equals(res2.getName()));
- assertTrue("1.0".equals(res2.getVersion()));
- }
-
- @Test
- public void removeDuplicateSdcFunctionShouldNotReturnNull() {
- // given
- SdcCatalogServices catalogServices = new SdcCatalogServices();
-
- // when
- List<SdcResourceBasicInfo> firstResult = catalogServices.removeDuplicateSdcResourceBasicInfo(null);
- List<SdcResourceBasicInfo> secondResult = catalogServices
- .removeDuplicateSdcResourceBasicInfo(new ArrayList<>());
-
- // then
- assertThat(firstResult).isEmpty();
- assertThat(secondResult).isEmpty();
- }
-
- @Test
- public void getServiceUuidFromServiceInvariantIdTest() throws Exception {
- SdcCatalogServices spy = Mockito.spy(sdcCatalogWired);
- Mockito.doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcServicesListExample.json"), "UTF-8"))
- .when(spy).getSdcServicesInformation(null);
- // Try the vcts4 version 1.0, this one should be replaced by 1.1 so it
- // should not exist, returning empty string
- String resUuidVcts4Null = spy.getServiceUuidFromServiceInvariantId("a33ed748-3477-4434-b3f3-b5560f5e7d9b");
- assertTrue("".equals(resUuidVcts4Null));
- // Try the vcts4 version 1.1, this one should be there as it replaces
- // the vcts4 v1.0
- String resUuidVcts4Latest = spy.getServiceUuidFromServiceInvariantId("a33ed748-3477-4434-b3f3-b5560f5e7d9c");
- assertTrue("29018914-966c-442d-9d08-251b9dc45b8f".equals(resUuidVcts4Latest));
- // Try the vcts5 version 1.0, this one should be there
- String resUuidVcts5 = spy.getServiceUuidFromServiceInvariantId("a33ed748-3477-4434-b3f3-b5560f5e7d8c");
- assertTrue("29018914-966c-442d-9d08-251b9dc45b7f".equals(resUuidVcts5));
- // try one that does not exist at all
- String resUuidUnknown = spy.getServiceUuidFromServiceInvariantId("testuuid");
- assertTrue("".equals(resUuidUnknown));
- }
-
- @Test
- public void getCldsServiceDataWithAlarmConditionsTest() throws Exception {
- SdcCatalogServices spy = Mockito.spy(sdcCatalogWired);
- Mockito.doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcServicesListExample.json"), "UTF-8"))
- .when(spy).getSdcServicesInformation(null);
- // This invariant uuid is the one from vcts4 v1.1
- String serviceResourceDetailUrl = refProp.getStringValue("sdc.serviceUrl")
- + "/29018914-966c-442d-9d08-251b9dc45b8f/metadata";
- Mockito.doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcServiceDetailsExample.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(serviceResourceDetailUrl);
- String resourceDetailUrl = refProp.getStringValue("sdc.catalog.url")
- + "resources/585822c7-4027-4f84-ba50-e9248606f136/metadata";
- Mockito.doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcResourceDetailsExample.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(resourceDetailUrl);
- String securityRulesDetailUrl = refProp.getStringValue("sdc.catalog.url")
- + "resources/d57e57d2-e3c6-470d-8d16-e6ea05f536c5/metadata";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcSecurityRules.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(securityRulesDetailUrl);
- String cinderVolumeDetailUrl = refProp.getStringValue("sdc.catalog.url")
- + "resources/b4288e07-597a-44a2-aa98-ad36e551a39d/metadata";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcCinderVolume.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(cinderVolumeDetailUrl);
- String vfcGenericDetailUrl = refProp.getStringValue("sdc.catalog.url")
- + "resources/2c8f1219-8000-4001-aa13-496a0396d40f/metadata";
- Mockito.doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcVFCGenericWithAlarms.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(vfcGenericDetailUrl);
- String csvAlarmsDetailUrl = refProp.getStringValue("sdc.catalog.url")
- + "resources/2c8f1219-8000-4001-aa13-496a0396d40f/resourceInstances/virc_fe_be/"
- + "artifacts/5138e316-0237-49aa-817a-b3d8eaf77392";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcAlarmsList.csv"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(csvAlarmsDetailUrl);
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcAlarmsList.csv"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(csvAlarmsDetailUrl);
- String csvAlarmsDetailUrl2 = refProp.getStringValue("sdc.catalog.url")
- + "resources/d7646638-2572-4a94-b497-c028ac15f9ca/artifacts/5138e316-0237-49aa-817a-b3d8eaf77392";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcAlarmsList.csv"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(csvAlarmsDetailUrl2);
- String allVfResourcesDetailUrl = refProp.getStringValue("sdc.catalog.url") + "resources?resourceType=VF";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcVFResources.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(allVfResourcesDetailUrl);
- String vfcResourcesDetailUrl = refProp.getStringValue("sdc.catalog.url")
- + "resources/a0475018-1e7e-4ddd-8bee-33cbf958c2e6/metadata";
- Mockito.doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcCVFCResourceExample.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(vfcResourcesDetailUrl);
- String allVfcResourcesDetailUrl = refProp.getStringValue("sdc.catalog.url") + "resources?resourceType=VFC";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcVFCResources.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(allVfcResourcesDetailUrl);
- String allCvfcResourcesDetailUrl = refProp.getStringValue("sdc.catalog.url") + "resources?resourceType=CVFC";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcCVFCResources.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(allCvfcResourcesDetailUrl);
- String allVfAlarms = refProp.getStringValue("sdc.catalog.url")
- + "resources/84855843-5247-4e97-a2bd-5395a510253b/artifacts/d57ac7ec-f3c3-4793-983a-c75ac3a43153";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcMeasurementsList.csv"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(allVfAlarms);
- String vfcResourceExample = refProp.getStringValue("sdc.catalog.url")
- + "resources/d7646638-2572-4a94-b497-c028ac15f9ca/metadata";
- Mockito
- .doReturn(IOUtils.toString(
- SdcCatalogServicesItCase.class.getResourceAsStream("/example/sdc/sdcVFCResourceExample.json"), "UTF-8"))
- .when(spy).getCldsServicesOrResourcesBasedOnURL(vfcResourceExample);
- CldsServiceData cldsServiceData = spy
- .getCldsServiceDataWithAlarmConditions("a33ed748-3477-4434-b3f3-b5560f5e7d9c");
- assertTrue("a33ed748-3477-4434-b3f3-b5560f5e7d9c".equals(cldsServiceData.getServiceInvariantUUID()));
- assertTrue("29018914-966c-442d-9d08-251b9dc45b8f".equals(cldsServiceData.getServiceUUID()));
- assertTrue(cldsServiceData.getCldsVfs().size() == 1);
- List<CldsAlarmCondition> alarmsList = spy.getAllAlarmConditionsFromCldsServiceData(cldsServiceData,
- "alarmCondition");
- assertTrue(alarmsList.size() == 12);
- }
-}
diff --git a/src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java b/src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java
deleted file mode 100644
index 971b36f6f..000000000
--- a/src/test/java/org/onap/clamp/clds/it/SdcReqItCase.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-
-package org.onap.clamp.clds.it;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.util.List;
-
-import org.apache.commons.codec.DecoderException;
-import org.json.JSONException;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.onap.clamp.clds.client.req.sdc.SdcRequests;
-import org.onap.clamp.clds.model.CldsEvent;
-import org.onap.clamp.clds.model.properties.ModelProperties;
-import org.onap.clamp.clds.util.ResourceFileUtil;
-import org.skyscreamer.jsonassert.JSONAssert;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SdcReqItCase {
-
- @Autowired
- private SdcRequests sdcReq;
- private String modelBpmnProp;
- private String modelBpmn;
- private String modelName;
- private String controlName;
- private ModelProperties modelProperties;
- private String jsonWithYamlInside;
-
- /**
- * Initialize Test.
- */
- @Before
- public void setUp() throws IOException {
- modelBpmnProp = ResourceFileUtil.getResourceAsString("example/model-properties/tca/modelBpmnProperties.json");
- modelBpmn = ResourceFileUtil.getResourceAsString("example/model-properties/tca/modelBpmn.json");
- modelName = "example-model01";
- controlName = "ClosedLoop_FRWL_SIG_fad4dcae_e498_11e6_852e_0050568c4ccf";
- modelProperties = new ModelProperties(modelName, controlName, CldsEvent.ACTION_SUBMIT, false, modelBpmn,
- modelBpmnProp);
- jsonWithYamlInside = ResourceFileUtil.getResourceAsString("example/tca-policy-req/prop-text.json");
- }
-
- @Test
- public void formatBlueprintTest() throws IOException {
- String blueprintFormatted = sdcReq.formatBlueprint(modelProperties, jsonWithYamlInside);
- assertEquals(ResourceFileUtil.getResourceAsString("example/tca-policy-req/blueprint-expected.yaml"),
- blueprintFormatted);
- }
-
- @Test
- public void formatSdcLocationsReqTest() {
- String blueprintFormatted = sdcReq.formatSdcLocationsReq(modelProperties, "testos");
- assertEquals(
- "{\"artifactName\":\"testos\",\"locations\":[\"SNDGCA64\",\"ALPRGAED\",\"LSLEILAA\",\"MDTWNJC1\"]}",
- blueprintFormatted);
- }
-
- @Test
- public void formatSdcReqTest() throws JSONException {
- String jsonResult = sdcReq.formatSdcReq("payload", "artifactName", "artifactLabel", "artifactType");
- JSONAssert.assertEquals("{\"payloadData\" : \"cGF5bG9hZA==\",\"artifactLabel\" : \"artifactLabel\","
- + "\"artifactName\" :\"artifactName\",\"artifactType\" : \"artifactType\","
- + "\"artifactGroupType\" : \"DEPLOYMENT\",\"description\" : \"from CLAMP Cockpit\"}", jsonResult, true);
- }
-
- @Test
- public void getSdcReqUrlsListTest() throws GeneralSecurityException, DecoderException {
- List<String> listUrls = sdcReq.getSdcReqUrlsList(modelProperties);
- assertNotNull(listUrls);
- assertTrue(listUrls.size() == 1);
- assertTrue(listUrls.get(0).contains(
- "/sdc/v1/catalog/services/56441b4b-0467-41dc-9a0e-e68613838219/resourceInstances/vpacketgen0/artifacts"));
- }
-}
diff --git a/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java b/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java
index 9d58ba8f0..65aa9b44f 100644
--- a/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/config/CldsReferencePropertiesItCase.java
@@ -28,8 +28,8 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.gson.JsonElement;
import java.io.IOException;
import java.util.List;
@@ -62,24 +62,34 @@ public class CldsReferencePropertiesItCase {
assertNull(refProp.getStringValue("does.not.exist"));
}
- /**
- * Test getting prop value as a JSON Node / template.
- *
- * @throws IOException
- * when JSON parsing fails
- */
@Test
- public void testGetJsonTemplate() throws IOException {
- // ui.location.default={"DC1":"Data Center 1","DC2":"Data Center
- // 2","DC3":"Data Center 3"}
- ObjectNode root = (ObjectNode) refProp.getJsonTemplate("ui.location.default");
+ public void shouldReturnJsonFromTemplate() throws IOException {
+ //when
+ JsonElement root = refProp.getJsonTemplate("ui.location.default");
+
+ //then
assertNotNull(root);
- assertEquals(root.get("DC1").asText(), "Data Center 1");
- // Test composite key
- root = (ObjectNode) refProp.getJsonTemplate("ui.location", "default");
+ assertTrue(root.isJsonObject());
+ assertEquals(root.getAsJsonObject().get("DC1").getAsString(), "Data Center 1");
+ }
+
+ @Test
+ public void shouldReturnJsonFromTemplate_2() throws IOException {
+ //when
+ JsonElement root = refProp.getJsonTemplate("ui.location", "default");
+
+ //then
assertNotNull(root);
- assertEquals(root.get("DC1").asText(), "Data Center 1");
- root = (ObjectNode) refProp.getJsonTemplate("ui.location", "");
+ assertTrue(root.isJsonObject());
+ assertEquals(root.getAsJsonObject().get("DC1").getAsString(), "Data Center 1");
+ }
+
+ @Test
+ public void shouldReturnNullIfPropertyNotFound() throws IOException {
+ //when
+ JsonElement root = refProp.getJsonTemplate("ui.location", "");
+
+ //then
assertNull(root);
}
@@ -91,11 +101,12 @@ public class CldsReferencePropertiesItCase {
*/
@Test
public void testGetFileContent() throws IOException {
- String content = refProp.getFileContent("sdc.decode.service_ids");
- assertEquals("{}", content);
+ String location = "{\n\t\"DC1\": \"Data Center 1\",\n\t\"DC2\": \"Data Center 2\",\n\t\"DC3\": \"Data Center 3\"\n}\n";
+ String content = refProp.getFileContent("ui.location.default");
+ assertEquals(location, content);
// Test composite key
- content = refProp.getFileContent("sdc.decode", "service_ids");
- assertEquals("{}", content);
+ content = refProp.getFileContent("ui.location", "default");
+ assertEquals(location, content);
}
@Test
diff --git a/src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java b/src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java
index 0cab4b9d3..8fd817cbe 100644
--- a/src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/config/SdcControllersConfigurationItCase.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import com.google.gson.JsonSyntaxException;
import java.io.IOException;
import java.util.Map;
@@ -71,7 +72,7 @@ public class SdcControllersConfigurationItCase {
sdcControllersConfiguration.getSdcSingleControllerConfiguration("sdc-controller2").getSdcControllerName());
}
- @Test(expected = IOException.class)
+ @Test(expected = JsonSyntaxException.class)
public void testBadJsonLoading() throws IOException {
loadFile("classpath:/clds/sdc-controllers-config-bad.json");
fail("Should have raised an exception");
diff --git a/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java b/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java
index 9eaca5f73..c6dbce4c5 100644
--- a/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/sdc/controller/SdcSingleControllerItCase.java
@@ -23,7 +23,6 @@
package org.onap.clamp.clds.it.sdc.controller;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -89,8 +88,11 @@ public class SdcSingleControllerItCase {
return notifData;
}
+ /**
+ * Initialization method.
+ */
@Before
- public void init() throws IOException {
+ public void init() {
sdcSingleController = new SdcSingleController(clampProp, Mockito.mock(CsarInstaller.class),
SdcSingleControllerConfigurationTest.loadControllerConfiguration("clds/sdc-controller-config-TLS.json",
"sdc-controller1"),
diff --git a/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java b/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
index 276f50910..2c24dcb5c 100644
--- a/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
+++ b/src/test/java/org/onap/clamp/clds/it/sdc/controller/installer/CsarInstallerItCase.java
@@ -69,8 +69,8 @@ public class CsarInstallerItCase {
private static final String INVARIANT_SERVICE_UUID = "4cc5b45a-1f63-4194-8100-cd8e14248c92";
private static final String INVARIANT_RESOURCE1_UUID = "07e266fc-49ab-4cd7-8378-ca4676f1b9ec";
private static final String INVARIANT_RESOURCE2_UUID = "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad";
- private static final String INSTANCE_NAME_RESOURCE1 = "ResourceInstanceName1";
- private static final String INSTANCE_NAME_RESOURCE2 = "ResourceInstanceName2";
+ private static final String RESOURCE_INSTANCE_NAME_RESOURCE1 = "ResourceInstanceName1";
+ private static final String RESOURCE_INSTANCE_NAME_RESOURCE2 = "ResourceInstanceName2";
@Autowired
private CsarInstaller csarInstaller;
@Autowired
@@ -92,14 +92,14 @@ public class CsarInstallerItCase {
}
private BlueprintArtifact buildFakeBuildprintArtifact(String instanceName, String invariantResourceUuid,
- String blueprintFilePath, String csarArtifactName, String invariantServiceUuid) throws IOException {
+ String blueprintFilePath, String artifactName, String invariantServiceUuid) throws IOException {
IResourceInstance resource = Mockito.mock(IResourceInstance.class);
Mockito.when(resource.getResourceInstanceName()).thenReturn(instanceName);
Mockito.when(resource.getResourceInvariantUUID()).thenReturn(invariantResourceUuid);
BlueprintArtifact blueprintArtifact = Mockito.mock(BlueprintArtifact.class);
Mockito.when(blueprintArtifact.getDcaeBlueprint())
.thenReturn(ResourceFileUtil.getResourceAsString(blueprintFilePath));
- Mockito.when(blueprintArtifact.getBlueprintArtifactName()).thenReturn(csarArtifactName);
+ Mockito.when(blueprintArtifact.getBlueprintArtifactName()).thenReturn(artifactName);
Mockito.when(blueprintArtifact.getBlueprintInvariantServiceUuid()).thenReturn(invariantServiceUuid);
Mockito.when(blueprintArtifact.getResourceAttached()).thenReturn(resource);
return blueprintArtifact;
@@ -115,17 +115,23 @@ public class CsarInstallerItCase {
Mockito.when(notificationData.getResources()).thenReturn(listResources);
Map<String, BlueprintArtifact> blueprintMap = new HashMap<>();
Mockito.when(csarHandler.getMapOfBlueprints()).thenReturn(blueprintMap);
- // Create fake blueprint artifact 1
- BlueprintArtifact blueprintArtifact = buildFakeBuildprintArtifact(INSTANCE_NAME_RESOURCE1,
- INVARIANT_RESOURCE1_UUID, "example/sdc/blueprint-dcae/tca.yaml", CSAR_ARTIFACT_NAME,
- INVARIANT_SERVICE_UUID);
+ // Create fake blueprint artifact 1 on resource1
+ BlueprintArtifact blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE1,
+ INVARIANT_RESOURCE1_UUID, "example/sdc/blueprint-dcae/tca.yaml", "tca.yaml", INVARIANT_SERVICE_UUID);
listResources.add(blueprintArtifact.getResourceAttached());
- blueprintMap.put(blueprintArtifact.getResourceAttached().getResourceInstanceName(), blueprintArtifact);
- // Create fake blueprint artifact 2
- blueprintArtifact = buildFakeBuildprintArtifact(INSTANCE_NAME_RESOURCE2, INVARIANT_RESOURCE2_UUID,
- "example/sdc/blueprint-dcae/tca_2.yaml", CSAR_ARTIFACT_NAME, INVARIANT_SERVICE_UUID);
+ blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact);
+ // Create fake blueprint artifact 2 on resource2
+ blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE2, INVARIANT_RESOURCE2_UUID,
+ "example/sdc/blueprint-dcae/tca_2.yaml", "tca_2.yaml", INVARIANT_SERVICE_UUID);
listResources.add(blueprintArtifact.getResourceAttached());
- blueprintMap.put(blueprintArtifact.getResourceAttached().getResourceInstanceName(), blueprintArtifact);
+ blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact);
+
+ // Create fake blueprint artifact 3 on resource 1 so that it's possible to
+ // test multiple CL deployment per Service/vnf
+ blueprintArtifact = buildFakeBuildprintArtifact(RESOURCE_INSTANCE_NAME_RESOURCE1, INVARIANT_RESOURCE1_UUID,
+ "example/sdc/blueprint-dcae/tca_3.yaml", "tca_3.yaml", INVARIANT_SERVICE_UUID);
+ blueprintMap.put(blueprintArtifact.getBlueprintArtifactName(), blueprintArtifact);
+
// Build fake csarhandler
Mockito.when(csarHandler.getSdcNotification()).thenReturn(notificationData);
// Build fake csar Helper
@@ -153,40 +159,45 @@ public class CsarInstallerItCase {
String generatedName = RandomStringUtils.randomAlphanumeric(5);
CsarHandler csar = buildFakeCsarHandler(generatedName);
csarInstaller.installTheCsar(csar);
- CldsModel cldsModel1 = verifyClosedLoopModelLoadedInDb(csar, generatedName, INSTANCE_NAME_RESOURCE1);
+ CldsModel cldsModel1 = verifyClosedLoopModelLoadedInDb(csar, "tca.yaml");
JSONAssert.assertEquals(
IOUtils.toString(ResourceFileUtil.getResourceAsStream("example/sdc/blueprint-dcae/prop-text-for-tca.json")),
cldsModel1.getPropText(), true);
- CldsModel cldsModel2 = verifyClosedLoopModelLoadedInDb(csar, generatedName, INSTANCE_NAME_RESOURCE2);
+ CldsModel cldsModel2 = verifyClosedLoopModelLoadedInDb(csar, "tca_2.yaml");
JSONAssert.assertEquals(
IOUtils
.toString(ResourceFileUtil.getResourceAsStream("example/sdc/blueprint-dcae/prop-text-for-tca-2.json")),
cldsModel2.getPropText(), true);
+ CldsModel cldsModel3 = verifyClosedLoopModelLoadedInDb(csar, "tca_3.yaml");
+ JSONAssert.assertEquals(
+ IOUtils.toString(ResourceFileUtil.getResourceAsStream("example/sdc/blueprint-dcae/prop-text-for-tca.json")),
+ cldsModel3.getPropText(), true);
}
- private CldsModel verifyClosedLoopModelLoadedInDb(CsarHandler csar, String generatedName,
- String instanceNameResource) throws SdcArtifactInstallerException {
+ private CldsModel verifyClosedLoopModelLoadedInDb(CsarHandler csar, String artifactName)
+ throws SdcArtifactInstallerException {
+
// Get the template back from DB
- CldsTemplate templateFromDb = CldsTemplate.retrieve(cldsDao,
- CsarInstallerImpl.TEMPLATE_NAME_PREFIX + CsarInstallerImpl.buildModelName(csar, instanceNameResource),
- false);
+ CldsTemplate templateFromDb = CldsTemplate.retrieve(cldsDao, CsarInstallerImpl.TEMPLATE_NAME_PREFIX
+ + CsarInstallerImpl.buildModelName(csar, csar.getMapOfBlueprints().get(artifactName)), false);
assertNotNull(templateFromDb);
assertNotNull(templateFromDb.getBpmnText());
assertNotNull(templateFromDb.getImageText());
assertNotNull(templateFromDb.getPropText());
assertTrue(templateFromDb.getPropText().contains("global")
&& templateFromDb.getPropText().contains("node_templates:"));
- assertEquals(templateFromDb.getName(),
- CsarInstallerImpl.TEMPLATE_NAME_PREFIX + CsarInstallerImpl.buildModelName(csar, instanceNameResource));
+ assertEquals(templateFromDb.getName(), CsarInstallerImpl.TEMPLATE_NAME_PREFIX
+ + CsarInstallerImpl.buildModelName(csar, csar.getMapOfBlueprints().get(artifactName)));
// Get the Model back from DB
CldsModel modelFromDb = CldsModel.retrieve(cldsDao,
- CsarInstallerImpl.buildModelName(csar, instanceNameResource), true);
+ CsarInstallerImpl.buildModelName(csar, csar.getMapOfBlueprints().get(artifactName)), true);
assertNotNull(modelFromDb);
assertNotNull(modelFromDb.getBpmnText());
assertNotNull(modelFromDb.getImageText());
assertNotNull(modelFromDb.getPropText());
assertTrue(modelFromDb.getPropText().contains("policy_id"));
- assertEquals(CsarInstallerImpl.buildModelName(csar, instanceNameResource), modelFromDb.getName());
+ assertEquals(CsarInstallerImpl.buildModelName(csar, csar.getMapOfBlueprints().get(artifactName)),
+ modelFromDb.getName());
assertEquals(CsarInstallerImpl.CONTROL_NAME_PREFIX, modelFromDb.getControlNamePrefix());
return modelFromDb;
}
diff --git a/src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java b/src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java
index 7d3a21583..871d0a651 100644
--- a/src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java
+++ b/src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java
@@ -18,16 +18,16 @@
* limitations under the License.
* ============LICENSE_END============================================
* ===================================================================
- *
+ *
*/
package org.onap.clamp.clds.model.prop;
-import com.fasterxml.jackson.databind.JsonNode;
-
+import com.google.gson.JsonObject;
import org.onap.clamp.clds.model.properties.AbstractModelElement;
import org.onap.clamp.clds.model.properties.ModelBpmn;
import org.onap.clamp.clds.model.properties.ModelProperties;
+import org.onap.clamp.clds.util.JsonUtils;
/**
* A CustomModelElement to test the capability to add new elements on the fly.
@@ -40,10 +40,10 @@ public class CustomModelElement extends AbstractModelElement {
/**
* Main Constructor.
*/
- public CustomModelElement(ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) {
+ public CustomModelElement(ModelProperties modelProp, ModelBpmn modelBpmn, JsonObject modelJson) {
super(CUSTOM_TYPE, modelProp, modelBpmn, modelJson);
- topicPublishes = getValueByName("topicPublishes");
- test = this.getValueByName("test");
+ topicPublishes = JsonUtils.getStringValueByName(modelElementJsonNode, "topicPublishes");
+ test = JsonUtils.getStringValueByName(modelElementJsonNode, "test");
}
public static final String getType() {
diff --git a/src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java b/src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java
index 295ccc59f..4195f907c 100644
--- a/src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java
+++ b/src/test/java/org/onap/clamp/clds/model/prop/ModelPropertiesTest.java
@@ -23,6 +23,7 @@
package org.onap.clamp.clds.model.prop;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -36,6 +37,7 @@ import org.onap.clamp.clds.model.CldsModel;
import org.onap.clamp.clds.model.properties.Holmes;
import org.onap.clamp.clds.model.properties.ModelProperties;
import org.onap.clamp.clds.model.properties.Policy;
+import org.onap.clamp.clds.model.properties.PolicyItem;
import org.onap.clamp.clds.model.properties.Tca;
import org.onap.clamp.clds.util.ResourceFileUtil;
@@ -61,11 +63,12 @@ public class ModelPropertiesTest {
assertEquals(1, policy.getPolicyChains().size());
assertEquals("0", policy.getPolicyChains().get(0).getPolicyId());
assertEquals(1, policy.getPolicyChains().get(0).getPolicyItems().size());
- assertEquals("resourceid", policy.getPolicyChains().get(0).getPolicyItems().get(0).getTargetResourceId());
- assertEquals(180, policy.getPolicyChains().get(0).getPolicyItems().get(0).getRetryTimeLimit());
- assertEquals(3, policy.getPolicyChains().get(0).getPolicyItems().get(0).getMaxRetries());
- assertEquals("", policy.getPolicyChains().get(0).getPolicyItems().get(0).getParentPolicy());
- assertEquals(null, policy.getPolicyChains().get(0).getPolicyItems().get(0).getParentPolicyConditions());
+ PolicyItem firstPolicyItem = policy.getPolicyChains().get(0).getPolicyItems().get(0);
+ assertEquals("resourceid", firstPolicyItem.getTargetResourceId());
+ assertEquals(180, firstPolicyItem.getRetryTimeLimit());
+ assertEquals(3, firstPolicyItem.getMaxRetries());
+ assertEquals("", firstPolicyItem.getParentPolicy());
+ assertThat(firstPolicyItem.getParentPolicyConditions()).isEmpty();
Tca tca = prop.getType(Tca.class);
assertNotNull(tca);
assertTrue(tca.isFound());
@@ -91,8 +94,8 @@ public class ModelPropertiesTest {
prop.getGlobal().getResourceVf().toArray()));
assertTrue(Arrays.equals(new String[] { "SNDGCA64", "ALPRGAED", "LSLEILAA", "MDTWNJC1" },
prop.getGlobal().getLocation().toArray()));
- assertEquals("value1", prop.getGlobal().getDeployParameters().get("input1").asText());
- assertEquals("value2", prop.getGlobal().getDeployParameters().get("input2").asText());
+ assertEquals("value1", prop.getGlobal().getDeployParameters().get("input1").getAsString());
+ assertEquals("value2", prop.getGlobal().getDeployParameters().get("input2").getAsString());
}
@Test
@@ -107,11 +110,12 @@ public class ModelPropertiesTest {
assertEquals(1, policy.getPolicyChains().size());
assertEquals("0", policy.getPolicyChains().get(0).getPolicyId());
assertEquals(1, policy.getPolicyChains().get(0).getPolicyItems().size());
- assertEquals("resourceid", policy.getPolicyChains().get(0).getPolicyItems().get(0).getTargetResourceId());
- assertEquals(180, policy.getPolicyChains().get(0).getPolicyItems().get(0).getRetryTimeLimit());
- assertEquals(3, policy.getPolicyChains().get(0).getPolicyItems().get(0).getMaxRetries());
- assertEquals("", policy.getPolicyChains().get(0).getPolicyItems().get(0).getParentPolicy());
- assertEquals(null, policy.getPolicyChains().get(0).getPolicyItems().get(0).getParentPolicyConditions());
+ PolicyItem firstPolicyItem = policy.getPolicyChains().get(0).getPolicyItems().get(0);
+ assertEquals("resourceid", firstPolicyItem.getTargetResourceId());
+ assertEquals(180, firstPolicyItem.getRetryTimeLimit());
+ assertEquals(3, firstPolicyItem.getMaxRetries());
+ assertEquals("", firstPolicyItem.getParentPolicy());
+ assertThat(firstPolicyItem.getParentPolicyConditions()).isEmpty();
Holmes holmes = prop.getType(Holmes.class);
assertNotNull(holmes);
assertTrue(holmes.isFound());
@@ -124,8 +128,8 @@ public class ModelPropertiesTest {
prop.getGlobal().getResourceVf().toArray()));
assertTrue(Arrays.equals(new String[] { "SNDGCA64", "ALPRGAED", "LSLEILAA", "MDTWNJC1" },
prop.getGlobal().getLocation().toArray()));
- assertEquals("value1", prop.getGlobal().getDeployParameters().get("input1").asText());
- assertEquals("value2", prop.getGlobal().getDeployParameters().get("input2").asText());
+ assertEquals("value1", prop.getGlobal().getDeployParameters().get("input1").getAsString());
+ assertEquals("value2", prop.getGlobal().getDeployParameters().get("input2").getAsString());
}
@Test
diff --git a/src/test/java/org/onap/clamp/clds/model/sdc/SdcResourceBasicInfoTest.java b/src/test/java/org/onap/clamp/clds/model/sdc/SdcResourceBasicInfoTest.java
index 119fd2181..5adb0647a 100644
--- a/src/test/java/org/onap/clamp/clds/model/sdc/SdcResourceBasicInfoTest.java
+++ b/src/test/java/org/onap/clamp/clds/model/sdc/SdcResourceBasicInfoTest.java
@@ -31,15 +31,17 @@ public class SdcResourceBasicInfoTest {
@Test
public void testHashCode() {
SdcResourceBasicInfo sdc1a = new SdcResourceBasicInfo();
- SdcResourceBasicInfo sdc1b = new SdcResourceBasicInfo();
- SdcResourceBasicInfo sdc2 = new SdcResourceBasicInfo();
sdc1a.setName("test1");
sdc1a.setVersion("1.0");
- sdc1b.setName("test1");
- sdc1b.setVersion("2.0");
+
+ SdcResourceBasicInfo sdc2 = new SdcResourceBasicInfo();
sdc2.setName("test2");
sdc2.setVersion("2.0");
+ SdcResourceBasicInfo sdc1b = new SdcResourceBasicInfo();
+ sdc1b.setName("test1");
+ sdc1b.setVersion("2.0");
+
Assertions.assertThat(sdc1a.hashCode()).isNotEqualTo(sdc1b.hashCode());
Assertions.assertThat(sdc1b.hashCode()).isNotEqualTo(sdc2.hashCode());
sdc1b.setVersion("1.0");
@@ -50,12 +52,14 @@ public class SdcResourceBasicInfoTest {
@Test
public void testCompareTo() {
SdcResourceBasicInfo sdc1a = new SdcResourceBasicInfo();
- SdcResourceBasicInfo sdc1b = new SdcResourceBasicInfo();
- SdcResourceBasicInfo sdc2 = new SdcResourceBasicInfo();
sdc1a.setName("test1");
sdc1a.setVersion("1.0");
+
+ SdcResourceBasicInfo sdc1b = new SdcResourceBasicInfo();
sdc1b.setName("test1");
sdc1b.setVersion("2.0");
+
+ SdcResourceBasicInfo sdc2 = new SdcResourceBasicInfo();
sdc2.setName("test2");
sdc2.setVersion("2.0");
@@ -68,12 +72,14 @@ public class SdcResourceBasicInfoTest {
@Test
public void testEquals() {
SdcResourceBasicInfo sdc1a = new SdcResourceBasicInfo();
- SdcResourceBasicInfo sdc1b = new SdcResourceBasicInfo();
- SdcResourceBasicInfo sdc2 = new SdcResourceBasicInfo();
sdc1a.setName("test1");
sdc1a.setVersion("1.0");
+
+ SdcResourceBasicInfo sdc1b = new SdcResourceBasicInfo();
sdc1b.setName("test1");
sdc1b.setVersion("2.0");
+
+ SdcResourceBasicInfo sdc2 = new SdcResourceBasicInfo();
sdc2.setName("test2");
sdc2.setVersion("2.0");
diff --git a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java
index 725b1ff1c..bb4fd01f2 100644
--- a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java
+++ b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarHandlerTest.java
@@ -57,6 +57,7 @@ public class CsarHandlerTest {
private static final String RESOURCE1_INSTANCE_NAME = "sim-1802 0";
private static final String RESOURCE1_INSTANCE_NAME_IN_CSAR = "sim18020";
private static final String BLUEPRINT1_NAME = "FOI.Simfoimap223S0112.event_proc_bp.yaml";
+ private static final String BLUEPRINT2_NAME = "FOI.Simfoimap223S0112.event_proc_bp2.yaml";
@Test
public void testConstructor() throws CsarHandlerException {
@@ -124,20 +125,26 @@ public class CsarHandlerTest {
assertEquals(CSAR_ARTIFACT_NAME, csar.getArtifactElement().getArtifactName());
assertNotNull(csar.getSdcCsarHelper());
// Test dcaeBlueprint
- String blueprint = csar.getMapOfBlueprints().get(RESOURCE1_INSTANCE_NAME).getDcaeBlueprint();
+ String blueprint = csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getDcaeBlueprint();
assertNotNull(blueprint);
assertTrue(!blueprint.isEmpty());
assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1"));
// Test additional properties from Sdc notif
- assertEquals(BLUEPRINT1_NAME,
- csar.getMapOfBlueprints().get(RESOURCE1_INSTANCE_NAME).getBlueprintArtifactName());
+ assertEquals(BLUEPRINT1_NAME, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintArtifactName());
assertEquals(RESOURCE1_UUID,
- csar.getMapOfBlueprints().get(RESOURCE1_INSTANCE_NAME).getResourceAttached().getResourceInvariantUUID());
- assertEquals(SERVICE_UUID,
- csar.getMapOfBlueprints().get(RESOURCE1_INSTANCE_NAME).getBlueprintInvariantServiceUuid());
+ csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getResourceAttached().getResourceInvariantUUID());
+ assertEquals(SERVICE_UUID, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintInvariantServiceUuid());
+
+ // Just check the second one is there as well
+ assertEquals(BLUEPRINT2_NAME, csar.getMapOfBlueprints().get(BLUEPRINT2_NAME).getBlueprintArtifactName());
+ blueprint = csar.getMapOfBlueprints().get(BLUEPRINT2_NAME).getDcaeBlueprint();
+ assertNotNull(blueprint);
+ assertTrue(!blueprint.isEmpty());
+ assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1"));
// Do some cleanup
Path path = Paths.get(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME);
Files.deleteIfExists(path);
+
}
@Test
@@ -150,17 +157,15 @@ public class CsarHandlerTest {
assertEquals(CSAR_ARTIFACT_NAME, csar.getArtifactElement().getArtifactName());
assertNotNull(csar.getSdcCsarHelper());
// Test dcaeBlueprint
- String blueprint = csar.getMapOfBlueprints().get(RESOURCE1_INSTANCE_NAME).getDcaeBlueprint();
+ String blueprint = csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getDcaeBlueprint();
assertNotNull(blueprint);
assertTrue(!blueprint.isEmpty());
assertTrue(blueprint.contains("DCAE-VES-PM-EVENT-v1"));
// Test additional properties from Sdc notif
- assertEquals(BLUEPRINT1_NAME,
- csar.getMapOfBlueprints().get(RESOURCE1_INSTANCE_NAME).getBlueprintArtifactName());
+ assertEquals(BLUEPRINT1_NAME, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintArtifactName());
assertEquals(RESOURCE1_UUID,
- csar.getMapOfBlueprints().get(RESOURCE1_INSTANCE_NAME).getResourceAttached().getResourceInvariantUUID());
- assertEquals(SERVICE_UUID,
- csar.getMapOfBlueprints().get(RESOURCE1_INSTANCE_NAME).getBlueprintInvariantServiceUuid());
+ csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getResourceAttached().getResourceInvariantUUID());
+ assertEquals(SERVICE_UUID, csar.getMapOfBlueprints().get(BLUEPRINT1_NAME).getBlueprintInvariantServiceUuid());
Path path = Paths.get(SDC_FOLDER + "/test-controller/" + CSAR_ARTIFACT_NAME);
// A double save should simply overwrite the existing
csar.save(buildFakeSdcResut());
diff --git a/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java
new file mode 100644
index 000000000..a995c523d
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/sdc/controller/installer/CsarInstallerImplTest.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.sdc.controller.installer;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import com.google.gson.JsonObject;
+import java.io.IOException;
+import org.junit.Test;
+import org.onap.clamp.clds.util.JsonUtils;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+
+public class CsarInstallerImplTest {
+
+ @Test
+ public void shouldReturnInputParametersFromBlueprint() throws IOException {
+ //given
+ String expectedBlueprintInputsText = "{\"aaiEnrichmentHost\":\"aai.onap.svc.cluster.local\""
+ + ",\"aaiEnrichmentPort\":\"8443\""
+ + ",\"enableAAIEnrichment\":true"
+ + ",\"dmaap_host\":\"message-router\""
+ + ",\"dmaap_port\":\"3904\""
+ + ",\"enableRedisCaching\":false"
+ + ",\"redisHosts\":\"dcae-redis:6379\""
+ + ",\"tag_version\":\"nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.0\""
+ + ",\"consul_host\":\"consul-server\""
+ + ",\"consul_port\":\"8500\",\"cbs_host\":\"{\\\"test\\\":"
+ + "{\\\"test\\\":\\\"test\\\"}}\",\"cbs_port\":\"10000\""
+ + ",\"external_port\":\"32010\",\"policy_id\":\"AUTO_GENERATED_POLICY_ID_AT_SUBMIT\"}";
+
+ JsonObject expectedBlueprintInputs = JsonUtils.GSON.fromJson(expectedBlueprintInputsText, JsonObject.class);
+ String dceaBlueprint = ResourceFileUtil.getResourceAsString("tosca/dcea_blueprint.yml");
+ BlueprintArtifact blueprintArtifact = mock(BlueprintArtifact.class);
+ when(blueprintArtifact.getDcaeBlueprint()).thenReturn(dceaBlueprint);
+ CsarInstallerImpl csarInstaller = new CsarInstallerImpl();
+
+ //when
+ String parametersInJson = csarInstaller.getAllBlueprintParametersInJson(blueprintArtifact);
+
+ //then
+ assertThat(JsonUtils.GSON.fromJson(parametersInJson, JsonObject.class)).isEqualTo(expectedBlueprintInputs);
+ }
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/clamp/clds/util/JacksonUtilsTest.java b/src/test/java/org/onap/clamp/clds/util/JacksonUtilsTest.java
deleted file mode 100644
index 1d9e4e79d..000000000
--- a/src/test/java/org/onap/clamp/clds/util/JacksonUtilsTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-
-package org.onap.clamp.clds.util;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-
-import java.io.IOException;
-
-import org.junit.Test;
-
-public class JacksonUtilsTest {
-
- public static class TestClass extends TestObject {
-
- String test2;
- TestObject2 object2;
-
- public TestClass(String value1, String value2) {
- super(value1);
- test2 = value2;
- }
-
- public TestClass() {
- }
-
- public String getTest2() {
- return test2;
- }
-
- public void setTest2(String test2) {
- this.test2 = test2;
- }
-
- public TestObject2 getObject2() {
- return object2;
- }
-
- public void setObject2(TestObject2 object2) {
- this.object2 = object2;
- }
- }
-
- @Test
- public void testGetObjectMapperInstance() {
- assertNotNull(JacksonUtils.getObjectMapperInstance());
- }
-
- /**
- * This method test that the security hole in Jackson is not enabled in the
- * default ObjectMapper.
- *
- * @throws JsonParseException
- * In case of issues
- * @throws JsonMappingException
- * In case of issues
- * @throws IOException
- * In case of issues
- */
- @Test
- public void testCreateBeanDeserializer() throws JsonParseException, JsonMappingException, IOException {
- TestClass test = new TestClass("value1", "value2");
- test.setObject2(new TestObject2("test3"));
- Object testObject = JacksonUtils.getObjectMapperInstance()
- .readValue("[\"org.onap.clamp.clds.util.JacksonUtilsTest$TestClass\""
- + ",{\"test\":\"value1\",\"test2\":\"value2\",\"object2\":[\"org.onap.clamp.clds.util.TestObject2\","
- + "{\"test3\":\"test3\"}]}]", Object.class);
- assertNotNull(testObject);
- assertFalse(testObject instanceof TestObject);
- assertFalse(testObject instanceof TestClass);
- }
-}
diff --git a/src/test/java/org/onap/clamp/clds/util/JsonUtilsTest.java b/src/test/java/org/onap/clamp/clds/util/JsonUtilsTest.java
new file mode 100644
index 000000000..3e11b8a23
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/util/JsonUtilsTest.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * Modifications copyright (c) 2019 Nokia
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.util;
+
+import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import java.io.IOException;
+
+import java.util.List;
+import org.junit.Test;
+
+public class JsonUtilsTest {
+
+ public static class TestClass extends TestObject {
+
+ String test2;
+ TestObject2 object2;
+
+ TestClass(String value1, String value2) {
+ super(value1);
+ test2 = value2;
+ }
+
+ void setObject2(TestObject2 object2) {
+ this.object2 = object2;
+ }
+ }
+
+ private static final JsonObject DEPLOY_PARAMETERS = JsonUtils.GSON.fromJson(
+ "{\n"
+ + " \"aaiEnrichmentHost\": \"aai.onap.svc.cluster.local\",\n"
+ + " \"aaiEnrichmentPort\": \"8443\",\n"
+ + " \"enableAAIEnrichment\": true,\n"
+ + " \"dmaap_host\": \"message-router\",\n"
+ + " \"dmaap_port\": \"3904\",\n"
+ + " \"enableRedisCaching\": false,\n"
+ + " \"redisHosts\": \"dcae-redis:6379\",\n"
+ + " \"tag_version\": \"nexus3.onap.org:10001/onap/org.onap.dcaegen2."
+ + "deployments.tca-cdap-container:1.1.0\",\n"
+ + " \"consul_host\": \"consul-server\",\n"
+ + " \"consul_port\": \"8500\",\n"
+ + " \"cbs_host\": \"config-binding-service\",\n"
+ + " \"cbs_port\": \"10000\",\n"
+ + " \"external_port\": \"32010\",\n"
+ + " \"policy_id\": \"AUTO_GENERATED_POLICY_ID_AT_SUBMIT\"\n"
+ + " }", JsonObject.class);
+
+
+ @Test
+ public void testGetObjectMapperInstance() {
+ assertNotNull(JsonUtils.GSON);
+ }
+
+ /**
+ * This method test that the security hole in Jackson is not enabled in the default ObjectMapper.
+ */
+ @Test
+ public void testCreateBeanDeserializer() {
+ TestClass test = new TestClass("value1", "value2");
+ test.setObject2(new TestObject2("test3"));
+ Object testObject = JsonUtils.GSON.fromJson("[\"org.onap.clamp.clds.util.JsonUtilsTest$TestClass\""
+ + ",{\"test\":\"value1\",\"test2\":\"value2\",\"object2\":[\"org.onap.clamp.clds.util.TestObject2\","
+ + "{\"test3\":\"test3\"}]}]", Object.class);
+ assertNotNull(testObject);
+ assertFalse(testObject instanceof TestObject);
+ }
+
+
+ @Test
+ public void shouldReturnJsonValueByName() throws IOException {
+ //given
+ String modelProperties = ResourceFileUtil
+ .getResourceAsString("example/model-properties/custom/modelBpmnPropertiesMultiVF.json");
+ JsonElement globalElement = JsonUtils.GSON.fromJson(modelProperties, JsonObject.class).get("global");
+
+ //when
+ String locationName = JsonUtils.getStringValueByName(globalElement, "location");
+ String timeoutValue = JsonUtils.getStringValueByName(globalElement, "timeout");
+
+ //then
+ assertThat(locationName).isEqualTo("SNDGCA64");
+ assertThat(timeoutValue).isEqualTo("500");
+ }
+
+ @Test
+ public void shouldReturnJsonObjectByPropertyName() throws IOException {
+ //given
+ String modelProperties = ResourceFileUtil
+ .getResourceAsString("example/model-properties/custom/modelBpmnPropertiesMultiVF.json");
+ JsonElement globalElement = JsonUtils.GSON.fromJson(modelProperties, JsonObject.class).get("global");
+
+ //when
+ JsonObject deployParameters = JsonUtils.getJsonObjectByName(globalElement, "deployParameters");
+
+ //then
+ assertThat(deployParameters).isEqualToComparingFieldByField(DEPLOY_PARAMETERS);
+ }
+
+ @Test
+ public void shouldReturnJsonValuesByPropertyName() throws IOException {
+ //given
+ String modelProperties = ResourceFileUtil
+ .getResourceAsString("example/model-properties/custom/modelBpmnPropertiesMultiVF.json");
+ JsonElement globalElement = JsonUtils.GSON.fromJson(modelProperties, JsonObject.class).get("global");
+
+ //when
+ List<String> vfs = JsonUtils.getStringValuesByName(globalElement, "vf");
+
+ //then
+ assertThat(vfs).containsExactly(
+ "6c7aaec2-59eb-41d9-8681-b7f976ab668d",
+ "8sadsad0-a98s-6a7s-fd12-sadji9sa8d12",
+ "8sfd71ad-a90d-asd9-as87-8a7sd81adsaa"
+ );
+ }
+
+
+ @Test
+ public void shouldReturnJsonValueAsInteger() throws IOException {
+ //given
+ String modelProperties = ResourceFileUtil
+ .getResourceAsString("example/model-properties/custom/modelBpmnPropertiesMultiVF.json");
+ JsonElement globalElement = JsonUtils.GSON.fromJson(modelProperties, JsonObject.class).get("global");
+
+ //when
+ Integer timeoutValue = JsonUtils.getIntValueByName(globalElement, "timeout");
+
+ //then
+ assertThat(timeoutValue).isEqualTo(500);
+ }
+}
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
index d75c60869..f41b68dfb 100644
--- a/src/test/resources/application.properties
+++ b/src/test/resources/application.properties
@@ -124,11 +124,6 @@ clamp.config.files.sdcController=classpath:/clds/sdc-controllers-config.json
clamp.config.dcae.template=classpath:/clds/templates/dcae-template.json
clamp.config.dcae.deployment.template=classpath:/clds/templates/dcae-deployment-template.json
#
-# SDC request blueprint properties
-#
-clamp.config.sdc.template=classpath:/clds/templates/sdc-template.json
-clamp.config.sdc.decode.service_ids=classpath:/clds/templates/sdc-decode-service_ids.json
-#
#
# Configuration Settings for Policy Engine Components
clamp.config.policy.pdpUrl1=http://localhost:${docker.http-cache.port.host}/pdp/ , testpdp, alpha123
@@ -178,18 +173,6 @@ clamp.config.op.controller=amsterdam
clamp.config.op.policy.appc=APPC
#
# Sdc service properties
-clamp.config.sdc.catalog.url=http://localhost:${docker.http-cache.port.host}/sdc/v1/catalog/
-clamp.config.sdc.hostUrl=http://localhost:${docker.http-cache.port.host}
-clamp.config.sdc.serviceUrl=http://localhost:${docker.http-cache.port.host}/sdc/v1/catalog/services
-clamp.config.sdc.serviceUsername=clamp
-clamp.config.sdc.servicePassword=b7acccda32b98c5bb7acccda32b98c5b05D511BD6D93626E90D18E9D24D9B78CD34C7EE8012F0A189A28763E82271E50A5D4EC10C7D93E06E0A2D27CAE66B981
-clamp.config.sdc.artifactLabel=blueprintclampcockpit
-clamp.config.sdc.sdcX-InstanceID=CLAMP
-clamp.config.sdc.artifactType=DCAE_INVENTORY_BLUEPRINT
-clamp.config.sdc.locationArtifactLabel=locationclampcockpit
-clamp.config.sdc.locationArtifactType=DCAE_INVENTORY_JSON
-clamp.config.sdc.InstanceID=X-ECOMP-InstanceID
-clamp.config.sdc.header.requestId = X-ECOMP-RequestID
#
clamp.config.sdc.csarFolder = ${project.build.directory}/sdc-tests
clamp.config.sdc.blueprint.parser.mapping = classpath:/clds/blueprint-parser-mapping.json
diff --git a/src/test/resources/example/model-properties/custom/modelBpmnPropertiesMultiVF.json b/src/test/resources/example/model-properties/custom/modelBpmnPropertiesMultiVF.json
new file mode 100644
index 000000000..211aaecf7
--- /dev/null
+++ b/src/test/resources/example/model-properties/custom/modelBpmnPropertiesMultiVF.json
@@ -0,0 +1,273 @@
+{
+ "global":
+ [
+ {
+ "name": "service",
+ "value":
+ [
+ "0f983e18-4603-4bb4-a98c-e29691fb16a1"
+ ]
+ },
+
+ {
+ "name": "vf",
+ "value":
+ [
+ "6c7aaec2-59eb-41d9-8681-b7f976ab668d",
+ "8sadsad0-a98s-6a7s-fd12-sadji9sa8d12",
+ "8sfd71ad-a90d-asd9-as87-8a7sd81adsaa"
+ ]
+ },
+
+ {
+ "name": "actionSet",
+ "value":
+ [
+ "vnfRecipe"
+ ]
+ },
+
+ {
+ "name": "location",
+ "value":
+ [
+ "SNDGCA64"
+ ]
+ },
+ {
+ "name": "timeout",
+ "value": "500"
+ },
+ {
+ "name": "deployParameters",
+ "value": {
+ "aaiEnrichmentHost": "aai.onap.svc.cluster.local",
+ "aaiEnrichmentPort": "8443",
+ "enableAAIEnrichment": true,
+ "dmaap_host": "message-router",
+ "dmaap_port": "3904",
+ "enableRedisCaching": false,
+ "redisHosts": "dcae-redis:6379",
+ "tag_version": "nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.0",
+ "consul_host": "consul-server",
+ "consul_port": "8500",
+ "cbs_host": "config-binding-service",
+ "cbs_port": "10000",
+ "external_port": "32010",
+ "policy_id": "AUTO_GENERATED_POLICY_ID_AT_SUBMIT"
+ }
+ }
+ ],
+
+ "Policy_":
+ {
+ "Policy1":
+ [
+ {
+ "name": "pname",
+ "value": "Policy1"
+ },
+
+ {
+ "name": "pid",
+ "value": "1"
+ },
+
+ {
+ "name": "timeout",
+ "value": "500"
+ },
+
+ {
+ "policyConfigurations":
+ [
+ [
+ {
+ "name": "recipe",
+ "value":
+ [
+ "restart"
+ ]
+ },
+
+ {
+ "name": "maxRetries",
+ "value":
+ [
+ "3"
+ ]
+ },
+
+ {
+ "name": "retryTimeLimit",
+ "value":
+ [
+ "180"
+ ]
+ },
+
+ {
+ "name": "_id",
+ "value":
+ [
+ "n9bQ4t6"
+ ]
+ },
+
+ {
+ "name": "parentPolicy",
+ "value":
+ [
+ ""
+ ]
+ },
+ {
+ "name": "targetResourceId",
+ "value":
+ [
+ "resource-id"
+ ]
+ }
+ ],
+
+ [
+ {
+ "name": "recipe",
+ "value":
+ [
+ "rebuild"
+ ]
+ },
+
+ {
+ "name": "maxRetries",
+ "value":
+ [
+ "3"
+ ]
+ },
+
+ {
+ "name": "retryTimeLimit",
+ "value":
+ [
+ "180"
+ ]
+ },
+
+ {
+ "name": "_id",
+ "value":
+ [
+ "ItE5xKT"
+ ]
+ },
+
+ {
+ "name": "parentPolicy",
+ "value":
+ [
+ "n9bQ4t6"
+ ]
+ },
+
+ {
+ "name": "parentPolicyConditions",
+ "value":
+ [
+ "Failure_Retries",
+ "Failure_Timeout",
+ "Failure_Exception",
+ "Failure"
+ ]
+ },
+ {
+ "name": "targetResourceId",
+ "value":
+ [
+ "resource-id"
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ },
+
+ "TCA_":
+ {
+ "Narra":
+ [
+ {
+ "name": "tname",
+ "value": "Narra"
+ },
+
+ {
+ "name": "tuuid",
+ "value": "886be8da-14fe-tca1-d04b-d13b55d58df9"
+ },
+
+ {
+ "name": "tnfc",
+ "value": "ENBE"
+ },
+
+ {
+ "name": "tcaEnab",
+ "value": "on"
+ },
+
+ {
+ "name": "tcaPol",
+ "value": "Policy1"
+ },
+
+ {
+ "name": "tcaPolId",
+ "value": "1"
+ },
+
+ {
+ "name": "tcaInt",
+ "value": "2"
+ },
+
+ {
+ "name": "tcaSev",
+ "value": "Warning"
+ },
+
+ {
+ "name": "tcaVio",
+ "value": "3"
+ },
+
+ {
+ "serviceConfigurations":
+ [
+ [
+ "PMRRCCONNESTABFAILCELLLATENCY",
+ "LESS",
+ "4",
+ "$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[?(@.Name == 'PMRRCCONNESTABFAILCELLLATENCY')].Value"
+ ],
+
+ [
+ "PMRAATTCBRA",
+ "GREATER",
+ "30",
+ "$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[?(@.Name == 'PMRAATTCBRA')].Value"
+ ]
+ ]
+ }
+ ]
+ },
+
+ "CustomType_": [
+ {
+ "name": "test",
+ "value": "This is a test"
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml b/src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml
new file mode 100644
index 000000000..0ab831712
--- /dev/null
+++ b/src/test/resources/example/sdc/blueprint-dcae/tca_3.yaml
@@ -0,0 +1,104 @@
+tosca_definitions_version: cloudify_dsl_1_3
+imports:
+- http://www.getcloudify.org/spec/cloudify/3.4/types.yaml
+- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/docker/2.2.0/node-type.yaml
+- https://onap.org:8443/repository/solutioning01-mte2-raw/type_files/relationship/1.0.0/node-type.yaml
+- http://onap.org:8081/repository/solutioning01-mte2-raw/type_files/dmaap/dmaap_mr.yaml
+inputs:
+ location_id:
+ type: string
+ service_id:
+ type: string
+ policy_id:
+ type: string
+node_templates:
+ policy_0:
+ type: dcae.nodes.policy
+ properties:
+ policy_id:
+ get_input: policy_id
+ cdap_host_host:
+ type: dcae.nodes.StreamingAnalytics.SelectedCDAPInfrastructure
+ properties:
+ location_id:
+ get_input: location_id
+ scn_override: cdap_broker.solutioning-central.dcae.onap.org
+ interfaces:
+ cloudify.interfaces.lifecycle: {
+ }
+ tca_tca:
+ type: dcae.nodes.MicroService.cdap
+ properties:
+ app_config:
+ appDescription: DCAE Analytics Threshold Crossing Alert Application
+ appName: dcae-tca
+ tcaSubscriberOutputStreamName: TCASubscriberOutputStream
+ tcaVESAlertsTableName: TCAVESAlertsTable
+ tcaVESAlertsTableTTLSeconds: '1728000'
+ tcaVESMessageStatusTableName: TCAVESMessageStatusTable
+ tcaVESMessageStatusTableTTLSeconds: '86400'
+ thresholdCalculatorFlowletInstances: '2'
+ app_preferences:
+ publisherContentType: application/json
+ publisherHostName: mrlocal-mtnjftle01.onap.org
+ publisherHostPort: '3905'
+ publisherMaxBatchSize: '10'
+ publisherMaxRecoveryQueueSize: '100000'
+ publisherPollingInterval: '20000'
+ publisherProtocol: https
+ publisherTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESPub
+ publisherUserName: test@tca.af.dcae.onap.org
+ publisherUserPassword: password
+ subscriberConsumerGroup: OpenDCAE-c12
+ subscriberConsumerId: c12
+ subscriberContentType: application/json
+ subscriberHostName: mrlocal-mtnjftle01.onap.org
+ subscriberHostPort: '3905'
+ subscriberMessageLimit: '-1'
+ subscriberPollingInterval: '20000'
+ subscriberProtocol: https
+ subscriberTimeoutMS: '-1'
+ subscriberTopicName: org.onap.dcae.dmaap.mtnje2.DcaeTestVESSub
+ subscriberUserName: test@tca.af.dcae.onap.org
+ subscriberUserPassword: password
+ tca_policy: null
+ artifact_name: dcae-analytics-tca
+ artifact_version: 1.0.0
+ connections:
+ streams_publishes: [
+ ]
+ streams_subscribes: [
+ ]
+ jar_url: http://somejar
+ location_id:
+ get_input: location_id
+ namespace: cdap_tca_hi_lo
+ programs:
+ - program_id: TCAVESCollectorFlow
+ program_type: flows
+ - program_id: TCADMaaPMRSubscriberWorker
+ program_type: workers
+ - program_id: TCADMaaPMRPublisherWorker
+ program_type: workers
+ service_component_type: cdap_app_tca
+ service_id:
+ get_input: service_id
+ streamname: TCASubscriberOutputStream
+ relationships:
+ - target: topic0
+ type: dcae.relationships.subscribe_to_events
+ - target: topic1
+ type: dcae.relationships.publish_events
+ - target: cdap_host_host
+ type: dcae.relationships.component_contained_in
+ - target: policy_0
+ type: dcae.relationships.depends_on
+ topic0:
+ type: dcae.nodes.Topic
+ properties:
+ topic_name: ''
+ topic1:
+ type: dcae.nodes.Topic
+ properties:
+ topic_name: ''
+
diff --git a/src/test/resources/example/sdc/service-Simsfoimap0112.csar b/src/test/resources/example/sdc/service-Simsfoimap0112.csar
index fac487cec..ea0e44a22 100644
--- a/src/test/resources/example/sdc/service-Simsfoimap0112.csar
+++ b/src/test/resources/example/sdc/service-Simsfoimap0112.csar
Binary files differ
diff --git a/src/test/resources/tosca/dcea_blueprint.yml b/src/test/resources/tosca/dcea_blueprint.yml
new file mode 100644
index 000000000..0d3ea0462
--- /dev/null
+++ b/src/test/resources/tosca/dcea_blueprint.yml
@@ -0,0 +1,170 @@
+#
+# ============LICENSE_START====================================================
+# =============================================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# =============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END======================================================
+
+tosca_definitions_version: cloudify_dsl_1_3
+
+description: >
+ This blueprint deploys/manages the TCA module as a Docker container
+
+imports:
+ - http://www.getcloudify.org/spec/cloudify/3.4/types.yaml
+ - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/k8splugin/1.4.4/k8splugin_types.yaml
+ - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R4/dcaepolicyplugin/2.3.0/dcaepolicyplugin_types.yaml
+inputs:
+ aaiEnrichmentHost:
+ type: string
+ default: "aai.onap.svc.cluster.local"
+ aaiEnrichmentPort:
+ type: string
+ default: "8443"
+ enableAAIEnrichment:
+ type: string
+ default: true
+ dmaap_host:
+ type: string
+ default: message-router
+ dmaap_port:
+ type: string
+ default: "3904"
+ enableRedisCaching:
+ type: string
+ default: false
+ redisHosts:
+ type: string
+ default: dcae-redis:6379
+ tag_version:
+ type: string
+ default: "nexus3.onap.org:10001/onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.1.0"
+ consul_host:
+ type: string
+ default: consul-server
+ consul_port:
+ type: string
+ default: "8500"
+ cbs_host:
+ type: string
+ default:
+ test:
+ test: test
+ cbs_port:
+ type: string
+ default: "10000"
+ policy_id:
+ type: string
+ default: "none"
+ external_port:
+ type: string
+ description: Kubernetes node port on which CDAPgui is exposed
+ default: "32010"
+
+node_templates:
+ tca_k8s:
+ type: dcae.nodes.ContainerizedServiceComponent
+ relationships:
+ - target: tca_policy
+ type: cloudify.relationships.depends_on
+ properties:
+ service_component_type: 'dcaegen2-analytics-tca'
+ docker_config: {}
+ image:
+ get_input: tag_version
+ log_info:
+ log_directory: "/opt/app/TCAnalytics/logs"
+ application_config:
+ app_config:
+ appDescription: DCAE Analytics Threshold Crossing Alert Application
+ appName: dcae-tca-ak-serv
+ tcaAlertsAbatementTableName: TCAAlertsAbatementTable
+ tcaAlertsAbatementTableTTLSeconds: '1728000'
+ tcaSubscriberOutputStreamName: TCASubscriberOutputStream
+ tcaVESAlertsTableName: TCAVESAlertsTable
+ tcaVESAlertsTableTTLSeconds: '1728000'
+ tcaVESMessageStatusTableName: TCAVESMessageStatusTable
+ tcaVESMessageStatusTableTTLSeconds: '86400'
+ thresholdCalculatorFlowletInstances: '2'
+ app_preferences:
+ aaiEnrichmentHost:
+ get_input: aaiEnrichmentHost
+ aaiEnrichmentIgnoreSSLCertificateErrors: 'true'
+ aaiEnrichmentPortNumber: '8443'
+ aaiEnrichmentProtocol: https
+ aaiEnrichmentUserName: DCAE
+ aaiEnrichmentUserPassword: DCAE
+ aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query
+ aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf
+ enableAAIEnrichment:
+ get_input: enableAAIEnrichment
+ enableRedisCaching:
+ get_input: enableRedisCaching
+ redisHosts:
+ get_input: redisHosts
+ enableAlertCEFFormat: 'false'
+ publisherContentType: application/json
+ publisherHostName:
+ get_input: dmaap_host
+ publisherHostPort:
+ get_input: dmaap_port
+ publisherMaxBatchSize: '1'
+ publisherMaxRecoveryQueueSize: '100000'
+ publisherPollingInterval: '20000'
+ publisherProtocol: http
+ publisherTopicName: unauthenticated.DCAE_CL_OUTPUT
+ subscriberConsumerGroup: OpenDCAE-c12
+ subscriberConsumerId: c12
+ subscriberContentType: application/json
+ subscriberHostName:
+ get_input: dmaap_host
+ subscriberHostPort:
+ get_input: dmaap_port
+ subscriberMessageLimit: '-1'
+ subscriberPollingInterval: '30000'
+ subscriberProtocol: http
+ subscriberTimeoutMS: '-1'
+ subscriberTopicName: unauthenticated.VES_MEASUREMENT_OUTPUT
+ tca_policy: '{"domain":"measurementsForVfScaling","metricsPerEventName":[{"eventName":"vFirewallBroadcastPackets","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta","thresholdValue":300,"direction":"LESS_OR_EQUAL","severity":"MAJOR","closedLoopEventStatus":"ONSET"},{"closedLoopControlName":"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta","thresholdValue":700,"direction":"GREATER_OR_EQUAL","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]},{"eventName":"vLoadBalancer","controlLoopSchemaType":"VM","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta","thresholdValue":300,"direction":"GREATER_OR_EQUAL","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]},{"eventName":"Measurement_vGMUX","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":0,"direction":"EQUAL","severity":"MAJOR","closedLoopEventStatus":"ABATED"},{"closedLoopControlName":"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":0,"direction":"GREATER","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]}]}'
+ interfaces:
+ cloudify.interfaces.lifecycle:
+ start:
+ inputs:
+ envs:
+ DMAAPHOST:
+ { get_input: dmaap_host }
+ DMAAPPORT:
+ { get_input: dmaap_port }
+ DMAAPPUBTOPIC: "unauthenticated.DCAE_CL_OUTPUT"
+ DMAAPSUBTOPIC: "unauthenticated.VES_MEASUREMENT_OUTPUT"
+ AAIHOST:
+ { get_input: aaiEnrichmentHost }
+ AAIPORT:
+ { get_input: aaiEnrichmentPort }
+ CONSUL_HOST:
+ { get_input: consul_host }
+ CONSUL_PORT:
+ { get_input: consul_port }
+ CBS_HOST:
+ { get_input: cbs_host }
+ CBS_PORT:
+ { get_input: cbs_port }
+ CONFIG_BINDING_SERVICE: "config_binding_service"
+ ports:
+ - concat: ["11011:", { get_input: external_port }]
+ tca_policy:
+ type: dcae.nodes.policy
+ properties:
+ policy_id:
+ get_input: policy_id