diff options
Diffstat (limited to 'sdnr/wt/devicemanager/provider/src')
395 files changed, 134900 insertions, 0 deletions
diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiProviderClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiProviderClient.java new file mode 100644 index 000000000..d5030c1c7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiProviderClient.java @@ -0,0 +1,168 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.aaiconnector.impl; + +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.http.BaseHTTPResponse; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InventoryInformation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementRepresentation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.HtDevicemanagerConfiguration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.IConfigChangedListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.AaiConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AaiProviderClient implements AutoCloseable { + + private static Logger LOG = LoggerFactory.getLogger(AaiProviderClient.class); + private static boolean reloadConfigFlag; + private static final IConfigChangedListener configChangedListener = () -> reloadConfigFlag = true; + + private AaiConfig config; + private final DeviceManagerImpl deviceManager; + private final HtDevicemanagerConfiguration htconfig; + + + public AaiConfig getConfig() { + return this.config; + } + + + public AaiProviderClient(HtDevicemanagerConfiguration cfg, DeviceManagerImpl devMgr) { + this.config = cfg.getAai(); + this.htconfig = cfg; + this.htconfig.registerConfigChangedListener(configChangedListener); + this.deviceManager = devMgr; + + } + + private void _reload() { + if (reloadConfigFlag) { + this.config = AaiConfig.reload(); + LOG.info("config reloaded: {}", config == null ? "null" : config); + } + reloadConfigFlag = false; + } + + public void onDeviceRegistered(String mountPointName) { + this._reload(); + if (this.config.isOff()) { + return; + } + ONFCoreNetworkElementRepresentation ne = + this.deviceManager != null ? this.deviceManager.getNeByMountpoint(mountPointName) : null; + this.onDeviceRegistered(mountPointName, + ne != null ? ne.getInventoryInformation("MWPS") : InventoryInformation.getDefault()); + + } + + public void onDeviceRegistered(String mountPointName, InventoryInformation i) { + this._reload(); + if (this.config.isOff()) { + return; + } + new Thread(new AaiCreateRequestRunnable(mountPointName, i.getType(), i.getModel(), i.getVendor(), + i.getDeviceIpv4(), i.getInterfaceUuidList())).start(); + } + + public void onDeviceUnregistered(String mountPointName) { + this._reload(); + if (this.config.isOff()) { + return; + } + if (this.config.doDeleteOnMountPointRemoved()) { + new Thread(new AaiDeleteRequestRunnable(mountPointName)).start(); + } else { + LOG.debug("prevent deleting device {} by config", mountPointName); + } + } + + @Override + public void close() throws Exception { + this.htconfig.unregisterConfigChangedListener(configChangedListener); + } + + private class AaiCreateRequestRunnable implements Runnable { + + private static final int RESPCODE_NOTFOUND = BaseHTTPResponse.CODE404; + private static final int RESPCODE_FOUND = BaseHTTPResponse.CODE200; + private final AaiWebApiClient mClient; + private final String pnfId; + private final String type; + private final String model; + private final String vendor; + private final String oamIp; + private final List<String> ifaces; + private final int timeout; + + public AaiCreateRequestRunnable(String pnfId, String type, String model, String vendor, String oamIp, + List<String> ifaces) { + this.pnfId = pnfId; + this.type = type; + this.model = model; + this.vendor = vendor; + this.oamIp = oamIp; + this.ifaces = ifaces; + this.timeout = AaiProviderClient.this.config.getConnectionTimeout(); + this.mClient = new AaiWebApiClient(AaiProviderClient.this.config.getBaseUrl(), + AaiProviderClient.this.config.getHeaders(), AaiProviderClient.this.config.getTrustAll(), + AaiProviderClient.this.config.getPcks12CertificateFilename(), + AaiProviderClient.this.config.getPcks12CertificatePassphrase()); + } + + @Override + public void run() { + LOG.debug("check if pnfid {} exists", pnfId); + this.mClient.setTimeout(timeout); + int responseCode = this.mClient.pnfCheckIfExists(pnfId); + if (responseCode == RESPCODE_NOTFOUND) { + LOG.debug("do pnfCreate for {}", pnfId); + this.mClient.pnfCreate(pnfId, type, model, vendor, oamIp, ifaces); + } else if (responseCode == RESPCODE_FOUND) { + LOG.debug("pnfid {} found, nothing to do", pnfId); + } else { + LOG.warn("unhandled response code: {}", responseCode); + } + } + }; + + private class AaiDeleteRequestRunnable implements Runnable { + + private final AaiWebApiClient mClient; + private final String pnfId; + private final int timeout; + + + public AaiDeleteRequestRunnable(String pnfId) { + this.pnfId = pnfId; + this.timeout = AaiProviderClient.this.config.getConnectionTimeout(); + this.mClient = new AaiWebApiClient(AaiProviderClient.this.config.getBaseUrl(), + AaiProviderClient.this.config.getHeaders(), AaiProviderClient.this.config.getTrustAll(), + AaiProviderClient.this.config.getPcks12CertificateFilename(), + AaiProviderClient.this.config.getPcks12CertificatePassphrase()); + } + + @Override + public void run() { + this.mClient.setTimeout(this.timeout); + this.mClient.pnfDelete(pnfId); + } + }; + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiWebApiClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiWebApiClient.java new file mode 100644 index 000000000..6ce4cff67 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/AaiWebApiClient.java @@ -0,0 +1,157 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.aaiconnector.impl; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.http.BaseHTTPClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.http.BaseHTTPResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AaiWebApiClient extends BaseHTTPClient { + + private static Logger LOG = LoggerFactory.getLogger(AaiWebApiClient.class); + private static final String PNF_JSON_INTERFACE_TEMPLATE = " {\n" + + " \"interface-name\": \"@interface@\",\n" + " \"speed-value\": \"300\",\n" + + " \"speed-units\": \"MBit/s\",\n" + + " \"port-description\": \"Air Interface (MWPS)\",\n" + + " \"equipment-identifier\": \"@pnfId@-@interface@\",\n" + + " \"interface-role\": \"Wireless\",\n" + + " \"interface-type\": \"Air Interface (MWPS)\",\n" + + " \"resource-version\": \"@model@\",\n" + " \"relationship-list\": [\n" + + " {\n" + + " \"related-to\": \"A keyword provided by A&AI to indicate type of node.\",\n" + + " \"related-link\": \"URL to the object in A&AI.\",\n" + + " \"relationship-data\": [\n" + " {\n" + + " \"relationship-key\": \"A keyword provided by A&AI to indicate an attribute.\",\n" + + " \"relationship-value\": \"Value of the attribute\"\n" + + " }\n" + " ],\n" + + " \"related-to-property\": [\n" + " {\n" + + " \"property-key\": \"Key part of a key/value pair\",\n" + + " \"property-value\": \"Value part of a key/value pair\"\n" + + " }\n" + " ]\n" + " }\n" + " ]\n" + + " }\n"; + private static final String PNF_JSON_TEMPLATE = "{\n" + " \"pnf-name\": \"@pnfId@\",\n" + + " \"pnf-id\": \"@pnfId@\",\n" + " \"equip-type\": \"@type@\",\n" + + " \"equip-model\": \"@model@\",\n" + " \"equip-vendor\": \"@vendor@\",\n" + + " \"ipaddress-v4-oam\": \"@oamIp@\",\n" + " \"in-maint\": false,\n" + + " \"prov-status\":\"PROV\",\n" + " \"p-interfaces\": @interface-list@\n" + "}\n" + ""; + private static final String PNF_URI = "network/pnfs/pnf/"; + private static final String EMPTY_MESSAGE = ""; + + private final Map<String, String> headerMap; + + + public AaiWebApiClient(String baseUrl, Map<String, String> headers, boolean trustAllCerts) { + this(baseUrl, headers, trustAllCerts, null, null); + } + + public AaiWebApiClient(String baseUrl, Map<String, String> headers, boolean trustAllCerts, String certFilename, + String passphrase) { + super(baseUrl, trustAllCerts, certFilename, passphrase, BaseHTTPClient.getSslCertPcks()); + + this.headerMap = new HashMap<>(); + this.headerMap.putAll(headers); + this.headerMap.put("Content-Type", "application/json"); + this.headerMap.put("Accept", "application/json"); + } + + /** + * Create and specify defition parametrs of pnf + * @param pnfId name + * @param type type + * @param model model + * @param vendor vendor + * @param oamIp ip + * @param ifaces interfaces + * @return true if http response code was 200 or false if not. + */ + public boolean pnfCreate(String pnfId, String type, String model, String vendor, String oamIp, + List<String> ifaces) { + LOG.debug("registering {} (type={}, model={}, vendor={},ip={})", pnfId, type, model, vendor, oamIp); + String message = getPnfTemplateFilled(pnfId, type, model, vendor, oamIp, ifaces); + return pnfRequest(pnfId, "PUT", message) == 200; + } + + /** + * Unregister + * @param pnfId name + * @return true if http response code was 200 or false if not. + */ + public boolean pnfDelete(String pnfId) { + LOG.debug("unregistering {}", pnfId); + return pnfRequest(pnfId, "DELETE", EMPTY_MESSAGE) == 200; + } + + /** + * Send registration request + * @param pnfId name + * @return error accoring to http response code or -1 + */ + public int pnfCheckIfExists(String pnfId) { + LOG.debug("check for {}", pnfId); + return pnfRequest(pnfId, "GET", EMPTY_MESSAGE); + } + + /* + * Private classes + */ + + private int pnfRequest(String pnfId, String method, String message) { + BaseHTTPResponse response; + try { + String uri = PNF_URI + URLParamEncoder.encode(pnfId); + response = this.sendRequest(uri, method, message, headerMap); + LOG.debug("finished with responsecode {}", response.code); + return response.code; + } catch (IOException e) { + LOG.warn("problem registering {} : {}", pnfId, e.getMessage()); + return -1; + } + } + + + private static String getPnfTemplateFilled(String pnfId, String type, String model, String vendor, String oamIp, + List<String> ifaces) { + return PNF_JSON_TEMPLATE.replace("@pnfId@", pnfId).replace("@type@", type).replace("@model@", model) + .replace("@vendor@", vendor).replace("@oamIp@", oamIp) + .replace("@interface-list@", getPnfTemplateInterfaceList(pnfId, ifaces, model)); + } + + private static String getPnfTemplateInterfaceList(String pnfId, List<String> ifaces, String model) { + StringBuffer s = new StringBuffer(); + s.append("["); + if (ifaces != null) { + for (int i = 0; i < ifaces.size(); i++) { + if (i > 0) { + s.append(","); + } + s.append(PNF_JSON_INTERFACE_TEMPLATE.replace("@interface@", ifaces.get(i))); + } + } + s.append("]"); + + return s.toString().replace("@pnfId@", pnfId).replace("@model@", model); + } + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/URLParamEncoder.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/URLParamEncoder.java new file mode 100644 index 000000000..2e8b44fd7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/aaiconnector/impl/URLParamEncoder.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.aaiconnector.impl; + +class URLParamEncoder { + + public static String encode(String input) { + StringBuilder resultStr = new StringBuilder(); + for (char ch : input.toCharArray()) { + if (isUnsafe(ch)) { + resultStr.append('%'); + resultStr.append(toHex(ch / 16)); + resultStr.append(toHex(ch % 16)); + } else { + resultStr.append(ch); + } + } + return resultStr.toString(); + } + + private static char toHex(int ch) { + return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10); + } + + private static boolean isUnsafe(char ch) { + if (ch > 128 || ch < 0) { + return true; + } + return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/EsBaseRequireNetworkElement.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/EsBaseRequireNetworkElement.java new file mode 100644 index 000000000..7c78a4aed --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/EsBaseRequireNetworkElement.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +public class EsBaseRequireNetworkElement extends EsObject { + public static final String ESDATATYPENAME = "required-networkelement"; + + public EsBaseRequireNetworkElement() { + + } + + public EsBaseRequireNetworkElement(String mountpountName) { + super(); + this.setEsId(mountpountName); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/EsObject.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/EsObject.java new file mode 100644 index 000000000..4b188d1de --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/EsObject.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * @author Herbert + * + */ +public class EsObject implements IsEsObject { + + @JsonIgnore + private String esId; + + @Override + public String getEsId() { + return esId; + } + + @Override + public void setEsId(String esId) { + this.esId = esId; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBase.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBase.java new file mode 100644 index 000000000..856163104 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBase.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import org.elasticsearch.client.Client; +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.SearchHit; + + +/** + * Interface, used by access one object + * @author Herbert + * + */ +public interface HtDataBase { + + String getNetworkIndex(); + void setNetworkIndex(String networkIndex); + + Client getClient(); + void closeDb(); + + public BytesReference doReadJsonData( String dataTypeName, IsEsObject esId ); + public BytesReference doReadJsonData(String dataTypeName, String esId); + public SearchHit[] doReadAllJsonData( int start, int length, String dataTypeName ); + public SearchHit[] doReadByQueryJsonData( int start, int length, String dataTypeName, QueryBuilder query); + + public String doWriteByteArray( String dataTypeName, IsEsObject esId, byte[] json); + public String doWriteJsonString( String dataTypeName, IsEsObject esId, String json); + + public boolean doRemove( String dataTypeName, IsEsObject esId ); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBaseReaderAndWriter.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBaseReaderAndWriter.java new file mode 100644 index 000000000..f13b1066f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDataBaseReaderAndWriter.java @@ -0,0 +1,242 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.annotation.Nullable; + +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.SearchHit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Generic class to write lists of model classes to the database. + * + */ +public class HtDataBaseReaderAndWriter<T extends IsEsObject> { + + private static final Logger log = LoggerFactory.getLogger(HtDataBaseReaderAndWriter.class); + + + private final HtDataBase db; + private final String dataTypeName; + private final HtMapper<T> mapper; + + /** + * Class specific access to database + * @param db ES database descriptor + * @param dataTypeName datatype name + * @param clazz class of datatype + */ + public HtDataBaseReaderAndWriter(HtDataBase db, String dataTypeName, Class<? extends T> clazz) { + + this.db = db; + this.dataTypeName = dataTypeName; + this.mapper = new HtMapper<>( clazz ); + + } + + /** + * Remove Object from database + * @param object Object with content + * @return true if remove is done + */ + public boolean doRemove( T object) { + + return db.doRemove(dataTypeName, object ); + + } + + /** + * Remove all data that match the filter + * @param query to specify data to be deleted + * @return number of removed objects + */ + public int doRemoveByQuery(QueryBuilder query) { + + int idx = 0; //Idx for getAll + int iterateLength = 100; //Step width for iterate + + SearchHit hits[]; + do { + hits = db.doReadByQueryJsonData(idx, iterateLength, dataTypeName, query); + log.debug("Found: {} elements: {} Failures: {}",dataTypeName,hits.length, mapper.getMappingFailures()); + + T object; + idx += hits.length; + for (SearchHit hit : hits) { + + object = mapper.getObjectFromJson( hit.getSourceRef() ); + + log.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n Failures: {}", hit.getId(), hit.getSourceAsString(), object, mapper.getMappingFailures()); + if (object != null) { + object.setEsId( hit.getId() ); + doRemove(object); + } else { + log.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString()); + } + } + } while (hits.length == iterateLength); //Do it until end indicated, because less hits than iterateLength allows. + + return idx; + } + + /** + * Do the mapping for test purpose + * @param object object for test purpose + * @return json String + */ + public String getJson( T object ) { + String json = mapper.objectToJson(object); + return json; + } + + /** + * Write one object into Database + * @param object Object with content + * @return This object for chained call pattern. + */ + public T doWrite( T object) { + + String json = mapper.objectToJson(object); + return doWrite(object, json); + + } + + /** + * Write one object into Database + * @param object Object with content + * @param json string + * @return This object for chained call pattern. + */ + public T doWrite( T object, String json) { + + log.debug("doWrite {} {}",object.getClass().getSimpleName(), object.getEsId()); + + if (json != null) { + String esId = db.doWriteJsonString(dataTypeName, object, json); + object.setEsId(esId); + log.debug("doWrite done for {} {}",object.getClass().getSimpleName(), object.getEsId()); + return esId == null ? null : object; + } else { + log.warn("Can not map object and write to database. {} {}",object.getClass().getSimpleName(), object); + return null; + } + + } + + + /** + * Write a list of Objects to the database. + * @param list Object list with content + * @return This object for chained call pattern. + */ + public HtDataBaseReaderAndWriter<T> doWrite( Collection<T> list) { + + int writeError = 0; + String indexName = db.getNetworkIndex(); + + log.debug("Write to ES database {}, {} Class: {} {} elements",indexName,dataTypeName, mapper.getClazz().getSimpleName(), list.size()); + + if (indexName == null) { + throw new IllegalArgumentException("Missing Index"); + } + + if (list != null && !list.isEmpty()) { + for( T s : list ) { + if ( doWrite(s) == null ) { + if ( ++writeError > 5 ) { + log.warn("Leave because of to >5 write errors"); + break; + } + } + } + + } + + return this; + } + + /** + * Read one object via the object class specific ID + * @param object Object refrenced by idString + * @return The Object if found or null + */ + public @Nullable T doRead( IsEsObject object ) { + T res = mapper.getObjectFromJson( db.doReadJsonData( dataTypeName, object) ); + if (res != null) { + res.setEsId(object.getEsId()); + } + return res; + } + + /** + * Read one object via the object class specific ID + * @param objectEsId Object refrence + * @return The Object if found or null + */ + public @Nullable T doRead( String objectEsId ) { + T res = mapper.getObjectFromJson( db.doReadJsonData( dataTypeName, objectEsId ) ); + if (res != null) { + res.setEsId(objectEsId); + } + return res; + } + + + /** + * Read all existing objects of a type + * @return the list of all objects + */ + public List<T> doReadAll() { + + List<T> res = new ArrayList<>(); + int idx = 0; //Idx for getAll + int iterateLength = 100; //Step width for iterate + + SearchHit hits[]; + + + do { + hits = db.doReadAllJsonData(idx, iterateLength, dataTypeName); + log.debug("Read: {} elements: {} Failures: {}",dataTypeName,hits.length, mapper.getMappingFailures()); + + T object; + idx += hits.length; + for (SearchHit hit : hits) { + + object = mapper.getObjectFromJson( hit.getSourceRef() ); + + log.debug("Mapp Object: {}\nSource: '{}'\nResult: '{}'\n Failures: {}", hit.getId(), hit.getSourceAsString(), object, mapper.getMappingFailures()); + if (object != null) { + object.setEsId( hit.getId() ); + res.add( object ); + } else { + log.warn("Mapp result null Object: {}\n Source: '{}'\n : '", hit.getId(), hit.getSourceAsString()); + } + } + } while (hits.length == iterateLength); //Do it until end indicated, because less hits than iterateLength allows. + + return res; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseClientAbstract.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseClientAbstract.java new file mode 100644 index 000000000..9b7d1159e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseClientAbstract.java @@ -0,0 +1,766 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; +import org.elasticsearch.action.admin.cluster.node.info.NodesInfoResponse; +import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse; +import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; +import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequestBuilder; +import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse; +import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; +import org.elasticsearch.action.delete.DeleteResponse; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.index.IndexRequestBuilder; +import org.elasticsearch.action.index.IndexResponse; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.cluster.node.DiscoveryNode; +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.InetSocketTransportAddress; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author Herbert + * + */ +public class HtDatabaseClientAbstract implements HtDataBase, AutoCloseable { + + private final Logger log = LoggerFactory.getLogger(HtDatabaseClientAbstract.class); + + private static int DELAYSECONDS = 10; + private final Client client; + private String esIndexAlias; + + /** + * Full database initialization. + * + * @param esIndex Database index + * @param esNodeserverName Servername or Server-IP that hosts the node. + * @param esClusterName Name of the cluster + * @param esNodeName Name of the node within the cluster to connect to. + * @throws UnknownHostException Servername not known. + */ + public HtDatabaseClientAbstract(String esIndex, String esNodeserverName, String esClusterName, String esNodeName) + throws UnknownHostException { + + this.esIndexAlias = esIndex; + + Settings settings = + Settings.settingsBuilder().put("cluster.name", esClusterName).put("node.name", esNodeName).build(); + this.client = getClient(esNodeserverName, settings); + + } + + /** + * Do not use the hostname, but use the IP for getting the client + * + * @param esIndex index to be used by the client + * @param esClusterName name of the ES cluster + * @param esNodeName name of the node + * @throws UnknownHostException if hostname not known + */ + public HtDatabaseClientAbstract(String esIndex, String esClusterName, String esNodeName) + throws UnknownHostException { + + this.esIndexAlias = esIndex; + Settings settings = + Settings.settingsBuilder().put("cluster.name", esClusterName).put("node.name", esNodeName).build(); + this.client = getClient(null, settings); + } + + + /** + * Simple database initialization. Query all ES configuration information from cluster node. + * + * @param esIndex Database index + * @param esNodeserverHostName Servername or Server-IP that hosts the node. + * @throws UnknownHostException Servername not known. + */ + + public HtDatabaseClientAbstract(String esIndex, String esNodeserverHostName) throws UnknownHostException { + + this.esIndexAlias = esIndex; + + Settings settings = Settings.settingsBuilder().put("client.transport.ignore_cluster_name", true) + .put("client.transport.sniff", true).build(); + this.client = getClient(esNodeserverHostName, settings); + } + + /** + * Simple database initialization. Query all ES configuration information from cluster node. + * + * @param esIndex Database index + * @param database database node descriptor + */ + public HtDatabaseClientAbstract(String esIndex, @Nonnull HtDatabaseNode database) { + + this.esIndexAlias = esIndex; + this.client = database.getClient(); + } + + + /*---------------------------------- + * some constructing functions, used by public constructors + */ + /** + * + * @param esNodeserverName + * @param settings + * @return + * @throws UnknownHostException + */ + private final TransportClient getClient(@Nullable String esNodeserverName, Settings settings) + throws UnknownHostException { + + TransportClient newClient = TransportClient.builder().settings(settings).build(); + + if (esNodeserverName != null) { + InetAddress nodeIp = InetAddress.getByName(esNodeserverName); + newClient.addTransportAddress(new InetSocketTransportAddress(nodeIp, 9300)); + } + + setup(newClient); + return newClient; + } + + private void setup(TransportClient newClient) { + NodesInfoResponse nodeInfos = newClient.admin().cluster().prepareNodesInfo().get(); + String clusterName = nodeInfos.getClusterName().value(); + + // ------ Debug/ Info + StringBuffer logInfo = new StringBuffer(); + logInfo.append("Create ES Client an localhost for Cluster '"); + logInfo.append(clusterName); + logInfo.append("' for index '"); + logInfo.append(esIndexAlias); + logInfo.append("' Nodelist: "); + for (DiscoveryNode node : newClient.connectedNodes()) { + logInfo.append("("); + logInfo.append(node.toString()); + logInfo.append(") "); + } + log.info(logInfo.toString()); + // ------ Debug/ Info + + log.info("Starting Database service. Short wait."); + + ClusterHealthResponse nodeStatus = newClient.admin().cluster().prepareHealth().setWaitForGreenStatus() + // .setWaitForYellowStatus() + .setTimeout(TimeValue.timeValueSeconds(DELAYSECONDS)).get(); + log.debug("Elasticsearch client started with status {}", nodeStatus.toString()); + + + List<DiscoveryNode> nodeList = newClient.connectedNodes(); + + if (nodeList.isEmpty()) { + log.info("ES Client created for nodes: <empty node list>"); + } else { + int t = 0; + for (DiscoveryNode dn : nodeList) { + log.info("ES Client created for node#{}: {}", t, dn.getName()); + } + } + + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + log.info("Shutdown node " + HtDatabaseClientAbstract.class.getSimpleName()); + } + }); + + log.info("Database service started."); + + } + + + /*---------------------------------- + * Getter / Setter + */ + + @Override + public String getNetworkIndex() { + return esIndexAlias; + } + + @Override + public void setNetworkIndex(String es_index) { + this.esIndexAlias = es_index; + } + + @Override + public Client getClient() { + return client; + } + + /*---------------------------------- + * Functions + */ + + /** + * Close function + */ + @Override + public void close() { + client.close(); + } + + /** + * Create an ES index. Delete an existing index. + */ + public void doDeleteIndex() { + log.info("Remove index {}", esIndexAlias); + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + try { + + // Delete index + IndicesExistsResponse res = client.admin().indices().prepareExists(esIndexAlias).execute().actionGet(); + + if (res.isExists()) { + log.info("Delete Index start: {}", esIndexAlias); + DeleteIndexRequestBuilder delIdx = client.admin().indices().prepareDelete(esIndexAlias); + delIdx.execute().actionGet(); + log.info("Delete Index done."); + } + + } catch (ElasticsearchException e) { + log.warn(e.getDetailedMessage()); + } + } + + /** + * Verify if index already created + * + * @return boolean accordingly + */ + public boolean isExistsIndex() { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + log.debug("Check status of ES index: {}", esIndexAlias); + + final IndicesExistsResponse indexStatus = + client.admin().indices().prepareExists(esIndexAlias).execute().actionGet(); + + return indexStatus.isExists(); + + } + + + /** + * Create and write the mapping and setting of the index + * + * @param jsonIndexMappingSetting with mapping and setting definition Object or null for no + * configuration + */ + public void doCreateIndexWithMapping(JSONObject jsonIndexMappingSetting) { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + try { + // Create index with mapping and setting + String esIndexName = esIndexAlias + "_v1"; + log.debug("Create not existing ES index: {} with alias:{}", esIndexName, esIndexAlias); + + doCreateIndexWithMappingsAndSettings(esIndexName, jsonIndexMappingSetting); + + // Set Alias + log.debug("Set alias {} to index {}", esIndexAlias, esIndexName); + IndicesAliasesResponse setAliasResponse = + client.admin().indices().prepareAliases().addAlias(esIndexName, esIndexAlias).execute().actionGet(); + log.debug("CreateIndex response {}", setAliasResponse); + + } catch (ElasticsearchException e) { + log.warn("ElasticsearchException: {}", e.getDetailedMessage()); + } + } + + + /** + * Assign each mapping in the mappings section as separate mapping entry + * + * @param createIndexRequestBuilder builder for command to ES + * @param jsonIndexMappingSetting json with mapping information + */ + private void doCreateIndexWithMappingsAndSettings(String esIndexName, JSONObject jsonIndexMappingSetting) { + + CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(esIndexName); + if (createIndexRequestBuilder == null) { + throw new HtDatabaseClientException("No client. Can not create index.", esIndexAlias); + } + + if (jsonIndexMappingSetting != null) { + try { + doAddMappings(createIndexRequestBuilder, jsonIndexMappingSetting); + doAddSetting(createIndexRequestBuilder, jsonIndexMappingSetting); + log.debug(" doCreateIndexWithMapping"); + } catch (RuntimeException e) { + log.info("Exception during adding mappings or settings to CreateIndexRequestBuilder. ", e); + } + } + + CreateIndexResponse createResponse = createIndexRequestBuilder.execute().actionGet(); + log.debug("CreateIndex response {}", createResponse); + } + + /** + * Add one or more mappings to command + * + * @param createIndexRequestBuilder to add parameters + * @param jsonIndexMappingSetting contains mapping and setting information + */ + private void doAddMappings(CreateIndexRequestBuilder createIndexRequestBuilder, + JSONObject jsonIndexMappingSetting) { + + // If there are json information .. verify if they contain mappings + JSONObject jsonMapping = jsonIndexMappingSetting.optJSONObject("mappings"); + + // Handle optional mappings if requested + if (jsonMapping != null) { + log.debug("Set mapping for index {} {}", esIndexAlias, jsonMapping); + + // For any reason the function below was not working without iterator + Set<String> keys = getStringKeySet(jsonMapping); + if (log.isDebugEnabled()) { + log.debug("Found length: {} keys: {}", jsonMapping.length(), keys.size()); + } + + for (String docType : keys) { + JSONObject jsonObject = jsonMapping.getJSONObject(docType); + if (jsonObject != null) { + String jsonObjectString = jsonObject.toString(); + log.debug("Doctype:{} mapping:{}", docType, jsonObjectString); + createIndexRequestBuilder.addMapping(docType, jsonObjectString); + log.debug("Mapping created Doctype:{}", docType); + } else { + log.debug("No jsonObject for docType {}", docType); + } + } + } else { + log.debug("No mapping requested for index {}", esIndexAlias); + } + } + + /** + * Add one setting to command + * + * @param createIndexRequestBuilder to add parameters + * @param jsonIndexMappingSetting contains mapping and setting information + */ + private void doAddSetting(CreateIndexRequestBuilder createIndexRequestBuilder, JSONObject jsonIndexMappingSetting) { + // Handle optional settings if requested + log.debug("Handle settings"); + JSONObject jsonSettings = jsonIndexMappingSetting.optJSONObject("settings"); + if (jsonSettings != null) { + log.debug("Set setting for index {} {}", esIndexAlias, jsonSettings); + createIndexRequestBuilder.setSettings(Settings.settingsBuilder().loadFromSource(jsonSettings.toString())); + } else { + log.debug("No settings requested for index {}", esIndexAlias); + } + } + + /** + * Create Index with alias according to definition, but no mapping + */ + public void doCreateIndex() { + doCreateIndexWithMapping(null); + } + + /** + * Write a JSON mapping definition for a document from a file to ES Hint: A later change of the + * mapping is not possible. + * + * @param jsonString String with mapping definition in JSON Format + */ + + public void doWriteMappingJson(String jsonString) { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + if (jsonString == null) { + String s = "Mapping string parameter is null"; + log.warn(s); + throw new IllegalArgumentException(s); + } + + try { + // MAPPING GOES HERE + log.debug("Check status of ES index: {}", esIndexAlias); + + final IndicesExistsResponse indexStatus = + client.admin().indices().prepareExists(esIndexAlias).execute().actionGet(); + + if (indexStatus.isExists()) { + log.debug("ES index exists: {}", esIndexAlias); + // A change of mapping is not working. This here works only for new datatypes + + PutMappingResponse res = client.admin().indices().preparePutMapping(esIndexAlias).setSource(jsonString) + .execute().actionGet(); + if (log.isDebugEnabled()) { + log.debug("Result: {}", res); + } + + } else { + log.debug("Create not existing ES index: {}", esIndexAlias); + + CreateIndexRequestBuilder createIndexRequestBuilder = + client.admin().indices().prepareCreate(esIndexAlias); + createIndexRequestBuilder.addMapping(jsonString).execute().actionGet(); + } + + } catch (ElasticsearchException e) { + log.warn(e.getDetailedMessage()); + } + } + + /** + * Write a Json mapping definition for a document from a file to ES + * + * @param fileName Filename with json definition. + */ + public void doWriteMappingFromFile(String fileName) { + + + log.info("Write mapping from File: {}", fileName); + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + if (fileName == null) { + log.warn("No mapping for {} specified in parameter file.", esIndexAlias); + return; + } + + String content = null; + + try { + content = new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8); + } catch (IOException e1) { + log.warn("Problem with file {}: {}", fileName, e1.getMessage()); + } + + doWriteMappingJson(content); + + } + + /** + * Write list with json objects from json files + * + * @param docTypeAndFileName List with 2 String Array. String[0] Contains the dataType name + * String[1] Contains the filename + */ + public void doWriteJsonFiles(List<String[]> docTypeAndFileName) { + + if (docTypeAndFileName != null) { + log.debug("Write number of JSONFiles: {}", docTypeAndFileName.size()); + int t = 1; + for (String[] s : docTypeAndFileName) { + if (s.length == 2) { + writeJsonObjectsFromFile(s[0], s[1]); + } else { + log.warn("Wrong parameters number. Entry: {}", t); + } + t++; + } + } + } + + /** + * Write one object into Database + * + * @param esId Database index + * @param dataTypeName Name of datatype + * @param json String in JSON format. + * @return esId of the object + */ + @Override + public String doWriteJsonString(String dataTypeName, IsEsObject esId, String json) { + return doWriteByteArray(dataTypeName, esId, json.getBytes()); + } + + /** + * Write one object into Database + * + * @param esId Database index + * @param dataTypeName Name of datatype + * @param json String in JSON format. + * @return esId of the object + */ + + @Override + public String doWriteByteArray(String dataTypeName, IsEsObject esId, byte[] json) { + return doWriteRaw(dataTypeName, esId.getEsId(), json); + } + + /** + * Write one object into Database + * + * @param dataTypeName Name of datatype + * @param id id of the object or null + * @param json Object as json + * @return esId of the Object + */ + public String doWriteJsonObject(String dataTypeName, String id, JSONObject json) { + return doWriteRaw(dataTypeName, id, json.toString().getBytes()); + } + + /** + * Write one object into Database + * + * @param esId Database index or null + * @param dataTypeName Name of datatype + * @param json String in JSON format. + * @return esId of the object + */ + + public String doWriteRaw(String dataTypeName, String esId, byte[] json) { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + IndexRequestBuilder request = esId == null || esId.isEmpty() ? client.prepareIndex(esIndexAlias, dataTypeName) + : client.prepareIndex(esIndexAlias, dataTypeName, esId); + + IndexResponse response = null; + try { + response = request.setSource(json).execute().actionGet(); + } catch (ElasticsearchException e) { + log.warn("ES Exception {} Json: {}", e.getMessage(), new String(json)); + } + + if (response == null) { + String jsonString = new String(json); + log.warn("Response null during write: {} {}", esId, jsonString); + return null; + } else { + return response.getId(); + } + } + + /** + * Write JSON Data. First level contains datatype, next level id Example "datatype" : { "id" : { } } + * @param json Object + */ + public void doWriteJSONObject(JSONObject json) { + + Set<String> docTypes = getStringKeySet(json); + log.debug("Found number of keys: {} keys: {}", json.length(), docTypes.size()); + for (String docType : docTypes) { + JSONObject objects = json.optJSONObject(docType); + if (objects == null) { + log.debug("Skip json {} with class {}", docType, json.get(docType).getClass()); + } else { + doWriteJsonObjectsWithIds(docType, objects); + } + } + } + + /** + * Write object and Id of object for a doctype + * @param docType of the objects + * @param objects a bunch of objects with ids as object name + */ + private void doWriteJsonObjectsWithIds(String docType, JSONObject objects) { + Set<String> ids = getStringKeySet(objects); + log.debug("write doctype {} with elements {}", docType, ids.size()); + for (String id : ids) { + JSONObject jsonIdObject = objects.optJSONObject(id); + if (jsonIdObject == null) { + log.debug("Skip jsonsub {} with class {}", id, objects.get(id).getClass()); + } else { + if (log.isTraceEnabled()) { + log.trace("Jsonsub object of id {} '{}'", id, jsonIdObject); + } + this.doWriteRaw(docType, id, jsonIdObject.toString().getBytes()); + } + } + } + + /** + * Remove Object from database + */ + @Override + public boolean doRemove(String dataTypeName, IsEsObject esId) { + + if (esIndexAlias == null) { + throw new IllegalArgumentException("Missing Index"); + } + + DeleteResponse response = + client.prepareDelete(esIndexAlias, dataTypeName, esId.getEsId()).execute().actionGet(); + + return response.isFound(); + } + + /** + * Read Json Object from database + */ + @Override + public @Nullable BytesReference doReadJsonData(String dataTypeName, IsEsObject esId) { + + if (esId.getEsId() == null) { + throw new IllegalArgumentException("Read access to object without database Id"); + } + + return doReadJsonData(dataTypeName, esId.getEsId()); + } + + /** + * Read Json Object from database + */ + @Override + public @Nullable BytesReference doReadJsonData(String dataTypeName, String esId) { + + log.debug("NetworkIndex read: {}", esIndexAlias); + + GetResponse response = client.prepareGet(esIndexAlias, dataTypeName, esId) + // .setOperationThreaded(false) + .execute().actionGet(); + + return response.isExists() ? response.getSourceAsBytesRef() : null; + } + + + @Override + public SearchHit[] doReadByQueryJsonData(int start, int length, String dataTypeName, QueryBuilder qb) { + + log.debug("NetworkIndex query and read: {}", esIndexAlias); + + SearchResponse response1 = client.prepareSearch(esIndexAlias).setTypes(dataTypeName).setQuery(qb).setFrom(start) + .setSize(length).execute().actionGet(); + + return response1.getHits().hits(); + } + + + @Override + public SearchHit[] doReadAllJsonData(int start, int length, String dataTypeName) { + // Use query + QueryBuilder qb = QueryBuilders.matchAllQuery(); + return doReadByQueryJsonData(start, length, dataTypeName, qb); + } + + /** + * Write Json datetype that is specified by file to ES + * + * @param dataType ES Datatype name + * @param fileName file name + */ + public void writeJsonObjectsFromFile(String dataType, String fileName) { + + log.debug("Start: Index: '{}' ' datatype: '{}' File: '{}'", esIndexAlias, dataType, fileName); + + String content = null; + + try { + content = new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8); + } catch (IOException e1) { + log.warn("Can not read file: {}", e1.getMessage()); + } + + if (content != null && content.charAt(0) == 0xfeff) { + content = content.substring(1); + log.debug("Delete first char {} {}", dataType, fileName); + } + + if (content != null) { + IndexResponse response = null; + try { + response = client.prepareIndex(esIndexAlias, dataType).setSource(content).execute().actionGet(); + } catch (ElasticsearchException e) { + log.error("ElasticsearchException during write: for {} from {} from {}", e.getMessage(), dataType, fileName); + } catch (Exception e) { + log.error("Exception during write: for {} from {} from {}", e.getMessage(), dataType, fileName); + } + + if (response != null) { + if (!response.isCreated()) { + String responseAsString = response.toString(); + log.warn("Jackson Response not created: {} {} {}", dataType, fileName, responseAsString); + } else { + log.debug("Created: {}", response.getId()); + } + } else { + log.warn("Jackson Response null after write {} {}", dataType, fileName); + } + } + + } + + @Override + public void closeDb() { + if (client != null) { + client.close(); + } + } + + + // For any reason the function json.keySet() was not working in Oxygen => replaced by iterator + public static @Nonnull Set<String> getStringKeySet(JSONObject json) { + Set<String> keys = new HashSet<>(); + Iterator<?> iterator = json.keys(); + while (iterator.hasNext()) { + keys.add((String) iterator.next()); + } + return keys; + } + + + private static class HtDatabaseClientException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public HtDatabaseClientException(String string, String esIndexAlias) { + super(string + " Effected index: " + "esIndexAlias"); + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseNode.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseNode.java new file mode 100644 index 000000000..47d7570e8 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseNode.java @@ -0,0 +1,261 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import static org.elasticsearch.node.NodeBuilder.nodeBuilder; +import java.io.File; +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.ServerSocket; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import javax.annotation.Nullable; +import org.apache.lucene.util.Version; +import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.node.Node; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Resources; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.AkkaConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.EsConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.GeoConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.util.ClusterNodeInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HtDatabaseNode implements AutoCloseable { + + private static final Logger LOGGER = LoggerFactory.getLogger(HtDatabaseNode.class); + private static final String DBCONFIGFILENAME = "etc/elasticsearch.yml"; + private static final String RESFOLDER_PLUGIN = "elasticsearch/plugins"; + private static final String RESFOLDER_PLUGINHEAD = RESFOLDER_PLUGIN + "/head"; + private static final String RESFOLDER_PLUGINDELETE = RESFOLDER_PLUGIN + "/delete-by-query"; + private static int MIN_PORT_NUMBER = 1024; + private static int MAX_PORT_NUMBER = 65535; + private static int ES_PORT = 9200; + private static int DELAYSECONDS = 120; + private static String PLUGINFOLDER = "etc/elasticsearch-plugins"; + + private static HtDatabaseNode oneNode = null; + private static Object initializationLock = new Object(); + private static Integer initializedTarget = 0; + private static Integer initializedReached = 0; + + private final Node node; + + private HtDatabaseNode() { + LOGGER.debug("Start elasticsearch service"); + + LOGGER.debug("Lucine version: " + Version.LATEST); + + node = nodeBuilder().settings(Settings.builder().put("path.home", "etc").put("path.conf", "etc")).node(); + LOGGER.info("Starting Database service. Wait {} s", DELAYSECONDS); + // Wait for orange status for single node without redundancy + ClusterHealthResponse nodeStatus = node.client().admin().cluster().prepareHealth().setWaitForYellowStatus() + .setTimeout(TimeValue.timeValueSeconds(DELAYSECONDS)).get(); + + LOGGER.debug("Elasticsearch service started with status {}", nodeStatus.toString()); + } + + /** + * Close node + */ + @Override + public void close() { + node.close(); + oneNode = null; // Release the one instance that was started ! + } + + /** + * Provide indication if all Index initializations are done. + * + * @return true if all index initializations are ready, false if not + */ + public Boolean getInitialized() { + synchronized (initializationLock) { + return initializedTarget != 0 && initializedReached == initializedTarget; + } + } + + public void setInitializedReached() { + synchronized (initializationLock) { + HtDatabaseNode.initializedReached++; + } + } + + public void setInitializedTarget() { + synchronized (initializationLock) { + HtDatabaseNode.initializedTarget++; + } + } + + public Client getClient() { + return node.client(); + } + + + /* + * --------------------------------------- Static functions below + */ + + + // Visibility package for test purpose + static void checkorcreateplugins(String pluginFolder) { + File f = new File(pluginFolder); + if (!f.exists()) { + f.mkdir(); + } + Resources.copyFolderInto(RESFOLDER_PLUGINHEAD, PLUGINFOLDER, RESFOLDER_PLUGIN); + Resources.copyFolderInto(RESFOLDER_PLUGINDELETE, PLUGINFOLDER, RESFOLDER_PLUGIN); + } + + /** + * Checks to see if a specific port is available. + * + * @param port the port to check for availability + */ + private static boolean isPortAvailable(int port) { + if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) { + throw new IllegalArgumentException("Invalid start port: " + port); + } + + ServerSocket ss = null; + DatagramSocket ds = null; + try { + ss = new ServerSocket(port); + ss.setReuseAddress(true); + ds = new DatagramSocket(port); + ds.setReuseAddress(true); + return true; + } catch (IOException e) { + } finally { + if (ds != null) { + ds.close(); + } + + if (ss != null) { + try { + ss.close(); + } catch (IOException e) { + /* should not be thrown */ + } + } + } + + return false; + } + + private static void checkorcreateConfigFile(EsConfig config, AkkaConfig akkaConfig, GeoConfig geoConfig) { + File f = new File(DBCONFIGFILENAME); + if (!f.exists()) { + LOGGER.debug("no " + DBCONFIGFILENAME + " found - extracting from resources"); + if (Resources.extractFileTo("elasticsearch/elasticsearch.yml", f)) { + // replace template values + LOGGER.debug("replace template values with config:" + config); + Charset charset = StandardCharsets.UTF_8; + try { + Path p = f.toPath(); + String hostName = "0.0.0.0"; // Default as initialisation value + if (akkaConfig != null && akkaConfig.isCluster()) { + LOGGER.debug("cluster configuration found"); + hostName = akkaConfig.getClusterConfig().getHostName(hostName); + String clusterDBName = akkaConfig.getClusterConfig().getDBClusterName(null); + String nodeName = String.format("node%d.%s", akkaConfig.getClusterConfig().getRoleMemberIndex(), + clusterDBName); + if (clusterDBName != null) { + config.setCluster(clusterDBName); + config.setNode(nodeName); + config.save(); + LOGGER.info("set db name to " + clusterDBName + " nodename=" + nodeName); + } else { + LOGGER.warn("unable to set correct db clustername"); + } + } + String content = new String(Files.readAllBytes(p), charset); + content = content.replaceAll("\\$clustername", config.getCluster()) + .replaceAll("\\$nodename", config.getNode()).replaceAll("\\$hostname", hostName); + + // add cluster configuration + if (akkaConfig != null && akkaConfig.isCluster()) { + List<ClusterNodeInfo> seedNodes = akkaConfig.getClusterConfig().getSeedNodes(); + String nodesJSONString = "[\"" + seedNodes.get(0).getRemoteAddress() + "\""; + for (int i = 1; i < seedNodes.size(); i++) { + nodesJSONString += ",\"" + seedNodes.get(i).getRemoteAddress() + "\""; + } + nodesJSONString += "]"; + content += System.lineSeparator() + + String.format("discovery.zen.ping.unicast.hosts: %s", nodesJSONString); + + if (geoConfig != null) { + LOGGER.debug("adding zone configuration"); + content += System.lineSeparator() + String + .format("cluster.routing.allocation.awareness.force.zone.values: zone1,zone2"); + content += System.lineSeparator() + + String.format("cluster.routing.allocation.awareness.attributes: zone"); + if (geoConfig.isPrimary(akkaConfig.getClusterConfig().getRoleMember())) { + content += System.lineSeparator() + String.format("node.zone: zone1"); + LOGGER.debug("setting zone to zone1"); + } else { + content += System.lineSeparator() + String.format("node.zone: zone2"); + LOGGER.debug("setting zone to zone2"); + } + } + } + Files.write(p, content.getBytes(charset)); + } catch (IOException e) { + LOGGER.warn("problem replacing values in file: " + e.getMessage()); + + } + } else { + LOGGER.warn("problem writing database.yml to etc folder from res"); + } + } + } + + /** + * Start as singleton + * + * @return the node or null if external node used + */ + public static @Nullable HtDatabaseNode start(EsConfig config) throws IllegalStateException { + return start(config, null, null); + } + + public static HtDatabaseNode start(EsConfig config, AkkaConfig akkaConfig, GeoConfig geoConfig) { + if (isPortAvailable(ES_PORT)) { + LOGGER.info("ES Port not in use. Start internal ES."); + if (oneNode == null) { + checkorcreateplugins(PLUGINFOLDER); + checkorcreateConfigFile(config, akkaConfig, geoConfig); + oneNode = new HtDatabaseNode(); + } else { + throw new IllegalStateException( + "Database is already started, but can only be started once. Stop here."); + } + } else { + LOGGER.info("ES Port in use. External ES used."); + } + + return oneNode; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseUpdateFile.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseUpdateFile.java new file mode 100644 index 000000000..f846000b7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseUpdateFile.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.json.JSONTokener; + +public class HtDatabaseUpdateFile extends ZipFile { + + public static final String FILENAME_DEFAULT = "elasticsearch_update.zip"; + + public class EsUpdateObject { + public final String Uri; + public final String Method; + public final JSONObject Body; + + public EsUpdateObject(JSONObject o) { + this.Uri = o.getString("uri"); + this.Method = o.getString("method"); + this.Body = o.getJSONObject("body"); + } + } + + public interface FileReadCallback { + void read(EsUpdateObject obj,String filename); + + void onerror(String filename,IOException e); + } + + private static final Comparator<ZipEntry> byfilenameComparator = new Comparator<ZipEntry>() { + + @Override + public int compare(ZipEntry o1, ZipEntry o2) { + return o1.getName().compareTo(o2.getName()); + } + }; + + public HtDatabaseUpdateFile(String filename) throws IOException { + super(filename); + } + + private static String readFile(final InputStream s) throws IOException { + // read file + BufferedReader in = new BufferedReader(new InputStreamReader(s)); + StringBuilder sb = new StringBuilder(); + String inputLine; + while ((inputLine = in.readLine()) != null) { + sb.append(inputLine); + } + in.close(); + s.close(); + return sb.toString(); + } + + public boolean readFiles(FileReadCallback cb) { + boolean r=true; + Enumeration<? extends ZipEntry> entries = this.entries(); + ArrayList<? extends ZipEntry> list = Collections.list(entries); + Collections.sort(list, byfilenameComparator); + for (ZipEntry entry : list) { + if (entry.isDirectory()) + continue; + try { + InputStream stream = this.getInputStream(entry); + Object data = new JSONTokener(readFile(stream)).nextValue(); + stream.close(); + if(data instanceof JSONArray) + { + JSONArray a=(JSONArray)data; + for(int i=0;i<a.length();i++) + { + cb.read(new EsUpdateObject(a.getJSONObject(i)),entry.getName()); + } + } + else if(data instanceof JSONObject) + { + cb.read(new EsUpdateObject( (JSONObject)data),entry.getName()); + } + } catch (IOException e) { + r=false; + cb.onerror(entry.getName(),e); + } + } + return r; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseWebAPIClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseWebAPIClient.java new file mode 100644 index 000000000..25930791a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtDatabaseWebAPIClient.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class HtDatabaseWebAPIClient { + + private static Logger LOG = LoggerFactory.getLogger(HtDatabaseWebAPIClient.class); + private static final int BUFSIZE = 1024; + private static final String CHARSET = "UTF-8"; + private final String host; + private final int port; + + public HtDatabaseWebAPIClient() { + this.host = "http://localhost"; + this.port = 9200; + } + + public String sendRequest(String uri, String method, JSONObject body) throws IOException { + LOG.debug("try to send request with uri=" + uri + " as method=" + method); + String sresponse = ""; + int responseCode = -1; + + if (body != null) { + LOG.trace("body: {}", body); + InputStream response = null; + String surl = String.format("%s:%d%s", this.host, this.port, uri); + URL url = new URL(surl); + URLConnection urlConnection = url.openConnection(); + if (urlConnection instanceof HttpURLConnection) { + HttpURLConnection http = (HttpURLConnection) urlConnection; + http.setRequestMethod(method); + http.setDoOutput(true); + http.setRequestProperty("Content-Type", "application/json"); + // send request + // Send the message to destination + if (!method.equals("GET")) { + try (OutputStream output = http.getOutputStream()) { + output.write(body.toString().getBytes(CHARSET)); + } + } + responseCode = http.getResponseCode(); + // Receive answer + if (responseCode >= 200 && responseCode < 300) { + response = http.getInputStream(); + } else { + response = http.getErrorStream(); + if (response == null) { + http.getInputStream(); + } + } + } + byte[] buffer = new byte[BUFSIZE]; + int len = 0; + if (response != null) { + while (true) { + len = response.read(buffer, 0, BUFSIZE); + if (len <= 0) { + break; + } + sresponse += new String(buffer, 0, len, CHARSET); + } + response.close(); + } else { + LOG.debug("response is null"); + } + } + LOG.debug("ResponseCode: " + responseCode); + LOG.trace("Response: " + sresponse); + + return sresponse; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtMapper.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtMapper.java new file mode 100644 index 000000000..64d3fa02a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/HtMapper.java @@ -0,0 +1,166 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +import javax.annotation.Nullable; + +import org.elasticsearch.common.bytes.BytesReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; + +/** + * @author Herbert + * + */ +public class HtMapper<T> { + + private static final Logger log = LoggerFactory.getLogger(HtDatabaseClientAbstract.class); + + private final Class<? extends T> clazz; + + private final JsonMapperBase objectMapperRead; + private final JsonMapperBase objectMapperWrite; + + private int mappingFailures; + + + public HtMapper(Class<? extends T> clazz) { + + this.mappingFailures = 0; + this.clazz = clazz; + + this.objectMapperRead = new JsonMapperBase(); + this.objectMapperWrite = this.objectMapperRead; + } + + public Class<? extends T> getClazz() { + return clazz; + } + + public int getMappingFailures() { + return mappingFailures; + } + + public String objectToJson( T object ) { + return objectMapperWrite.objectToJson(object); + } + + public String objectListToJson( List<T> objectList ) { + return objectMapperWrite.objectListToJson( objectList ); + } + + public T readValue( JsonNode node ) { + + try { + T object = objectMapperRead.readValue(node.traverse(), clazz); + return object; + } catch (JsonParseException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (JsonMappingException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (IOException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (Exception e) { + mappingFailures++; + log.warn(e.toString()); + } + log.warn("Can not parse: {} {} ", clazz, node); + return null; + + } + + /** + * Do the mapping from Json to class + * Block further mapping if there is are to many failures + * @param json String with Objects JSON representation + * @return The Object + */ + public @Nullable T getObjectFromJson(byte[] json) { + + if (json == null) + return null; + else if (mappingFailures < 10) { + try { + T object = objectMapperRead.readValue(json, clazz); + return object; + } catch (JsonParseException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (JsonMappingException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (IOException e) { + mappingFailures++; + log.warn(e.toString()); + } catch (Exception e) { + mappingFailures++; + log.warn(e.toString()); + } + } + log.warn("Problems parsing : {} {}", clazz, json); + return null; + } + + /** + * Do the mapping from Json to class + * Block further mapping if there is are to many failures + * @param json Byte array with JSON Object representation + * @return The Object + */ + public @Nullable T getObjectFromJson(BytesReference json) { + + return json == null ? null : getObjectFromJson(json.toBytes()); + + } + + /** + * Read json from File. + * @param fileName File with JSON text + * @return Object Object + */ + public T readJsonObjectFromFile( String fileName ) { + byte[] content = null; + log.debug("Filename readJsonObjectFromFile: {}",fileName); + + try { + content = Files.readAllBytes(Paths.get(fileName)); + } catch (IOException e1) { + log.warn("IO Problem: {}", e1.getMessage()); + } + + if (content != null) { + return getObjectFromJson(content); + } else { + return null; + } + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/IndexClientBuilder.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/IndexClientBuilder.java new file mode 100644 index 000000000..facc1c6f7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/IndexClientBuilder.java @@ -0,0 +1,141 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Resources; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Setup index in the database + * @author herbert + * + */ +public class IndexClientBuilder implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(IndexClientBuilder.class); + + /** Index name to be used */ + private final String index; + /** Location of mapping data **/ + private String mappingSettingFileName = null; + /** Location of configuration data **/ + private String modelDataDirectory = null; + + private final ScheduledExecutorService scheduler; + private HtDatabaseClientAbstract client; + private HtDatabaseNode databaseNode; + + + // --- Construct and initialize + + public IndexClientBuilder(String index) { + this.index = index; + this.databaseNode = null; + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + } + + // Additional setter functions + + public IndexClientBuilder setMappingSettingJsonFileName(String jsonFileName) { + this.mappingSettingFileName = jsonFileName; + return(this); + } + + public IndexClientBuilder setModelDataDirectory(String jsonDirectory) { + this.modelDataDirectory = jsonDirectory; + return(this); + } + + public HtDatabaseClientAbstract create(HtDatabaseNode database) { + LOG.info("Create {} start with node", this.getClass().getSimpleName() ); + this.databaseNode = database; + client = new HtDatabaseClientAbstract(index, database); + setupIndex(); + return client; + } + + + public void stop() { + this.scheduler.shutdown(); + } + + @Override + public void close() throws Exception { + stop(); + } + + private void setupIndex() { + if (! client.isExistsIndex()) { + LOG.info("Index not existing ... create index"); + + // Initialisation 1 + if (mappingSettingFileName != null) { + JSONObject indexconfigdata=Resources.getJSONFile(mappingSettingFileName); + client.doCreateIndexWithMapping(indexconfigdata); + } else + client.doCreateIndex(); + + // Initialisation 2 - start asynchron initialization and let it run + scheduler.schedule(fillDatabase, 0, TimeUnit.SECONDS); + } + } + + private final Runnable fillDatabase = new Runnable() { + @Override + public void run() { + if (databaseNode != null) { + databaseNode.setInitializedTarget(); + } + try { //Prevent ending task by exception + if (modelDataDirectory != null) { + LOG.info("... write initial data for index {}",index); + List<JSONObject> dataList=Resources.getJSONFiles(modelDataDirectory, false); + LOG.debug("received number of objects: {} of index {}", dataList.size(), index); + for (JSONObject da: dataList) { + client.doWriteJSONObject(da); + } + LOG.debug("wrote all objects for index {}", index); + } else { + LOG.info("No initial data for index {}",index); + } + } catch (Exception e) { + LOG.warn("Problem during initialization of index "+index+" {}", e); + } + if (databaseNode != null) { + databaseNode.setInitializedReached(); + } + } + }; + + /*--------------------------------------------------------- + * static files + */ + + public static IndexClientBuilder getBuilder(String index) { + return new IndexClientBuilder(index); + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/IsEsObject.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/IsEsObject.java new file mode 100644 index 000000000..7e9db591d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/IsEsObject.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +/** + * Element is a document in the ES database. + */ +public interface IsEsObject { + + /** + * Set the ES Id + * @param id Set the ID, created by ES for this Object + */ + void setEsId( String id ); + + /** + * Get Id content as string that is used in ES + * @return Related ID, that was specified by set command. + */ + String getEsId(); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/JsonMapperBase.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/JsonMapperBase.java new file mode 100644 index 000000000..4a89c9be1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/JsonMapperBase.java @@ -0,0 +1,137 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonGenerator.Feature; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +/** + * This class is used to define default for JSON Serialization and Deserialization for the project at a single place + */ +public class JsonMapperBase extends ObjectMapper { + + private static final long serialVersionUID = 1L; + private static final Logger LOG = LoggerFactory.getLogger(JsonMapperBase.class); + + public JsonMapperBase() { + + setVisibility(PropertyAccessor.ALL, Visibility.NONE); + setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + + // Deserialization + configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true); + + // Serialization + configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + getFactory().configure(Feature.ESCAPE_NON_ASCII, true); + } + + public JsonMapperBase(int t) { + + switch(t) { + case 0: + break; + case 1: + setVisibility(PropertyAccessor.ALL, Visibility.NONE); + setVisibility(PropertyAccessor.FIELD, Visibility.DEFAULT); + break; + case 2: + setVisibility(PropertyAccessor.ALL, Visibility.NONE); + setVisibility(PropertyAccessor.FIELD, Visibility.PROTECTED_AND_PUBLIC); + break; + case 3: + setVisibility(PropertyAccessor.ALL, Visibility.NONE); + setVisibility(PropertyAccessor.GETTER, Visibility.ANY); + setVisibility(PropertyAccessor.IS_GETTER, Visibility.ANY); + break; + default: + setVisibility(PropertyAccessor.ALL, Visibility.NONE); + setVisibility(PropertyAccessor.FIELD, Visibility.ANY); + break; + + } + + // Deserialization + configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true); + + // Serialization + configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); + getFactory().configure(Feature.ESCAPE_NON_ASCII, true); + } + + + + public String objectToJson( Object object ) { + String res = null; + + try { + + res = writeValueAsString(object); + + } catch (JsonGenerationException e) { + LOG.debug(e.toString()); + } catch (JsonMappingException e) { + LOG.debug(e.toString()); + } catch (IOException e) { + LOG.debug(e.toString()); + } catch (Exception e) { + LOG.debug(e.toString()); + } + + return res; + } + + public String objectListToJson( List<? extends Object> objectList ) { + String res = null; + + try { + + StringWriter stringEmp = new StringWriter(); + writeValue(stringEmp, objectList); + res = stringEmp.toString(); + stringEmp.close(); + + } catch (JsonGenerationException e) { + LOG.debug(e.toString()); + } catch (JsonMappingException e) { + LOG.debug(e.toString()); + } catch (IOException e) { + LOG.debug(e.toString()); + } catch (Exception e) { + LOG.debug(e.toString()); + } + + return res; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/http/BaseHTTPClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/http/BaseHTTPClient.java new file mode 100644 index 000000000..b0404eed6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/http/BaseHTTPClient.java @@ -0,0 +1,325 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.http; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.security.KeyFactory; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; +import java.util.Map; +import javax.annotation.Nonnull; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.xml.bind.DatatypeConverter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BaseHTTPClient { + + private static Logger LOG = LoggerFactory.getLogger(BaseHTTPClient.class); + private static final int SSLCERT_NONE = -1; + private static final int SSLCERT_PCKS = 0; + private static final int SSLCERT_PEM = 1; + private static final int BUFSIZE = 1024; + private static final Charset CHARSET = StandardCharsets.UTF_8; + private static final String SSLCONTEXT = "TLSv1.2"; + private static final int DEFAULT_HTTP_TIMEOUT_MS = 30000; // in ms + + private final boolean trustAll; + private final String baseUrl; + + private int timeout = DEFAULT_HTTP_TIMEOUT_MS; + private SSLContext sc = null; + + public BaseHTTPClient(String base) { + this(base, false); + } + + public BaseHTTPClient(String base, boolean trustAllCerts) { + this(base, trustAllCerts, null, null, SSLCERT_NONE); + } + + public BaseHTTPClient(String base, boolean trustAllCerts, String certFilename, String passphrase, int sslCertType) { + this.baseUrl = base; + this.trustAll = trustAllCerts; + try { + sc = setupSsl(trustAll, certFilename, passphrase, sslCertType); + } catch (KeyManagementException | NoSuchAlgorithmException | UnrecoverableKeyException | CertificateException + | KeyStoreException | IOException | InvalidKeySpecException e) { + LOG.warn("problem ssl setup: " + e.getMessage()); + } + } + + protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, String body, Map<String, String> headers) + throws IOException { + return this.sendRequest(uri, method, body != null ? body.getBytes(CHARSET) : null, headers); + } + + protected @Nonnull BaseHTTPResponse sendRequest(String uri, String method, byte[] body, Map<String, String> headers) + throws IOException { + if (uri == null) { + uri = ""; + } + String surl = this.baseUrl; + if (!surl.endsWith("/") && uri.length() > 0) { + surl += "/"; + } + if (uri.startsWith("/")) { + uri = uri.substring(1); + } + surl += uri; + LOG.debug("try to send request with url=" + this.baseUrl + uri + " as method=" + method); + LOG.trace("body:" + (body == null ? "null" : new String(body, CHARSET))); + URL url = new URL(surl); + URLConnection http = url.openConnection(); + http.setConnectTimeout(this.timeout); + if (surl.toString().startsWith("https")) { + if (sc != null) { + ((HttpsURLConnection) http).setSSLSocketFactory(sc.getSocketFactory()); + if (trustAll) { + LOG.debug("trusting all certs"); + HostnameVerifier allHostsValid = (hostname, session) -> true; + ((HttpsURLConnection) http).setHostnameVerifier(allHostsValid); + } + } else // Should never happen + { + LOG.warn("No SSL context available"); + return new BaseHTTPResponse(-1, ""); + } + } + ((HttpURLConnection) http).setRequestMethod(method); + http.setDoOutput(true); + if (headers != null && headers.size() > 0) { + for (String key : headers.keySet()) { + http.setRequestProperty(key, headers.get(key)); + LOG.trace("set http header " + key + ": " + headers.get(key)); + } + } + byte[] buffer = new byte[BUFSIZE]; + int len = 0, lensum = 0; + // send request + // Send the message to destination + if (!method.equals("GET") && body != null && body.length > 0) { + try (OutputStream output = http.getOutputStream()) { + output.write(body); + } + } + // Receive answer + int responseCode = ((HttpURLConnection) http).getResponseCode(); + String sresponse = ""; + InputStream response = null; + try { + if (responseCode >= 200 && responseCode < 300) { + response = http.getInputStream(); + } else { + response = ((HttpURLConnection) http).getErrorStream(); + if (response == null) { + response = http.getInputStream(); + } + } + if (response != null) { + while (true) { + len = response.read(buffer, 0, BUFSIZE); + if (len <= 0) { + break; + } + lensum += len; + sresponse += new String(buffer, 0, len, CHARSET); + } + } else { + LOG.debug("response is null"); + } + } catch (Exception e) { + LOG.debug("No response. ", e); + } finally { + if (response != null) { + response.close(); + } + } + LOG.debug("ResponseCode: " + responseCode); + LOG.trace("Response (len:{}): {}", String.valueOf(lensum), sresponse); + return new BaseHTTPResponse(responseCode, sresponse); + } + + public static SSLContext setupSsl(boolean trustall) + throws NoSuchAlgorithmException, KeyManagementException, CertificateException, FileNotFoundException, + IOException, UnrecoverableKeyException, KeyStoreException, InvalidKeySpecException { + + return setupSsl(trustall, null, null, SSLCERT_NONE); + } + + /** + * @param keyFilename filename for key file + * @param certFilename filename for cert file + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + * @throws IOException + * @throws FileNotFoundException + * @throws CertificateException + * @throws KeyStoreException + * @throws UnrecoverableKeyException + * @throws InvalidKeySpecException + */ + /** + * Setup of SSLContext + * + * @param trustall true to switch of certificate verification + * @param certFilename filename for certificate file + * @param passPhrase for certificate + * @param certType of certificate + * @return SSL Context according to parameters + * @throws NoSuchAlgorithmException according name + * @throws KeyManagementException according name + * @throws CertificateException according name + * @throws FileNotFoundException according name + * @throws IOException according name + * @throws UnrecoverableKeyException according name + * @throws KeyStoreException according name + * @throws InvalidKeySpecException according name + */ + public static SSLContext setupSsl(boolean trustall, String certFilename, String passPhrase, int certType) + throws NoSuchAlgorithmException, KeyManagementException, CertificateException, FileNotFoundException, + IOException, UnrecoverableKeyException, KeyStoreException, InvalidKeySpecException { + + SSLContext sc = SSLContext.getInstance(SSLCONTEXT); + TrustManager[] trustCerts = null; + if (trustall) { + trustCerts = new TrustManager[] {new javax.net.ssl.X509TrustManager() { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {} + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {} + }}; + + } + KeyManager[] kms = null; + if (certFilename != null && passPhrase != null && !certFilename.isEmpty() && !passPhrase.isEmpty()) { + if (certType == SSLCERT_PCKS) { + LOG.debug("try to load pcks file " + certFilename + " with passphrase=" + passPhrase); + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + FileInputStream fileInputStream = new FileInputStream(certFilename); + keyStore.load(fileInputStream, passPhrase.toCharArray()); + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(keyStore, passPhrase.toCharArray()); + kms = kmf.getKeyManagers(); + fileInputStream.close(); + LOG.debug("successful"); + + } else if (certType == SSLCERT_PEM) { + LOG.debug("try to load pem files cert=" + certFilename + " key=" + passPhrase); + File fCert = new File(certFilename); + File fKey = new File(passPhrase); + KeyStore keyStore = KeyStore.getInstance("JKS"); + keyStore.load(null); + byte[] certBytes = parseDERFromPEM(Files.readAllBytes(fCert.toPath()), "-----BEGIN CERTIFICATE-----", + "-----END CERTIFICATE-----"); + byte[] keyBytes = parseDERFromPEM(Files.readAllBytes(fKey.toPath()), "-----BEGIN PRIVATE KEY-----", + "-----END PRIVATE KEY-----"); + + X509Certificate cert = generateCertificateFromDER(certBytes); + RSAPrivateKey key = generatePrivateKeyFromDER(keyBytes); + keyStore.setCertificateEntry("cert-alias", cert); + keyStore.setKeyEntry("key-alias", key, "changeit".toCharArray(), new Certificate[] {cert}); + + KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + kmf.init(keyStore, "changeit".toCharArray()); + kms = kmf.getKeyManagers(); + LOG.debug("successful"); + } + } + // Init the SSLContext with a TrustManager[] and SecureRandom() + sc.init(kms, trustCerts, new java.security.SecureRandom()); + return sc; + } + + protected static byte[] parseDERFromPEM(byte[] pem, String beginDelimiter, String endDelimiter) { + String data = new String(pem); + String[] tokens = data.split(beginDelimiter); + tokens = tokens[1].split(endDelimiter); + return DatatypeConverter.parseBase64Binary(tokens[0]); + } + + protected static RSAPrivateKey generatePrivateKeyFromDER(byte[] keyBytes) + throws InvalidKeySpecException, NoSuchAlgorithmException { + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); + + KeyFactory factory = KeyFactory.getInstance("RSA"); + + return (RSAPrivateKey) factory.generatePrivate(spec); + } + + protected static X509Certificate generateCertificateFromDER(byte[] certBytes) throws CertificateException { + CertificateFactory factory = CertificateFactory.getInstance("X.509"); + + return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certBytes)); + } + + public static String getAuthorizationHeaderValue(String username, String password) { + return "Basic " + new String(Base64.getEncoder().encode((username + ":" + password).getBytes())); + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public static int getSslCertPcks() { + return SSLCERT_PCKS; + } + + public static int getSslCertNone() { + return SSLCERT_NONE; + } + + public static int getSslCertPEM() { + return SSLCERT_PEM; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/http/BaseHTTPResponse.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/http/BaseHTTPResponse.java new file mode 100644 index 000000000..ddadd1149 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/http/BaseHTTPResponse.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.http; + +public class BaseHTTPResponse { + + public static final int CODE404 = 404; + public static final int CODE200 = 200; + public static final BaseHTTPResponse UNKNOWN = new BaseHTTPResponse(-1, ""); + public final int code; + public final String body; + + public BaseHTTPResponse(int code,String body) + { + this.code=code; + this.body=body; + } + + @Override + public String toString() { + return "BaseHTTPResponse [code=" + code + ", body=" + body + "]"; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Environment.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Environment.java new file mode 100644 index 000000000..b56fe12b3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Environment.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +import java.net.Inet4Address; +import java.net.UnknownHostException; +import java.util.Map; + +public class Environment { + + public static String getVar(String v) + { + if(v.equals("$HOSTNAME")) + { + String s=null; + try { + s = Inet4Address.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + + } + if(s!=null && s.length()>0) + return s; + } + Map<String, String> env = System.getenv(); + for (String envName : env.keySet()) { + if(envName!=null && envName.equals(v)) + return env.get(envName); + } + return null; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/FileWatchdog.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/FileWatchdog.java new file mode 100644 index 000000000..90bb8432a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/FileWatchdog.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for additional information regarding + * copyright ownership. The ASF licenses this file to You 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. + */ + +package org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +import java.io.File; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Check every now and then that a certain file has not changed. If it has, then call the + * {@link #doOnChange} method. + * + * @author JunHo Yoon + * @since 3.1.1 + */ +public abstract class FileWatchdog extends Thread { + private static final Logger LOGGER = LoggerFactory.getLogger(FileWatchdog.class); + /** + * The default delay between every file modification check, set to 60 seconds. + */ + public static final long DEFAULT_DELAY = 60000; + /** + * The name of the file to observe for changes. + */ + private final String filename; + + /** + * The delay to observe between every check. By default set {@link #DEFAULT_DELAY}. + */ + private long delay = DEFAULT_DELAY; + + private final File file; + private long lastModified = 0; + private boolean warnedAlready = false; + + protected FileWatchdog(String filename) { + this.filename = filename; + file = new File(filename); + setDaemon(true); + checkAndConfigure(); + } + + /** + * Set the delay to observe between each check of the file changes. + * + * @param delay the frequency of file watch. + */ + public void setDelay(long delay) { + this.delay = delay; + } + + /** + * abstract method to be run when the file is changed. + */ + protected abstract void doOnChange(); + + protected void checkAndConfigure() { + boolean fileExists; + try { + fileExists = file.exists(); + } catch (SecurityException e) { + LOGGER.warn("Was not allowed to read check file existence, file:[{}].",filename); + this.interrupt(); // there is no point in continuing + return; + } + + if (fileExists) { + long l = file.lastModified(); // this can also throw a + if (lastModified == 0) { + lastModified = l; // is very unlikely. + } + if (l > lastModified) { // however, if we reached this point this + lastModified = l; // is very unlikely. + doOnChange(); + warnedAlready = false; + } + } else { + if (!warnedAlready) { + LOGGER.debug("[{}] does not exist.", filename); + warnedAlready = true; + } + } + } + + @Override + public void run() { + while (!isInterrupted()) { + checkAndConfigure(); + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + LOGGER.debug("Interrupted sleep. {}", e.getMessage()); + Thread.currentThread().interrupt(); + } + } + LOGGER.debug("Stoppen file watchdog for file {}", filename); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/IniConfigurationFile.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/IniConfigurationFile.java new file mode 100644 index 000000000..8fe64b5ca --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/IniConfigurationFile.java @@ -0,0 +1,397 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map.Entry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IniConfigurationFile { + + private static final Logger LOG = LoggerFactory.getLogger(IniConfigurationFile.class); + + private static final String SECTIONNAME_ROOT = ""; + private static final String DELIMITER = "="; + private static final String COMMENTCHARS[] = {"#", ";"}; + private static final String LR = "\n"; + + private final File mFile; + private final List<Section> sections; + + public IniConfigurationFile(File f) { + this.mFile = f; + this.sections = new ArrayList<>(); + this.sections.add(new Section(SECTIONNAME_ROOT)); + } + + public void load() throws ConfigurationException { + String curSectionName = SECTIONNAME_ROOT; + LOG.debug("loading file"); + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(this.mFile)); + for (String line; (line = br.readLine()) != null;) { + line = line.trim(); + if (line.isEmpty()) { + continue; + } + if (line.startsWith("[") && line.endsWith("]")) { + curSectionName = line.substring(1, line.length() - 1); + this.addSection(curSectionName); + } else { + this.getSection(curSectionName).addLine(line); + } + } + + } catch (Exception e) { + throw new ConfigurationException(e.getMessage()); + } finally { + try { + if (br != null) { + br.close(); + } + } catch (IOException e) { + } + } + LOG.debug("finished loading file"); + LOG.debug("start parsing sections"); + for (Section section : this.sections) { + section.parseLines(); + } + LOG.debug("finished parsing " + this.sections.size() + " sections"); + } + + private Section getSection(String name) { + for (Section s : this.sections) { + if (s.Name.equals(name)) { + return s; + } + } + return this.addSection(name); + + } + + private Section addSection(String name) { + + Section s = new Section(name); + this.sections.add(s); + return s; + } + + public void reLoad() throws ConfigurationException { + this.sections.clear(); + this.sections.add(new Section(SECTIONNAME_ROOT)); + this.load(); + } + + public String getProperty(String key, String defValue) { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else { + s = this.getSection(SECTIONNAME_ROOT); + } + + String v = s.getProperty(key); + if (v == null || v.isEmpty()) { + return defValue; + } + return v; + } + + public void setProperty(String key, String value) { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else { + s = this.getSection(SECTIONNAME_ROOT); + } + s.setProperty(key, value); + } + + public int getProperty(String key, int defValue) throws ConversionException { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else { + s = this.getSection(SECTIONNAME_ROOT); + } + + return s.getInt(key, defValue); + } + + public void setProperty(String key, int value) { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else { + s = this.getSection(SECTIONNAME_ROOT); + } + s.setProperty(key, String.format("%d", value)); + } + + public boolean getProperty(String key, boolean defValue) throws ConversionException { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else { + s = this.getSection(SECTIONNAME_ROOT); + } + + return s.getBoolean(key, defValue); + } + + public void setProperty(String key, boolean value) { + Section s; + if (key.contains(".")) { + s = this.getSection(key.substring(0, key.indexOf("."))); + key = key.substring(key.indexOf(".") + 1); + } else { + s = this.getSection(SECTIONNAME_ROOT); + } + s.setProperty(key, value ? "true" : "false"); + } + + public void setProperty(String key, Object value) { + this.setProperty(key, value == null ? "null" : value.toString()); + } + + public void save() { + try (BufferedWriter bw = new BufferedWriter(new FileWriter(this.mFile, false))) { + for (Section section : this.sections) { + if (section.hasValues()) { + bw.write(String.join(LR, section.toLines()) + LR + LR); + } + } + bw.close(); + } catch (Exception e) { + LOG.warn("problem saving value: " + e.getMessage()); + } + } + + public Section subset(String section) { + return this.getSection(section); + } + + public static class ConfigurationException extends Exception { + + private static final long serialVersionUID = 733061908616404383L; + + public ConfigurationException(String m) { + super(m); + } + } + + public static class ConversionException extends Exception { + private static final long serialVersionUID = 5179891576029923079L; + + public ConversionException(String m) { + super(m); + } + } + + private static class SectionValue { + private String Value; + private final List<String> Comments; + private boolean IsUncommented; + + public SectionValue(String value) { + this(value, new ArrayList<String>(), false); + } + + public SectionValue(String value, List<String> commentsForValue, boolean isuncommented) { + this.Comments = commentsForValue; + this.Value = value; + this.IsUncommented = isuncommented; + } + } + + public static class Section { + private final String Name; + private final List<String> rawLines; + private final LinkedHashMap<String, SectionValue> values; + + public Section(String name) { + LOG.debug("new section created:" + name); + this.Name = name; + this.rawLines = new ArrayList<>(); + this.values = new LinkedHashMap<>(); + } + + public void addLine(String line) { + LOG.trace("adding raw line:" + line); + this.rawLines.add(line); + } + + public String getProperty(String key) { + return this.getProperty(key, null); + } + + public String getProperty(String key, String defValue) { + if (values.containsKey(key)) { + return values.get(key).Value; + } + return defValue; + } + + public void setProperty(String key, String value) { + boolean isuncommented = this.isCommentLine(key); + if (isuncommented) { + key = key.substring(1); + } + if (this.values.containsKey(key)) { + this.values.get(key).Value = value; + this.values.get(key).IsUncommented = isuncommented; + } else { + SectionValue sv = new SectionValue(value); + sv.IsUncommented = isuncommented; + this.values.put(key, sv); + } + } + + public void parseLines() { + this.values.clear(); + List<String> commentsForValue = new ArrayList<>(); + boolean uncommented = false; + for (String line : rawLines) { + + if (this.isCommentLine(line)) { + if (!line.contains(DELIMITER)) { + commentsForValue.add(line); + continue; + } else { + uncommented = true; + line = line.substring(1); + } + } + if (!line.contains(DELIMITER)) { + continue; + } + String hlp[] = line.split(DELIMITER); + if (hlp.length > 1) { + String key = hlp[0]; + String value = + line.length() > (key + DELIMITER).length() ? line.substring((key + DELIMITER).length()) + : ""; + if (this.values.containsKey(key)) { + this.values.get(key).Value = value; + } else { + this.values.put(key, new SectionValue(value, commentsForValue, uncommented)); + commentsForValue = new ArrayList<>(); + } + } else { + LOG.warn("ignoring unknown formatted line:" + line); + } + uncommented = false; + } + } + + private boolean isCommentLine(String line) { + for (String c : COMMENTCHARS) { + if (line.startsWith(c)) { + return true; + } + } + return false; + } + + public String[] toLines() { + List<String> lines = new ArrayList<>(); + if (!this.Name.isEmpty()) { + lines.add("[" + this.Name + "]"); + } + for (Entry<String, SectionValue> entry : this.values.entrySet()) { + if (entry.getValue().Comments.size() > 0) { + for (String comment : entry.getValue().Comments) { + lines.add(comment); + } + } + lines.add((entry.getValue().IsUncommented ? COMMENTCHARS[0] : "") + entry.getKey() + DELIMITER + + entry.getValue().Value); + } + String[] alines = new String[lines.size()]; + return lines.toArray(alines); + } + + public String getString(String key, String def) { + return this.getProperty(key, def); + } + + public boolean getBoolean(String key, boolean def) throws ConversionException { + String v = this.getProperty(key); + if (v == null || v.isEmpty()) { + return def; + } + if (v.equals("true")) { + return true; + } + if (v.equals("false")) { + return false; + } + throw new ConversionException("invalid value for key " + key); + } + + public int getInt(String key, int def) throws ConversionException { + String v = this.getProperty(key); + if (v == null || v.isEmpty()) { + return def; + } + try { + return Integer.parseInt(v); + } catch (NumberFormatException e) { + throw new ConversionException(e.getMessage()); + } + } + + public long getLong(String key, long def) throws ConversionException { + String v = this.getProperty(key); + if (v == null || v.isEmpty()) { + return def; + } + try { + return Long.parseLong(v); + } catch (NumberFormatException e) { + throw new ConversionException(e.getMessage()); + } + } + + public boolean hasValues() { + return this.values.size() > 0; + } + + public boolean hasKey(String key) { + return this.values.containsKey(key); + } + + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InternalDateAndTime.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InternalDateAndTime.java new file mode 100644 index 000000000..cc5b8316d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InternalDateAndTime.java @@ -0,0 +1,103 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.DateAndTime; + +/** + * Converts time stamps into internal format according to ONF1.2 and ISO 8601. + * @author herbert + * + */ +public class InternalDateAndTime { + + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + + private static final InternalDateAndTime TESTPATTERN = new InternalDateAndTime("2017-01-01T00:00:00.0Z"); + + String internalDateAndTime; + + /** + * Static builder ONF1.2 + * @param time in ONF1.2 yang format + * @return InternalDateAndTime + */ + public static InternalDateAndTime valueOf(DateAndTime time) { + return new InternalDateAndTime(time); + } + + /** + * Static builder ONF1.0 + * @param time in ONF1.0 yang format + * @return InternalDateAndTime + */ + + public static InternalDateAndTime valueOf(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime time) { + return new InternalDateAndTime(time); + } + + /** + * @return Getter with String representation + */ + public String getValue() { + return internalDateAndTime; + } + + /*---------------------------------------------------------------- + * Private constructors and functions + */ + + /** + * Convert ONF 1.2 DateAndTime to String + * @param time as input + */ + private InternalDateAndTime(DateAndTime time) { + internalDateAndTime = NETCONFTIME_CONVERTER.getTimeStampFromNetconf(time.getValue()); + } + + /** + * Convert ONF 1.2 DateAndTime to String + * @param time as input + */ + private InternalDateAndTime(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime time) { + internalDateAndTime = NETCONFTIME_CONVERTER.getTimeStampFromNetconf(time.getValue()); + } + + /** + * Setup static TEST + * @param internalDateAndTime + */ + private InternalDateAndTime(String internalDateAndTime) { + this.internalDateAndTime = internalDateAndTime; + } + + /** + * Get a testpattern + * @return testpattern + */ + public static InternalDateAndTime getTestpattern() { + return TESTPATTERN; + } + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InternalSeverity.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InternalSeverity.java new file mode 100644 index 000000000..20c3193b1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InternalSeverity.java @@ -0,0 +1,125 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + * @author herbert + * + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +public enum InternalSeverity { + + NonAlarmed, + Warning, + Minor, + Major, + Critical; + + public boolean isNoAlarmIndication() { + return this == NonAlarmed; + } + + public String getValueAsString() { + return this.name(); + } + + @Override + public String toString() { + return this.name(); + } + + public String toNetconfString() + { + switch(this) + { + case NonAlarmed: + return "non-alarmed"; + case Warning: + return "warning"; + case Minor: + return "minor"; + case Major: + return "major"; + case Critical: + return "critical"; + } + return "not-specified"; + } + + /** + * convert ONF 1.2 Severity + * @param severity as input + * @return String with related output + */ + public static InternalSeverity valueOf(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.SeverityType severity ) { + switch( severity ) { + case NonAlarmed: + return InternalSeverity.NonAlarmed; + case Warning: + return InternalSeverity.Warning; + case Minor: + return InternalSeverity.Minor; + case Major: + return InternalSeverity.Major; + case Critical: + return InternalSeverity.Critical; + } + return null; + } + + /** + * convert ONF 1.2.1.1 Severity + * @param severity as input + * @return String with related output + */ + public static InternalSeverity valueOf(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.SeverityType severity ) { + switch( severity ) { + case NonAlarmed: + return InternalSeverity.NonAlarmed; + case Warning: + return InternalSeverity.Warning; + case Minor: + return InternalSeverity.Minor; + case Major: + return InternalSeverity.Major; + case Critical: + return InternalSeverity.Critical; + } + return null; + } + + /** + * convert ONF 1.2.1.1p Severity + * @param severity as input + * @return String with related output + */ + public static InternalSeverity valueOf(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.SeverityType severity ) { + switch( severity ) { + case NonAlarmed: + return InternalSeverity.NonAlarmed; + case Warning: + return InternalSeverity.Warning; + case Minor: + return InternalSeverity.Minor; + case Major: + return InternalSeverity.Major; + case Critical: + return InternalSeverity.Critical; + } + return null; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InventoryInformation.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InventoryInformation.java new file mode 100644 index 000000000..e4ce4afa7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/InventoryInformation.java @@ -0,0 +1,130 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +import java.util.ArrayList; +import java.util.List; + +public class InventoryInformation { + + private static final String UNKNOWN = "unknown"; + private static final List<String> EMPTY = new ArrayList<>(); + private static final InventoryInformation DEFAULT = new InventoryInformation(); + + private String type; + private String model; + private String vendor; + private String deviceIpv4; + private String deviceIpv6; + private List<String> interfaceUuidList; + + public InventoryInformation() + { + this.type=UNKNOWN; + this.model=UNKNOWN; + this.vendor=UNKNOWN; + this.deviceIpv4=UNKNOWN; + this.deviceIpv6=UNKNOWN; + this.interfaceUuidList=EMPTY; + } + + public InventoryInformation(InventoryInformation inventoryInformation) { + this.type=inventoryInformation.type; + this.model=inventoryInformation.model; + this.vendor=inventoryInformation.vendor; + this.deviceIpv4=inventoryInformation.deviceIpv4; + this.deviceIpv6=inventoryInformation.deviceIpv6; + this.interfaceUuidList=new ArrayList<>(inventoryInformation.interfaceUuidList); + } + + public InventoryInformation( + String type, String model, String vendor, String deviceIpv4, + String deviceIpv6, List<String> interfaceUuidList) { + setType(type); + setModel(model); + setVendor(vendor); + setDeviceIpv4(deviceIpv4); + setDeviceIpv6(deviceIpv6); + setInterfaceUuidList(interfaceUuidList); + } + + public String getType() { + return type; + } + + public String getModel() { + return model; + } + + public String getVendor() { + return vendor; + } + + public String getDeviceIpv4() { + return deviceIpv4; + } + + public String getDeviceIpv6() { + return deviceIpv6; + } + + public List<String> getInterfaceUuidList() { + return interfaceUuidList; + } + + public InventoryInformation setType(String type) { + this.type = type != null ? type : UNKNOWN; + return this; + } + + public InventoryInformation setModel(String model) { + this.model = model != null ? model : UNKNOWN; + return this; + } + + public InventoryInformation setVendor(String vendor) { + this.vendor = vendor != null ? vendor : UNKNOWN; + return this; + } + + public InventoryInformation setDeviceIpv4(String deviceIpv4) { + this.deviceIpv4 = deviceIpv4 != null ? deviceIpv4 : UNKNOWN; + return this; + } + + public InventoryInformation setDeviceIpv6(String deviceIpv6) { + this.deviceIpv6 = deviceIpv6 != null ? deviceIpv6 : UNKNOWN ; + return this; + } + + public InventoryInformation setInterfaceUuidList(List<String> interfaceUuidList) { + this.interfaceUuidList = interfaceUuidList != null ? interfaceUuidList : EMPTY; + return this; + } + + public static InventoryInformation getDefault() { + return DEFAULT; + } + + @Override + public String toString() { + return "InventoryInformation [type=" + type + ", model=" + model + ", vendor=" + vendor + ", deviceIpv4=" + + deviceIpv4 + ", deviceIpv6=" + deviceIpv6 + ", interfaceUuidList=" + interfaceUuidList + "]"; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Resources.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Resources.java new file mode 100644 index 000000000..b4fec083a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/Resources.java @@ -0,0 +1,336 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileFilter; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; +import org.json.JSONException; +import org.json.JSONObject; +import org.osgi.framework.Bundle; +import org.osgi.framework.FrameworkUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Resources { + + private static final Logger LOG = LoggerFactory.getLogger(Resources.class); + + private static final String RESSOURCEROOT = "src/main/resources"; + + private static URL getFileURL(String resFile) { + Bundle b = FrameworkUtil.getBundle(Resources.class); + URL u = null; + LOG.debug("try to get file {}", resFile); + if (b == null) { + LOG.info("Load resource as file: {}", resFile); + u = getUrlForRessource(resFile); + } else { + LOG.info("Load resource from bundle: {}", resFile); + u = b.getEntry(resFile); + } + return u; + } + + private static File getFile(String resFile) { + Bundle b = FrameworkUtil.getBundle(Resources.class); + File f = null; + LOG.debug("try to get file {}", resFile); + if (b == null) { + LOG.warn("cannot load bundle resources"); + f = new File(RESSOURCEROOT + resFile); + } else { + try { + + f = new File(b.getEntry(resFile).toURI()); + } catch (URISyntaxException e) { + + } + } + return f; + } + + private static String readFile(final URL u) throws IOException { + return readFile(u.openStream()); + } + + private static String readFile(final InputStream s) throws IOException { + // read file + BufferedReader in = new BufferedReader(new InputStreamReader(s)); + StringBuilder sb = new StringBuilder(); + String inputLine; + while ((inputLine = in.readLine()) != null) { + sb.append(inputLine); + } + in.close(); + s.close(); + return sb.toString(); + } + + public static List<URL> getFileURLs(String folder, final String filter, final boolean recursive) + throws IOException { + Bundle b = FrameworkUtil.getBundle(Resources.class); + List<URL> list = new ArrayList<>(); + if (b == null) { + FileFilter ff = pathname -> { + if (pathname.isFile()) { + return pathname.getName().contains(filter); + } else { + return true; + } + }; + File ffolder = getFile(folder); + if (ffolder != null && ffolder.isDirectory()) { + File[] files = ffolder.listFiles(ff); + if (files != null && files.length > 0) { + for (File f : files) { + if (f.isFile()) { + list.add(f.toURI().toURL()); + } else if (f.isDirectory() && recursive) { + getFileURLsRecursive(f, ff, list); + } + } + } + } + } else { + getResourceURLsTreeRecurse(b, filter, b.getEntryPaths(folder), recursive, list); + } + return list; + } + + private static void getFileURLsRecursive(File root, FileFilter ff, List<URL> list) throws MalformedURLException { + if (root != null && root.isDirectory()) { + File[] files = root.listFiles(ff); + if (files != null && files.length > 0) { + for (File f : files) { + if (f.isFile()) { + list.add(f.toURI().toURL()); + } else if (f.isDirectory()) { + getFileURLsRecursive(f, ff, list); + } + } + } + } + + } + + private static void getResourceURLsTreeRecurse(Bundle b, String filter, Enumeration<String> resource, + boolean recursive, List<URL> outp) throws IOException { + while (resource.hasMoreElements()) { + String name = resource.nextElement(); + Enumeration<String> list = b.getEntryPaths(name); + if (list != null) { + if (recursive) { + getResourceURLsTreeRecurse(b, filter, list, recursive, outp); + } + } else { + // Read + if (name.contains(filter)) { + LOG.debug("add {} to list", name); + outp.add(b.getEntry(name)); + } else { + LOG.debug("filtered out {}", name); + } + } + } + } + + public static List<JSONObject> getJSONFiles(String folder, boolean recursive) { + List<JSONObject> list = new ArrayList<>(); + List<URL> urls; + try { + urls = getFileURLs(folder, ".json", recursive); + LOG.debug("found {} files", urls.size()); + } catch (IOException e1) { + urls = new ArrayList<>(); + LOG.warn("failed to get urls from resfolder {} : {}", folder, e1.getMessage()); + } + for (URL u : urls) { + LOG.debug("try to parse " + u.toString()); + try { + JSONObject o = new JSONObject(readFile(u)); + list.add(o); + } catch (JSONException | IOException e) { + LOG.warn("problem reading/parsing file {} : {}", u, e.getMessage()); + } + } + return list; + } + + public static JSONObject getJSONFile(String resFile) { + LOG.debug("loading json file {} from res", resFile); + URL u = getFileURL(resFile); + if (u == null) { + LOG.warn("cannot find resfile: {}", resFile); + return null; + } + JSONObject o = null; + try { + // parse to jsonobject + o = new JSONObject(readFile(u)); + } catch (Exception e) { + LOG.warn("problem reading/parsing file: {}", e.getMessage()); + } + return o; + } + + /** + * Used for reading plugins from resource files + * /elasticsearch/plugins/head + * /etc/elasticsearch-plugins + * /elasticsearch/plugins + * @param resFolder resource folder pointing to the related files + * @param dstFolder destination + * @param rootDirToRemove part from full path to remove + * @return true if files could be extracted + */ + public static boolean copyFolderInto(String resFolder, String dstFolder, String rootDirToRemove) { + + Enumeration<URL> urls = null; + Bundle b = FrameworkUtil.getBundle(Resources.class); + if (b == null) { + LOG.info("Running in file text."); + urls = getResourceFolderFiles(resFolder); + } else { + urls = b.findEntries(resFolder, "*", true); + } + + boolean success = true; + URL srcUrl; + String srcFilename; + String dstFilename; + while (urls.hasMoreElements()) { + srcUrl = urls.nextElement(); + srcFilename = srcUrl.getFile(); + + if (srcFilename.endsWith("/")) { + LOG.warn("Skip directory: {}", srcFilename); + continue; + } + + LOG.debug("try to copy res {} to {}", srcFilename, dstFolder); + if (rootDirToRemove != null) { + srcFilename = srcFilename + .substring(srcFilename.indexOf(rootDirToRemove) + rootDirToRemove.length() + 1); + LOG.debug("dstfilename trimmed to {}", srcFilename); + } + dstFilename = dstFolder + "/" + srcFilename; + try { + if (!extractFileTo(srcUrl, new File(dstFilename))) { + success = false; + } + } catch (Exception e) { + LOG.warn("problem copying res {} to {}: {}", srcFilename, dstFilename, e.getMessage()); + } + } + + return success; + + } + private static Enumeration<URL> getResourceFolderFiles (String folder) { + LOG.info("Get ressource: {}", folder); + URL url = getUrlForRessource(folder); + String path = url.getPath(); + File[] files = new File(path).listFiles(); + Collection<URL> urlCollection = new ArrayList<>(); + + if (files != null) { + for (File f : files) { + try { + if (f.isDirectory()) { + urlCollection.addAll(Collections.list(getResourceFolderFiles(folder+"/"+f.getName()))); + } else { + urlCollection.add(f.toURI().toURL()); + } + } catch (MalformedURLException e) { + LOG.error("Can not read ressources", e); + break; + } + } + } + + Enumeration<URL> urls = Collections.enumeration(urlCollection); + return urls; + } + + private static URL getUrlForRessource (String fileOrDirectory) { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + URL url = loader.getResource(fileOrDirectory); + return url; + } + + public static boolean extractFileTo(String resFile, File oFile) { + if (oFile == null) { + return false; + } + LOG.debug("try to copy {} from res to {}", resFile, oFile.getAbsolutePath()); + URL u = getFileURL(resFile); + if (u == null) { + LOG.warn("cannot find resfile: {}", resFile); + return false; + } + return extractFileTo(u, oFile); + } + + public static boolean extractFileTo(URL u, File oFile) { + + if (oFile.isDirectory()) { + oFile.mkdirs(); + return true; + } else { + oFile.getParentFile().mkdirs(); + } + + if (!oFile.exists()) { + try { + oFile.createNewFile(); + } catch (IOException e) { + LOG.warn("problem creating file {}: {}", oFile.getAbsoluteFile(), e.getMessage()); + } + } + try (InputStream in = u.openStream(); OutputStream outStream = new FileOutputStream(oFile);) { + + int theInt; + while ((theInt = in.read()) >= 0) { + outStream.write(theInt); + } + in.close(); + outStream.flush(); + outStream.close(); + LOG.debug("file written successfully"); + } catch (IOException e) { + LOG.error("problem writing file: {}", e.getMessage()); + return false; + } + return true; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/TemplateFile.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/TemplateFile.java new file mode 100644 index 000000000..3703e18a6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/TemplateFile.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class TemplateFile { + + protected final HashMap<String, Object> mKeyValuePairs; + private final String mContent; + + public TemplateFile(String content) { + this.mKeyValuePairs = new HashMap<>(); + this.mContent = content; + + } + + public TemplateFile(File f) throws IOException { + this(initialize(f)); + } + + public void addValue(String key, Object value) { + this.mKeyValuePairs.put(key, value); + } + + public void removeValue(String key) { + this.mKeyValuePairs.remove(key); + } + + private String replace() { + String s = this.mContent; + String key; + Object value; + for (Map.Entry<String, Object> entry : this.mKeyValuePairs.entrySet()) { + key = entry.getKey(); + value = entry.getValue(); + if (value != null) { + s = s.replace(key, value.toString()); + } + } + return s; + } + + @Override + public String toString() { + return this.replace(); + } + + private static String initialize(File f) throws FileNotFoundException, IOException { + StringBuilder sb = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new FileReader(f));) { + String line = br.readLine(); + + while (line != null) { + sb.append(line); + line = br.readLine(); + } + br.close(); + } + return sb.toString(); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/TimeSpan.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/TimeSpan.java new file mode 100644 index 000000000..551955d45 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/internalTypes/TimeSpan.java @@ -0,0 +1,650 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/* + * SoSy-Lab Common is a library of useful utilities. + * This file is part of SoSy-Lab Common. + * + * Copyright (C) 2007-2015 Dirk Beyer + * 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. + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.concurrent.TimeUnit.DAYS; +import static java.util.concurrent.TimeUnit.HOURS; +import static java.util.concurrent.TimeUnit.MICROSECONDS; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.NANOSECONDS; +import static java.util.concurrent.TimeUnit.SECONDS; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Ascii; +import com.google.common.collect.EnumHashBiMap; +import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.Lists; +import com.google.common.collect.Ordering; +import com.google.common.math.LongMath; +import com.google.common.primitives.Longs; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.annotation.CheckReturnValue; +import javax.annotation.Nullable; + +/** + * This is an immutable representation of some time span, using a {@link TimeUnit} and a value. + * + * <p>The value may be positive or negative. All operations check for overflows and underflows, the + * behavior on overflow and underflow differs and is documented for each method. + * + * <p>Two instances are considered equal if they represent the exact same time span regardless of + * their unit, for example, 60s and 1min are considered equal. + */ + +public final class TimeSpan implements Comparable<TimeSpan>, Serializable { + + private static final long serialVersionUID = -4013592312989551009L; + + private static final ImmutableSortedSet<TimeUnit> ALL_UNITS = + ImmutableSortedSet.copyOf(EnumSet.allOf(TimeUnit.class)); + + static { + assert ALL_UNITS.higher(SECONDS).equals(MINUTES); // assert expected order of set + } + + private static final EnumHashBiMap<TimeUnit, String> TIME_UNITS = + EnumHashBiMap.create(TimeUnit.class); + + static { + TIME_UNITS.put(NANOSECONDS, "ns"); + TIME_UNITS.put(MICROSECONDS, "µs"); + TIME_UNITS.put(MILLISECONDS, "ms"); + TIME_UNITS.put(SECONDS, "s"); + TIME_UNITS.put(MINUTES, "min"); + TIME_UNITS.put(HOURS, "h"); + TIME_UNITS.put(DAYS, "d"); + } + + private static final Pattern ONLY_DIGITS = Pattern.compile(" *([0-9]+) *"); + + private enum CharType { + BEGIN, + END, + LETTER, + DIGIT, + WHITESPACE + } + + private final long span; + private final TimeUnit unit; + + private TimeSpan(long pSpan, TimeUnit pUnit) { + span = pSpan; + unit = checkNotNull(pUnit); + } + + public static TimeSpan of(long pSpan, TimeUnit pUnit) { + return new TimeSpan(pSpan, pUnit); + } + + public static TimeSpan ofSeconds(long pSeconds) { + return new TimeSpan(pSeconds, SECONDS); + } + + public static TimeSpan ofMillis(long pMillis) { + return new TimeSpan(pMillis, MILLISECONDS); + } + + public static TimeSpan ofNanos(long pNanos) { + return new TimeSpan(pNanos, NANOSECONDS); + } + + public static TimeSpan empty() { + return new TimeSpan(0, DAYS); + } + + /** + * Converts the given {@link String} into a {@link TimeSpan} object. Supported units are day, + * hour, minute and second. + * + * @param input the {@link String} to convert + * @return a {@link TimeSpan} represented by the given {@link String} + * @throws IllegalArgumentException if the input is not a valid string representation of a {@link + * TimeSpan}. + */ + public static TimeSpan valueOf(String input) { + + // only seconds: use simple regex + Matcher secondMatcher = ONLY_DIGITS.matcher(input); + if (secondMatcher.matches()) { + return ofSeconds(Long.parseLong(secondMatcher.group(1))); + } + + // values with units: more elaborate parsing necessary + List<String> tokens = splitIntoTokens(input); + + long days = 0; + long hours = 0; + long minutes = 0; + long seconds = 0; + + Iterator<String> it = tokens.iterator(); + + while (it.hasNext()) { + // first: value + String nextString = it.next(); + long value = Long.parseLong(nextString); + + // second: unit + if (!it.hasNext()) { + throw new IllegalArgumentException("Value " + nextString + " has no unit."); + } + + String unit = it.next(); + switch (unit) { + case "day": + case "days": + case "d": + if (days != 0) { + throw new IllegalArgumentException("Days set twice: " + unit); + } + days = value; + break; + + case "h": + case "hour": + case "hours": + if (hours != 0) { + throw new IllegalArgumentException("Hours set twice: " + unit); + } + hours = value; + break; + + case "min": + case "m": + if (minutes != 0) { + throw new IllegalArgumentException("Minutes set twice: " + unit); + } + minutes = value; + break; + + case "s": + if (seconds != 0) { + throw new IllegalArgumentException("Seconds set twice: " + unit); + } + seconds = value; + break; + + default: + throw new IllegalArgumentException("Unknown unit: " + unit); + } + } + + return sum(of(seconds, SECONDS), of(minutes, MINUTES), of(hours, HOURS), of(days, DAYS)); + } + + private static List<String> splitIntoTokens(String input) { + List<String> tokens = Lists.newArrayList(); + CharType previous = CharType.BEGIN; + int pos = 0; + + for (int i = 0; i <= input.length(); ++i) { + + CharType current; + if (i == input.length()) { + current = CharType.END; + } else { + char currentChar = input.charAt(i); + if (Character.isLetter(currentChar)) { + current = CharType.LETTER; + } else if (Character.isDigit(currentChar)) { + current = CharType.DIGIT; + } else if (Character.isWhitespace(currentChar)) { + current = CharType.WHITESPACE; + } else { + throw new IllegalArgumentException( + "Unreconized character '" + currentChar + "' when parsing " + input); + } + } + + if (current != previous) { + // we want to use the previous token + if (previous == CharType.LETTER || previous == CharType.DIGIT) { + tokens.add(input.substring(pos, i)); + } + + if (current == CharType.LETTER || current == CharType.DIGIT) { + pos = i; + } + + previous = current; + } + } + + return tokens; + } + + /** + * Get the value of this TimeSpan represented in the given unit. If the given unit is larger than + * the current unit, precision may be lost. + * + * @throws ArithmeticException If the value cannot be represented in the given unit due to + * overflow. + */ + public long getChecked(TimeUnit dest) { + if (dest.compareTo(unit) < 0) { + // Example case: we have seconds, but we want milliseconds (can overflow) + long factor = dest.convert(1, unit); + assert factor > 1; + return LongMath.checkedMultiply(span, factor); + } + + // Example case: we have nanoseconds, but we want seconds (cannot overflow) + return dest.convert(span, unit); + } + + /** + * Get the value of this TimeSpan represented in the given unit. If the given unit is larger than + * the current unit, precision may be lost. If the value cannot be represented in the given unit + * due to overflow, Long.MAX_VALUE/Long.MIN_VALUE is returned. + */ + public long getSaturated(TimeUnit dest) { + return dest.convert(span, unit); + } + + /** + * Return a TimeSpan that represents (approximately) the same time span, but whose unit is the + * given unit. If the given unit is larger than the current unit, precision may be lost. + * + * @throws ArithmeticException If the value cannot be represented in the given unit + */ + public TimeSpan toChecked(TimeUnit dest) { + if (dest.equals(unit)) { + return this; + } + return new TimeSpan(getChecked(dest), dest); + } + + /** + * Return a TimeSpan that represents (approximately) the same time span, but whose unit is the + * given unit. If the given unit is larger than the current unit, precision may be lost. If the + * value cannot be represented in the given unit due to overflow, Long.MAX_VALUE/Long.MIN_VALUE is + * returned. + */ + public TimeSpan toSaturated(TimeUnit dest) { + if (dest.equals(unit)) { + return this; + } + return new TimeSpan(getSaturated(dest), dest); + } + + /** + * Return a TimeSpan that represents (approximately) the same time span, but whose unit is the + * given unit, if possible. If the given unit is larger than the current unit, precision may be + * lost. If the value cannot be represented in the given unit due to overflow, the resulting + * TimeSpan does not use the given unit, but the closest unit one that still allows to hold the + * exact value. + */ + @VisibleForTesting + TimeSpan toIfPossible(TimeUnit dest) { + if (dest.equals(unit)) { + return this; + } + if (dest.compareTo(unit) < 0) { + // Example case: we have seconds, but we want milliseconds (can overflow). + // Overflow is expected to be very rare. + // Loop will terminate because at one time "dest" becomes equal to "this.unit" + // and then toChecked succeeds for sure. + while (true) { + try { + return toChecked(dest); + } catch (ArithmeticException e) { + dest = checkNotNull(ALL_UNITS.higher(dest)); + } + } + + } else { + // Example case: we have nanoseconds, but we want seconds (cannot overflow). + return new TimeSpan(getSaturated(dest), dest); + } + } + + /** + * Get the value of this TimeSpan as seconds. If the current unit is smaller than seconds, + * precision may be lost. + * + * @throws ArithmeticException If the value cannot be represented as seconds due to overflow. + */ + public long asSeconds() { + return getChecked(SECONDS); + } + + /** + * Get the value of this TimeSpan as milliseconds. If the current unit is smaller than + * milliseconds, precision may be lost. + * + * @throws ArithmeticException If the value cannot be represented as milliseconds due to overflow. + */ + public long asMillis() { + return getChecked(MILLISECONDS); + } + + /** + * Get the value of this TimeSpan as nanoseconds. + * + * @throws ArithmeticException If the value cannot be represented as milliseconds due to overflow. + */ + public long asNanos() { + return getChecked(NANOSECONDS); + } + + public TimeUnit getUnit() { + return unit; + } + + /** + * Return a strings that represents (approximately) this time span, in the given unit if possible. + * If the given unit is larger than the current unit, precision may be lost. If the value cannot + * be represented in the given unit due to overflow, the result does not use the given unit, but + * the closest unit one that still allows to hold the exact value. + */ + public String formatAs(TimeUnit dest) { + if (dest.compareTo(unit) <= 0) { + // Example case: we have seconds, but we want milliseconds + return toIfPossible(dest).toString(); + } + + // Example case: we have nanoseconds, but we want seconds + long scaleFactor = unit.convert(1L, dest); + assert scaleFactor > 0; + return String.format(Locale.US, "%9.3f%s", (double) span / scaleFactor, TIME_UNITS.get(dest)); + } + + /** Check whether this time span is empty, i.e., represents 0ns (or 0ms or 0s or ...). */ + public boolean isEmpty() { + return span == 0; + } + + @Override + public boolean equals(@Nullable Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof TimeSpan)) { + return false; + } + TimeSpan other = (TimeSpan) obj; + if (this.unit == other.unit) { + return this.span == other.span; + } + TimeUnit leastCommonUnit = leastCommonUnit(this, other); + try { + return this.getChecked(leastCommonUnit) == other.getChecked(leastCommonUnit); + } catch (ArithmeticException e) { + // In case of overflow, both values cannot be the same. + return false; + } + } + + @Override + public int hashCode() { + // Need to use a fixed unit here to be consistent with equals: + // 60s and 1min need to have the same hashCode. + // Saturation is ok, all really large values just have the same hash code. + return Longs.hashCode(getSaturated(NANOSECONDS)); + } + + @Override + public int compareTo(TimeSpan other) { + if (this.unit == other.unit) { + return Long.compare(this.span, other.span); + } + TimeUnit leastCommonUnit = leastCommonUnit(this, other); + try { + return Long.compare(this.getChecked(leastCommonUnit), other.getChecked(leastCommonUnit)); + } catch (ArithmeticException e) { + // Only one of the two calls can overflow, + // and it has to be the one with the larger unit. + // Thus in case of overflow the TimeSpan with the larger unit also has the larger value. + return this.unit.compareTo(other.unit); + } + } + + private static TimeUnit leastCommonUnit(TimeSpan a, TimeSpan b) { + return Ordering.natural().min(a.unit, b.unit); + } + + @Override + public String toString() { + return DEFAULT_FORMAT.apply(this); + } + + /** + * Create a new time span that is the sum of two time spans. The unit of the returned time span is + * the more precise one if possible, otherwise the closest unit that still allows to hold both + * input values and the result. Note that this can loose precision when adding a very large and a + * very small value. + * + * @throws ArithmeticException If no unit is large enough to represent the result value. + */ + public static TimeSpan sum(TimeSpan a, TimeSpan b) { + TimeUnit leastCommonUnit = leastCommonUnit(a, b); + while (true) { + try { + return new TimeSpan( + LongMath.checkedAdd(a.getChecked(leastCommonUnit), b.getChecked(leastCommonUnit)), + leastCommonUnit); + } catch (ArithmeticException e) { + // Overflow is expected to be very rare, thus handle exception case instead of checking. + // Try again with next unit. + leastCommonUnit = ALL_UNITS.higher(leastCommonUnit); + if (leastCommonUnit == null) { + // overflow from addition + throw e; + } + } + } + } + + /** + * Create a new time span that is the sum of several time spans. The unit of the returned time + * span is the most precise one if possible, otherwise the closest unit that still allows to hold + * input values and the result. Note that this can loose precision when adding very large and very + * small values. + * + * @throws ArithmeticException If no unit is large enough to represent the result value. + */ + public static TimeSpan sum(Iterable<TimeSpan> timeSpans) { + Iterator<TimeSpan> it = timeSpans.iterator(); + checkArgument(it.hasNext()); + + TimeSpan result = it.next(); + // TODO Summing in loop looses more precision than necessary. + while (it.hasNext()) { + result = sum(result, it.next()); + } + return result; + } + + /** + * Create a new time span that is the sum of several time spans. The unit of the returned time + * span is the most precise one. + */ + public static TimeSpan sum(TimeSpan... t) { + return sum(Arrays.asList(t)); + } + + /** + * Create a new time span that is the difference of two time spans. The unit of the returned time + * span is the more precise one if possible, otherwise the closest unit that still allows to hold + * both input values and the result. Note that this can loose precision when subtracting a very + * large and a very small value. + */ + public static TimeSpan difference(TimeSpan a, TimeSpan b) { + TimeUnit leastCommonUnit = leastCommonUnit(a, b); + while (true) { + try { + return new TimeSpan( + LongMath.checkedSubtract(a.getChecked(leastCommonUnit), b.getChecked(leastCommonUnit)), + leastCommonUnit); + } catch (ArithmeticException e) { + // Overflow is expected to be very rare, thus handle exception case instead of checking. + // Try again with next unit. + leastCommonUnit = ALL_UNITS.higher(leastCommonUnit); + if (leastCommonUnit == null) { + // overflow from subtraction + throw e; + } + } + } + } + + /** + * Create a new time span that is the current one multiplied by a non-negative integral factor. + * The unit of the returned time span is the same as the current one if possible, otherwise the + * closest unit that still allows to the result. Note that this can loose precision. + */ + @CheckReturnValue + public TimeSpan multiply(int factor) { + checkArgument(factor >= 0, "Cannot multiply TimeSpan with negative value %s", factor); + TimeUnit dest = unit; + while (true) { + try { + return new TimeSpan(LongMath.checkedMultiply(getChecked(dest), factor), dest); + } catch (ArithmeticException e) { + // Overflow is expected to be very rare, thus handle exception case instead of checking. + // Try again with next unit. + dest = ALL_UNITS.higher(dest); + if (dest == null) { + // overflow from multiplication + throw e; + } + } + } + } + + /** + * Create a new time span that is the current one divided by a non-negative integral value. The + * result of the division is rounded down (integer division). The unit of the returned time span + * is the same as the current one. + */ + @CheckReturnValue + public TimeSpan divide(int divisor) { + checkArgument(divisor >= 0, "Cannot divide TimeSpan by negative value %s", divisor); + return new TimeSpan(span / divisor, unit); + } + + // Code for formatting as string + + private static final Function<TimeSpan, String> FORMAT_SIMPLE = + pInput -> pInput.span + TIME_UNITS.get(pInput.unit); + + @VisibleForTesting + static final Function<TimeSpan, String> FORMAT_HUMAN_READABLE_LARGE = + pInput -> { + TimeUnit unit = pInput.getUnit(); + StringBuilder result = new StringBuilder(); + boolean started = false; + + long years = pInput.getChecked(DAYS) / 365; + if (years > 0) { + started = true; + result.append(years).append("a "); + } + + long days = pInput.getChecked(DAYS) - years * 365; + if (started || days > 0) { + started = true; + result.append(days).append("d "); + } + if (unit.equals(DAYS)) { + return result.toString().trim(); + } + + long hours = pInput.getChecked(HOURS) - years * 365 * 24 - days * 24; + if (started || hours > 0) { + started = true; + result.append(String.format("%02dh ", hours)); + } + if (unit.equals(HOURS)) { + return result.toString().trim(); + } + + long minutes = + pInput.getChecked(MINUTES) - years * 365 * 24 * 60 - days * 24 * 60 - hours * 60; + if (started || minutes > 0) { + result.append(String.format("%02dmin ", minutes)); + } + if (unit.equals(MINUTES)) { + started = true; + return result.toString().trim(); + } + + long seconds = + pInput.getChecked(SECONDS) + - years * 365 * 24 * 60 * 60 + - days * 24 * 60 * 60 + - hours * 60 * 60 + - minutes * 60; + result.append(String.format("%02ds", seconds)); + + return result.toString(); + }; + + private static final String DEFAULT_FORMAT_PROPERTY_NAME = + TimeSpan.class.getCanonicalName() + ".defaultFormat"; + + private static final Function<TimeSpan, String> DEFAULT_FORMAT; + + static { + String format = + Ascii.toUpperCase(System.getProperty(DEFAULT_FORMAT_PROPERTY_NAME, "SIMPLE").trim()); + switch (format) { + case "HUMAN_READABLE_LARGE": + DEFAULT_FORMAT = FORMAT_HUMAN_READABLE_LARGE; + break; + case "SIMPLE": + DEFAULT_FORMAT = FORMAT_SIMPLE; + break; + default: + DEFAULT_FORMAT = FORMAT_SIMPLE; + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/NotificationActor.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/NotificationActor.java new file mode 100644 index 000000000..7daf7c9c5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/NotificationActor.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +public interface NotificationActor<T> { + + public void notificationActor(T item); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/NotificationWorker.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/NotificationWorker.java new file mode 100644 index 000000000..b6e0ca23c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/NotificationWorker.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; + +public class NotificationWorker<T> implements AutoCloseable { + + private final BlockingQueue<T> workQueue; + private final ExecutorService service; + private final NotificationActor<T> actor; + + public NotificationWorker(int numWorkers, int workQueueSize, NotificationActor<T> actorObject) { + workQueue = new LinkedBlockingQueue<T>(workQueueSize); + service = Executors.newFixedThreadPool(numWorkers); + actor = actorObject; + + for (int i=0; i < numWorkers; i++) { + service.submit(new Worker<T>(workQueue, actor)); + } + } + + public void put(T item) { + try { + workQueue.put(item); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + + @Override + public void close() throws Exception { + // TODO Auto-generated method stub + } + + private static class Worker<T> implements Runnable { + private final BlockingQueue<T> workQueue; + private final NotificationActor<T> actor; + + + public Worker(BlockingQueue<T> workQueue, NotificationActor<T> actor) { + this.workQueue = workQueue; + this.actor = actor; + } + + @Override + public void run() { + while (!Thread.currentThread().isInterrupted()) { + try { + T item = workQueue.take(); + actor.notificationActor(item); + // Process item + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + break; + } + } + } + } + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCOreNetworkElementCoreData.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCOreNetworkElementCoreData.java new file mode 100644 index 000000000..265a3db84 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCOreNetworkElementCoreData.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.NetworkElement; + +public interface ONFCOreNetworkElementCoreData { + + public String getMountpoint(); + public DataBroker getDataBroker(); + public NetworkElement getOptionalNetworkElement(); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreEmpty.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreEmpty.java new file mode 100644 index 000000000..00393d967 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreEmpty.java @@ -0,0 +1,111 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InventoryInformation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.AllPm; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; + +/** + * @author herbert + * + */ +public class ONFCoreEmpty implements ONFCoreNetworkElementRepresentation { + + private String mountPointNodeName = ""; + + + ONFCoreEmpty(String mountPointNodeName) { + this.mountPointNodeName = mountPointNodeName; + } + + @Override + public void initialReadFromNetworkElement() { + } + + @Override + public String getMountPointNodeName() { + return mountPointNodeName; + } + + @Override + public void resetPMIterator() { + } + + @Override + public boolean hasNext() { + return false; + } + + @Override + public void next() { + } + + @Override + public AllPm getHistoricalPM() { + return AllPm.getEmpty(); + } + + @Override + public String pmStatusToString() { + return "ONFCoreEmpty"; + } + + @Override + public int removeAllCurrentProblemsOfNode() { + return 0; + } + + @Override + public void doRegisterMicrowaveEventListener(MountPoint mointPoint) { + //Do nothing + } + + @Override + public void prepareCheck() { + //Do nothing here + } + + @Override + public boolean checkIfConnectionToMediatorIsOk() { + return false; + } + + @Override + public boolean checkIfConnectionToNeIsOk() { + return false; + } + + @Override + public void initSynchronizationExtension() { + } + + @Override + public InventoryInformation getInventoryInformation() { + return InventoryInformation.getDefault(); + } + + @Override + public InventoryInformation getInventoryInformation(String layerProtocolFilter) { + return InventoryInformation.getDefault(); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreInterfacePac.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreInterfacePac.java new file mode 100644 index 000000000..1c9c8e073 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreInterfacePac.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +/** + * @author herbert + * + */ +public class ONFCoreInterfacePac<T> { + + + Class<T> myClass; + + ONFCoreInterfacePac( Class<T> myClass ) { + this.myClass = myClass; + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12.java new file mode 100644 index 000000000..de43e5760 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12.java @@ -0,0 +1,741 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.AllPm; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ONFLayerProtocolName; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.GenericTransactionUtils; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc.OnfMicrowaveModel; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc.WrapperMicrowaveModelRev170324; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc.WrapperMicrowaveModelRev180907; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc.WrapperMicrowaveModelRev181010; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter.NotificationDelayService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.ProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.listener.MicrowaveEventListener12; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types.EsHistoricalPerformance15Minutes; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types.EsHistoricalPerformance24Hours; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.controller.md.sal.binding.api.NotificationService; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.NetworkElement; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.extension.g.Extension; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.network.element.Ltp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.NetworkElementPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.network.element.pac.NetworkElementCurrentProblems; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.NotificationListener; +import org.opendaylight.yangtools.yang.common.QName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.google.common.base.Optional; + +/** + * Get information over NETCONF device according to ONF Coremodel. Read networkelement and + * conditional packages. + * + * Get conditional packages from Networkelement Possible interfaces are: MWPS, LTP(MWPS-TTP), + * MWAirInterfacePac, MicrowaveModel-ObjectClasses-AirInterface ETH-CTP,LTP(Client), + * MW_EthernetContainer_Pac MWS, LTP(MWS-CTP-xD), MWAirInterfaceDiversityPac, + * MicrowaveModel-ObjectClasses-AirInterfaceDiversity MWS, LTP(MWS-TTP), + * ,MicrowaveModel-ObjectClasses-HybridMwStructure MWS, LTP(MWS-TTP), + * ,MicrowaveModel-ObjectClasses-PureEthernetStructure + * + * @author herbert + * + */ +public class ONFCoreNetworkElement12 extends ONFCoreNetworkElement12Base + implements ONFCoreNetworkElementCallback, NotificationActor<AttributeValueChangedNotificationXml> { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElement12.class); + + /*----------------------------------------------------------------------------- + * Class members + */ + private final @Nonnull MicrowaveEventListener12 microwaveEventListener; + private final @Nonnull OnfMicrowaveModel microwaveModel; + private final NotificationWorker<AttributeValueChangedNotificationXml> notificationQueue; + + private ListenerRegistration<NotificationListener> listenerRegistrationresult = null; + + /*----------------------------------------------------------------------------- + * Construction + */ + + /** + * Constructor + * + * @param mountPointNodeName as String + * @param capabilities of the specific network element + * @param netconfNodeDataBroker for the network element specific data + * @param webSocketService to forward event notifications + * @param databaseService to access the database + * @param dcaeProvider to forward problem / change notifications + */ + private ONFCoreNetworkElement12(String mountPointNodeName, Capabilities capabilities, + DataBroker netconfNodeDataBroker, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider, @Nullable ProviderClient aotsmClient, + MaintenanceService maintenanceService, + NotificationDelayService<ProblemNotificationXml> notificationDelayService, + OnfMicrowaveModel onfMicrowaveModel) { + + super(mountPointNodeName, netconfNodeDataBroker, capabilities); + + this.microwaveModel = onfMicrowaveModel; + this.microwaveModel.setCoreData(this); + + // Create MicrowaveService here + this.microwaveEventListener = new MicrowaveEventListener12(mountPointNodeName, webSocketService, + databaseService, dcaeProvider, aotsmClient, maintenanceService, notificationDelayService, this); + this.microwaveModel.setOnfMicrowaveModelListener(microwaveEventListener); + + this.notificationQueue = new NotificationWorker<>(1, 100, this); + + // ->Below shifted to super class + // this.isNetworkElementCurrentProblemsSupporting12 = + // capabilities.isSupportingNamespaceAndRevision(NetworkElementPac.QNAME); + // LOG.debug("support necurrent-problem-list=" + this.isNetworkElementCurrentProblemsSupporting12); + // LOG.info("Create NE instance {}", InstanceList.QNAME.getLocalName()); + + } + + /** + * Check capabilities are matching the this specific implementation and create network element + * representation if so. + * + * @param mountPointNodeName as String + * @param capabilities of the specific network element + * @param netconfNodeDataBroker for the network element specific data + * @param webSocketService to forward event notifications + * @param databaseService to access the database + * @param dcaeProvider to forward problem / change notifications + * @return created Object if conditions are OK or null if not. + */ + public static @Nullable ONFCoreNetworkElement12 build(String mountPointNodeName, Capabilities capabilities, + DataBroker netconfNodeDataBroker, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider, @Nullable ProviderClient aotsmClient, + MaintenanceService maintenanceService, + NotificationDelayService<ProblemNotificationXml> notificationDelayService) { + + if (capabilities.isSupportingNamespaceAndRevision(NetworkElement.QNAME)) { + OnfMicrowaveModel onfMicrowaveModel = null; + + if (capabilities.isSupportingNamespaceAndRevision(WrapperMicrowaveModelRev170324.QNAME)) { + onfMicrowaveModel = new WrapperMicrowaveModelRev170324(); + } else if (capabilities.isSupportingNamespaceAndRevision(WrapperMicrowaveModelRev180907.QNAME)) { + onfMicrowaveModel = new WrapperMicrowaveModelRev180907(); + } else if (capabilities.isSupportingNamespaceAndRevision(WrapperMicrowaveModelRev181010.QNAME)) { + onfMicrowaveModel = new WrapperMicrowaveModelRev181010(); + } + + if (onfMicrowaveModel != null) { + return new ONFCoreNetworkElement12(mountPointNodeName, capabilities, netconfNodeDataBroker, + webSocketService, databaseService, dcaeProvider, aotsmClient, maintenanceService, + notificationDelayService, onfMicrowaveModel); + } + } + return null; + + } + + /*----------------------------------------------------------------------------- + * Functions + */ + + /** + * DeviceMonitor Prepare check by updating NE state and reading all interfaces. + */ + @Override + public void prepareCheck() { + synchronized (dmLock) { + boolean change = readNetworkElementAndInterfaces(); + if (change) { + int problems = microwaveEventListener.removeAllCurrentProblemsOfNode(); + List<ProblemNotificationXml> resultList = readAllCurrentProblemsOfNode(); + microwaveEventListener.initCurrentProblemStatus(resultList); + LOG.info("Resync mountpoint {} for device {}. Removed {}. Current problems: {}", getMountPointNodeName(), + getUuId(), problems, resultList.size()); + } + } + } + + // public boolean checkIfConnectionToMediatorIsOk() -> Shifted to super class + // public boolean checkIfConnectionToNeIsOk() -> Shifted to super class + + /*----------------------------------------------------------------------------- + * Synchronization + */ + + // public void initSynchronizationExtension() -> Shifted to super class + // private InstanceList readPTPClockInstances() -> Shifted to super class + + /*----------------------------------------------------------------------------- + * Services for NE/Device synchronization + */ + + /** + * Handling of specific Notifications from NE, indicating changes and need for synchronization. + * + * <attribute-value-changed-notification xmlns="urn:onf:params:xml:ns:yang:microwave-model"> + * <attribute-name>/equipment-pac/equipment-current-problems</attribute-name> + * <object-id-ref>CARD-1.1.1.0</object-id-ref> <new-value></new-value> + * </attribute-value-changed-notification> + * <attribute-value-changed-notification xmlns="urn:onf:params:xml:ns:yang:microwave-model"> + * <attribute-name>/network-element/extension[value-name="top-level-equipment"]/value</attribute-name> + * <object-id-ref>Hybrid-Z</object-id-ref> + * <new-value>SHELF-1.1.0.0,IDU-1.55.0.0,ODU-1.56.0.0,IDU-1.65.0.0</new-value> + * </attribute-value-changed-notification> + */ + + + @Override + public void notificationFromNeListener(AttributeValueChangedNotificationXml notificationXml) { + notificationQueue.put(notificationXml); + } + + @Override + public void notificationActor(AttributeValueChangedNotificationXml notificationXml) { + + LOG.debug("Enter change notification listener"); + if (LOG.isTraceEnabled()) { + LOG.trace("Notification: {}", notificationXml); + } + if (notificationXml.getAttributeName().equals("/equipment-pac/equipment-current-problems")) { + syncEquipmentPac(notificationXml.getObjectId()); + } else if (notificationXml.getAttributeName() + .equals("/network-element/extension[value-name=\"top-level-equipment\"]/value")) { + initialReadFromNetworkElement(); + } + LOG.debug("Leave change notification listener"); + } + + /** + * Synchronize problems for a specific equipment-pac + * + * @param uuidString of the equipment-pac + */ + private synchronized void syncEquipmentPac(String uuidString) { + + int problems = microwaveEventListener.removeObjectsCurrentProblemsOfNode(uuidString); + LOG.debug("Removed {} problems for uuid {}", problems, uuidString); + + List<ProblemNotificationXml> resultList = equipment.addProblemsofNodeObject(uuidString); + microwaveEventListener.initCurrentProblemStatus(resultList); + LOG.debug("Added {} problems for uuid {}", resultList.size(), uuidString); + + } + + + /*----------------------------------------------------------------------------- + * Problem/Fault related functions + */ + + /** + * Read during startup all relevant structure and status parameters from device + */ + @Override + public synchronized void initialReadFromNetworkElement() { + // optionalNe.getLtp().get(0).getLp(); + LOG.debug("Get info about {}", getMountPointNodeName()); + + int problems = microwaveEventListener.removeAllCurrentProblemsOfNode(); + LOG.debug("Removed all {} problems from database at registration", problems); + + // Step 2.1: access data broker within this mount point + LOG.debug("DBRead start"); + + // Step 2.2: read ne from data store + readNetworkElementAndInterfaces(); + equipment.readNetworkElementEquipment(); + + // Step 2.3: read the existing faults and add to DB + List<ProblemNotificationXml> resultList = readAllCurrentProblemsOfNode(); + equipment.addProblemsofNode(resultList); + + microwaveEventListener.initCurrentProblemStatus(resultList); + + microwaveEventListener.writeEquipment(equipment); + + LOG.info("Found info at {} for device {} number of problems: {}", getMountPointNodeName(), getUuId(), + resultList.size()); + } + + /** + * LOG the newly added problems of the interface pac + * + * @param idxStart + * @param uuid + * @param resultList + */ + private void debugResultList(String uuid, List<ProblemNotificationXml> resultList, int idxStart) { + if (LOG.isDebugEnabled()) { + StringBuffer sb = new StringBuffer(); + int idx = 0; + for (int t = idxStart; t < resultList.size(); t++) { + sb.append(idx++); + sb.append(":{"); + sb.append(resultList.get(t)); + sb.append('}'); + } + LOG.debug("Found problems {} {}", uuid, sb.toString()); + } + } + + /** + * Read from NetworkElement and verify LTPs have changed. If the NE has changed, update to the new + * structure. From initial state it changes also. + */ + private synchronized boolean readNetworkElementAndInterfaces() { + + LOG.debug("Update mountpoint if changed {}", getMountPointNodeName()); + + optionalNe = GenericTransactionUtils.readData(getNetconfNodeDataBroker(), LogicalDatastoreType.OPERATIONAL, + NETWORKELEMENT_IID);; + synchronized (pmLock) { + boolean change = false; + + if (optionalNe == null) { + LOG.debug("Unable to read NE data for mountpoint {}", getMountPointNodeName()); + if (!interfaceList.isEmpty()) { + interfaceList.clear(); + interfaceListIterator = null; + change = true; + } + + } else { + LOG.debug("Mountpoint '{}' NE-Name '{}'", getMountPointNodeName(), optionalNe.getName().toString()); + List<Lp> actualInterfaceList = getLtpList(optionalNe); + if (!interfaceList.equals(actualInterfaceList)) { + LOG.debug("Mountpoint '{}' Update LTP List. Elements {}", getMountPointNodeName(), + actualInterfaceList.size()); + interfaceList.clear(); + interfaceList.addAll(actualInterfaceList); + interfaceListIterator = null; + change = true; + } + } + return change; + } + } + + /** + * Read current problems of AirInterfaces and EthernetContainer according to NE status into DB + * + * @return List with all problems + */ + private List<ProblemNotificationXml> readAllCurrentProblemsOfNode() { + + // Step 2.3: read the existing faults and add to DB + List<ProblemNotificationXml> resultList = new ArrayList<>(); + int idxStart; // Start index for debug messages + UniversalId uuid; + + synchronized (pmLock) { + for (Lp ltp : interfaceList) { + + idxStart = resultList.size(); + uuid = ltp.getUuid(); + Class<?> lpClass = getLpExtension(ltp); + + ONFLayerProtocolName lpName = ONFLayerProtocolName.valueOf(ltp.getLayerProtocolName()); + + microwaveModel.readTheFaultsOfMicrowaveModel(lpName, lpClass, uuid, resultList); + + debugResultList(uuid.getValue(), resultList, idxStart); + + } + } + + // Step 2.4: Read other problems from mountpoint + if (isNetworkElementCurrentProblemsSupporting12) { + idxStart = resultList.size(); + readNetworkElementCurrentProblems12(resultList); + debugResultList("CurrentProblems12", resultList, idxStart); + } + + return resultList; + + } + + /** + * Get uuid of Optional NE. + * + * @return Uuid or EMPTY String if optionNE is not available + */ + private String getUuId() { + String uuid = EMPTY; + + try { + uuid = optionalNe != null ? optionalNe.getUuid() != null ? optionalNe.getUuid().getValue() : EMPTY : EMPTY; + } catch (NullPointerException e) { + // Unfortunately throws null pointer if not definied + } + return uuid; + } + + /** + * Read the NetworkElement part from database. + * + * @return Optional with NetworkElement or empty + */ + @Nullable + private NetworkElement readNetworkElement() { + // Step 2.2: construct data and the relative iid + // The schema path to identify an instance is + // <i>CoreModel-CoreNetworkModule-ObjectClasses/NetworkElement</i> + // Read to the config data store + return GenericTransactionUtils.readData(getNetconfNodeDataBroker(), LogicalDatastoreType.OPERATIONAL, + NETWORKELEMENT_IID); + } + + /** + * Get from LayProtocolExtensions the related generated ONF Interface PAC class which represents it. + * + * @param ltp logical termination point + * @return Class of InterfacePac + */ + @Nullable + private Class<?> getLpExtension(@Nullable Lp ltp) { + + String capability = EMPTY; + String revision = EMPTY; + String conditionalPackage = EMPTY; + Class<?> res = null; + + if (ltp != null) { + for (Extension e : getExtensionList(ltp)) { + if (e.getValueName().contentEquals("capability")) { + capability = e.getValue(); + int idx = capability.indexOf("?"); + if (idx != -1) { + capability = capability.substring(0, idx); + } + } + if (e.getValueName().contentEquals("revision")) { + revision = e.getValue(); + } + if (e.getValueName().contentEquals("conditional-package")) { + conditionalPackage = e.getValue(); + } + } + } + // QName qName = + // org.opendaylight.yangtools.yang.common.QName.create("urn:onf:params:xml:ns:yang:microwave-model", + // "2017-03-24", "mw-air-interface-pac").intern(); + LOG.info("LpExtension capability={} revision={} conditionalPackage={}", capability, revision, + conditionalPackage); + if (!capability.isEmpty() && !revision.isEmpty() && !conditionalPackage.isEmpty()) { + try { + QName qName = QName.create(capability, revision, conditionalPackage); + res = this.microwaveModel.getClassForLtpExtension(qName); + } catch (IllegalArgumentException e) { + LOG.debug("Can not create QName from ({}{}{}): {}", capability, revision, conditionalPackage, + e.getMessage()); + } + } + return res; + } + + /** + * Read element from class that could be not available + * + * @param ltp layer termination point + * @return List with extension parameters or empty list + */ + @Nonnull + private static List<Extension> getExtensionList(@Nullable Lp ltp) { + if (ltp != null && ltp.getExtension() != null) { + return ltp.getExtension(); + } else { + return EMPTYLTPEXTENSIONLIST; + } + } + + /** + * Get List of UUIDs for conditional packages from Networkelement<br> + * Possible interfaces are:<br> + * MWPS, LTP(MWPS-TTP), MWAirInterfacePac, MicrowaveModel-ObjectClasses-AirInterface<br> + * ETH-CTP,LTP(Client), MW_EthernetContainer_Pac<br> + * MWS, LTP(MWS-CTP-xD), MWAirInterfaceDiversityPac, + * MicrowaveModel-ObjectClasses-AirInterfaceDiversity<br> + * MWS, LTP(MWS-TTP), ,MicrowaveModel-ObjectClasses-HybridMwStructure<br> + * MWS, LTP(MWS-TTP), ,MicrowaveModel-ObjectClasses-PureEthernetStructure<br> + * + * @param ne Networkelement + * @return Id List, never null. + */ + private static List<Lp> getLtpList(@Nullable NetworkElement ne) { + + List<Lp> res = Collections.synchronizedList(new ArrayList<Lp>()); + + if (ne != null) { + List<Ltp> ltpRefList = ne.getLtp(); + if (ltpRefList == null) { + LOG.debug("DBRead NE-Interfaces: null"); + } else { + for (Ltp ltRefListE : ltpRefList) { + List<Lp> lpList = ltRefListE.getLp(); + if (lpList == null) { + LOG.debug("DBRead NE-Interfaces Reference List: null"); + } else { + for (Lp ltp : lpList) { + //// LayerProtocolName layerProtocolName = lpListE.getLayerProtocolName(); + // UniversalId uuId = lpListE.getUuid(); + res.add(ltp); + } + } + } + } + } else { + LOG.debug("DBRead NE: null"); + } + + // ---- Debug + if (LOG.isDebugEnabled()) { + StringBuffer strBuf = new StringBuffer(); + for (Lp ltp : res) { + if (strBuf.length() > 0) { + strBuf.append(", "); + } + strBuf.append(ltp.getLayerProtocolName().getValue()); + strBuf.append(':'); + strBuf.append(ltp.getUuid().getValue()); + } + LOG.debug("DBRead NE-Interfaces: {}", strBuf.toString()); + } + // ---- Debug end + + return res; + } + + + @Nonnull + private List<? extends OtnHistoryDataG> readTheHistoricalPerformanceData(Lp lp) { + ONFLayerProtocolName lpName = ONFLayerProtocolName.valueOf(lp.getLayerProtocolName()); + + return this.microwaveModel.readTheHistoricalPerformanceData(lpName, lp); + /* + * switch (lpName) { case MWAirInterface: return + * readTheHistoricalPerformanceDataOfMwAirInterfacePac(lp); + * + * case EthernetContainer12: return readTheHistoricalPerformanceDataOfEthernetContainer(lp); + * + * case EthernetContainer10: case EthernetPhysical: case Ethernet: case TDMContainer: case + * Structure: case Unknown: LOG.debug("Do not read HistoricalPM data for {} {}", lpName, + * lp.getUuid().getValue()); break; } return new ArrayList<>(); + */ + } + + @Override + public AllPm getHistoricalPM() { + + synchronized (pmLock) { + if (pmLp != null) { + LOG.debug("Enter query PM"); + AllPm allPm = new AllPm(); + Lp lp = pmLp; + + List<? extends OtnHistoryDataG> resultList = readTheHistoricalPerformanceData(lp); + LOG.debug("Got records: {}", resultList.size()); + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType + GranularityPeriodType granularityPeriod; + for (OtnHistoryDataG perf : resultList) { + + granularityPeriod = perf.getGranularityPeriod(); + if (granularityPeriod == null) { + granularityPeriod = GranularityPeriodType.Unknown; + } + + switch (granularityPeriod) { + case Period15Min: { + EsHistoricalPerformance15Minutes pm = + new EsHistoricalPerformance15Minutes(getMountPointNodeName(), lp) + .setHistoricalRecord15Minutes(perf); + allPm.add(pm); + } + break; + + case Period24Hours: { + EsHistoricalPerformance24Hours pm = + new EsHistoricalPerformance24Hours(getMountPointNodeName(), lp) + .setHistoricalRecord24Hours(perf); + LOG.debug("Write 24h write to DB"); + allPm.add(pm); + } + break; + + default: + LOG.warn("Unknown granularity {}", perf.getGranularityPeriod()); + break; + + } + } + LOG.debug("Deliver normalized records: {}", allPm.size()); + return allPm; + } else { + LOG.debug("Deliver empty, no LTP"); + return AllPm.getEmpty(); + } + } + } + + @Override + public void resetPMIterator() { + synchronized (pmLock) { + interfaceListIterator = interfaceList.iterator(); + } + LOG.debug("PM reset iterator"); + } + + @Override + public boolean hasNext() { + boolean res; + synchronized (pmLock) { + res = interfaceListIterator != null ? interfaceListIterator.hasNext() : false; + } + LOG.debug("PM hasNext LTP {}", res); + return res; + } + + @Override + public void next() { + synchronized (pmLock) { + if (interfaceListIterator == null) { + pmLp = null; + LOG.debug("PM next LTP null"); + } else { + pmLp = interfaceListIterator.next(); + LOG.debug("PM next LTP {}", pmLp.getLayerProtocolName().getValue()); + } + } + } + + @Override + public String pmStatusToString() { + StringBuffer res = new StringBuffer(); + synchronized (pmLock) { + res.append(pmLp == null ? "no interface" : pmLp.getLayerProtocolName().getValue()); + for (Lp lp : interfaceList) { + res.append("IF:"); + res.append(lp.getLayerProtocolName().getValue()); + res.append(" "); + } + } + return res.toString(); + } + + /** + * Remove all entries from list + */ + @Override + public int removeAllCurrentProblemsOfNode() { + return microwaveEventListener.removeAllCurrentProblemsOfNode(); + } + + /** + * Register the listener + */ + @Override + public void doRegisterMicrowaveEventListener(MountPoint mountPoint) { + LOG.info("End registration listener for Mountpoint {}", mountPoint.getIdentifier().toString()); + final Optional<NotificationService> optionalNotificationService = + mountPoint.getService(NotificationService.class); + final NotificationService notificationService = optionalNotificationService.get(); + // notificationService.registerNotificationListener(microwaveEventListener); + listenerRegistrationresult = + notificationService.registerNotificationListener(microwaveModel.getNotificationListener()); + LOG.info("End registration listener for Mountpoint {} Listener: {} Result: {}", + mountPoint.getIdentifier().toString(), optionalNotificationService, listenerRegistrationresult); + } + + + /*------------------------------------------------------------ + * private function to access database + */ + + /*----------------------------------------------------------------------------- + * Reading problems for the networkElement V1.2 + */ + + private List<ProblemNotificationXml> readNetworkElementCurrentProblems12(List<ProblemNotificationXml> resultList) { + + LOG.info("DBRead Get {} NetworkElementCurrentProblems12", getMountPointNodeName()); + + InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.NetworkElementPac> networkElementCurrentProblemsIID = + InstanceIdentifier.builder( + org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.NetworkElementPac.class) + .build(); + + // Step 2.3: read to the config data store + NetworkElementPac problemPac; + NetworkElementCurrentProblems problems; + try { + problemPac = GenericTransactionUtils.readData(getNetconfNodeDataBroker(), LogicalDatastoreType.OPERATIONAL, + networkElementCurrentProblemsIID); + problems = problemPac.getNetworkElementCurrentProblems(); + if (problems == null) { + LOG.debug("DBRead no NetworkElementCurrentProblems12"); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead empty CurrentProblemList12"); + } else { + for (org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.network.element.current.problems.g.CurrentProblemList problem : problems + .getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(getMountPointNodeName(), problem.getObjectReference(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), + InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + } catch (Exception e) { + LOG.warn("DBRead {} NetworkElementCurrentProblems12 not supported. Message '{}' ", getMountPointNodeName(), + e.getMessage()); + } + return resultList; + + } + + @Override + public void close() throws Exception { + super.close(); + if (listenerRegistrationresult != null) { + listenerRegistrationresult.close(); + } + } + + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12Base.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12Base.java new file mode 100644 index 000000000..8fc4c3308 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12Base.java @@ -0,0 +1,232 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InventoryInformation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.GenericTransactionUtils; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.InstanceList; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.InstanceListKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.PortDsEntry; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.instance.list.PortDsList; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ptp.dataset.rev170208.port.ds.entry.PortIdentity; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.NetworkElement; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.extension.g.Extension; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.NetworkElementPac; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + + +/** + * This class contains the ONF Core model Version 1.2 related functions. + * It should import + */ +public abstract class ONFCoreNetworkElement12Base extends ONFCoreNetworkElementBase implements ONFCOreNetworkElementCoreData { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElement12Base.class); + + protected static final List<Extension> EMPTYLTPEXTENSIONLIST = new ArrayList<>(); + // private static final List<Ltp> EMPTYLTPLIST = new ArrayList<>(); + + protected static final InstanceIdentifier<NetworkElement> NETWORKELEMENT_IID = InstanceIdentifier + .builder(NetworkElement.class).build(); + + protected static final InstanceIdentifier<InstanceList> PTPINSTANCES_IID = InstanceIdentifier + .builder(InstanceList.class, new InstanceListKey(1)).build(); + + /*----------------------------------------------------------------------------- + * Class members + */ + + // Non specific part. Used by all functions. + /** interfaceList is used by PM task and should be synchronized */ + protected final @Nonnull List<Lp> interfaceList = Collections.synchronizedList(new CopyOnWriteArrayList<>()); + protected @Nullable NetworkElement optionalNe = null; + + // Performance monitoring specific part + /** Lock for the PM access specific elements that could be null */ + protected final @Nonnull Object pmLock = new Object(); + protected @Nullable Iterator<Lp> interfaceListIterator = null; + /** Actual pmLp used during iteration over interfaces */ + protected @Nullable Lp pmLp = null; + + // Device monitoring specific part + /** Lock for the DM access specific elements that could be null */ + protected final @Nonnull Object dmLock = new Object(); + + protected final boolean isNetworkElementCurrentProblemsSupporting12; + + protected final ONFCoreNetworkElement12Equipment equipment; + + /* + * Constructor + */ + + protected ONFCoreNetworkElement12Base(String mountPointNodeName, DataBroker netconfNodeDataBroker, + Capabilities capabilities) { + super(mountPointNodeName, netconfNodeDataBroker, capabilities); + // TODO Auto-generated constructor stub + this.isNetworkElementCurrentProblemsSupporting12 = capabilities.isSupportingNamespaceAndRevision(NetworkElementPac.QNAME); + this.equipment = new ONFCoreNetworkElement12Equipment(this, capabilities); + LOG.debug("support necurrent-problem-list=" + this.isNetworkElementCurrentProblemsSupporting12); + LOG.info("Create NE instance {}", InstanceList.QNAME.getLocalName()); + } + + /*--------------------------------------------------------------- + * Getter/ Setter + */ + + @Override + public NetworkElement getOptionalNetworkElement() { + return optionalNe; + } + + + /*--------------------------------------------------------------- + * Device Monitor + */ + + @Override + public boolean checkIfConnectionToMediatorIsOk() { + synchronized (dmLock) { + return optionalNe != null; + } + } + + /* + * New implementation to interpret status with empty LTP List as notConnected => return false + * 30.10.2018 Since this behavior is very specific and implicit for specific NE Types + * it needs to be activated by extension or configuration. Change to be disabled at the moment + */ + @Override + public boolean checkIfConnectionToNeIsOk() { + return true; + } + + /*--------------------------------------------------------------- + * Synchronization + */ + + /** + * Query synchronization information out of NE + */ + + @Override + public void initSynchronizationExtension() { + // ClockIdentityType vv; + try { + if (!getCapabilities().isSupportingNamespaceAndRevision(InstanceList.QNAME)) { + LOG.debug("Mountpoint {} does not support PTP", getMountPointNodeName()); + } else { + StringBuffer sb = new StringBuffer(); + sb.append("NE " + getMountPointNodeName() + " does support synchronisation.\n"); + InstanceList ptpInstance = readPTPClockInstances(); + if (ptpInstance != null) { + List<PortDsList> dsList = ptpInstance.getPortDsList(); + if (dsList != null) { + int t = 0; + for (PortDsEntry portDs : ptpInstance.getPortDsList()) { + PortIdentity portId = portDs.getPortIdentity(); + if (portId != null) { + sb.append("Port["); + sb.append(portId.getPortNumber()); + sb.append("]{ ClockId: "); + sb.append(portId.getClockIdentity()); + sb.append(", Portstate: "); + sb.append(portDs.getPortState()); + sb.append("}, "); + } else { + sb.append("Incomplete port #" + t + ", "); + } + t++; + } + } else { + sb.append("dsList contains null"); + } + } else { + sb.append("ptpInstance equals null"); + } + LOG.trace(sb.toString()); + } + } catch (Exception e) { + LOG.info("Inconsistent synchronisation structure: " + e.getMessage()); + } + + } + + @Nullable + private InstanceList readPTPClockInstances() { + return GenericTransactionUtils.readData(getNetconfNodeDataBroker(), LogicalDatastoreType.OPERATIONAL, + PTPINSTANCES_IID); + } + + /*--------------------------------------------------------------- + * Equipment related functions + */ + + + @Override + public InventoryInformation getInventoryInformation() { + return this.getInventoryInformation(null); + } + + + @Override + public @Nonnull InventoryInformation getInventoryInformation(String layerProtocolFilter) { + LOG.debug("request inventory information. filter:" + layerProtocolFilter); + return this.equipment.getInventoryInformation(getFilteredInterfaceUuidsAsStringList(layerProtocolFilter)); + } + + /*--------------------------------------------------------------- + * Other + */ + + @Override + protected List<String> getFilteredInterfaceUuidsAsStringList(String layerProtocolFilter) { + List<String> uuids = new ArrayList<>(); + + LOG.debug("request inventory information. filter:" + layerProtocolFilter); + if (optionalNe != null) { + // uuids + for (Lp lp : this.interfaceList) { + if (layerProtocolFilter == null || layerProtocolFilter.isEmpty()) { + uuids.add(lp.getUuid().getValue()); + } else if (lp.getLayerProtocolName() != null && lp.getLayerProtocolName().getValue() != null + && lp.getLayerProtocolName().getValue().equals(layerProtocolFilter)) { + uuids.add(lp.getUuid().getValue()); + } + } + } + LOG.debug("uuids found: {}", uuids); + return uuids; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12Equipment.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12Equipment.java new file mode 100644 index 000000000..205afc0d3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElement12Equipment.java @@ -0,0 +1,293 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InventoryInformation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ValueNameList; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.GenericTransactionUtils; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc.OnfInterfacePac; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc.WrapperEquipmentPacRev170402; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.ExtendedEquipment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.Equipment; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.EquipmentKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.NetworkElement; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.equipment.g.ContainedHolder; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.manufactured.thing.g.EquipmentType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.manufactured.thing.g.ManufacturerProperties; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Contains equipment related information of ONFCore Network Element + */ +public class ONFCoreNetworkElement12Equipment { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElement12Equipment.class); + + private static final UniversalId EQUIPMENTROOT = new UniversalId("network-element"); + private static final int EQUIPMENTROOTLEVEL = 0; + + private final ONFCOreNetworkElementCoreData coreData; + private final OnfInterfacePac equipmentPac; + + private final ValueNameList extensionList; + private final List<UniversalId> topLevelEqUuidList; + private final List<ProblemNotificationXml> globalProblemList; + private final List<ExtendedEquipment> globalEquipmentList; + + public ONFCoreNetworkElement12Equipment(ONFCOreNetworkElementCoreData coreData, Capabilities capabilities) { + LOG.debug("Initialize " + ONFCoreNetworkElement12Equipment.class.getName()); + this.coreData = coreData; + if (capabilities.isSupportingNamespaceAndRevision(WrapperEquipmentPacRev170402.QNAME)) { + this.equipmentPac = new WrapperEquipmentPacRev170402(coreData); + LOG.debug("Equipement pac supported {}", WrapperEquipmentPacRev170402.QNAME); + } else { + this.equipmentPac = null; + LOG.debug("Equipement pac not supported {}", WrapperEquipmentPacRev170402.QNAME); + } + + extensionList = new ValueNameList(); + topLevelEqUuidList = new ArrayList<>(); + globalProblemList = new ArrayList<>(); + globalEquipmentList = new ArrayList<>(); + + initClassVars(); + } + + public void addProblemsofNode(List<ProblemNotificationXml> resultList) { + resultList.addAll(globalProblemList); + } + + public List<ProblemNotificationXml> addProblemsofNodeObject(String uuidString) { + List<ProblemNotificationXml> res = new ArrayList<>(); + + if (this.equipmentPac != null) { + this.equipmentPac.readTheFaults(new UniversalId(uuidString), res); + } + return res; + } + + public @Nonnull InventoryInformation getInventoryInformation(List<String> uuids) { + return getInventoryInformation(this.extensionList, uuids); + } + + protected void readNetworkElementEquipment() { + doSyncNetworkElementEquipmentToClassVars(); + } + + public String getMountpoint() { + return coreData.getMountpoint(); + } + + public OnfInterfacePac getEquipmentPac() { + return equipmentPac; + } + + public List<UniversalId> getTopLevelEqUuidList() { + return topLevelEqUuidList; + } + + public List<ExtendedEquipment> getEquipmentList() { + return globalEquipmentList; + } + + public List<Equipment> getEquipmentAll() { + List<Equipment> equipmentListAll = new ArrayList<>(); + + Equipment equipment = readEquipmentAll(); + equipmentListAll.add(equipment); + + return equipmentListAll; + } + + + /* + * --------------------------------------------------------------------------------- private + * functions + */ + + private void initClassVars() { + this.globalProblemList.clear(); + this.globalEquipmentList.clear(); + this.extensionList.clear(); + this.topLevelEqUuidList.clear(); + } + + private void doSyncNetworkElementEquipmentToClassVars() { + + NetworkElement optionalNe = coreData.getOptionalNetworkElement(); + initClassVars(); + + if (optionalNe != null) { + // extract Inventory + extensionList.put(optionalNe.getExtension()); + + if (!extensionList.isEmpty()) { + + /* + * Loop through network element extension to get "top-level-equipment" <extension> + * <value-name>top-level-equipment</value-name> <value>1.0.BKP,1.0.WCS</value> </extension> "ipv4" + * address + */ + extensionList.getAsUniversalIdList("top-level-equipment", topLevelEqUuidList); + + // If top-level-equipment exists get further information + if (topLevelEqUuidList.isEmpty()) { + LOG.debug("no top level equipment found"); + } else { + // Read equipment and problems + for (UniversalId uuid : topLevelEqUuidList) { + recurseReadEquipmentProblems(uuid, EQUIPMENTROOT, EQUIPMENTROOTLEVEL, globalProblemList, + globalEquipmentList); + } + } + } else { + LOG.debug("extension list is null"); + } + } + } + + private void recurseReadEquipmentProblems(UniversalId uuid, UniversalId parentUuid, int treeLevel, + List<ProblemNotificationXml> problemList, List<ExtendedEquipment> equipmentList) { + + if (uuid != null) { + + Equipment equipment = this.readEquipment(uuid); + + if (equipment != null) { + equipmentList.add(new ExtendedEquipment(parentUuid.getValue(), equipment, treeLevel)); + + if (this.equipmentPac != null) { + this.equipmentPac.readTheFaults(uuid, problemList); + + List<ContainedHolder> containedHolderListe = equipment.getContainedHolder(); + if (containedHolderListe != null) { + for (ContainedHolder containedHolder : containedHolderListe) { + recurseReadEquipmentProblems(containedHolder.getOccupyingFru(), uuid, treeLevel + 1, + problemList, equipmentList); + } + } + } + } + } + } + + private @Nonnull InventoryInformation getInventoryInformation(ValueNameList extensions, List<String> uuids) { + + InventoryInformation inventoryInformation = new InventoryInformation(); + + // uuids + inventoryInformation.setInterfaceUuidList(uuids); + + if (!extensions.isEmpty()) { + + inventoryInformation.setDeviceIpv4(extensions.getOrNull("neIpAddress")); + + // If top-level-equipment exists get further information + if (topLevelEqUuidList.isEmpty()) { + LOG.debug("no top level equipment found"); + } else { + // + if (!globalEquipmentList.isEmpty()) { + Equipment e = globalEquipmentList.get(0).getEquipment(); + if (e.getManufacturedThing() != null) { + EquipmentType et; + if ((et = e.getManufacturedThing().getEquipmentType()) != null) { + inventoryInformation.setType(et.getTypeName()); + inventoryInformation.setModel(et.getModelIdentifier()); + } + ManufacturerProperties em; + if ((em = e.getManufacturedThing().getManufacturerProperties()) != null) { + inventoryInformation.setVendor(em.getManufacturerIdentifier()); + } + } + } + } + } else { + LOG.debug("extension list is null"); + } + + LOG.debug("Inventory: {}", inventoryInformation); + return inventoryInformation; + + } + + + /** + * Read equipment information + * + * @param interfacePacUuid uuid as key for Equipment. + * @return Equipment or null + */ + private @Nullable Equipment readEquipment(UniversalId interfacePacUuid) { + + final Class<?> clazzPac = Equipment.class; + + LOG.info("DBRead Get equipment for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<Equipment> equipmentIID = + InstanceIdentifier.builder(Equipment.class, new EquipmentKey(interfacePacUuid)).build(); + + Equipment res = GenericTransactionUtils.readData(coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, + equipmentIID); + + return res; + } + + /** + * Read equipment information + * + * @param interfacePacUuid uuid as key for Equipment. + * @return Equipment or null + */ + private @Nullable Equipment readEquipmentAll() { + + final Class<?> clazzPac = Equipment.class; + + LOG.info("DBRead Get all equipment for class {} from mountpoint {}", clazzPac.getSimpleName(), + coreData.getMountpoint()); + + InstanceIdentifier<Equipment> equipmentIID = InstanceIdentifier.builder(Equipment.class).build(); + + Equipment res = GenericTransactionUtils.readData(coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, + equipmentIID); + + return res; + } + + /** + * specific toString() + */ + @Override + public String toString() { + return "ONFCoreNetworkElement12Equipment [coreData=" + coreData + ", equipmentPac=" + equipmentPac + + ", extensions=" + extensionList + ", topLevelEqUuidList=" + topLevelEqUuidList + ", problemList=" + + globalProblemList + ", equipmentList=" + globalEquipmentList + "]"; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementBase.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementBase.java new file mode 100644 index 000000000..e49ff6591 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementBase.java @@ -0,0 +1,127 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import java.util.List; +import javax.annotation.Nonnull; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InventoryInformation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.Capabilities; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author herbert + * + */ +public abstract class ONFCoreNetworkElementBase implements AutoCloseable, ONFCoreNetworkElementRepresentation { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElementBase.class); + + protected static final String EMPTY = ""; + + private final String mountPointNodeName; + private final DataBroker netconfNodeDataBroker; + private final Capabilities capabilities; + private final boolean isNetworkElementCurrentProblemsSupporting10; + + private @Nonnull InventoryInformation inventoryInformation = new InventoryInformation(); + + + protected ONFCoreNetworkElementBase(String mountPointNodeName, DataBroker netconfNodeDataBroker, + Capabilities capabilities) { + LOG.info("Create ONFCoreNetworkElementBase"); + this.mountPointNodeName = mountPointNodeName; + this.netconfNodeDataBroker = netconfNodeDataBroker; + this.capabilities = capabilities; + + this.isNetworkElementCurrentProblemsSupporting10 = false; + + } + + @Override + public String getMountPointNodeName() { + return mountPointNodeName; + } + + /** + * @return the netconfNodeDataBroker + */ + public DataBroker getNetconfNodeDataBroker() { + return netconfNodeDataBroker; + } + + /** + * @return the capabilities + */ + public Capabilities getCapabilities() { + return capabilities; + } + + /** + * @return the isNetworkElementCurrentProblemsSupporting10 + */ + public boolean isNetworkElementCurrentProblemsSupporting10() { + return isNetworkElementCurrentProblemsSupporting10; + } + + public void setInventoryInformation(InventoryInformation newInventoryInformation) { + this.inventoryInformation = newInventoryInformation; + } + + @Override + public InventoryInformation getInventoryInformation() { + return getInventoryInformation(null); + } + + @Override + public InventoryInformation getInventoryInformation(String layerProtocolFilter) { + InventoryInformation res = new InventoryInformation(inventoryInformation); + res.setInterfaceUuidList(getFilteredInterfaceUuidsAsStringList(layerProtocolFilter)); + + return res; + } + + @Override + public void close() throws Exception {} + + /*--------------------------------------------------------------- + * Getter/ Setter + */ + + public String getMountpoint() { + return mountPointNodeName; + } + + public DataBroker getDataBroker() { + return netconfNodeDataBroker; + } + + /*----------------------------------------------------------------------------- + * Sychronization + */ + + @Override + public void initSynchronizationExtension() {} + + protected @Nonnull abstract List<String> getFilteredInterfaceUuidsAsStringList(String layerProtocolFilter); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementCallback.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementCallback.java new file mode 100644 index 000000000..e681ee0a0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementCallback.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; + +public interface ONFCoreNetworkElementCallback { + + public void notificationFromNeListener(AttributeValueChangedNotificationXml notificationXml); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementFactory.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementFactory.java new file mode 100644 index 000000000..3fc8b133f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementFactory.java @@ -0,0 +1,87 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import com.google.common.base.Optional; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.Capabilities; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter.NotificationDelayService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.ProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceService; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Create a Network Element representation according to the capability + * information. The capabilities are more than an ODL-QName. After the ? other + * terms than "revision" are provided. + * + */ +public class ONFCoreNetworkElementFactory { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElementFactory.class); + + @SuppressWarnings("deprecation") + public static @Nonnull ONFCoreNetworkElementRepresentation create(String mountPointNodeName, DataBroker dataBroker, + WebSocketServiceClient webSocketService, HtDatabaseEventsService databaseService, + InstanceIdentifier<Node> instanceIdentifier, DataBroker mountpointDataBroker, ProviderClient dcaeProvider, + @Nullable ProviderClient aotsmClient, MaintenanceService maintenanceService, + NotificationDelayService<ProblemNotificationXml> notificationDelayService) { + + ONFCoreNetworkElementRepresentation res = null; + try (ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction();){ + Optional<Node> nodeOption = tx.read(LogicalDatastoreType.OPERATIONAL, instanceIdentifier).checkedGet(); + if (nodeOption.isPresent()) { + Node node = nodeOption.get(); + NetconfNode nnode = node.augmentation(NetconfNode.class); + if (nnode != null) { + ConnectionStatus csts = nnode.getConnectionStatus(); + if (csts == ConnectionStatus.Connected) { + Capabilities capabilities = new Capabilities(nnode); + LOG.info("Mountpoint {} capabilities {}", mountPointNodeName, capabilities); + res = ONFCoreNetworkElement12.build(mountPointNodeName, capabilities, mountpointDataBroker, + webSocketService, databaseService, dcaeProvider, aotsmClient, maintenanceService, + notificationDelayService); + LOG.info("ONFCoreNetworkElementRepresentation12 value is not null? " + (res != null)); + } + } + } + tx.close(); + } catch (ReadFailedException | IllegalArgumentException e) { + LOG.warn("Can not generate specific NE Version representation. ", e); + } + if (res == null) { + res = new ONFCoreEmpty(mountPointNodeName); + } + LOG.info("Mointpoint {} started as {}", mountPointNodeName, res.getClass().getSimpleName()); + return res; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementRepresentation.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementRepresentation.java new file mode 100644 index 000000000..c4fc9d01f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/ONFCoreNetworkElementRepresentation.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InventoryInformation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.AllPm; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl.DeviceMonitoredNe; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; + +public interface ONFCoreNetworkElementRepresentation extends DeviceMonitoredNe { + + /** + * Read during startup all relevant structure and status parameters from device. + * Remove all currentAlarms, read structure from networkElement with all interfacePacs, read current alarm status + */ + public void initialReadFromNetworkElement(); + + public String getMountPointNodeName(); + + public void resetPMIterator(); + + public boolean hasNext(); + + public void next(); + + public AllPm getHistoricalPM(); + + public String pmStatusToString(); + + public int removeAllCurrentProblemsOfNode(); + + public void doRegisterMicrowaveEventListener(MountPoint mountPoint); + + public void initSynchronizationExtension(); + + public InventoryInformation getInventoryInformation(); + + public InventoryInformation getInventoryInformation(String layerProtocolFilter); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/AllPm.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/AllPm.java new file mode 100644 index 000000000..196493cde --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/AllPm.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container; + +import java.util.ArrayList; +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types.EsHistoricalPerformance15Minutes; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types.EsHistoricalPerformance24Hours; + +public class AllPm { + + private final static AllPm EMPTY = new AllPm(); + + private final List<EsHistoricalPerformance15Minutes> pm15 = new ArrayList<>(); + private final List<EsHistoricalPerformance24Hours> pm24 = new ArrayList<>(); + + public void add(EsHistoricalPerformance15Minutes pm) { + pm15.add(pm); + } + + public void add(EsHistoricalPerformance24Hours pm) { + pm24.add(pm); + } + + public List<EsHistoricalPerformance15Minutes> getPm15() { + return pm15; + } + + public List<EsHistoricalPerformance24Hours> getPm24() { + return pm24; + } + + public Object size() { + return pm15.size()+pm24.size(); + } + + public static AllPm getEmpty() { + return EMPTY; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/Capabilities.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/Capabilities.java new file mode 100644 index 000000000..008a8fae7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/Capabilities.java @@ -0,0 +1,173 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + * Convert capabilities of netconfnode into internal format. Boron and Carbon are providing + * different versions + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yangtools.yang.common.QName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Capabilities { + + private static final Logger LOG = LoggerFactory.getLogger(Capabilities.class); + private static final String INTERFACE_AVAILABLECAPABILITY = + "org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability"; + + private final List<String> capabilities = new ArrayList<>(); + private final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + public Capabilities() { + + } + + public Capabilities(NetconfNode nnode) { + LOG.info("Create Capabilities constructor"); + + if (nnode != null) { + constructor(nnode.getAvailableCapabilities().getAvailableCapability()); + } + } + + /** + * Does all construction steps + * + * @param pcapabilities with a list of capabilities. <br> + * Type could be <br> + * - Boron: List<code><String></code> <br> + * - Carbon: List<AvailableCapability> + */ + private void constructor(List<?> pcapabilities) { + for (Object capability : pcapabilities) { + if (LOG.isTraceEnabled()) { + LOG.trace("capability class: {} Interfaces: {}", capability.getClass().getName(), + Arrays.toString(capability.getClass().getInterfaces())); + } + if (capability instanceof String) { // ODL Boron specific + this.capabilities.add((String) capability); + } else if (hasInterface(capability, INTERFACE_AVAILABLECAPABILITY)) { // Carbon specific part .. handled via + // generic + try { + Method method = capability.getClass().getDeclaredMethod("getCapability"); + this.capabilities.add(method.invoke(capability).toString()); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { + LOG.warn("Unknown capability class leads to a problem", e); + } + } else { + LOG.warn("Unknown capability class: {}", capability.getClass(), + Arrays.toString(capability.getClass().getInterfaces())); + } + } + } + + /** + * check if namespace is supported by given capabilites + * + * @param theCapability Capability to search + * @return true if available + */ + @Deprecated + public boolean isSupportingNamespace(QName theCapability) { + String theNameSpace = theCapability.getNamespace().toString(); + for (String capability : capabilities) { + if (capability.contains(theNameSpace)) { + LOG.trace("Check {} against {}", capability, theNameSpace); + return true; + } + } + return false; + } + + /** + * check if the namespace and its revision are supported by the given capabilities + * + * @param qCapability capability from the model + * @return true if supporting the model + */ + public boolean isSupportingNamespaceAndRevision(QName qCapability) { + String namespace = qCapability.getNamespace().toString(); + String revision; + Object revisionObject = qCapability.getRevision(); + if (revisionObject instanceof Optional) { + if (((Optional<?>) revisionObject).isPresent()) { + revisionObject = ((Optional<?>) revisionObject).get(); + LOG.info("Unwrapp Optional: {}", revisionObject.getClass()); + } + } + if (revisionObject instanceof String) { + revision = (String) revisionObject; + } else if (revisionObject instanceof Date) { + revision = formatter.format((Date) revisionObject); + } else { + revision = revisionObject.toString(); + LOG.warn("Revision number type not supported. Class:{} String:{}", revisionObject.getClass().getName(), + revisionObject); + } + for (String capability : capabilities) { + if (capability.contains(namespace) && capability.contains(revision)) { + LOG.trace("Model namespace {}?[revision {}]", namespace, revision); + return true; + } + } + return false; + } + + + public void add(String qname) { + capabilities.add(qname); + } + + @Override + public String toString() { + return "Capabilities [capabilities=" + capabilities + "]"; + } + + /** + * Check if object is proxy and has specific interface + * + * @param object Name of the object to verify + * @param interfaceName is the name of the interface + * @return boolean accordingly + */ + static boolean hasInterface(Object object, String interfaceName) { + if (object instanceof Proxy) { + Class<?>[] interfaces = object.getClass().getInterfaces(); + for (Class<?> i : interfaces) { + if (i.getName().equals(interfaceName)) { + return true; + } + } + } + return false; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType12.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType12.java new file mode 100644 index 000000000..470ddab80 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType12.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.LinkIdentifyingObject; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.ObjectIdentifier; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceConfigurationG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +public class ExtendedAirInterfaceHistoricalPerformanceType12 implements OtnHistoryDataG, LinkIdentifyingObject { + + private final AirInterfaceHistoricalPerformanceTypeG airInterfaceHistoricalPerformanceType; + private final AirInterfaceConfigurationG airInterfaceConfiguration; + + public ExtendedAirInterfaceHistoricalPerformanceType12(AirInterfaceHistoricalPerformanceTypeG data, AirInterfaceConfigurationG conf) { + this.airInterfaceHistoricalPerformanceType = data; + this.airInterfaceConfiguration = conf; + } + + + public AirInterfaceHistoricalPerformanceTypeG getAirInterfaceHistoricalPerformanceType() { + return airInterfaceHistoricalPerformanceType; + } + + + public AirInterfaceConfigurationG getAirInterfaceConfiguration() { + return airInterfaceConfiguration; + } + + + @Override + public Class<? extends DataContainer> getImplementedInterface() { + return airInterfaceHistoricalPerformanceType.getImplementedInterface(); + } + + @Override + public String getHistoryDataId() { + return airInterfaceHistoricalPerformanceType.getHistoryDataId(); + } + + @Override + public DateAndTime getPeriodEndTime() { + return airInterfaceHistoricalPerformanceType.getPeriodEndTime(); + } + + + @Override + public GranularityPeriodType getGranularityPeriod() { + return airInterfaceHistoricalPerformanceType.getGranularityPeriod(); + } + + + @Override + public ObjectIdentifier getObjectClass() { + return airInterfaceHistoricalPerformanceType.getObjectClass(); + } + + + @Override + public ObjectIdentifier getNameBinding() { + return airInterfaceHistoricalPerformanceType.getNameBinding(); + } + + @Override + public Boolean isSuspectIntervalFlag() { + return airInterfaceHistoricalPerformanceType.isSuspectIntervalFlag(); + } + + @Override + public String getSignalId() { + return airInterfaceConfiguration.getRadioSignalId(); + } + + + @Override + public String toString() { + return "ExtendedAirInterfaceHistoricalPerformanceType [airInterfaceHistoricalPerformanceType=" + + airInterfaceHistoricalPerformanceType + ", airInterfaceConfiguration=" + airInterfaceConfiguration + + "]"; + } + + + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType1211.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType1211.java new file mode 100644 index 000000000..115e20e17 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType1211.java @@ -0,0 +1,106 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.LinkIdentifyingObject; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.ObjectIdentifier; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AirInterfaceConfigurationG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +public class ExtendedAirInterfaceHistoricalPerformanceType1211 implements OtnHistoryDataG, LinkIdentifyingObject { + + private final AirInterfaceHistoricalPerformanceTypeG airInterfaceHistoricalPerformanceType; + private final AirInterfaceConfigurationG airInterfaceConfiguration; + + public ExtendedAirInterfaceHistoricalPerformanceType1211(AirInterfaceHistoricalPerformanceTypeG data, AirInterfaceConfigurationG conf) { + this.airInterfaceHistoricalPerformanceType = data; + this.airInterfaceConfiguration = conf; + } + + + public AirInterfaceHistoricalPerformanceTypeG getAirInterfaceHistoricalPerformanceType() { + return airInterfaceHistoricalPerformanceType; + } + + + public AirInterfaceConfigurationG getAirInterfaceConfiguration() { + return airInterfaceConfiguration; + } + + + @Override + public Class<? extends DataContainer> getImplementedInterface() { + return airInterfaceHistoricalPerformanceType.getImplementedInterface(); + } + + @Override + public String getHistoryDataId() { + return airInterfaceHistoricalPerformanceType.getHistoryDataId(); + } + + @Override + public DateAndTime getPeriodEndTime() { + return airInterfaceHistoricalPerformanceType.getPeriodEndTime(); + } + + + @Override + public GranularityPeriodType getGranularityPeriod() { + return airInterfaceHistoricalPerformanceType.getGranularityPeriod(); + } + + + @Override + public ObjectIdentifier getObjectClass() { + return airInterfaceHistoricalPerformanceType.getObjectClass(); + } + + + @Override + public ObjectIdentifier getNameBinding() { + return airInterfaceHistoricalPerformanceType.getNameBinding(); + } + + @Override + public Boolean isSuspectIntervalFlag() { + return airInterfaceHistoricalPerformanceType.isSuspectIntervalFlag(); + } + + @SuppressWarnings("deprecation") + @Override + public String getSignalId() { + return airInterfaceConfiguration.getRadioSignalId(); + } + + + @Override + public String toString() { + return "ExtendedAirInterfaceHistoricalPerformanceType [airInterfaceHistoricalPerformanceType=" + + airInterfaceHistoricalPerformanceType + ", airInterfaceConfiguration=" + airInterfaceConfiguration + + "]"; + } + + + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType1211p.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType1211p.java new file mode 100644 index 000000000..abac75fed --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ExtendedAirInterfaceHistoricalPerformanceType1211p.java @@ -0,0 +1,106 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.LinkIdentifyingObject; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.ObjectIdentifier; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AirInterfaceConfigurationG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +public class ExtendedAirInterfaceHistoricalPerformanceType1211p implements OtnHistoryDataG, LinkIdentifyingObject { + + private final AirInterfaceHistoricalPerformanceTypeG airInterfaceHistoricalPerformanceType; + private final AirInterfaceConfigurationG airInterfaceConfiguration; + + public ExtendedAirInterfaceHistoricalPerformanceType1211p(AirInterfaceHistoricalPerformanceTypeG data, AirInterfaceConfigurationG conf) { + this.airInterfaceHistoricalPerformanceType = data; + this.airInterfaceConfiguration = conf; + } + + + public AirInterfaceHistoricalPerformanceTypeG getAirInterfaceHistoricalPerformanceType() { + return airInterfaceHistoricalPerformanceType; + } + + + public AirInterfaceConfigurationG getAirInterfaceConfiguration() { + return airInterfaceConfiguration; + } + + + @Override + public Class<? extends DataContainer> getImplementedInterface() { + return airInterfaceHistoricalPerformanceType.getImplementedInterface(); + } + + @Override + public String getHistoryDataId() { + return airInterfaceHistoricalPerformanceType.getHistoryDataId(); + } + + @Override + public DateAndTime getPeriodEndTime() { + return airInterfaceHistoricalPerformanceType.getPeriodEndTime(); + } + + + @Override + public GranularityPeriodType getGranularityPeriod() { + return airInterfaceHistoricalPerformanceType.getGranularityPeriod(); + } + + + @Override + public ObjectIdentifier getObjectClass() { + return airInterfaceHistoricalPerformanceType.getObjectClass(); + } + + + @Override + public ObjectIdentifier getNameBinding() { + return airInterfaceHistoricalPerformanceType.getNameBinding(); + } + + @Override + public Boolean isSuspectIntervalFlag() { + return airInterfaceHistoricalPerformanceType.isSuspectIntervalFlag(); + } + + @SuppressWarnings("deprecation") + @Override + public String getSignalId() { + return airInterfaceConfiguration.getRadioSignalId(); + } + + + @Override + public String toString() { + return "ExtendedAirInterfaceHistoricalPerformanceType [airInterfaceHistoricalPerformanceType=" + + airInterfaceHistoricalPerformanceType + ", airInterfaceConfiguration=" + airInterfaceConfiguration + + "]"; + } + + + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ONFLayerProtocolName.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ONFLayerProtocolName.java new file mode 100644 index 000000000..ece7e7aa1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ONFLayerProtocolName.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public enum ONFLayerProtocolName { + + MWAirInterface("MWPS"), //V1.0 + V1.2 + EthernetContainer10("ETH-CTP"), //V1.0 + EthernetContainer12("ETC"), //V1.2 + V1.2.1.1 + EthernetPhysical("ETY"), //V1.2 + TDMContainer("TDM"), //V1.2 + Structure("MWS"), //V1.0 + V1.2 + Ethernet("ETH"), //V1.2 + Unknown(""); + + private static final Logger LOG = LoggerFactory.getLogger(ONFLayerProtocolName.class); + + private final String myLayerProtocolName; + + ONFLayerProtocolName( String myLayerProtocolName ) { + this.myLayerProtocolName = myLayerProtocolName; + } + + public boolean is( org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.LayerProtocolName onfName ) { + return myLayerProtocolName.equals(onfName.getValue()); + } + + public static ONFLayerProtocolName valueOf( org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.LayerProtocolName onfName ) { + for (ONFLayerProtocolName protocol : ONFLayerProtocolName.values()) { + if (protocol.is(onfName)) { + return protocol; + } + } + LOG.info("Can not map {}. Use Unknown",onfName.getValue() ); + return Unknown; + } + +} + diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ValueNameList.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ValueNameList.java new file mode 100644 index 000000000..1e0156c20 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/container/ValueNameList.java @@ -0,0 +1,84 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container; + +import java.util.HashMap; +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.extension.g.Extension; + +/** + * ValueNameList is an access Wrapper to NETCONF Extension lists + * Class is a specialized HashMap. + */ +public class ValueNameList extends HashMap<String, String> { + + private static final long serialVersionUID = 1L; + + /** + * Create ValueNameList for NETCONF extensions + * @param extensionList Parameters as received from device. Could be null. + */ + public void put(@Nullable List<Extension> extensionList) { + + if (extensionList != null) { + String name; + String value; + + for (Extension e : extensionList) { + name = e.getValueName(); + value = e.getValue(); + if (name != null && value != null) { + put(name, value); + } + } + } + } + + /** + * Return value or null + * @param name key for element + * @return value if key exists; if not nul + */ + public String getOrNull(String name) { + return containsKey(name) ? get(name) : null; + } + + /** + * Get element as id list + * @param name key of element + * @param topLevelEqUuidList as input to add elements + * @return List<UniversalId> + */ + public @Nonnull List<UniversalId> getAsUniversalIdList(String name, List<UniversalId> topLevelEqUuidList) { + if (containsKey(name)) { + String[] result = get(name).split(",\\s*"); + if (result.length > 0) { + for (String e : result) { + topLevelEqUuidList.add(new UniversalId(e)); + } + } + } + return topLevelEqUuidList; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/GenericTransactionUtils.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/GenericTransactionUtils.java new file mode 100644 index 000000000..83063a05a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/GenericTransactionUtils.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util; + +import java.util.NoSuchElementException; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import javax.annotation.Nullable; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.CheckedFuture; + +@SuppressWarnings("deprecation") +public final class GenericTransactionUtils { + static final Logger LOG = LoggerFactory.getLogger(GenericTransactionUtils.class); + + public static <T extends DataObject> boolean writeData(DataBroker dataBroker, + LogicalDatastoreType logicalDatastoreType, InstanceIdentifier<T> iid, T dataObject, boolean isAdd) { + Preconditions.checkNotNull(dataBroker); + WriteTransaction modification = dataBroker.newWriteOnlyTransaction(); + if (isAdd) { + if (dataObject == null) { + LOG.warn("Invalid attempt to add a non-existent object to path {}", iid); + return false; + } + modification.merge(logicalDatastoreType, iid, dataObject, true /* createMissingParents */); + } else { + modification.delete(LogicalDatastoreType.CONFIGURATION, iid); + } + CheckedFuture<Void, TransactionCommitFailedException> commitFuture = modification.submit(); + try { + commitFuture.checkedGet(); + LOG.debug("Transaction success for {} of object {}", isAdd ? "add" : "delete", dataObject); + return true; + } catch (Exception e) { + LOG.warn("Transaction failed with error {} for {} of object {}", e.getMessage(), isAdd ? "add" : "delete", + dataObject); + modification.cancel(); + return false; + } + } + + /** + * Deliver the data back or null. Warning + * + * @param <T> SubType of the DataObject to be handled + * @param dataBroker for accessing data + * @param dataStoreType to address datastore + * @param iid id to access data + * @return null or object + */ + @Nullable + public static <T extends DataObject> T readData(DataBroker dataBroker, LogicalDatastoreType dataStoreType, + InstanceIdentifier<T> iid) { + + AtomicBoolean noErrorIndication = new AtomicBoolean(); + AtomicReference<String> statusText = new AtomicReference<>(); + + T obj = readDataOptionalWithStatus(dataBroker, dataStoreType, iid, noErrorIndication, statusText); + + if (!noErrorIndication.get()) { + LOG.warn("Read transaction for identifier " + iid + " failed with status " + statusText.get()); + } + + return obj; + } + + /** + * Deliver the data back or null + * + * @param <T> SubType of the DataObject to be handled + * @param dataBroker for accessing data + * @param dataStoreType to address datastore + * @param iid id to access data + * @param noErrorIndication (Output) true if data could be read and are available and is not null + * @param statusIndicator (Output) String with status indications during the read. + * @return null or object + */ + @Nullable + public static <T extends DataObject> T readDataOptionalWithStatus(DataBroker dataBroker, + LogicalDatastoreType dataStoreType, InstanceIdentifier<T> iid, AtomicBoolean noErrorIndication, + AtomicReference<String> statusIndicator) { + + T data = null; + noErrorIndication.set(false); + + statusIndicator.set("Preconditions"); + Preconditions.checkNotNull(dataBroker); + + int retry = 0; + int retryDelayMilliseconds = 2000; + int maxRetries = 5; // 0 no Retry + + do { + if (retry > 0) { + try { + LOG.debug("Sleep {}ms", retryDelayMilliseconds); + Thread.sleep(retryDelayMilliseconds); + } catch (InterruptedException e) { + LOG.debug("Sleep interrupted", e); + Thread.currentThread().interrupt(); + } + } + + LOG.debug("Sending message with retry {} ", retry); + statusIndicator.set("Create Read Transaction"); + + try (ReadOnlyTransaction readTransaction = dataBroker.newReadOnlyTransaction();) { + CheckedFuture<Optional<T>, ReadFailedException> od = readTransaction.read(dataStoreType, iid); + statusIndicator.set("Read done"); + if (od != null) { + statusIndicator.set("Unwrap checkFuture done"); + Optional<T> optionalData = od.get(); + if (optionalData != null) { + statusIndicator.set("Unwrap optional done"); + data = optionalData.orNull(); + statusIndicator.set("Read transaction done"); + noErrorIndication.set(true); + } + } + + readTransaction.close(); + } catch (CancellationException | ExecutionException | InterruptedException | NoSuchElementException e) { + statusIndicator.set(ExceptionUtils.getStackTrace(e)); + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + } + + } while (noErrorIndication.get() == false && retry++ < maxRetries); + + return data; + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/LinkIdentifyingObject.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/LinkIdentifyingObject.java new file mode 100644 index 000000000..7c4f7e102 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/LinkIdentifyingObject.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util; + +public interface LinkIdentifyingObject { + + public String getSignalId(); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/NetconfTimeStamp.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/NetconfTimeStamp.java new file mode 100644 index 000000000..a9e451a39 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/util/NetconfTimeStamp.java @@ -0,0 +1,255 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Function is handling the NETCONF and the format used by database and restconf communication. + * + * Input supported for the formats used in NETCONF messages: + * + * Format1 ISO 8601 2017-01-18T11:44:49.482-05:00 + * + * Format2 NETCONF - pattern from ietf-yang-types "2013-07-15" Pattern: + * "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-](\d{2}):(\d{2}))" + * + * Format3 NETCONF DateAndTime CoreModel-CoreFoundationModule-TypeDefinitions vom + * 2016-07-01 Example1: 20170118114449.1Z Example2: 20170118114449.1-0500 Pattern: + * "\d{4}\d{2}\d{2}\d{2}\d{2}\d{2}.\d+?(Z|[\+\-](\d{2})(\d{2}))" typedef DateAndTime { description + * "This primitive type defines the date and time according to the following structure: + * 'yyyyMMddhhmmss.s[Z|{+|-}HHMm]' where: yyyy '0000'..'9999' year MM '01'..'12' month dd '01'..'31' + * day hh '00'..'23' hour mm '00'..'59' minute ss '00'..'59' second s '.0'..'.9' tenth of second + * (set to '.0' if EMS or NE cannot support this granularity) Z 'Z' indicates UTC (rather than local + * time) {+|-} '+' or '-' delta from UTC HH '00'..'23' time zone difference in hours Mm '00'..'59' + * time zone difference in minutes."; type string; } Format4 E/// specific Example1: + * 2017-01-23T13:32:38-05:00 Example2: 2017-01-23T13:32-05:00 + * + * Input formats netconfTime as String according the formats given above + * + * Return format is String in ISO8601 Format for database and presentation. + * + * Example formats: + * 1) ISO8601. Example 2017-01-18T11:44:49.482-05:00 + * 2) Microwave ONF. Examples 20170118114449.1Z, 20170118114449.1-0500 + * 3.1) Ericson. Example: 2017-01-23T13:32:38-05:00 + * 3.2) Ericson. Example: 2017-01-23T13:32-05:00 + * Always 10 Groups, + * 1:Year 2:Month 3:day 4:Hour 5:minute 6:optional sec 7:optional ms 8:optional Z or 9:offset + * signedhour 10:min + * + * Template: + * private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + */ + +public class NetconfTimeStamp { + private static final Logger LOG = LoggerFactory.getLogger(NetconfTimeStamp.class); + + private static final NetconfTimeStamp CONVERTER = new NetconfTimeStamp(); + + private final SimpleDateFormat dateFormatResult = init("yyyy-MM-dd'T'HH:mm:ss.S'Z'", TimeZone.getTimeZone("GMT")); + private final SimpleDateFormat dateFormatConvert = init("yyyy-MM-dd HH:mm:ss.S", TimeZone.getTimeZone("GMT")); + private static int MILLISECONDSDIGITS = 3; // Digits of milliseconds in dateFormatResult + private static String MILLISECONDZEROS = "000"; // String with zeros for milliseconds in dateFormatResult + private static final Pattern dateNetconfPatter = Pattern.compile( + "(\\d{4})-?(\\d{2})-?(\\d{2})T?(\\d{2}):?(\\d{2})(?:(?::?)(\\d{2}))?(?:.(\\d+))?(?:(Z)|([+-]\\d{2}):?(\\d{2}))"); + + /* + * ------------------------------------ Public function + */ + + /** + * Use static access + */ + private NetconfTimeStamp() { + } + + /** + * Use this function to get the converter + * @return global converter + */ + public static NetconfTimeStamp getConverter() { + return CONVERTER; + } + + /** + * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format + * + * @return String with Date in NETCONF/YANG Format Version 1.0. + */ + public String getTimeStampAsNetconfString() { + return getRightFormattedDate(new Date().getTime()); + } + + /** + * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format in GMT + * + * @return DateAndTime Type 1.0. Date in NETCONF/YANG Format Version 1.0. + */ + public DateAndTime getTimeStamp() { + return DateAndTime.getDefaultInstance(getTimeStampAsNetconfString()); + } + + + /** + * Return the String with a NETCONF time converted to long + * + * @param netconfTime as String according the formats given above + * @return Epoch milliseconds + * @throws IllegalArgumentException In case of no compliant time format definition for the string + * @throws ParseException Time parsing failed + */ + public long getTimeStampFromNetconfAsMilliseconds(String netconfTime) + throws IllegalArgumentException, ParseException { + Matcher m = dateNetconfPatter.matcher(netconfTime); + // According to spezified matches there have to be 10 parameter + if (m.matches() && m.groupCount() == 10) { + // Convert now + long utcMillis = dateFormatConvert.parse(getTimeAsNormalizedString(m, m.group(6), m.group(7))).getTime() + - getTimezoneOffsetMilliseconds(m.group(9), m.group(10)); + return utcMillis; + } else { + throw new IllegalArgumentException("No pattern for NETCONF data string: " + netconfTime); + } + } + + /** + * Deliver String result. + * + * @param netconfTime as String according the formats given above + * @return If successful: String in ISO8601 Format for database and presentation. If "wrong formed + * input" the Input string with the prefix "Mailformed date" is delivered back. + */ + public String getTimeStampFromNetconf(String netconfTime) { + Matcher m = dateNetconfPatter.matcher(netconfTime); + // According to spezified matches there have to be 10 parameter + if (m.matches() && m.groupCount() == 10) { + // Convert now + try { + long utcMillis = dateFormatConvert.parse(getTimeAsNormalizedString(m, m.group(6), m.group(7))).getTime() + - getTimezoneOffsetMilliseconds(m.group(9), m.group(10)); + return getRightFormattedDate(utcMillis); + } catch (ParseException e) { + LOG.info(e.getMessage()); + } catch (IllegalArgumentException e) { + LOG.info(e.getMessage()); + } + } + LOG.debug("No pattern for NETCONF data string: {}", netconfTime); + return "Malformed date: " + netconfTime; // Error handling + } + + /*------------------------------------------- + * Private and static functions + */ + /** + * Convert timeZone parameter in format [+-]/d/d:/d/d into milliseconds + * + * @param m Index 9 with "+/-" and hour string or null for UTZ, Index 10 with minutes + * @return long milliseconds of TimeZoneOffset + * @throws IllegalArgumentException If parameters are wrong + */ + private static long getTimezoneOffsetMilliseconds(String timeZoneHour, String timeZoneMinute) + throws IllegalArgumentException { + // -- Calculate timezone specific offset + long timeZoneOffsetMilliseconds = 0; + if (timeZoneHour != null) { + // Time zone offset in hours and minutes + int tzHour = 0; + int tzMinutes = 0; + tzHour = Integer.valueOf(timeZoneHour); + if (timeZoneMinute != null) { + tzMinutes = Integer.valueOf(timeZoneMinute); + } else { + throw new IllegalArgumentException("Problem in Netconf Time format timeZone minutes parameter."); + } + timeZoneOffsetMilliseconds = (tzHour * 60 + (tzHour > 0 ? tzMinutes : -tzMinutes)) * 60000L; + } + return timeZoneOffsetMilliseconds; + } + + /** + * Convert parameters to String with year .. minutes and optional Seconds and .. milliseconds + * + * @param m Matcher with parsed date + * @param secString Seconds as String or null + * @param msString Milliseconds as String or null + * @return Normalized time string + */ + private static String getTimeAsNormalizedString(Matcher m, String secString, String msString) { + // -- Create time as normalized string + StringBuffer sb = new StringBuffer(); + sb.append(m.group(1)); // year + sb.append('-'); + sb.append(m.group(2)); // Month + sb.append('-'); + sb.append(m.group(3)); // Day + sb.append(' '); + sb.append(m.group(4)); // Hour 0-23 + sb.append(':'); + sb.append(m.group(5)); // Minute + sb.append(':'); + sb.append(secString != null ? secString : "00"); // Seconds (optional) + sb.append('.'); + if (msString == null) { // Milliseconds optional + sb.append(MILLISECONDZEROS); + } else if (msString.length() <= MILLISECONDSDIGITS) { + sb.append(msString); // Millisecond + sb.append(MILLISECONDZEROS.substring(0, MILLISECONDSDIGITS - msString.length())); + } else { + sb.append(msString.substring(0, MILLISECONDSDIGITS)); // Only first Three + } + return sb.toString(); + } + + /** + * Deliver format in a way that milliseconds are correct. + * + * @param dateMillis Date as milliseconds in Java definition + * @return String + */ + private String getRightFormattedDate(long dateMillis) { + long tenthOfSeconds = dateMillis % 1000 / 100L; // Extract 100 milliseconds + long base = dateMillis / 1000L * 1000L; // Cut milliseconds to 000 + Date newDate = new Date(base + tenthOfSeconds); + return dateFormatResult.format(newDate); + } + + /** + * Static initialization + */ + private static SimpleDateFormat init(String format, TimeZone zone) { + if (zone == null) { + throw new ExceptionInInitializerError(); + } else { + SimpleDateFormat dateFormat; + dateFormat = new SimpleDateFormat(format); + dateFormat.setTimeZone(zone); + return dateFormat; + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfInterfacePac.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfInterfacePac.java new file mode 100644 index 000000000..e26d997a0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfInterfacePac.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc; + +import java.util.List; + +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; + +public interface OnfInterfacePac { + + /** + * Read problems of specific interfaces. TODO Goal for future implementation + * without usage of explicit new. Key is generated by newInstance() function + * here to verify this approach. + * + * @param interfacePacUuid Universal index of Interfacepac + * @param resultList List to add fault. If null new list is created. + * @return list of alarms + */ + public List<ProblemNotificationXml> readTheFaults(UniversalId interfacePacUuid, @Nullable List<ProblemNotificationXml> resultList); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfMicrowaveModel.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfMicrowaveModel.java new file mode 100644 index 000000000..637caa44b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfMicrowaveModel.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc; + +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCOreNetworkElementCoreData; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ONFLayerProtocolName; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yangtools.yang.binding.NotificationListener; +import org.opendaylight.yangtools.yang.common.QName; + +public interface OnfMicrowaveModel { + + public void setCoreData(ONFCOreNetworkElementCoreData coreData); + + public void readTheFaultsOfMicrowaveModel(ONFLayerProtocolName lpName, Class<?> lpClass, UniversalId uuid, + List<ProblemNotificationXml> resultList); + + public List<? extends OtnHistoryDataG> readTheHistoricalPerformanceData(ONFLayerProtocolName lpName, Lp lp); + + public Class<?> getClassForLtpExtension(QName qName); + + public <T extends NotificationListener> T getNotificationListener(); + + public void setOnfMicrowaveModelListener(OnfMicrowaveModelNotification microwaveModelListener); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfMicrowaveModelNotification.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfMicrowaveModelNotification.java new file mode 100644 index 000000000..2c7aead70 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/OnfMicrowaveModelNotification.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; + +/** + * Abstraction of YANG specified notifications + * Each method converts from internal specific class to model unspecific class + * @author herbert + * + */ +public interface OnfMicrowaveModelNotification { + + void onObjectCreationNotification(ObjectCreationNotificationXml notificationXml); + void onObjectDeletionNotification(ObjectDeletionNotificationXml notificationXml); + void onProblemNotification(ProblemNotificationXml notificationXml); + void onAttributeValueChangedNotification(AttributeValueChangedNotificationXml notificationXml); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperEquipmentPacRev170402.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperEquipmentPacRev170402.java new file mode 100644 index 000000000..03e830e5a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperEquipmentPacRev170402.java @@ -0,0 +1,127 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Nullable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCOreNetworkElementCoreData; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.GenericTransactionUtils; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.CurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.EquipmentPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.EquipmentPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.onf.core.model.conditional.packages.rev170402.equipment.pac.EquipmentCurrentProblems; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.QName; + +public class WrapperEquipmentPacRev170402 implements OnfInterfacePac { + + private static final Logger LOG = LoggerFactory.getLogger(WrapperEquipmentPacRev170402.class); + public static final QName QNAME = EquipmentPac.QNAME; + + ONFCOreNetworkElementCoreData coreData; + + public WrapperEquipmentPacRev170402(ONFCOreNetworkElementCoreData coreData) { + this.coreData = coreData; + } + + /** + * Read problems of specific interfaces. TODO Goal for future implementation without usage of + * explicit new. Key is generated by newInstance() function here to verify this approach. + * + * @param interfacePacUuid Universal index of onf interface-pac + * @param resultList list to add, or null for new list. + * @return list of alarms + */ + @Override + public List<ProblemNotificationXml> readTheFaults(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<EquipmentPac> clazzPac = EquipmentPac.class; + final Class<EquipmentPacKey> clazzPacKey = EquipmentPacKey.class; + final Class<EquipmentCurrentProblems> clazzProblems = EquipmentCurrentProblems.class; + // final Class<ContainerCurrentProblemTypeG> clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + try { + if (resultList == null) { + resultList = new ArrayList<>(); + } + // -- Specific part 1 + Constructor<EquipmentPacKey> cons = clazzPacKey.getConstructor(UniversalId.class); // Avoid new() + InstanceIdentifier<EquipmentCurrentProblems> interfaceIID = InstanceIdentifier + .builder(clazzPac, cons.newInstance(interfacePacUuid)).child(clazzProblems).build(); + + // -- Specific part 2 + EquipmentCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, interfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no {}", interfacePacUuid, clazzProblems, clazzProblems.getName()); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} no list {}", interfacePacUuid, clazzProblems.getName()); + } else { + // -- Specific part 3 + for (CurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), + InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + LOG.warn("Could not reade instance of MwTdmContainerPacKey: ", e); + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param interfacePacUuid Universal index of Equipmentpac + * @return EquipmentPac or null + */ + public @Nullable EquipmentPac readEquipmentPac(UniversalId interfacePacUuid) { + + final Class<?> clazzPac = EquipmentPac.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<EquipmentPac> equipmentIID = + InstanceIdentifier.builder(EquipmentPac.class, new EquipmentPacKey(interfacePacUuid)).build(); + + EquipmentPac res = GenericTransactionUtils.readData(coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, + equipmentIID); + + return res; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev170324.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev170324.java new file mode 100644 index 000000000..b62940109 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev170324.java @@ -0,0 +1,593 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc; + + + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCOreNetworkElementCoreData; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElement12; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ExtendedAirInterfaceHistoricalPerformanceType12; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ONFLayerProtocolName; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.GenericTransactionUtils; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceDiversityCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AttributeValueChangedNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ContainerCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ContainerHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MicrowaveModelListener; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfaceDiversityPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfaceDiversityPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfacePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwAirInterfacePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwEthernetContainerPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwEthernetContainerPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwHybridMwStructurePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwHybridMwStructurePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwPureEthernetStructurePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwPureEthernetStructurePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwTdmContainerPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.MwTdmContainerPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectCreationNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectDeletionNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ProblemNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.StructureCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.air._interface.diversity.pac.AirInterfaceDiversityCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.air._interface.pac.AirInterfaceConfiguration; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.air._interface.pac.AirInterfaceCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.air._interface.pac.AirInterfaceHistoricalPerformances; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.ethernet.container.pac.EthernetContainerCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.ethernet.container.pac.EthernetContainerHistoricalPerformances; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.hybrid.mw.structure.pac.HybridMwStructureCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.pure.ethernet.structure.pac.PureEthernetStructureCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.mw.tdm.container.pac.TdmContainerCurrentProblems; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.NotificationListener; +import org.opendaylight.yangtools.yang.common.QName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class WrapperMicrowaveModelRev170324 implements OnfMicrowaveModel, MicrowaveModelListener { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElement12.class); + + public static final QName QNAME = MwAirInterfacePac.QNAME; + + + private ONFCOreNetworkElementCoreData coreData; + private OnfMicrowaveModelNotification microwaveModelListener; + + /*----------------------------------------------------------------------------- + * Setter/Getter + */ + + public void setCoreData(ONFCOreNetworkElementCoreData coreData) { + this.coreData = coreData; + } + + public ONFCOreNetworkElementCoreData getCoreData() { + return coreData; + } + + @Override + public void setOnfMicrowaveModelListener(OnfMicrowaveModelNotification microwaveModelListener) { + this.microwaveModelListener = microwaveModelListener; + } + + @SuppressWarnings("unchecked") + @Override + public <T extends NotificationListener> T getNotificationListener() { + return (T)this; + } + + /*----------------------------------------------------------------------------- + * Interfacefunctions + */ + + public void readTheFaultsOfMicrowaveModel(ONFLayerProtocolName lpName, Class<?> lpClass, UniversalId uuid, + List<ProblemNotificationXml> resultList) { + + switch (lpName) { + case MWAirInterface: + readTheFaultsOfMwAirInterfacePac(uuid, resultList); + break; + + case EthernetContainer12: + readTheFaultsOfMwEthernetContainerPac(uuid, resultList); + break; + + case TDMContainer: + readTheFaultsOfMwTdmContainerPac(uuid, resultList); + break; + + case Structure: + if (lpClass == MwHybridMwStructurePac.class) { + readTheFaultsOfMwHybridMwStructurePac(uuid, resultList); + + } else if (lpClass == MwAirInterfaceDiversityPac.class) { + readTheFaultsOfMwAirInterfaceDiversityPac(uuid, resultList); + + } else if (lpClass == MwPureEthernetStructurePac.class) { + readTheFaultsOfMwPureEthernetStructurePac(uuid, resultList); + + } else { + LOG.warn("Unassigned lp model {} class {}", lpName, lpClass); + } + break; + case Ethernet: + // No alarms supported + break; + case EthernetContainer10: + default: + LOG.warn("Unassigned or not expected lp in model {}", lpName); + } + } + + public List<? extends OtnHistoryDataG> readTheHistoricalPerformanceData(ONFLayerProtocolName lpName, Lp lp) { + switch (lpName) { + case MWAirInterface: + return readTheHistoricalPerformanceDataOfMwAirInterfacePac(lp); + + case EthernetContainer12: + return readTheHistoricalPerformanceDataOfEthernetContainer(lp); + + case EthernetContainer10: + case EthernetPhysical: + case Ethernet: + case TDMContainer: + case Structure: + case Unknown: + LOG.debug("Do not read HistoricalPM data for {} {}", lpName, lp.getUuid().getValue()); + break; + } + return new ArrayList<>(); + } + + public Class<?> getClassForLtpExtension(QName qName) { + Class<?> res = null; + if (qName.equals(MwAirInterfacePac.QNAME)) { + res = MwAirInterfacePac.class; + } else if (qName.equals(MwAirInterfaceDiversityPac.QNAME)) { + res = MwAirInterfaceDiversityPac.class; + } else if (qName.equals(MwPureEthernetStructurePac.QNAME)) { + res = MwPureEthernetStructurePac.class; + } else if (qName.equals(MwHybridMwStructurePac.QNAME)) { + res = MwHybridMwStructurePac.class; + } else if (qName.equals(MwEthernetContainerPac.QNAME)) { + res = MwEthernetContainerPac.class; + } else if (qName.equals(MwTdmContainerPac.QNAME)) { + res = MwTdmContainerPac.class; + } + LOG.info("Found QName {} mapped to {}", String.valueOf(qName), String.valueOf(res)); + return res; + } + + /*----------------------------------------------------------------------------- + * Reading problems for specific interface pacs + */ + + /** + * Read problems of specific interfaces + * + * @param uuId Universal Id String of the interface + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwAirInterfacePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwAirInterfacePac> clazzPac = MwAirInterfacePac.class; + // final Class<MwAirInterfacePacKey> clazzPacKey = MwAirInterfacePacKey.class; + // final Class<AirInterfaceCurrentProblems> clazzProblems = + // AirInterfaceCurrentProblems.class; + // final Class<AirInterfaceCurrentProblemTypeG> clazzProblem = + // AirInterfaceCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + // Step 2.2: construct data and the relative iid + InstanceIdentifier<AirInterfaceCurrentProblems> mwAirInterfaceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(interfacePacUuid)) + .child(AirInterfaceCurrentProblems.class).build(); + + // Step 2.3: read to the config data store + AirInterfaceCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwAirInterfaceIID); + + if (problems == null) { + LOG.debug("DBRead Id {} no AirInterfaceCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemList", interfacePacUuid); + } else { + for (AirInterfaceCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwEthernetContainerPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwEthernetContainerPac> clazzPac = MwEthernetContainerPac.class; + // final Class<MwEthernetContainerPacKey> clazzPacKey = + // MwEthernetContainerPacKey.class; + // final Class<EthernetContainerCurrentProblems> clazzProblems = + // EthernetContainerCurrentProblems.class; + // final Class<ContainerCurrentProblemTypeG> clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<EthernetContainerCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(MwEthernetContainerPac.class, new MwEthernetContainerPacKey(interfacePacUuid)) + .child(EthernetContainerCurrentProblems.class).build(); + + EthernetContainerCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no EthernetContainerCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (ContainerCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwAirInterfaceDiversityPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwAirInterfaceDiversityPac> clazzPac = MwAirInterfaceDiversityPac.class; + // final Class<MwAirInterfaceDiversityPacKey> clazzPacKey = + // MwAirInterfaceDiversityPacKey.class; + final Class<AirInterfaceDiversityCurrentProblems> clazzProblems = AirInterfaceDiversityCurrentProblems.class; + // final Class<AirInterfaceDiversityCurrentProblemTypeG> clazzProblem = + // AirInterfaceDiversityCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<AirInterfaceDiversityCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwAirInterfaceDiversityPacKey(interfacePacUuid)).child(clazzProblems).build(); + + AirInterfaceDiversityCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no AirInterfaceDiversityCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemList", interfacePacUuid); + } else { + for (AirInterfaceDiversityCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwPureEthernetStructurePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwPureEthernetStructurePac> clazzPac = MwPureEthernetStructurePac.class; + // final Class<MwPureEthernetStructurePacKey> clazzPacKey = + // MwPureEthernetStructurePacKey.class; + final Class<PureEthernetStructureCurrentProblems> clazzProblems = PureEthernetStructureCurrentProblems.class; + // final Class<StructureCurrentProblemTypeG> clazzProblem = + // StructureCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<PureEthernetStructureCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwPureEthernetStructurePacKey(interfacePacUuid)).child(clazzProblems).build(); + + PureEthernetStructureCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no PureEthernetStructureCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (StructureCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwHybridMwStructurePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwHybridMwStructurePac> clazzPac = MwHybridMwStructurePac.class; + // final Class<MwHybridMwStructurePacKey> clazzPacKey = + // MwHybridMwStructurePacKey.class; + final Class<HybridMwStructureCurrentProblems> clazzProblems = HybridMwStructureCurrentProblems.class; + // final Class<HybridMwStructureCurrentProblemsG> clazzProblem = + // HybridMwStructureCurrentProblemsG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<HybridMwStructureCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwHybridMwStructurePacKey(interfacePacUuid)).child(clazzProblems).build(); + + HybridMwStructureCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no HybridMwStructureCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (StructureCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces. TODO Goal for future implementation + * without usage of explicit new. Key is generated by newInstance() function + * here to verify this approach. + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + * @throws SecurityException + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InstantiationException + */ + private List<ProblemNotificationXml> readTheFaultsOfMwTdmContainerPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwTdmContainerPac> clazzPac = MwTdmContainerPac.class; + final Class<MwTdmContainerPacKey> clazzPacKey = MwTdmContainerPacKey.class; + final Class<TdmContainerCurrentProblems> clazzProblems = TdmContainerCurrentProblems.class; + // final Class<ContainerCurrentProblemTypeG> clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + try { + // -- Specific part 1 + Constructor<MwTdmContainerPacKey> cons = clazzPacKey.getConstructor(UniversalId.class); // Avoid new() + InstanceIdentifier<TdmContainerCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, cons.newInstance(interfacePacUuid)).child(clazzProblems).build(); + + // -- Specific part 2 + TdmContainerCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no TdmContainerCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + // -- Specific part 3 + for (ContainerCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), + InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + LOG.warn("Could not reade instance of MwTdmContainerPacKey: ", e); + } + return resultList; + } + + /*----------------------------------------------------------------------------- + * Performance related data + */ + + /** + * PM MwAirInterfacePac + * + * @param lp + * @return + */ + private List<ExtendedAirInterfaceHistoricalPerformanceType12> readTheHistoricalPerformanceDataOfMwAirInterfacePac( + Lp lp) { + + String uuId = lp.getUuid().getValue(); + + List<ExtendedAirInterfaceHistoricalPerformanceType12> resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} MWAirInterfacePac: {}", coreData.getMountpoint(), uuId); + // ---- + UniversalId mwAirInterfacePacuuId = new UniversalId(uuId); + // Step 2.1: construct data and the relative iid + InstanceIdentifier<AirInterfaceConfiguration> mwAirInterfaceConfigurationIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceConfiguration.class).build(); + AirInterfaceConfiguration airConfiguration = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwAirInterfaceConfigurationIID); + + if (airConfiguration == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceConfiguration", mwAirInterfacePacuuId); + + } else { + // Step 2.2: construct data and the relative iid + InstanceIdentifier<AirInterfaceHistoricalPerformances> mwAirInterfaceHistoricalPerformanceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceHistoricalPerformances.class).build(); + + // Step 2.3: read to the config data store + AirInterfaceHistoricalPerformances airHistoricalPerformanceData = GenericTransactionUtils.readData( + coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, mwAirInterfaceHistoricalPerformanceIID); + + if (airHistoricalPerformanceData == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceHistoricalPerformances", + mwAirInterfacePacuuId); + } else { + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170320.air._interface.historical.performances.g.HistoricalPerformanceDataList + List<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.air._interface.historical.performances.g.HistoricalPerformanceDataList> airHistPMList = airHistoricalPerformanceData + .getHistoricalPerformanceDataList(); + LOG.debug("DBRead MWAirInterfacePac Id {} Records intermediate: {}", mwAirInterfacePacuuId, + airHistPMList.size()); + if (airHistPMList != null) { + for (AirInterfaceHistoricalPerformanceTypeG pmRecord : airHistoricalPerformanceData + .getHistoricalPerformanceDataList()) { + resultList.add(new ExtendedAirInterfaceHistoricalPerformanceType12(pmRecord, airConfiguration)); + } + } + } + } + LOG.debug("DBRead MWAirInterfacePac Id {} Records result: {}", mwAirInterfacePacuuId, resultList.size()); + return resultList; + } + + private List<ContainerHistoricalPerformanceTypeG> readTheHistoricalPerformanceDataOfEthernetContainer(Lp lp) { + + final String myName = "MWEthernetContainerPac"; + String uuId = lp.getUuid().getValue(); + + List<ContainerHistoricalPerformanceTypeG> resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} : {}", coreData.getMountpoint(), myName, uuId); + // ---- + UniversalId ethContainerPacuuId = new UniversalId(uuId); + // Step 2.2: construct data and the relative iid + InstanceIdentifier<EthernetContainerHistoricalPerformances> ethContainerIID = InstanceIdentifier + .builder(MwEthernetContainerPac.class, new MwEthernetContainerPacKey(ethContainerPacuuId)) + .child(EthernetContainerHistoricalPerformances.class).build(); + + // Step 2.3: read to the config data store + EthernetContainerHistoricalPerformances ethContainerHistoricalPerformanceData = GenericTransactionUtils + .readData(coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, ethContainerIID); + + if (ethContainerHistoricalPerformanceData == null) { + LOG.debug("DBRead {} Id {} no HistoricalPerformances", myName, ethContainerPacuuId); + } else { + // import + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170320.ethernet.container.historical.performances.g.HistoricalPerformanceDataList + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ethernet.container.historical.performances.g.HistoricalPerformanceDataList + List<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ethernet.container.historical.performances.g.HistoricalPerformanceDataList> airHistPMList = ethContainerHistoricalPerformanceData + .getHistoricalPerformanceDataList(); + LOG.debug("DBRead {} Id {} Records intermediate: {}", myName, ethContainerPacuuId, airHistPMList.size()); + if (airHistPMList != null) { + for (ContainerHistoricalPerformanceTypeG pmRecord : airHistPMList) { + resultList.add(pmRecord); + } + } + } + LOG.debug("DBRead {} Id {} Records result: {}", myName, ethContainerPacuuId, resultList.size()); + return resultList; + } + + @Override + public void onObjectCreationNotification(ObjectCreationNotification notification) { + LOG.debug("Got event of type :: {}", ObjectCreationNotification.class.getSimpleName()); + + ObjectCreationNotificationXml notificationXml = new ObjectCreationNotificationXml(coreData.getMountpoint(), + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + microwaveModelListener.onObjectCreationNotification(notificationXml); + } + + @Override + public void onObjectDeletionNotification(ObjectDeletionNotification notification) { + LOG.debug("Got event of type :: {}", ObjectDeletionNotification.class.getSimpleName()); + + ObjectDeletionNotificationXml notificationXml = new ObjectDeletionNotificationXml(coreData.getMountpoint(), + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue() + ); + microwaveModelListener.onObjectDeletionNotification(notificationXml); + } + + public void onProblemNotification(ProblemNotification notification) { + + LOG.debug("Got event of type :: {}", ProblemNotification.class.getSimpleName()); + + ProblemNotificationXml notificationXml = new ProblemNotificationXml(coreData.getMountpoint(), notification.getObjectIdRef().getValue(), + notification.getProblem(), InternalSeverity.valueOf(notification.getSeverity()), + notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp())); + + microwaveModelListener.onProblemNotification(notificationXml); + } + + @Override + public void onAttributeValueChangedNotification(AttributeValueChangedNotification notification) { + LOG.debug("Got event of type :: {}", AttributeValueChangedNotification.class.getSimpleName()); + + AttributeValueChangedNotificationXml notificationXml = new AttributeValueChangedNotificationXml(coreData.getMountpoint(), + String.valueOf(notification.getCounter()), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue(), notification.getAttributeName(), notification.getNewValue()); + + microwaveModelListener.onAttributeValueChangedNotification(notificationXml); + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev180907.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev180907.java new file mode 100644 index 000000000..d35115fd9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev180907.java @@ -0,0 +1,596 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc; + + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.NotificationListener; +import org.opendaylight.yangtools.yang.common.QName; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCOreNetworkElementCoreData; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElement12; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ExtendedAirInterfaceHistoricalPerformanceType1211; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ONFLayerProtocolName; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.GenericTransactionUtils; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; + +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AirInterfaceCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AirInterfaceDiversityCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ContainerCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ContainerHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MicrowaveModelListener; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwAirInterfaceDiversityPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwAirInterfaceDiversityPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwAirInterfacePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwAirInterfacePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwEthernetContainerPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwEthernetContainerPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwHybridMwStructurePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwHybridMwStructurePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwPureEthernetStructurePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwPureEthernetStructurePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwTdmContainerPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.MwTdmContainerPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.StructureCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.air._interface.diversity.pac.AirInterfaceDiversityCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.air._interface.pac.AirInterfaceConfiguration; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.air._interface.pac.AirInterfaceCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.air._interface.pac.AirInterfaceHistoricalPerformances; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.ethernet.container.pac.EthernetContainerCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.ethernet.container.pac.EthernetContainerHistoricalPerformances; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.hybrid.mw.structure.pac.HybridMwStructureCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.pure.ethernet.structure.pac.PureEthernetStructureCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.mw.tdm.container.pac.TdmContainerCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AttributeValueChangedNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ObjectCreationNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ObjectDeletionNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ProblemNotification; + + +public class WrapperMicrowaveModelRev180907 implements OnfMicrowaveModel, MicrowaveModelListener { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElement12.class); + + public static final QName QNAME = MwAirInterfacePac.QNAME; + + + private ONFCOreNetworkElementCoreData coreData; + + private OnfMicrowaveModelNotification microwaveModelListener; + + + /*----------------------------------------------------------------------------- + * Setter/Getter + */ + + public void setCoreData(ONFCOreNetworkElementCoreData coreData) { + this.coreData = coreData; + } + + public ONFCOreNetworkElementCoreData getCoreData() { + return coreData; + } + + @Override + public void setOnfMicrowaveModelListener(OnfMicrowaveModelNotification microwaveModelListener) { + this.microwaveModelListener = microwaveModelListener; + } + + @SuppressWarnings("unchecked") + @Override + public <T extends NotificationListener> T getNotificationListener() { + return (T) this; + } + + /*----------------------------------------------------------------------------- + * Interfacefunctions + */ + + public void readTheFaultsOfMicrowaveModel(ONFLayerProtocolName lpName, Class<?> lpClass, UniversalId uuid, + List<ProblemNotificationXml> resultList) { + + switch (lpName) { + case MWAirInterface: + readTheFaultsOfMwAirInterfacePac(uuid, resultList); + break; + + case EthernetContainer12: + readTheFaultsOfMwEthernetContainerPac(uuid, resultList); + break; + + case TDMContainer: + readTheFaultsOfMwTdmContainerPac(uuid, resultList); + break; + + case Structure: + if (lpClass == MwHybridMwStructurePac.class) { + readTheFaultsOfMwHybridMwStructurePac(uuid, resultList); + + } else if (lpClass == MwAirInterfaceDiversityPac.class) { + readTheFaultsOfMwAirInterfaceDiversityPac(uuid, resultList); + + } else if (lpClass == MwPureEthernetStructurePac.class) { + readTheFaultsOfMwPureEthernetStructurePac(uuid, resultList); + + } else { + LOG.warn("Unassigned lp model {} class {}", lpName, lpClass); + } + break; + case Ethernet: + // No alarms supported + break; + case EthernetContainer10: + default: + LOG.warn("Unassigned or not expected lp in model {}", lpName); + } + } + + public List<? extends OtnHistoryDataG> readTheHistoricalPerformanceData(ONFLayerProtocolName lpName, Lp lp) { + switch (lpName) { + case MWAirInterface: + return readTheHistoricalPerformanceDataOfMwAirInterfacePac(lp); + + case EthernetContainer12: + return readTheHistoricalPerformanceDataOfEthernetContainer(lp); + + case EthernetContainer10: + case EthernetPhysical: + case Ethernet: + case TDMContainer: + case Structure: + case Unknown: + LOG.debug("Do not read HistoricalPM data for {} {}", lpName, lp.getUuid().getValue()); + break; + } + return new ArrayList<>(); + } + + public Class<?> getClassForLtpExtension(QName qName) { + Class<?> res = null; + if (qName.equals(MwAirInterfacePac.QNAME)) { + res = MwAirInterfacePac.class; + } else if (qName.equals(MwAirInterfaceDiversityPac.QNAME)) { + res = MwAirInterfaceDiversityPac.class; + } else if (qName.equals(MwPureEthernetStructurePac.QNAME)) { + res = MwPureEthernetStructurePac.class; + } else if (qName.equals(MwHybridMwStructurePac.QNAME)) { + res = MwHybridMwStructurePac.class; + } else if (qName.equals(MwEthernetContainerPac.QNAME)) { + res = MwEthernetContainerPac.class; + } else if (qName.equals(MwTdmContainerPac.QNAME)) { + res = MwTdmContainerPac.class; + } + LOG.info("Found QName {} mapped to {}", String.valueOf(qName), String.valueOf(res)); + return res; + } + + /*----------------------------------------------------------------------------- + * Reading problems for specific interface pacs + */ + + /** + * Read problems of specific interfaces + * + * @param uuId Universal Id String of the interface + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwAirInterfacePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwAirInterfacePac> clazzPac = MwAirInterfacePac.class; + // final Class<MwAirInterfacePacKey> clazzPacKey = MwAirInterfacePacKey.class; + // final Class<AirInterfaceCurrentProblems> clazzProblems = + // AirInterfaceCurrentProblems.class; + // final Class<AirInterfaceCurrentProblemTypeG> clazzProblem = + // AirInterfaceCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + // Step 2.2: construct data and the relative iid + InstanceIdentifier<AirInterfaceCurrentProblems> mwAirInterfaceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(interfacePacUuid)) + .child(AirInterfaceCurrentProblems.class).build(); + + // Step 2.3: read to the config data store + AirInterfaceCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwAirInterfaceIID); + + if (problems == null) { + LOG.debug("DBRead Id {} no AirInterfaceCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemList", interfacePacUuid); + } else { + for (AirInterfaceCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwEthernetContainerPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwEthernetContainerPac> clazzPac = MwEthernetContainerPac.class; + // final Class<MwEthernetContainerPacKey> clazzPacKey = + // MwEthernetContainerPacKey.class; + // final Class<EthernetContainerCurrentProblems> clazzProblems = + // EthernetContainerCurrentProblems.class; + // final Class<ContainerCurrentProblemTypeG> clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<EthernetContainerCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(MwEthernetContainerPac.class, new MwEthernetContainerPacKey(interfacePacUuid)) + .child(EthernetContainerCurrentProblems.class).build(); + + EthernetContainerCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no EthernetContainerCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (ContainerCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwAirInterfaceDiversityPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwAirInterfaceDiversityPac> clazzPac = MwAirInterfaceDiversityPac.class; + // final Class<MwAirInterfaceDiversityPacKey> clazzPacKey = + // MwAirInterfaceDiversityPacKey.class; + final Class<AirInterfaceDiversityCurrentProblems> clazzProblems = AirInterfaceDiversityCurrentProblems.class; + // final Class<AirInterfaceDiversityCurrentProblemTypeG> clazzProblem = + // AirInterfaceDiversityCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<AirInterfaceDiversityCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwAirInterfaceDiversityPacKey(interfacePacUuid)).child(clazzProblems).build(); + + AirInterfaceDiversityCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no AirInterfaceDiversityCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemList", interfacePacUuid); + } else { + for (AirInterfaceDiversityCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwPureEthernetStructurePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwPureEthernetStructurePac> clazzPac = MwPureEthernetStructurePac.class; + // final Class<MwPureEthernetStructurePacKey> clazzPacKey = + // MwPureEthernetStructurePacKey.class; + final Class<PureEthernetStructureCurrentProblems> clazzProblems = PureEthernetStructureCurrentProblems.class; + // final Class<StructureCurrentProblemTypeG> clazzProblem = + // StructureCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<PureEthernetStructureCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwPureEthernetStructurePacKey(interfacePacUuid)).child(clazzProblems).build(); + + PureEthernetStructureCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no PureEthernetStructureCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (StructureCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwHybridMwStructurePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwHybridMwStructurePac> clazzPac = MwHybridMwStructurePac.class; + // final Class<MwHybridMwStructurePacKey> clazzPacKey = + // MwHybridMwStructurePacKey.class; + final Class<HybridMwStructureCurrentProblems> clazzProblems = HybridMwStructureCurrentProblems.class; + // final Class<HybridMwStructureCurrentProblemsG> clazzProblem = + // HybridMwStructureCurrentProblemsG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<HybridMwStructureCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwHybridMwStructurePacKey(interfacePacUuid)).child(clazzProblems).build(); + + HybridMwStructureCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no HybridMwStructureCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (StructureCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces. TODO Goal for future implementation + * without usage of explicit new. Key is generated by newInstance() function + * here to verify this approach. + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + * @throws SecurityException + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InstantiationException + */ + private List<ProblemNotificationXml> readTheFaultsOfMwTdmContainerPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwTdmContainerPac> clazzPac = MwTdmContainerPac.class; + final Class<MwTdmContainerPacKey> clazzPacKey = MwTdmContainerPacKey.class; + final Class<TdmContainerCurrentProblems> clazzProblems = TdmContainerCurrentProblems.class; + // final Class<ContainerCurrentProblemTypeG> clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + try { + // -- Specific part 1 + Constructor<MwTdmContainerPacKey> cons = clazzPacKey.getConstructor(UniversalId.class); // Avoid new() + InstanceIdentifier<TdmContainerCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, cons.newInstance(interfacePacUuid)).child(clazzProblems).build(); + + // -- Specific part 2 + TdmContainerCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no TdmContainerCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + // -- Specific part 3 + for (ContainerCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), + InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + LOG.warn("Could not reade instance of MwTdmContainerPacKey: ", e); + } + return resultList; + } + + /*----------------------------------------------------------------------------- + * Performance related data + */ + + /** + * PM MwAirInterfacePac + * + * @param lp + * @return + */ + private List<ExtendedAirInterfaceHistoricalPerformanceType1211> readTheHistoricalPerformanceDataOfMwAirInterfacePac( + Lp lp) { + + String uuId = lp.getUuid().getValue(); + + List<ExtendedAirInterfaceHistoricalPerformanceType1211> resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} MWAirInterfacePac: {}", coreData.getMountpoint(), uuId); + // ---- + UniversalId mwAirInterfacePacuuId = new UniversalId(uuId); + // Step 2.1: construct data and the relative iid + InstanceIdentifier<AirInterfaceConfiguration> mwAirInterfaceConfigurationIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceConfiguration.class).build(); + AirInterfaceConfiguration airConfiguration = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwAirInterfaceConfigurationIID); + + if (airConfiguration == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceConfiguration", mwAirInterfacePacuuId); + + } else { + // Step 2.2: construct data and the relative iid + InstanceIdentifier<AirInterfaceHistoricalPerformances> mwAirInterfaceHistoricalPerformanceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceHistoricalPerformances.class).build(); + + // Step 2.3: read to the config data store + AirInterfaceHistoricalPerformances airHistoricalPerformanceData = GenericTransactionUtils.readData( + coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, mwAirInterfaceHistoricalPerformanceIID); + + if (airHistoricalPerformanceData == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceHistoricalPerformances", + mwAirInterfacePacuuId); + } else { + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170320.air._interface.historical.performances.g.HistoricalPerformanceDataList + List<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.air._interface.historical.performances.g.HistoricalPerformanceDataList> airHistPMList = airHistoricalPerformanceData + .getHistoricalPerformanceDataList(); + LOG.debug("DBRead MWAirInterfacePac Id {} Records intermediate: {}", mwAirInterfacePacuuId, + airHistPMList.size()); + if (airHistPMList != null) { + for (AirInterfaceHistoricalPerformanceTypeG pmRecord : airHistoricalPerformanceData + .getHistoricalPerformanceDataList()) { + resultList.add(new ExtendedAirInterfaceHistoricalPerformanceType1211(pmRecord, airConfiguration)); + } + } + } + } + LOG.debug("DBRead MWAirInterfacePac Id {} Records result: {}", mwAirInterfacePacuuId, resultList.size()); + return resultList; + } + + private List<ContainerHistoricalPerformanceTypeG> readTheHistoricalPerformanceDataOfEthernetContainer(Lp lp) { + + final String myName = "MWEthernetContainerPac"; + String uuId = lp.getUuid().getValue(); + + List<ContainerHistoricalPerformanceTypeG> resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} : {}", coreData.getMountpoint(), myName, uuId); + // ---- + UniversalId ethContainerPacuuId = new UniversalId(uuId); + // Step 2.2: construct data and the relative iid + InstanceIdentifier<EthernetContainerHistoricalPerformances> ethContainerIID = InstanceIdentifier + .builder(MwEthernetContainerPac.class, new MwEthernetContainerPacKey(ethContainerPacuuId)) + .child(EthernetContainerHistoricalPerformances.class).build(); + + // Step 2.3: read to the config data store + EthernetContainerHistoricalPerformances ethContainerHistoricalPerformanceData = GenericTransactionUtils + .readData(coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, ethContainerIID); + + if (ethContainerHistoricalPerformanceData == null) { + LOG.debug("DBRead {} Id {} no HistoricalPerformances", myName, ethContainerPacuuId); + } else { + // import + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170320.ethernet.container.historical.performances.g.HistoricalPerformanceDataList + List<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ethernet.container.historical.performances.g.HistoricalPerformanceDataList> airHistPMList = ethContainerHistoricalPerformanceData + .getHistoricalPerformanceDataList(); + LOG.debug("DBRead {} Id {} Records intermediate: {}", myName, ethContainerPacuuId, airHistPMList.size()); + if (airHistPMList != null) { + for (ContainerHistoricalPerformanceTypeG pmRecord : airHistPMList) { + resultList.add(pmRecord); + } + } + } + LOG.debug("DBRead {} Id {} Records result: {}", myName, ethContainerPacuuId, resultList.size()); + return resultList; + } + + @Override + public void onObjectCreationNotification(ObjectCreationNotification notification) { + LOG.debug("Got event of type :: {}", ObjectCreationNotification.class.getSimpleName()); + + ObjectCreationNotificationXml notificationXml = new ObjectCreationNotificationXml(coreData.getMountpoint(), + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + microwaveModelListener.onObjectCreationNotification(notificationXml); + } + + @Override + public void onObjectDeletionNotification(ObjectDeletionNotification notification) { + LOG.debug("Got event of type :: {}", ObjectDeletionNotification.class.getSimpleName()); + + ObjectDeletionNotificationXml notificationXml = new ObjectDeletionNotificationXml(coreData.getMountpoint(), + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue() + ); + microwaveModelListener.onObjectDeletionNotification(notificationXml); + } + + public void onProblemNotification(ProblemNotification notification) { + + LOG.debug("Got event of type :: {}", ProblemNotification.class.getSimpleName()); + + ProblemNotificationXml notificationXml = new ProblemNotificationXml(coreData.getMountpoint(), notification.getObjectIdRef().getValue(), + notification.getProblem(), InternalSeverity.valueOf(notification.getSeverity()), + notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp())); + + microwaveModelListener.onProblemNotification(notificationXml); + } + + @Override + public void onAttributeValueChangedNotification(AttributeValueChangedNotification notification) { + LOG.debug("Got event of type :: {}", AttributeValueChangedNotification.class.getSimpleName()); + + AttributeValueChangedNotificationXml notificationXml = new AttributeValueChangedNotificationXml(coreData.getMountpoint(), + String.valueOf(notification.getCounter()), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue(), notification.getAttributeName(), notification.getNewValue()); + + microwaveModelListener.onAttributeValueChangedNotification(notificationXml); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev181010.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev181010.java new file mode 100644 index 000000000..c3970a8d4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/netconf/wrapperc/WrapperMicrowaveModelRev181010.java @@ -0,0 +1,594 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc; + + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.NotificationListener; +import org.opendaylight.yangtools.yang.common.QName; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCOreNetworkElementCoreData; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElement12; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ExtendedAirInterfaceHistoricalPerformanceType1211p; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ONFLayerProtocolName; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.GenericTransactionUtils; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; + +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AirInterfaceCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AirInterfaceDiversityCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ContainerCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ContainerHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MicrowaveModelListener; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwAirInterfaceDiversityPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwAirInterfaceDiversityPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwAirInterfacePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwAirInterfacePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwEthernetContainerPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwEthernetContainerPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwHybridMwStructurePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwHybridMwStructurePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwPureEthernetStructurePac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwPureEthernetStructurePacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwTdmContainerPac; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.MwTdmContainerPacKey; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.StructureCurrentProblemTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.air._interface.diversity.pac.AirInterfaceDiversityCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.air._interface.pac.AirInterfaceConfiguration; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.air._interface.pac.AirInterfaceCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.air._interface.pac.AirInterfaceHistoricalPerformances; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.ethernet.container.pac.EthernetContainerCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.ethernet.container.pac.EthernetContainerHistoricalPerformances; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.hybrid.mw.structure.pac.HybridMwStructureCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.pure.ethernet.structure.pac.PureEthernetStructureCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.mw.tdm.container.pac.TdmContainerCurrentProblems; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AttributeValueChangedNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ObjectCreationNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ObjectDeletionNotification; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ProblemNotification; + + +public class WrapperMicrowaveModelRev181010 implements OnfMicrowaveModel, MicrowaveModelListener { + + private static final Logger LOG = LoggerFactory.getLogger(ONFCoreNetworkElement12.class); + + public static final QName QNAME = MwAirInterfacePac.QNAME; + + + private ONFCOreNetworkElementCoreData coreData; + + private OnfMicrowaveModelNotification microwaveModelListener; + + /*----------------------------------------------------------------------------- + * Setter/Getter + */ + + public void setCoreData(ONFCOreNetworkElementCoreData coreData) { + this.coreData = coreData; + } + + public ONFCOreNetworkElementCoreData getCoreData() { + return coreData; + } + + @Override + public void setOnfMicrowaveModelListener(OnfMicrowaveModelNotification microwaveModelListener) { + this.microwaveModelListener = microwaveModelListener; + } + + @SuppressWarnings("unchecked") + @Override + public <T extends NotificationListener> T getNotificationListener() { + return (T) this; + } + + /*----------------------------------------------------------------------------- + * Interfacefunctions + */ + + public void readTheFaultsOfMicrowaveModel(ONFLayerProtocolName lpName, Class<?> lpClass, UniversalId uuid, + List<ProblemNotificationXml> resultList) { + + switch (lpName) { + case MWAirInterface: + readTheFaultsOfMwAirInterfacePac(uuid, resultList); + break; + + case EthernetContainer12: + readTheFaultsOfMwEthernetContainerPac(uuid, resultList); + break; + + case TDMContainer: + readTheFaultsOfMwTdmContainerPac(uuid, resultList); + break; + + case Structure: + if (lpClass == MwHybridMwStructurePac.class) { + readTheFaultsOfMwHybridMwStructurePac(uuid, resultList); + + } else if (lpClass == MwAirInterfaceDiversityPac.class) { + readTheFaultsOfMwAirInterfaceDiversityPac(uuid, resultList); + + } else if (lpClass == MwPureEthernetStructurePac.class) { + readTheFaultsOfMwPureEthernetStructurePac(uuid, resultList); + + } else { + LOG.warn("Unassigned lp model {} class {}", lpName, lpClass); + } + break; + case Ethernet: + // No alarms supported + break; + case EthernetContainer10: + default: + LOG.warn("Unassigned or not expected lp in model {}", lpName); + } + } + + public List<? extends OtnHistoryDataG> readTheHistoricalPerformanceData(ONFLayerProtocolName lpName, Lp lp) { + switch (lpName) { + case MWAirInterface: + return readTheHistoricalPerformanceDataOfMwAirInterfacePac(lp); + + case EthernetContainer12: + return readTheHistoricalPerformanceDataOfEthernetContainer(lp); + + case EthernetContainer10: + case EthernetPhysical: + case Ethernet: + case TDMContainer: + case Structure: + case Unknown: + LOG.debug("Do not read HistoricalPM data for {} {}", lpName, lp.getUuid().getValue()); + break; + } + return new ArrayList<>(); + } + + public Class<?> getClassForLtpExtension(QName qName) { + Class<?> res = null; + if (qName.equals(MwAirInterfacePac.QNAME)) { + res = MwAirInterfacePac.class; + } else if (qName.equals(MwAirInterfaceDiversityPac.QNAME)) { + res = MwAirInterfaceDiversityPac.class; + } else if (qName.equals(MwPureEthernetStructurePac.QNAME)) { + res = MwPureEthernetStructurePac.class; + } else if (qName.equals(MwHybridMwStructurePac.QNAME)) { + res = MwHybridMwStructurePac.class; + } else if (qName.equals(MwEthernetContainerPac.QNAME)) { + res = MwEthernetContainerPac.class; + } else if (qName.equals(MwTdmContainerPac.QNAME)) { + res = MwTdmContainerPac.class; + } + LOG.info("Found QName {} mapped to {}", String.valueOf(qName), String.valueOf(res)); + return res; + } + + /*----------------------------------------------------------------------------- + * Reading problems for specific interface pacs + */ + + /** + * Read problems of specific interfaces + * + * @param uuId Universal Id String of the interface + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwAirInterfacePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwAirInterfacePac> clazzPac = MwAirInterfacePac.class; + // final Class<MwAirInterfacePacKey> clazzPacKey = MwAirInterfacePacKey.class; + // final Class<AirInterfaceCurrentProblems> clazzProblems = + // AirInterfaceCurrentProblems.class; + // final Class<AirInterfaceCurrentProblemTypeG> clazzProblem = + // AirInterfaceCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + // Step 2.2: construct data and the relative iid + InstanceIdentifier<AirInterfaceCurrentProblems> mwAirInterfaceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(interfacePacUuid)) + .child(AirInterfaceCurrentProblems.class).build(); + + // Step 2.3: read to the config data store + AirInterfaceCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwAirInterfaceIID); + + if (problems == null) { + LOG.debug("DBRead Id {} no AirInterfaceCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemList", interfacePacUuid); + } else { + for (AirInterfaceCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwEthernetContainerPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwEthernetContainerPac> clazzPac = MwEthernetContainerPac.class; + // final Class<MwEthernetContainerPacKey> clazzPacKey = + // MwEthernetContainerPacKey.class; + // final Class<EthernetContainerCurrentProblems> clazzProblems = + // EthernetContainerCurrentProblems.class; + // final Class<ContainerCurrentProblemTypeG> clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<EthernetContainerCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(MwEthernetContainerPac.class, new MwEthernetContainerPacKey(interfacePacUuid)) + .child(EthernetContainerCurrentProblems.class).build(); + + EthernetContainerCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no EthernetContainerCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (ContainerCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwAirInterfaceDiversityPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwAirInterfaceDiversityPac> clazzPac = MwAirInterfaceDiversityPac.class; + // final Class<MwAirInterfaceDiversityPacKey> clazzPacKey = + // MwAirInterfaceDiversityPacKey.class; + final Class<AirInterfaceDiversityCurrentProblems> clazzProblems = AirInterfaceDiversityCurrentProblems.class; + // final Class<AirInterfaceDiversityCurrentProblemTypeG> clazzProblem = + // AirInterfaceDiversityCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<AirInterfaceDiversityCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwAirInterfaceDiversityPacKey(interfacePacUuid)).child(clazzProblems).build(); + + AirInterfaceDiversityCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no AirInterfaceDiversityCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemList", interfacePacUuid); + } else { + for (AirInterfaceDiversityCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwPureEthernetStructurePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwPureEthernetStructurePac> clazzPac = MwPureEthernetStructurePac.class; + // final Class<MwPureEthernetStructurePacKey> clazzPacKey = + // MwPureEthernetStructurePacKey.class; + final Class<PureEthernetStructureCurrentProblems> clazzProblems = PureEthernetStructureCurrentProblems.class; + // final Class<StructureCurrentProblemTypeG> clazzProblem = + // StructureCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<PureEthernetStructureCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwPureEthernetStructurePacKey(interfacePacUuid)).child(clazzProblems).build(); + + PureEthernetStructureCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no PureEthernetStructureCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (StructureCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + */ + private List<ProblemNotificationXml> readTheFaultsOfMwHybridMwStructurePac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwHybridMwStructurePac> clazzPac = MwHybridMwStructurePac.class; + // final Class<MwHybridMwStructurePacKey> clazzPacKey = + // MwHybridMwStructurePacKey.class; + final Class<HybridMwStructureCurrentProblems> clazzProblems = HybridMwStructureCurrentProblems.class; + // final Class<HybridMwStructureCurrentProblemsG> clazzProblem = + // HybridMwStructureCurrentProblemsG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + InstanceIdentifier<HybridMwStructureCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, new MwHybridMwStructurePacKey(interfacePacUuid)).child(clazzProblems).build(); + + HybridMwStructureCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no HybridMwStructureCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + for (StructureCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + return resultList; + } + + /** + * Read problems of specific interfaces. TODO Goal for future implementation + * without usage of explicit new. Key is generated by newInstance() function + * here to verify this approach. + * + * @param uuId Universal index of Interfacepac + * @return number of alarms + * @throws SecurityException + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InstantiationException + */ + private List<ProblemNotificationXml> readTheFaultsOfMwTdmContainerPac(UniversalId interfacePacUuid, + List<ProblemNotificationXml> resultList) { + + final Class<MwTdmContainerPac> clazzPac = MwTdmContainerPac.class; + final Class<MwTdmContainerPacKey> clazzPacKey = MwTdmContainerPacKey.class; + final Class<TdmContainerCurrentProblems> clazzProblems = TdmContainerCurrentProblems.class; + // final Class<ContainerCurrentProblemTypeG> clazzProblem = + // ContainerCurrentProblemTypeG.class; + + LOG.info("DBRead Get problems for class {} from mountpoint {} for uuid {}", clazzPac.getSimpleName(), + coreData.getMountpoint(), interfacePacUuid.getValue()); + + try { + // -- Specific part 1 + Constructor<MwTdmContainerPacKey> cons = clazzPacKey.getConstructor(UniversalId.class); // Avoid new() + InstanceIdentifier<TdmContainerCurrentProblems> mwEthInterfaceIID = InstanceIdentifier + .builder(clazzPac, cons.newInstance(interfacePacUuid)).child(clazzProblems).build(); + + // -- Specific part 2 + TdmContainerCurrentProblems problems = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwEthInterfaceIID); + if (problems == null) { + LOG.debug("DBRead Id {} no TdmContainerCurrentProblems", interfacePacUuid); + } else if (problems.getCurrentProblemList() == null) { + LOG.debug("DBRead Id {} empty CurrentProblemsList", interfacePacUuid); + } else { + // -- Specific part 3 + for (ContainerCurrentProblemTypeG problem : problems.getCurrentProblemList()) { + resultList.add(new ProblemNotificationXml(coreData.getMountpoint(), interfacePacUuid.getValue(), + problem.getProblemName(), InternalSeverity.valueOf(problem.getProblemSeverity()), + problem.getSequenceNumber().toString(), + InternalDateAndTime.valueOf(problem.getTimeStamp()))); + } + } + } catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException | InvocationTargetException e) { + LOG.warn("Could not reade instance of MwTdmContainerPacKey: ", e); + } + return resultList; + } + + /*----------------------------------------------------------------------------- + * Performance related data + */ + + /** + * PM MwAirInterfacePac + * + * @param lp + * @return + */ + private List<ExtendedAirInterfaceHistoricalPerformanceType1211p> readTheHistoricalPerformanceDataOfMwAirInterfacePac( + Lp lp) { + + String uuId = lp.getUuid().getValue(); + + List<ExtendedAirInterfaceHistoricalPerformanceType1211p> resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} MWAirInterfacePac: {}", coreData.getMountpoint(), uuId); + // ---- + UniversalId mwAirInterfacePacuuId = new UniversalId(uuId); + // Step 2.1: construct data and the relative iid + InstanceIdentifier<AirInterfaceConfiguration> mwAirInterfaceConfigurationIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceConfiguration.class).build(); + AirInterfaceConfiguration airConfiguration = GenericTransactionUtils.readData(coreData.getDataBroker(), + LogicalDatastoreType.OPERATIONAL, mwAirInterfaceConfigurationIID); + + if (airConfiguration == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceConfiguration", mwAirInterfacePacuuId); + + } else { + // Step 2.2: construct data and the relative iid + InstanceIdentifier<AirInterfaceHistoricalPerformances> mwAirInterfaceHistoricalPerformanceIID = InstanceIdentifier + .builder(MwAirInterfacePac.class, new MwAirInterfacePacKey(mwAirInterfacePacuuId)) + .child(AirInterfaceHistoricalPerformances.class).build(); + + // Step 2.3: read to the config data store + AirInterfaceHistoricalPerformances airHistoricalPerformanceData = GenericTransactionUtils.readData( + coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, mwAirInterfaceHistoricalPerformanceIID); + + if (airHistoricalPerformanceData == null) { + LOG.debug("DBRead MWAirInterfacePac Id {} no AirInterfaceHistoricalPerformances", + mwAirInterfacePacuuId); + } else { + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170320.air._interface.historical.performances.g.HistoricalPerformanceDataList + List<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.air._interface.historical.performances.g.HistoricalPerformanceDataList> airHistPMList = airHistoricalPerformanceData + .getHistoricalPerformanceDataList(); + LOG.debug("DBRead MWAirInterfacePac Id {} Records intermediate: {}", mwAirInterfacePacuuId, + airHistPMList.size()); + if (airHistPMList != null) { + for (AirInterfaceHistoricalPerformanceTypeG pmRecord : airHistoricalPerformanceData + .getHistoricalPerformanceDataList()) { + resultList.add(new ExtendedAirInterfaceHistoricalPerformanceType1211p(pmRecord, airConfiguration)); + } + } + } + } + LOG.debug("DBRead MWAirInterfacePac Id {} Records result: {}", mwAirInterfacePacuuId, resultList.size()); + return resultList; + } + + private List<ContainerHistoricalPerformanceTypeG> readTheHistoricalPerformanceDataOfEthernetContainer(Lp lp) { + + final String myName = "MWEthernetContainerPac"; + String uuId = lp.getUuid().getValue(); + + List<ContainerHistoricalPerformanceTypeG> resultList = new ArrayList<>(); + LOG.debug("DBRead Get {} : {}", coreData.getMountpoint(), myName, uuId); + // ---- + UniversalId ethContainerPacuuId = new UniversalId(uuId); + // Step 2.2: construct data and the relative iid + InstanceIdentifier<EthernetContainerHistoricalPerformances> ethContainerIID = InstanceIdentifier + .builder(MwEthernetContainerPac.class, new MwEthernetContainerPacKey(ethContainerPacuuId)) + .child(EthernetContainerHistoricalPerformances.class).build(); + + // Step 2.3: read to the config data store + EthernetContainerHistoricalPerformances ethContainerHistoricalPerformanceData = GenericTransactionUtils + .readData(coreData.getDataBroker(), LogicalDatastoreType.OPERATIONAL, ethContainerIID); + + if (ethContainerHistoricalPerformanceData == null) { + LOG.debug("DBRead {} Id {} no HistoricalPerformances", myName, ethContainerPacuuId); + } else { + // import + // org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170320.ethernet.container.historical.performances.g.HistoricalPerformanceDataList + List<org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ethernet.container.historical.performances.g.HistoricalPerformanceDataList> airHistPMList = ethContainerHistoricalPerformanceData + .getHistoricalPerformanceDataList(); + LOG.debug("DBRead {} Id {} Records intermediate: {}", myName, ethContainerPacuuId, airHistPMList.size()); + if (airHistPMList != null) { + for (ContainerHistoricalPerformanceTypeG pmRecord : airHistPMList) { + resultList.add(pmRecord); + } + } + } + LOG.debug("DBRead {} Id {} Records result: {}", myName, ethContainerPacuuId, resultList.size()); + return resultList; + } + + public void onObjectCreationNotification(ObjectCreationNotification notification) { + LOG.debug("Got event of type :: {}", ObjectCreationNotification.class.getSimpleName()); + + ObjectCreationNotificationXml notificationXml = new ObjectCreationNotificationXml(coreData.getMountpoint(), + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + microwaveModelListener.onObjectCreationNotification(notificationXml); + } + + @Override + public void onObjectDeletionNotification(ObjectDeletionNotification notification) { + LOG.debug("Got event of type :: {}", ObjectDeletionNotification.class.getSimpleName()); + + ObjectDeletionNotificationXml notificationXml = new ObjectDeletionNotificationXml(coreData.getMountpoint(), + notification.getCounter().toString(), + InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue() + ); + microwaveModelListener.onObjectDeletionNotification(notificationXml); + } + + public void onProblemNotification(ProblemNotification notification) { + + LOG.debug("Got event of type :: {}", ProblemNotification.class.getSimpleName()); + + ProblemNotificationXml notificationXml = new ProblemNotificationXml(coreData.getMountpoint(), notification.getObjectIdRef().getValue(), + notification.getProblem(), InternalSeverity.valueOf(notification.getSeverity()), + notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp())); + + microwaveModelListener.onProblemNotification(notificationXml); + } + + @Override + public void onAttributeValueChangedNotification(AttributeValueChangedNotification notification) { + LOG.debug("Got event of type :: {}", AttributeValueChangedNotification.class.getSimpleName()); + + AttributeValueChangedNotificationXml notificationXml = new AttributeValueChangedNotificationXml(coreData.getMountpoint(), + String.valueOf(notification.getCounter()), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue(), notification.getAttributeName(), notification.getNewValue()); + + microwaveModelListener.onAttributeValueChangedNotification(notificationXml); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayFilter.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayFilter.java new file mode 100644 index 000000000..fecdd3b53 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayFilter.java @@ -0,0 +1,162 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter; + +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class NotificationDelayFilter<T> implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(NotificationDelayFilter.class); + + private final ConcurrentHashMap <String, NotificationWithServerTimeStamp<T>> problemItems; +// private final HashMap<String, NotificationWithServerTimeStamp<T>> nonProblemItems; + private final NotificationDelayedListener<T> timeoutListener; + + private static long delay; + private static boolean enabled; + + public static void setDelay(long l) { + NotificationDelayFilter.delay = l; + } + + public static long getDelay() { + return NotificationDelayFilter.delay; + } + + public static boolean isEnabled() { + return NotificationDelayFilter.enabled; + } + + public static void setEnabled(boolean enabled) { + NotificationDelayFilter.enabled = enabled; + } + + private final ScheduledExecutorService scheduler; + private final Runnable timerRunner = () -> onTick(); + + private final String nodeName; + + public NotificationDelayFilter(String nodeName, NotificationDelayedListener<T> timeoutListener) { + this.nodeName = nodeName; + this.timeoutListener = timeoutListener; + this.problemItems = new ConcurrentHashMap <>(); + this.scheduler = Executors.newScheduledThreadPool(1); + this.startTimer(); + } + + /** + * Push notification with a specific severity (everything except non-alarmed) + * @param problemName key + * @param notification related notification + */ + public void pushAlarmNotification(String problemName, T notification) { + synchronized (problemItems) { + + boolean cp = this.problemItems.containsKey(problemName); + if (!cp) { + // no alarm in entries => create entry and push the alarm currently + NotificationWithServerTimeStamp<T> item = new NotificationWithServerTimeStamp<>( + notification); + LOG.debug("add event into list for node " + this.nodeName + " for alarm " + problemName + ": " + + item.toString()); + this.problemItems.put(problemName, item); + if (this.timeoutListener != null) { + this.timeoutListener.onNotificationDelay(notification); + } + } else { + LOG.debug("clear contra event for node " + this.nodeName + " for alarm " + problemName); + this.problemItems.get(problemName).clrContraEvent(); + } + + } + } + + /** + * Push notification with severity non-alarmed + * @param problemName key + * @param notification related notification + */ + public void clearAlarmNotification(String problemName, T notification) { + synchronized (problemItems) { + + boolean cp = this.problemItems.containsKey(problemName); + if (cp) { + LOG.debug("set contra event for alarm " + problemName); + this.problemItems.get(problemName).setContraEvent(notification); + } else { + // not in list => push directly through + if (this.timeoutListener != null) { + this.timeoutListener.onNotificationDelay(notification); + } + } + } + } + + private void startTimer() { + scheduler.scheduleAtFixedRate(timerRunner, 0, 1, TimeUnit.SECONDS); + } + + private void stopTimer() { + scheduler.shutdown(); + } + + /** + * check for clearing item out of the list + */ + private void onTick() { + long now = System.currentTimeMillis(); + try { + + synchronized (problemItems) { + + for (Entry<String, NotificationWithServerTimeStamp<T>> entry : problemItems + .entrySet()) { + NotificationWithServerTimeStamp<T> value = entry.getValue(); + if (value.isStable(now)) { + // send contra Alarm if exists + if (value.getContraAlarmNotification() != null) { + if (this.timeoutListener != null) { + this.timeoutListener.onNotificationDelay(value.getContraAlarmNotification()); + } + } + problemItems.remove(entry.getKey()); + LOG.debug("removing entry for "+this.nodeName+" for alarm " + entry.getKey()); + } else { + LOG.trace("currently state is still unstable for alarm " + entry.getKey()); + } + } + + } + } catch (Exception e) { + //Prevent stopping the task + LOG.warn("Exception during NotificationDelayFilter Task", e); + } + } + + @Override + public void close() throws Exception { + this.stopTimer(); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayService.java new file mode 100644 index 000000000..47482b248 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayService.java @@ -0,0 +1,64 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter; + +import java.util.HashMap; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.HtDevicemanagerConfiguration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.IConfigChangedListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.ToggleAlarmConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class NotificationDelayService<T> implements AutoCloseable { + private static final Logger LOG = LoggerFactory.getLogger(NotificationDelayService.class); + + private final HashMap<String, NotificationDelayFilter<T>> filters; + + public NotificationDelayFilter<T> getInstance(String nodeName, NotificationDelayedListener<T> eventListener) { + NotificationDelayFilter<T> filter = filters.getOrDefault(nodeName, null); + + LOG.trace("nodeName={}, filter!=null? {}", nodeName, filter != null); + if (filter == null) { + filter = new NotificationDelayFilter<>(nodeName, eventListener); + this.filters.put(nodeName, filter); + } + return filter; + } + + public NotificationDelayService(HtDevicemanagerConfiguration htconfig) { + this.filters = new HashMap<>(); + htconfig.registerConfigChangedListener(configChangedListener); + NotificationDelayFilter.setDelay(htconfig.getToggleAlarm().getDelay()); + NotificationDelayFilter.setEnabled(htconfig.getToggleAlarm().isEnabled()); + } + + private final IConfigChangedListener configChangedListener = () -> { + ToggleAlarmConfig cfg = ToggleAlarmConfig.reload(); + NotificationDelayFilter.setDelay(cfg.getDelay()); + NotificationDelayFilter.setEnabled(cfg.isEnabled()); + }; + + @Override + public void close() throws Exception { + // close all filters + for (NotificationDelayFilter<T> filter : this.filters.values()) { + filter.close(); + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayedListener.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayedListener.java new file mode 100644 index 000000000..04276c999 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationDelayedListener.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter; + +public interface NotificationDelayedListener<T> { + + public void onNotificationDelay(T notification); + +} + diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationWithServerTimeStamp.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationWithServerTimeStamp.java new file mode 100644 index 000000000..6631cbedf --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/toggleAlarmFilter/NotificationWithServerTimeStamp.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter; + +public class NotificationWithServerTimeStamp<T2> { + private final T2 alarmNotification; + private T2 contraAlarmNotification; + private final long timestampStart; + private long timestamp; + + public NotificationWithServerTimeStamp(T2 n) { + this(n, System.currentTimeMillis()); + } + + public NotificationWithServerTimeStamp(T2 n, long ts) { + this.alarmNotification = n; + this.contraAlarmNotification = null; + this.timestamp = ts; + this.timestampStart=ts; + } + + @SuppressWarnings("unused") + public long getStartTime() { + return this.timestampStart; + } + public void refresh() { + this.refresh(System.currentTimeMillis()); + } + + public void refresh(long ts) { + this.timestamp = ts; + } + + public void setContraEvent(T2 notification) { + this.contraAlarmNotification = notification; + this.refresh(); + } + + public void clrContraEvent() { + this.contraAlarmNotification = null; + this.refresh(); + } + + public boolean isStable(long now) { + return this.timestamp + NotificationDelayFilter.getDelay() < now; + } + + @SuppressWarnings("unused") + public T2 getAlarmNotification() { + return this.alarmNotification; + } + + public T2 getContraAlarmNotification() { + return this.contraAlarmNotification; + } + + @Override + public String toString() { + return "NotificationWithServerTimeStamp [alarmNotification=" + alarmNotification + + ", contraAlarmNotification=" + contraAlarmNotification + ", timestampStart=" + timestampStart + + ", timestamp=" + timestamp + "]"; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/BaseSubConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/BaseSubConfig.java new file mode 100644 index 000000000..88dde506c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/BaseSubConfig.java @@ -0,0 +1,127 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.ConversionException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.Section; + +public class BaseSubConfig { + + private final Section subconfig; + private final ISubConfigHandler configHandler; + private final IniConfigurationFile config; + + protected Section getSubConfig() { + return this.subconfig; + } + protected ISubConfigHandler getConfigHandler() { + return this.configHandler; + } + protected IniConfigurationFile getConfig() { + return this.config; + } + public BaseSubConfig() + { + this.config=null; + this.subconfig=null; + this.configHandler=null; + } + public BaseSubConfig(IniConfigurationFile config, ISubConfigHandler configHandler,String section) { + this.config = config; + this.subconfig = config.subset(section); + this.configHandler = configHandler; + } + protected boolean hasKey(String key) + { + if(this.subconfig==null) { + return false; + } + return this.subconfig.hasKey(key); + } + protected String getString(String key,String def) + { + if(this.subconfig==null) { + return def; + } + String s; + //try + { + s=this.subconfig.getString(key, def); + if(s.isEmpty()) { + s=def; + } + } + /*catch(ConversionException e) + { + s=def; + } + */ + return s; + } + protected boolean getBoolean(String key, boolean def) { + if(this.subconfig==null) { + return def; + } + boolean s; + try { + s=this.subconfig.getBoolean(key, def); + } + catch(ConversionException e) + { + s=def; + } + return s; + } + protected int getInt(String key, int def) { + if(this.subconfig==null) { + return def; + } + int s; + try { + s=this.subconfig.getInt(key, def); + } + catch(ConversionException e) + { + s=def; + } + return s; + } + protected long getLong(String key, long def) { + if(this.subconfig==null) { + return def; + } + long s; + try { + s=this.subconfig.getLong(key, def); + } + catch(ConversionException e) + { + s=def; + } + return s; + } + protected void save() + { + if(this.configHandler!=null) { + this.configHandler.save(); + } + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/HtDevicemanagerConfiguration.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/HtDevicemanagerConfiguration.java new file mode 100644 index 000000000..6167248f0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/HtDevicemanagerConfiguration.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config; + +import java.io.File; +import java.io.IOException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.AaiConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.DcaeConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.EsConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.PmConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.ToggleAlarmConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.util.ConfigFileObserver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HtDevicemanagerConfiguration { + + private static final long FILE_POLL_INTERVAL_MS = 1000; + + private static final Logger LOG = LoggerFactory.getLogger(HtDevicemanagerConfiguration.class); + + private static final String CONFIGURATIONFILE = "etc/devicemanager.properties"; + private static final String CONFIGURATIONTESTFILE = "test.properties"; // for + // testing + + private static HtDevicemanagerConfiguration mObj; + private static HtDevicemanagerConfiguration mObjTest; + private static IniConfigurationFile mConfig; + private final ISubConfigHandler subconfigHandler = () -> mConfig.save(); + + private final ConfigFileObserver fileObserver; + private File mFile; + + private HtDevicemanagerConfiguration(String filename) { + + try { + this.mFile = new File(filename); + if (!this.mFile.exists()) { + if (!this.mFile.createNewFile()) { + LOG.error("Can not create file {}", filename); + } + } + if (mConfig == null) { + mConfig = new IniConfigurationFile(this.mFile); + } + mConfig.load(); + + } catch (ConfigurationException e) { + LOG.error("Problem loading config values: {}", e.getMessage()); + } catch (IOException e) { + LOG.error("Problem loading config file {} : {}", filename, e.getMessage()); + } + + this.fileObserver = new ConfigFileObserver(filename, FILE_POLL_INTERVAL_MS, mConfig); + this.fileObserver.start(); + } + + + public static HtDevicemanagerConfiguration getConfiguration() { + if (mObj == null) { + mObj = new HtDevicemanagerConfiguration(CONFIGURATIONFILE); + } + return mObj; + } + + public static HtDevicemanagerConfiguration getTestConfiguration() { + return getTestConfiguration(CONFIGURATIONTESTFILE); + } + + public static HtDevicemanagerConfiguration getTestConfiguration(final String filename) { + if (mObjTest == null) { + mObjTest = new HtDevicemanagerConfiguration(filename); + } + return mObjTest; + } + + public IniConfigurationFile getMConfig() { + return mConfig; + } + + public void registerConfigChangedListener(IConfigChangedListener l) { + this.fileObserver.registerConfigChangedListener(l); + } + + public void unregisterConfigChangedListener(IConfigChangedListener l) { + this.fileObserver.unregisterConfigChangedListener(l); + } + + @Override + protected void finalize() throws Throwable { + if (this.fileObserver != null) { + this.fileObserver.interrupt(); + } + super.finalize(); + } + + public DcaeConfig getDcae() { + return DcaeConfig.getDcae(mConfig, this.subconfigHandler); + } + + public AaiConfig getAai() { + return AaiConfig.getAai(mConfig, this.subconfigHandler); + } + + public EsConfig getEs() { + return EsConfig.getEs(mConfig, this.subconfigHandler); + } + + public PmConfig getPm() { + return PmConfig.getPm(mConfig, this.subconfigHandler); + } + + public ToggleAlarmConfig getToggleAlarm() { + return ToggleAlarmConfig.getTa(mConfig, this.subconfigHandler); + } + + public ISubConfigHandler getSubconfigHandler() { + return subconfigHandler; + } + + public static void clear() { + mObj = null; + mObjTest = null; + DcaeConfig.clear(); + AaiConfig.clear(); + EsConfig.clear(); + PmConfig.clear(); + ToggleAlarmConfig.clear(); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/IConfigChangedListener.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/IConfigChangedListener.java new file mode 100644 index 000000000..704841ce7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/IConfigChangedListener.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config; + +public interface IConfigChangedListener { + void onConfigChanged(); +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/ISubConfigHandler.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/ISubConfigHandler.java new file mode 100644 index 000000000..c1f67f0a3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/ISubConfigHandler.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config; + +public interface ISubConfigHandler { + void save(); +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AaiClientPropertiesFile.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AaiClientPropertiesFile.java new file mode 100644 index 000000000..7912f047b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AaiClientPropertiesFile.java @@ -0,0 +1,74 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.impl; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +public class AaiClientPropertiesFile{ + + private final File mFile; + private String mPCKS12CertFilename; + private String mPCKS12Passphrase; + private boolean mTrustInsecureSSL; + private String mApplicationIdentifier; + private String mRemoteUrl; + private int mConnectionTimeout; + private int mReadTimeout; + + public String getFilename() + { return this.mFile.getAbsolutePath(); } + public String getPCKS12CertFilename() + {return this.mPCKS12CertFilename;} + public String getPCKS12Passphrase() + {return this.mPCKS12Passphrase; } + public boolean trustInsecureSSL() + {return this.mTrustInsecureSSL;} + public String getApplicationIdentifier() + {return this.mApplicationIdentifier;} + public String getRemoteUrl() + {return this.mRemoteUrl;} + public int getConnectionTimeout() + {return this.mConnectionTimeout;} + public int getReadTimeout() + {return this.mReadTimeout;} + + public boolean exists() + {return this.mFile.exists();} + public AaiClientPropertiesFile(String filename) + { + this.mFile=new File(filename); + } + public void load() throws IOException,NumberFormatException + { + Properties defaultProps = new Properties(); + FileInputStream in = new FileInputStream(this.mFile); + defaultProps.load(in); + this.mPCKS12CertFilename=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.ssl.key",null); + this.mPCKS12Passphrase=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.ssl.key.psswd",null); + this.mTrustInsecureSSL=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.host.certificate.ignore","false").equals("true"); + this.mApplicationIdentifier=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.application",null); + this.mRemoteUrl=defaultProps.getProperty("org.onap.ccsdk.sli.adaptors.aai.uri",null); + this.mConnectionTimeout=Integer.parseInt(defaultProps.getProperty("connection.timeout","60000")); + this.mReadTimeout=Integer.parseInt(defaultProps.getProperty("read.timeout","60000")); + in.close(); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AaiConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AaiConfig.java new file mode 100644 index 000000000..b30b3271d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AaiConfig.java @@ -0,0 +1,467 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.impl; + +import java.io.IOException; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import javax.annotation.Nullable; +import org.json.JSONArray; +import org.json.JSONException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.BaseSubConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.ISubConfigHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AaiConfig extends BaseSubConfig { + + private static final Logger LOG = LoggerFactory.getLogger(AaiConfig.class); + + private static final String SECTION_MARKER_AAI = "aai"; + + private static final String PROPERTY_KEY_AAIPROP_FILE ="aaiPropertiesFile"; + private static final String PROPERTY_KEY_BASEURL = "aaiUrl"; + private static final String PROPERTY_KEY_USERCREDENTIALS = "aaiUserCredentials"; + private static final String PROPERTY_KEY_HEADERS = "aaiHeaders"; + private static final String PROPERTY_KEY_DELETEONMOUNTPOINTREMOVED = "aaiDeleteOnMountpointRemove"; + private static final String PROPERTY_KEY_TRUSTALLCERTS = "aaiTrustAllCerts"; + private static final String PROPERTY_KEY_APIVERSION = "aaiApiVersion"; + private static final String PROPERTY_KEY_PCKS12CERTFILENAME = "aaiPcks12ClientCertFile"; + private static final String PROPERTY_KEY_PCKS12PASSPHRASE = "aaiPcks12ClientCertPassphrase"; + private static final String PROPERTY_KEY_CONNECTIONTIMEOUT = "aaiClientConnectionTimeout"; + private static final String PROPERTY_KEY_APPLICATIONID = "aaiApplicationId"; + + private static final String DEFAULT_VALUE_AAIPROP_FILE ="null"; + private static final String DEFAULT_VALUE_BASEURL = "off"; + private static final String DEFAULT_VALUE_APPLICATION = "SDNR"; + private static final String DEFAULT_VALUE_USERNAME = ""; + private static final String DEFAULT_VALUE_USERPASSWORD = ""; + private static final String DEFAULT_VALUE_USERCREDENTIALS = ""; + private static final String DEFAULT_VALUE_HEADERS = "[\"X-TransactionId: 9999\"]"; + private static final boolean DEFAULT_VALUE_DELETEONMOUNTPOINTREMOVED = false; + private static final boolean DEFAULT_VALUE_TRUSTALLCERTS = false; + private static final int DEFAULT_VALUE_CONNECTION_TIMEOUT = 30000; //in ms + private static final String DEFAULT_VALUE_APIVERSION = "aai/v13"; + private static final String DEFAULT_VALUE_PCKS12CERTFILENAME =""; + private static final String DEFAULT_VALUE_PCKS12PASSPHRASE = ""; + private static final String DEFAULT_VALUE_APPLICATIONID = "SDNR"; + + private static final String HEADER_KEY_APPLICATION = "X-FromAppId"; + + + private static AaiConfig aaiConfig; + + private final String aaiPropFile; + private final String baseUrl; + private String apiVersion; + private String applicationIdentifier; + private String username; + private String password; + private String pcks12CertificateFilename; + private String pcks12CertificatePassphrase; + private int connectionTimeout; + private final boolean deleteOnMountPointRemoved; + private final boolean trustAllCerts; + + public boolean doDeleteOnMountPointRemoved() { + return this.deleteOnMountPointRemoved; + } + + private Map<String, String> headers; + + + private AaiConfig() { + super(); + this.aaiPropFile = DEFAULT_VALUE_AAIPROP_FILE; + this.apiVersion=DEFAULT_VALUE_APIVERSION; + this.applicationIdentifier = DEFAULT_VALUE_APPLICATION; + this.baseUrl = DEFAULT_VALUE_BASEURL; + this.username = DEFAULT_VALUE_USERNAME; + this.password = DEFAULT_VALUE_USERPASSWORD; + this.deleteOnMountPointRemoved = DEFAULT_VALUE_DELETEONMOUNTPOINTREMOVED; + this.trustAllCerts=DEFAULT_VALUE_TRUSTALLCERTS; + this.applicationIdentifier=DEFAULT_VALUE_APPLICATIONID; + } + + public AaiConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + public AaiConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + super(config, configHandler, SECTION_MARKER_AAI); + // load + this.aaiPropFile=this.getString(PROPERTY_KEY_AAIPROP_FILE, ""); + AaiClientPropertiesFile aaiProperties = new AaiClientPropertiesFile(this.aaiPropFile); + String defBaseUrl=DEFAULT_VALUE_BASEURL; + String defPCKSCertFilename=DEFAULT_VALUE_PCKS12CERTFILENAME; + String defPCKSPassphrase=DEFAULT_VALUE_PCKS12PASSPHRASE; + String defApplicationId=DEFAULT_VALUE_APPLICATION; + int defconnectionTimeout=DEFAULT_VALUE_CONNECTION_TIMEOUT; + boolean loaded=false; + if(aaiProperties.exists()) + { + LOG.debug("found another aaiclient.properties file"); + try + { + aaiProperties.load(); + loaded=true; + LOG.debug("loaded successfully"); + } + catch(IOException|NumberFormatException e) + { + LOG.warn("problem loading external properties file "+aaiProperties.getFilename()+": "+e.getMessage()); + } + if(loaded) //preload new default values + { + String value; + value = aaiProperties.getRemoteUrl(); + if (value != null) { + defBaseUrl = value; + } + value = aaiProperties.getPCKS12CertFilename(); + if (value != null) { + defPCKSCertFilename = value; + } + value = aaiProperties.getPCKS12Passphrase(); + if (value != null) { + defPCKSPassphrase = value; + } + value = aaiProperties.getApplicationIdentifier(); + if (value != null) { + defApplicationId = value; + } + } + } else { + LOG.debug("no aaiclient.properties file found"); + } + + + this.baseUrl = this.getString(PROPERTY_KEY_BASEURL, defBaseUrl); + this.apiVersion=this.getString(PROPERTY_KEY_APIVERSION,DEFAULT_VALUE_APIVERSION); + String credentials = this.getString(PROPERTY_KEY_USERCREDENTIALS, DEFAULT_VALUE_USERCREDENTIALS); + if (credentials.contains(":")) { + try { + this.username = credentials.split(":")[0]; + this.password = credentials.split(":")[1]; + } catch (Exception e) { + this.username = DEFAULT_VALUE_USERNAME; + this.password = DEFAULT_VALUE_USERPASSWORD; + } + } else { + this.username = DEFAULT_VALUE_USERNAME; + this.password = DEFAULT_VALUE_USERPASSWORD; + } + this.headers = _parseHeadersMap(this.getString(PROPERTY_KEY_HEADERS, DEFAULT_VALUE_HEADERS)); + this.applicationIdentifier = this.getString(PROPERTY_KEY_APPLICATIONID, defApplicationId); + this.pcks12CertificateFilename=this.getString(PROPERTY_KEY_PCKS12CERTFILENAME, defPCKSCertFilename); + this.pcks12CertificatePassphrase=this.getString(PROPERTY_KEY_PCKS12PASSPHRASE, defPCKSPassphrase); + this.connectionTimeout = this.getInt(PROPERTY_KEY_CONNECTIONTIMEOUT, defconnectionTimeout); + this.deleteOnMountPointRemoved = this.getBoolean(PROPERTY_KEY_DELETEONMOUNTPOINTREMOVED, + DEFAULT_VALUE_DELETEONMOUNTPOINTREMOVED); + this.trustAllCerts = this.getBoolean(PROPERTY_KEY_TRUSTALLCERTS, DEFAULT_VALUE_TRUSTALLCERTS); + + boolean missing=!this.hasKey(PROPERTY_KEY_APPLICATIONID)|| !this.hasKey(PROPERTY_KEY_CONNECTIONTIMEOUT)|| + !this.hasKey(PROPERTY_KEY_TRUSTALLCERTS) || !this.hasKey(PROPERTY_KEY_PCKS12CERTFILENAME) || + !this.hasKey(PROPERTY_KEY_PCKS12PASSPHRASE); + if(missing) { + LOG.debug("some params missing in config file"); + } + //re-save if external aaiproperties file changed to show that params are submitted internally + if(missing || aaiConfig!=null && aaiConfig!=this && ( + !propertyEquals(aaiConfig.aaiPropFile, this.aaiPropFile) || + !propertyEquals(aaiConfig.pcks12CertificateFilename, this.pcks12CertificateFilename) || + !propertyEquals(aaiConfig.pcks12CertificatePassphrase, this.pcks12CertificatePassphrase) || + !propertyEquals(aaiConfig.connectionTimeout, this.connectionTimeout) + + )) + { + LOG.debug("force saving because of reload changes from remote file"); + save=true; + } + if (save) { + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_BASEURL, this.baseUrl); + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_USERCREDENTIALS, + nullorempty(this.username) && nullorempty(this.password)?"":this.username + ":" + this.password); + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_HEADERS, _printHeadersMap(this.headers)); + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_DELETEONMOUNTPOINTREMOVED, + this.deleteOnMountPointRemoved); + config.setProperty(SECTION_MARKER_AAI + "." + PROPERTY_KEY_TRUSTALLCERTS, this.trustAllCerts); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_AAIPROP_FILE, this.aaiPropFile); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_APIVERSION,this.apiVersion); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_APPLICATIONID, this.applicationIdentifier); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_CONNECTIONTIMEOUT, this.connectionTimeout); + /*if(this.pcks12CertificateFilename !=null && !this.pcks12CertificateFilename.isEmpty() && + this.pcks12CertificatePassphrase!=null && !this.pcks12CertificatePassphrase.isEmpty())*/ + { + LOG.debug("no client credentials to save"); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_PCKS12CERTFILENAME, this.pcks12CertificateFilename); + config.setProperty(SECTION_MARKER_AAI+"."+PROPERTY_KEY_PCKS12PASSPHRASE, this.pcks12CertificatePassphrase); + } + LOG.debug("save"); + this.save(); + } + } + + private boolean nullorempty(String s) { + return s==null || s.isEmpty(); + } + + public boolean isOff() { + return this.baseUrl == null || this.baseUrl.toLowerCase().equals("off"); + } + + private static boolean propertyEquals(final Object p1,final Object p2) + { + return p1==null && p2==null || p1 != null && p1.equals(p2); + } + private static boolean propertyEquals(final int p1,final int p2) + { + return p1==p2; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (aaiPropFile == null ? 0 : aaiPropFile.hashCode()); + result = prime * result + (apiVersion == null ? 0 : apiVersion.hashCode()); + result = prime * result + (applicationIdentifier == null ? 0 : applicationIdentifier.hashCode()); + result = prime * result + (baseUrl == null ? 0 : baseUrl.hashCode()); + result = prime * result + connectionTimeout; + result = prime * result + (deleteOnMountPointRemoved ? 1231 : 1237); + result = prime * result + (headers == null ? 0 : headers.hashCode()); + result = prime * result + (password == null ? 0 : password.hashCode()); + result = prime * result + (pcks12CertificateFilename == null ? 0 : pcks12CertificateFilename.hashCode()); + result = prime * result + (pcks12CertificatePassphrase == null ? 0 : pcks12CertificatePassphrase.hashCode()); + result = prime * result + (trustAllCerts ? 1231 : 1237); + result = prime * result + (username == null ? 0 : username.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + AaiConfig other = (AaiConfig) obj; + if (aaiPropFile == null) { + if (other.aaiPropFile != null) { + return false; + } + } else if (!aaiPropFile.equals(other.aaiPropFile)) { + return false; + } + if (apiVersion == null) { + if (other.apiVersion != null) { + return false; + } + } else if (!apiVersion.equals(other.apiVersion)) { + return false; + } + if (applicationIdentifier == null) { + if (other.applicationIdentifier != null) { + return false; + } + } else if (!applicationIdentifier.equals(other.applicationIdentifier)) { + return false; + } + if (baseUrl == null) { + if (other.baseUrl != null) { + return false; + } + } else if (!baseUrl.equals(other.baseUrl)) { + return false; + } + if (connectionTimeout != other.connectionTimeout) { + return false; + } + if (deleteOnMountPointRemoved != other.deleteOnMountPointRemoved) { + return false; + } + if (headers == null) { + if (other.headers != null) { + return false; + } + } else if (!headers.equals(other.headers)) { + return false; + } + if (password == null) { + if (other.password != null) { + return false; + } + } else if (!password.equals(other.password)) { + return false; + } + if (pcks12CertificateFilename == null) { + if (other.pcks12CertificateFilename != null) { + return false; + } + } else if (!pcks12CertificateFilename.equals(other.pcks12CertificateFilename)) { + return false; + } + if (pcks12CertificatePassphrase == null) { + if (other.pcks12CertificatePassphrase != null) { + return false; + } + } else if (!pcks12CertificatePassphrase.equals(other.pcks12CertificatePassphrase)) { + return false; + } + if (trustAllCerts != other.trustAllCerts) { + return false; + } + if (username == null) { + if (other.username != null) { + return false; + } + } else if (!username.equals(other.username)) { + return false; + } + return true; + } + + public String getBaseUrl() { + String url=this.baseUrl; + if(!url.endsWith("/")) { + url+="/"; + } + if(this.apiVersion.startsWith("/")) { + this.apiVersion=this.apiVersion.substring(1); + } + return url+this.apiVersion; + } + + public Map<String, String> getHeaders() { + if (this.headers == null) { + this.headers = new HashMap<>(); + } + this.headers.put(HEADER_KEY_APPLICATION, this.applicationIdentifier); + String s = this.headers.getOrDefault("Authorization", null); + if (nullorempty(s) && !nullorempty(this.username) && !nullorempty(this.password)) { + this.headers.put("Authorization", "Basic " + + new String(Base64.getEncoder().encode((this.username + ":" + this.password).getBytes()))); + } + return this.headers; + } + + @Override + public String toString() { + return "AaiConfig [aaiPropFile=" + aaiPropFile + ", baseUrl=" + baseUrl + ", apiVersion=" + apiVersion + + ", applicationIdentifier=" + applicationIdentifier + ", username=" + username + ", password=" + + password + ", pcks12CertificateFilename=" + pcks12CertificateFilename + + ", pcks12CertificatePassphrase=" + pcks12CertificatePassphrase + ", connectionTimeout=" + + connectionTimeout + ", deleteOnMountPointRemoved=" + deleteOnMountPointRemoved + ", trustAllCerts=" + + trustAllCerts + ", headers=" + this.getHeaders() + "]"; + } + + private static String _printHeadersMap(Map<String, String> headers) { + String r = "["; + if (headers != null) { + int i = 0; + for (Entry<String, String> entry : headers.entrySet()) { + if (i > 0) { + r += ","; + } + r += "\"" + entry.getKey() + ":" + entry.getValue() + "\""; + i++; + } + } + r += "]"; + return r; + } + + private static Map<String, String> _parseHeadersMap(String s) throws JSONException { + Map<String, String> r = new HashMap<>(); + JSONArray a = new JSONArray(s); + if (a != null && a.length() > 0) { + for (int i = 0; i < a.length(); i++) { + String item = a.getString(i); + String[] hlp = item.split(":"); + if (hlp.length > 1) { + r.put(hlp[0], hlp[1]); + } + } + } + return r; + } + + public static boolean isInstantiated() { + return aaiConfig != null; + } + + public static AaiConfig getDefaultConfiguration() { + return new AaiConfig(); + } + + public static AaiConfig getAai(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (aaiConfig == null) { + try { + aaiConfig = new AaiConfig(config, configHandler); + } catch (ConfigurationException e) { + aaiConfig = AaiConfig.getDefaultConfiguration(); + } + } + return aaiConfig; + } + + public static @Nullable AaiConfig reload() { + if (aaiConfig == null) { + return null; + } + AaiConfig tmpConfig; + try { + tmpConfig = new AaiConfig(aaiConfig.getConfig(), aaiConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = AaiConfig.getDefaultConfiguration(); + LOG.warn("problem loading config: "+e.getMessage()); + } + aaiConfig = tmpConfig; + return aaiConfig; + } + + public boolean getTrustAll() { + return this.trustAllCerts; + } + + public String getPcks12CertificateFilename() { + return this.pcks12CertificateFilename; + } + + public String getPcks12CertificatePassphrase() { + return this.pcks12CertificatePassphrase; + } + + public int getConnectionTimeout() { + return this.connectionTimeout; + } + + public static void clear() { + aaiConfig=null; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AkkaConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AkkaConfig.java new file mode 100644 index 000000000..6c416a257 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/AkkaConfig.java @@ -0,0 +1,88 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.impl; + +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import java.io.File; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.util.ClusterConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class AkkaConfig { + + @SuppressWarnings("unused") + private static final Logger LOG = LoggerFactory.getLogger(AkkaConfig.class); + + private static final String DEFAULT_FILENAME = "configuration/initial/akka.conf"; + private final String filename; + private ClusterConfig cluserConfig; + + public ClusterConfig getClusterConfig() { + return this.cluserConfig; + } + + private AkkaConfig(String filename) { + this.filename = filename; + } + + public AkkaConfig() { + this(null); + } + + @Override + public String toString() { + return "AkkaConfig [filename=" + filename + ", cluserConfig=" + cluserConfig + "]"; + } + + private void loadFromFile() throws Exception { + Config cfg = ConfigFactory.parseFile(new File(this.filename)); + this.cluserConfig = new ClusterConfig(cfg.getConfig("odl-cluster-data").getConfig("akka").getConfig("cluster")); + } + + public boolean isCluster() { + return this.cluserConfig != null ? this.cluserConfig.isCluster() : false; + } + + public static AkkaConfig load() throws Exception { + return load(DEFAULT_FILENAME); + } + + public static AkkaConfig load(String filename) throws Exception { + AkkaConfig cfg = new AkkaConfig(filename); + cfg.loadFromFile(); + return cfg; + } + + public boolean isSingleNode() { + return !this.isCluster(); + } + public static AkkaConfig defaultSingleNodeConfig() + { + AkkaConfig cfg=new AkkaConfig(); + cfg.cluserConfig=new ClusterConfig(); + return cfg; + } + + public static AkkaConfig parse(String content) throws Exception { + Config cfg = ConfigFactory.parseString(content); + AkkaConfig c = new AkkaConfig(); + c.cluserConfig=new ClusterConfig(cfg.getConfig("odl-cluster-data").getConfig("akka").getConfig("cluster")); + return c; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/DcaeConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/DcaeConfig.java new file mode 100644 index 000000000..669b211e1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/DcaeConfig.java @@ -0,0 +1,200 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.BaseSubConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.ISubConfigHandler; + +public class DcaeConfig extends BaseSubConfig { + private static final String SECTION_MARKER_DCAE = "dcae"; + + private static final String PROPERTY_KEY_EVENTRECEIVERURL = "dcaeUrl"; + //private static final String PROPERTY_KEY_TESTCOLLECTOR = "dcaeTestCollector"; + private static final String PROPERTY_KEY_USERCREDENTIALS = "dcaeUserCredentials"; + private static final String PROPERTY_KEY_TIMERPERIOD = "dcaeHeartbeatPeriodSeconds"; + + private static final String DEFAULT_VALUE_EVENTRECEIVERURL = "off"; + @SuppressWarnings("unused") + private static final String DEFAULT_VALUE_TESTCOLLECTOR = "no"; + private static final String DEFAULT_VALUE_USERCREDENTIALS = "admin:admin"; + private static final int DEFAULT_VALUE_TIMERPERIOD = 120; + + private static DcaeConfig dcaeConfig = null; // Singleton of configuration data + + private String eventReceiverUrl; + private String userCredentials; + private Integer timerPeriodSeconds; + + private DcaeConfig() { + super(); + this.eventReceiverUrl = DEFAULT_VALUE_EVENTRECEIVERURL; + this.userCredentials = DEFAULT_VALUE_USERCREDENTIALS; + this.timerPeriodSeconds = DEFAULT_VALUE_TIMERPERIOD; + } + + private DcaeConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + private DcaeConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + + super(config, configHandler, SECTION_MARKER_DCAE); + + this.eventReceiverUrl = this.getString(PROPERTY_KEY_EVENTRECEIVERURL, DEFAULT_VALUE_EVENTRECEIVERURL); + this.userCredentials = this.getString(PROPERTY_KEY_USERCREDENTIALS, DEFAULT_VALUE_USERCREDENTIALS); + this.timerPeriodSeconds = this.getInt(PROPERTY_KEY_TIMERPERIOD, DEFAULT_VALUE_TIMERPERIOD); + if (save) { + config.setProperty(SECTION_MARKER_DCAE + "." + PROPERTY_KEY_EVENTRECEIVERURL, this.eventReceiverUrl); + config.setProperty(SECTION_MARKER_DCAE + "." + PROPERTY_KEY_USERCREDENTIALS, this.userCredentials); + config.setProperty(SECTION_MARKER_DCAE + "." + PROPERTY_KEY_TIMERPERIOD, this.timerPeriodSeconds); + + this.save(); + } + } + + /* + * Setter + */ + + public void setEventReceiverUrl(String eventReveicerUrl) { + this.eventReceiverUrl = eventReveicerUrl; + } + + public void setUserCredentials(String userCredentials) { + this.userCredentials = userCredentials; + } + + + + public void setTimerPeriodSeconds(Integer timerPeriodSeconds) { + this.timerPeriodSeconds = timerPeriodSeconds; + } + + /* + * Getter + */ + + public String getEventReveicerUrl() { + return eventReceiverUrl; + } + + public String getUserCredentials() { + return userCredentials; + } + + + public Integer getTimerPeriodSeconds() { + return timerPeriodSeconds; + } + + @Override + public String toString() { + return "DcaeConfig [eventReceiverUrl=" + eventReceiverUrl + ", userCredentials=" + userCredentials + + ", timerPeriodSeconds=" + timerPeriodSeconds + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (eventReceiverUrl == null ? 0 : eventReceiverUrl.hashCode()); + result = prime * result + (timerPeriodSeconds == null ? 0 : timerPeriodSeconds.hashCode()); + result = prime * result + (userCredentials == null ? 0 : userCredentials.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + DcaeConfig other = (DcaeConfig) obj; + if (eventReceiverUrl == null) { + if (other.eventReceiverUrl != null) { + return false; + } + } else if (!eventReceiverUrl.equals(other.eventReceiverUrl)) { + return false; + } + if (timerPeriodSeconds == null) { + if (other.timerPeriodSeconds != null) { + return false; + } + } else if (!timerPeriodSeconds.equals(other.timerPeriodSeconds)) { + return false; + } + if (userCredentials == null) { + if (other.userCredentials != null) { + return false; + } + } else if (!userCredentials.equals(other.userCredentials)) { + return false; + } + return true; + } + + /*------------------------------------- + * static Functions + */ + + public static DcaeConfig getDefaultConfiguration() { + return new DcaeConfig(); + } + + public static DcaeConfig getDcae(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (dcaeConfig == null) { + try { + dcaeConfig = new DcaeConfig(config, configHandler); + } catch (ConfigurationException e) { + dcaeConfig = DcaeConfig.getDefaultConfiguration(); + } + } + return dcaeConfig; + } + + public static boolean isInstantiated() { + return dcaeConfig != null; + } + + public static DcaeConfig reload() { + if (dcaeConfig == null) { + return null; + } + DcaeConfig tmpConfig; + try { + tmpConfig = new DcaeConfig(dcaeConfig.getConfig(), dcaeConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = DcaeConfig.getDefaultConfiguration(); + } + dcaeConfig = tmpConfig; + return dcaeConfig; + } + + public static void clear() { + dcaeConfig=null; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/EsConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/EsConfig.java new file mode 100644 index 000000000..958a0dfd3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/EsConfig.java @@ -0,0 +1,219 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Environment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.BaseSubConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.ISubConfigHandler; + +public class EsConfig extends BaseSubConfig { + + public static final String SECTION_MARKER_ES = "es"; + public static final String ESDATATYPENAME = "database"; + private static final String EMPTY = "empty"; + private static final String PROPERTY_KEY_CLUSTER = "esCluster"; + private static final String DEFAULT_VALUE_CLUSTER = ""; + private static EsConfig esConfig; + + private String cluster; + private String host; + private String node; + private String index; + + private EsConfig() { + super(); + this.host = EMPTY; + this.node = EMPTY; + this.index = EMPTY; + this.cluster = DEFAULT_VALUE_CLUSTER; + } + + public EsConfig cloneWithIndex(String _index) { + EsConfig c = new EsConfig(); + c.index = _index; + c.host = this.host; + c.node = this.node; + c.cluster = this.cluster; + return c; + } + + public static String getESDATATYPENAME() { + return ESDATATYPENAME; + } + + public String getCluster() { + return cluster; + } + + public void setCluster(String cluster) { + this.cluster = cluster; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getNode() { + return node; + } + + public void setNode(String node) { + this.node = node; + } + + public String getIndex() { + return index; + } + + public void setIndex(String index) { + this.index = index; + } + + @Override + public String toString() { + return "EsConfig [cluster=" + cluster + ", host=" + host + ", node=" + node + ", index=" + index + "]"; + } + + public EsConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + public EsConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + + super(config, configHandler, SECTION_MARKER_ES); + String clustername = Environment.getVar("$HOSTNAME"); + + String c = this.getString(PROPERTY_KEY_CLUSTER, clustername); + if (c != null && c.startsWith("$")) { + c = Environment.getVar(c); + } + this.cluster = c; + this.node = String.format("%s%s", this.cluster, "n1"); + this.host = "localhost"; + + if (save) { + config.setProperty(SECTION_MARKER_ES + "." + PROPERTY_KEY_CLUSTER, this.cluster); + this.save(); + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (cluster == null ? 0 : cluster.hashCode()); + result = prime * result + (host == null ? 0 : host.hashCode()); + result = prime * result + (index == null ? 0 : index.hashCode()); + result = prime * result + (node == null ? 0 : node.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + EsConfig other = (EsConfig) obj; + if (cluster == null) { + if (other.cluster != null) { + return false; + } + } else if (!cluster.equals(other.cluster)) { + return false; + } + if (host == null) { + if (other.host != null) { + return false; + } + } else if (!host.equals(other.host)) { + return false; + } + if (index == null) { + if (other.index != null) { + return false; + } + } else if (!index.equals(other.index)) { + return false; + } + if (node == null) { + if (other.node != null) { + return false; + } + } else if (!node.equals(other.node)) { + return false; + } + return true; + } + + @Override + public void save() + { + this.getConfig().setProperty(SECTION_MARKER_ES + "." + PROPERTY_KEY_CLUSTER, this.cluster); + super.save(); + } + public static boolean isInstantiated() { + return esConfig != null; + } + + public static EsConfig getDefaultConfiguration() { + return new EsConfig(); + } + + public static EsConfig getEs(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (esConfig == null) { + try { + esConfig = new EsConfig(config, configHandler); + } catch (ConfigurationException e) { + esConfig = EsConfig.getDefaultConfiguration(); + } + } + return esConfig; + } + + public static EsConfig reload() { + if (esConfig == null) { + return null; + } + EsConfig tmpConfig; + try { + tmpConfig = new EsConfig(esConfig.getConfig(), esConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = EsConfig.getDefaultConfiguration(); + } + esConfig = tmpConfig; + return esConfig; + } + + public static void clear() { + esConfig=null; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/GeoConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/GeoConfig.java new file mode 100644 index 000000000..ac9c3cb50 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/GeoConfig.java @@ -0,0 +1,163 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.impl; + +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.util.ClusterRoleInfo; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.util.ClusterRoleInfoCollection; + +public class GeoConfig { + + private static final String DEFAULT_FILENAME = "configuration/initial/geo.conf"; + private static final String LUMINA_ROOTNODENAME = "lumina-geo-cluster"; + private final String filename; + private final String rootNodename; + private ClusterRoleInfoCollection primaryRoles; + private ClusterRoleInfoCollection secondayRoles; + private RolesTable rolesTable; + + private GeoConfig() { + this(null); + } + + private GeoConfig(String filename) { + this(filename, LUMINA_ROOTNODENAME); + } + + private GeoConfig(String filename, String rootNodeName) { + this.filename = filename; + this.rootNodename = rootNodeName; + } + + public static boolean fileExists() { + File f = new File(DEFAULT_FILENAME); + return f.exists(); + } + + public static GeoConfig load() throws Exception { + return load(DEFAULT_FILENAME); + } + + public static GeoConfig load(String filename) throws Exception { + GeoConfig cfg = new GeoConfig(filename); + cfg._load(); + return cfg; + } + + private void _load() throws Exception { + this._load(ConfigFactory.parseFile(new File(this.filename))); + } + + private void _load(Config cfg) throws Exception { + this.primaryRoles = new ClusterRoleInfoCollection(); + List<String> a = cfg.getConfig(this.rootNodename).getStringList("primary_roles"); + + for (int i = 0; i < a.size(); i++) { + ClusterRoleInfo s = new ClusterRoleInfo(a.get(i)); + this.primaryRoles.add(s); + } + this.secondayRoles = new ClusterRoleInfoCollection(); + a = cfg.getConfig(this.rootNodename).getStringList("secondary_roles"); + for (int i = 0; i < a.size(); i++) { + ClusterRoleInfo s = new ClusterRoleInfo(a.get(i)); + this.secondayRoles.add(s); + } + this.checkDuplicateRoleEntries(); + this.rolesTable = new RolesTable(cfg.getConfig(this.rootNodename).getConfigList("ip_roles_table")); + } + + private void checkDuplicateRoleEntries() throws Exception { + ClusterRoleInfoCollection duplicateEntries = new ClusterRoleInfoCollection(); + for (ClusterRoleInfo primaryRole : this.primaryRoles) { + if (this.secondayRoles.contains(primaryRole)) { + duplicateEntries.add(primaryRole); + } + } + if (duplicateEntries.size() > 0) { + throw new Exception("duplicate entries found: " + duplicateEntries.toString()); + } + + } + + public static GeoConfig parse(String content) throws Exception { + GeoConfig cfg = new GeoConfig(); + cfg._load(ConfigFactory.parseString(content)); + return cfg; + } + + public ClusterRoleInfoCollection getPrimaryRoles() { + return this.primaryRoles; + } + + public ClusterRoleInfoCollection getSecondaryRoles() { + return this.secondayRoles; + } + + public boolean isPrimary(ClusterRoleInfo roleMember) { + return !this.isSecondary(roleMember); + } + + private boolean isSecondary(ClusterRoleInfo roleMember) { + if (roleMember == null) { + return false; + } + for (ClusterRoleInfo info : this.secondayRoles) { + if (info.equals(roleMember)) { + return true; + } + } + return false; + } + + @Override + public String toString() { + return "GeoConfig [filename=" + filename + ", rootNodename=" + rootNodename + ", primaryRoles=" + primaryRoles + + ", secondayRoles=" + secondayRoles + ", rolesTable=" + rolesTable + "]"; + } + + public static class RolesTableEntry { + private final ClusterRoleInfo role; + private final String ip; + + public RolesTableEntry(Config c) throws Exception { + this.role = new ClusterRoleInfo(c.getString("role")); + this.ip = c.getString("ip"); + } + + @Override + public String toString() { + return "RolesTableEntry [role=" + role + ", ip=" + ip + "]"; + } + } + public static class RolesTable extends ArrayList<RolesTableEntry> { + private static final long serialVersionUID = -9146218864237487506L; + + public RolesTable(List<? extends Config> configList) throws Exception { + for (Config c : configList) { + this.add(new RolesTableEntry(c)); + } + } + + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/PmConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/PmConfig.java new file mode 100644 index 000000000..d710efed2 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/PmConfig.java @@ -0,0 +1,209 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Environment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.BaseSubConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.ISubConfigHandler; + +public class PmConfig extends BaseSubConfig { + + private static final String SECTION_MARKER_PM = "pm"; + private static final String PROPERTY_KEY_ENABLED = "pmEnabled"; + private static final String PROPERTY_KEY_CLUSTER = "pmCluster"; + + private static final boolean DEFAULT_VALUE_ENABLED = true; + private static final String DEFAULT_VALUE_CLUSTER = ""; + private static PmConfig pmConfig; + + private boolean enabled; + + public static final String ESDATATYPENAME = "database"; + + private static final String EMPTY = "empty"; + + private String cluster; + private String host; + private String node; + + public static String getESDATATYPENAME() { + return ESDATATYPENAME; + } + + public String getCluster() { + return cluster; + } + + public void setCluster(String cluster) { + this.cluster = cluster; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public String getNode() { + return node; + } + + public void setNode(String node) { + this.node = node; + } + + public boolean isPerformanceManagerEnabled() { + return this.enabled; + } + + public PmConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + public PmConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + + super(config, configHandler, SECTION_MARKER_PM); + String clustername = Environment.getVar("$HOSTNAME"); + + this.enabled = this.getBoolean(PROPERTY_KEY_ENABLED, DEFAULT_VALUE_ENABLED); + String c = this.getString(PROPERTY_KEY_CLUSTER, clustername); + if (c != null && c.startsWith("$")) { + c = Environment.getVar(c); + } + this.cluster = c; + this.node = String.format("%s%s", this.cluster, "n1"); + this.host = "localhost"; + + if (save) { + config.setProperty(SECTION_MARKER_PM + "." + PROPERTY_KEY_ENABLED, this.enabled); + config.setProperty(SECTION_MARKER_PM + "." + PROPERTY_KEY_CLUSTER, this.cluster); + + this.save(); + } + } + + private PmConfig() { + super(); + this.cluster = EMPTY; + this.host = EMPTY; + this.node = EMPTY; + this.enabled = DEFAULT_VALUE_ENABLED; + } + + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (cluster == null ? 0 : cluster.hashCode()); + result = prime * result + (enabled ? 1231 : 1237); + result = prime * result + (host == null ? 0 : host.hashCode()); + result = prime * result + (node == null ? 0 : node.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + PmConfig other = (PmConfig) obj; + if (cluster == null) { + if (other.cluster != null) { + return false; + } + } else if (!cluster.equals(other.cluster)) { + return false; + } + if (enabled != other.enabled) { + return false; + } + if (host == null) { + if (other.host != null) { + return false; + } + } else if (!host.equals(other.host)) { + return false; + } + if (node == null) { + if (other.node != null) { + return false; + } + } else if (!node.equals(other.node)) { + return false; + } + return true; + } + + public static PmConfig getDefaultConfiguration() { + PmConfig c = new PmConfig(); + c.enabled = DEFAULT_VALUE_ENABLED; + c.cluster = DEFAULT_VALUE_CLUSTER; + return c; + } + + @Override + public String toString() { + return "PmConfig [enabled=" + enabled + ", cluster=" + cluster + ", host=" + host + ", node=" + node + "]"; + } + + public static boolean isInstantiated() { + return pmConfig != null; + } + + public static PmConfig getPm(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (pmConfig == null) { + try { + pmConfig = new PmConfig(config, configHandler); + } catch (ConfigurationException e) { + pmConfig = PmConfig.getDefaultConfiguration(); + } + } + return pmConfig; + } + + public static PmConfig reload() { + if (pmConfig == null) { + return null; + } + PmConfig tmpConfig; + try { + tmpConfig = new PmConfig(pmConfig.getConfig(), pmConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = PmConfig.getDefaultConfiguration(); + } + pmConfig = tmpConfig; + return pmConfig; + } + + public static void clear() { + pmConfig=null; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/ToggleAlarmConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/ToggleAlarmConfig.java new file mode 100644 index 000000000..da2f10a75 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/impl/ToggleAlarmConfig.java @@ -0,0 +1,139 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.BaseSubConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.ISubConfigHandler; + +public class ToggleAlarmConfig extends BaseSubConfig{ + + private static final String SECTION_MARKER_TA = "toggleAlarmFilter"; + private static final String PROPERTY_KEY_ENABLED = "taEnabled"; + private static final String PROPERTY_KEY_DELAY = "taDelay"; + + private static final boolean DEFAULT_VALUE_ENABLED = true; + private static final long DEFAULT_VALUE_DELAY = 3000; //in ms + private static ToggleAlarmConfig taConfig; + private boolean enabled; + private long delay; + + public boolean isEnabled() { + return this.enabled; + } + public long getDelay() { + return this.delay; + } + private ToggleAlarmConfig() { + super(); + this.enabled = DEFAULT_VALUE_ENABLED; + this.delay=DEFAULT_VALUE_DELAY; + } + public ToggleAlarmConfig(IniConfigurationFile config, ISubConfigHandler configHandler) throws ConfigurationException { + this(config, configHandler, true); + } + + public ToggleAlarmConfig(IniConfigurationFile config, ISubConfigHandler configHandler, boolean save) + throws ConfigurationException { + + super(config, configHandler, SECTION_MARKER_TA); + + this.enabled = this.getBoolean(PROPERTY_KEY_ENABLED, DEFAULT_VALUE_ENABLED); + this.delay = this.getLong(PROPERTY_KEY_DELAY,DEFAULT_VALUE_DELAY); + if (save) { + config.setProperty(SECTION_MARKER_TA + "." + PROPERTY_KEY_ENABLED, this.enabled); + config.setProperty(SECTION_MARKER_TA + "." + PROPERTY_KEY_DELAY, this.delay); + + this.save(); + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (delay ^ delay >>> 32); + result = prime * result + (enabled ? 1231 : 1237); + return result; + } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ToggleAlarmConfig other = (ToggleAlarmConfig) obj; + if (delay != other.delay) { + return false; + } + if (enabled != other.enabled) { + return false; + } + return true; + } + + @Override + public String toString() { + return "ToggleAlarmConfig [enabled=" + enabled + ", delay=" + delay + "]"; + } + + public static ToggleAlarmConfig getDefaultConfiguration() { + ToggleAlarmConfig c = new ToggleAlarmConfig(); + c.enabled = DEFAULT_VALUE_ENABLED; + c.delay = DEFAULT_VALUE_DELAY; + return c; + } + public static boolean isInstantiated() { + return taConfig != null; + } + + public static ToggleAlarmConfig getTa(IniConfigurationFile config, ISubConfigHandler configHandler) { + if (taConfig == null) { + try { + taConfig = new ToggleAlarmConfig(config, configHandler); + } catch (ConfigurationException e) { + taConfig = ToggleAlarmConfig.getDefaultConfiguration(); + } + } + return taConfig; + } + + public static ToggleAlarmConfig reload() { + if (taConfig == null) { + return null; + } + ToggleAlarmConfig tmpConfig; + try { + tmpConfig = new ToggleAlarmConfig(taConfig.getConfig(), taConfig.getConfigHandler(), false); + } catch (ConfigurationException e) { + tmpConfig = ToggleAlarmConfig.getDefaultConfiguration(); + } + taConfig = tmpConfig; + return taConfig; + } + + public static void clear() { + taConfig=null; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterConfig.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterConfig.java new file mode 100644 index 000000000..7d3174bce --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterConfig.java @@ -0,0 +1,133 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.util; + +import com.typesafe.config.Config; +import java.util.ArrayList; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ClusterConfig { + + private static final Logger LOG = LoggerFactory.getLogger(ClusterConfig.class); + + private final List<ClusterNodeInfo> seedNodes; + private final ClusterRoleInfoCollection roles; + private ClusterNodeInfo ismeInfo; + + public static ClusterConfig defaultSingleNodeConfig() + { + ClusterConfig cfg=new ClusterConfig(); + cfg.ismeInfo=ClusterNodeInfo.defaultSingleNodeInfo(); + cfg.seedNodes.add(cfg.ismeInfo); + cfg.roles.add(ClusterRoleInfo.defaultSingleNodeRole()); + return cfg; + } + public ClusterConfig() + { + this.seedNodes = new ArrayList<>(); + this.roles = new ClusterRoleInfoCollection(); + + } + public ClusterConfig(Config o) throws Exception { + { + this.seedNodes = new ArrayList<>(); + this.roles = new ClusterRoleInfoCollection(); + List<String> a = o.getStringList("seed-nodes"); + for (int i = 0; i < a.size(); i++) { + ClusterNodeInfo info = new ClusterNodeInfo(a.get(i)); + this.seedNodes.add(info); + } + a = o.getStringList("roles"); + for (int i = 0; i < a.size(); i++) { + ClusterRoleInfo s = new ClusterRoleInfo(a.get(i)); + this.roles.add(s); + } + int idx = this.roles.get(0).getIndex() - 1; + if (idx >= 0 && idx < this.seedNodes.size()) { + this.ismeInfo = this.seedNodes.get(idx); + } else { + this.ismeInfo = null; + } + } + + } + + public boolean isCluster() { + return this.seedNodes != null ? this.seedNodes.size() > 1 : false; + } + + public boolean isMe(ClusterNodeInfo i) { + return this.ismeInfo != null ? this.ismeInfo.equals(i) : false; + } + + public List<ClusterNodeInfo> getSeedNodes() { + return this.seedNodes; + } + + public String getHostName(String defaultValue) { + if (getRoleMemberIndex() > 0 && getRoleMemberIndex() <= seedNodes.size()) { + return this.seedNodes.get(getRoleMemberIndex()-1).getRemoteAddress(); + } else { + LOG.warn("Seednode not available for roleMemberIndex {}. Using default {}",getRoleMember(), defaultValue); + return defaultValue; + } + } + + public String getDBClusterName(String defaultValue) { + String r = null; + if (this.seedNodes != null && this.seedNodes.size() > 0) { + r = String.format("cluster-%s.%d", this.seedNodes.get(0).getRemoteAddress(), this.seedNodes.get(0).getPort()); + } + if (r == null || r.isEmpty()) { + r = defaultValue; + } + return r; + } + public String getClusterSeedNodeName() { + return this.getClusterSeedNodeName(""); + } + public String getClusterSeedNodeName(String defaultValue) { + int idx=this.getRoleMemberIndex()-1; + String r=null; + if(this.seedNodes!=null && idx>=0 && this.seedNodes.size()>0 && this.seedNodes.size()>idx) + { + r=this.seedNodes.get(idx).getSeedNodeName(); + } + if (r == null || r.isEmpty()) { + r = defaultValue; + } + return r; + } + public int getRoleMemberIndex() { + + ClusterRoleInfo role=this.roles.get("member"); + return role!=null?role.getIndex():0; + } + public ClusterRoleInfo getRoleMember() { + return this.roles.get("member"); + } + + @Override + public String toString() { + return "ClusterConfig [seedNodes=" + seedNodes + ", roles=" + roles + ", ismeInfo=" + ismeInfo + "]"; + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterNodeInfo.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterNodeInfo.java new file mode 100644 index 000000000..53dcfd102 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterNodeInfo.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ClusterNodeInfo { + private final String protocol; + private final String clusterName; + private final String remoteAdr; + private final int port; + private final String seedNodeName; + + public static ClusterNodeInfo defaultSingleNodeInfo() { + return new ClusterNodeInfo("akka.tcp","opendaylight-cluster-data","127.0.0.1",2550); + } + + public ClusterNodeInfo(String s) throws Exception { + final String regex = "([a-z.]*):\\/\\/([a-zA-Z0-9-]*)@([a-zA-Z0-9.-]*):([0-9]*)"; + final Pattern pattern = Pattern.compile(regex); + final Matcher matcher = pattern.matcher(s); + if (!matcher.find()) { + throw new Exception("invalid seedNode format"); + } + this.seedNodeName = matcher.group(); + this.protocol = matcher.group(1); + this.clusterName = matcher.group(2); + this.remoteAdr = matcher.group(3); + this.port = Integer.parseInt(matcher.group(4)); + } + + public ClusterNodeInfo(String protocol, String clustername, String remoteadr, int port) { + this.protocol=protocol; + this.clusterName=clustername; + this.remoteAdr=remoteadr; + this.port=port; + this.seedNodeName=this.protocol+"://"+this.clusterName+"@"+this.remoteAdr+":"+this.port; + } + + public String getProtocol() { + return protocol; + } + + public String getClusterName() { + return clusterName; + } + + public String getRemoteAddress() { + return remoteAdr; + } + public String getSeedNodeName() { + return seedNodeName; + } + + public int getPort() { + return port; + } + + @Override + public String toString() { + return "ClusterNodeInfo [protocol=" + protocol + ", clusterName=" + clusterName + ", remoteAdr=" + remoteAdr + + ", port=" + port + ", seedNodeName=" + seedNodeName + "]"; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterRoleInfo.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterRoleInfo.java new file mode 100644 index 000000000..fa2a21b6a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterRoleInfo.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ClusterRoleInfo { + private final String Role; + private final int Index; + + public ClusterRoleInfo(String s) throws Exception { + final String regex = "([a-zA-Z]*)-([0-9]*)"; + final Pattern pattern = Pattern.compile(regex); + final Matcher matcher = pattern.matcher(s); + if (!matcher.find()) { + throw new Exception("unexpected role format:"+s); + } + this.Role = matcher.group(1); + this.Index = Integer.parseInt(matcher.group(2)); + } + + private ClusterRoleInfo(String role, int idx) { + this.Role=role; + this.Index=idx; + } + + public static ClusterRoleInfo defaultSingleNodeRole() { + return new ClusterRoleInfo("member",1); + } + + public String getRole() { + return Role; + } + public int getIndex() { + return Index; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + Index; + result = prime * result + (Role == null ? 0 : Role.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ClusterRoleInfo other = (ClusterRoleInfo) obj; + if (Index != other.Index) { + return false; + } + if (Role == null) { + if (other.Role != null) { + return false; + } + } else if (!Role.equals(other.Role)) { + return false; + } + return true; + } + @Override + public String toString() { + return "ClusterRoleInfo [Role=" + Role + ", Index=" + Index + "]"; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterRoleInfoCollection.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterRoleInfoCollection.java new file mode 100644 index 000000000..6cb81c2af --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ClusterRoleInfoCollection.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.util; + +import java.util.ArrayList; + +public class ClusterRoleInfoCollection extends ArrayList<ClusterRoleInfo> { + private static final long serialVersionUID = 1L; + + public ClusterRoleInfo get(String role) { + for (ClusterRoleInfo info : this) { + if (info.getRole().equals(role)) { + return info; + } + } + return null; + } + + public boolean contains(ClusterRoleInfo info) { + if (info == null) { + return false; + } + for (ClusterRoleInfo i : this) { + if (i.equals(info)) { + return true; + } + } + return false; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ConfigFileObserver.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ConfigFileObserver.java new file mode 100644 index 000000000..daa572a63 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/config/util/ConfigFileObserver.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.config.util; + +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Nonnull; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.FileWatchdog; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.IniConfigurationFile.ConfigurationException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.IConfigChangedListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ConfigFileObserver extends FileWatchdog { + + private static final Logger LOG = LoggerFactory.getLogger(ConfigFileObserver.class); + + private final List<IConfigChangedListener> mConfigChangedHandlers = new ArrayList<>(); + private final IniConfigurationFile mConfig; + + public ConfigFileObserver(String filename, long pollIntervallMs, IniConfigurationFile mConfig) { + super(filename); + this.setDelay(pollIntervallMs); + this.mConfig = mConfig; + } + + @Override + protected void doOnChange() { + + LOG.debug("property file has changed"); + try { + mConfig.reLoad(); + // push event to all listeners + for (IConfigChangedListener listener : this.mConfigChangedHandlers) { + listener.onConfigChanged(); + } + } catch (ConfigurationException e) { + LOG.warn("error reloading config: " + e.getMessage()); + } + } + + public void registerConfigChangedListener(@Nonnull IConfigChangedListener l) { + if (!this.mConfigChangedHandlers.contains(l)) { + this.mConfigChangedHandlers.add(l); + } + } + + public void unregisterConfigChangedListener(IConfigChangedListener l) { + this.mConfigChangedHandlers.remove(l); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeMessages.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeMessages.java new file mode 100644 index 000000000..5f3c1aaca --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeMessages.java @@ -0,0 +1,341 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + ecompProvider.sendProblemNotification(ownKeyName, notificationXml); + * ECOMP Messages are generated an send to destination + * + * @author herbert + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.text.ParseException; +import javax.annotation.Nullable; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InventoryInformation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementRepresentation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DcaeMessages { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeSenderImpl.class); + + private static final String DCAE_NORMAL = "NORMAL"; + private static final String DCAE_MINOR = "MINOR"; + private static final String DCAE_WARNING = "WARNING"; + private static final String DCAE_CRITICAL = "CRITICAL"; + private static final String DCAE_MAJOR = "MAJOR"; + + private static final String eventNamePrefix = "fault_Microwave_Radio_Alarms"; + private static final String eventType = "Microwave_Radio_Alarms"; + private static final String eventSourceType = "Microwave_Radio"; + + private static final String charset = "UTF-8"; + + private static final HostnameVerifier allHostsValid = (hostname, session) -> true; + + private static final String CONTENT_TYPE_APPJSON = "application/json"; + + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + + //Configurable parameters + private final DcaeSender dcaeSender; + private final int heartbeatIntervallSeconds; + private final String entityName; + private final DeviceManagerImpl deviceManager; + + //Variables + private int heartbeatsequence = 0; + + public DcaeMessages(DcaeSender ecompSender, String entityName, Integer heartbeatIntervallSeconds, DeviceManagerImpl deviceManager) { + this.dcaeSender = ecompSender; + this.entityName = entityName; + this.deviceManager = deviceManager; + this.heartbeatIntervallSeconds = heartbeatIntervallSeconds; + } + + /** + * Create a heartbeat message. + * @return Result string with answer from server + */ + public String postHeartBeat() { + String epochTimeMicrosecondsString = getEpochTimeMicroseconds(); + String body = assembleHeartbeatFromTemplate(null, + epochTimeMicrosecondsString, + heartbeatsequence++, + NETCONFTIME_CONVERTER.getTimeStampAsNetconfString()).toString(); + return dcaeSender.sendDcaePost( body); + } + + /** + * ONF 1.2 Problem Notification + * @param mountPointName self-explaining + * @param notification Notification input + * @return String with answer + */ + + public String postNotification(String mountPointName, ProblemNotificationXml notification) { + + String problemName = notification.getProblem(); + String sequence = notification.getCounter(); + String objId = notification.getObjectId(); + String severity = convert( notification.getSeverity()); + String timeStamp = convert( notification.getTimeStamp() ); + + String body = assembleEventNotificationFromTemplate(null, + timeStamp, sequence, + mountPointName, objId, problemName, severity, notification.getTimeStamp() ).toString(); + + return dcaeSender.sendDcaePost( body); + } + + /** + * Setup a connection to URL with authorisation header + * @param url e.g. "https://plan.fritz.box:9092/ux/#" or " + * @param basicAuth authorisation header like "Basic SGVyYmVydDpIZXJiZXJ0" + * @param insertContentHeader + * @return Null in case of error or the URLConnection + * @throws IOException + * @throws MalformedURLException + */ + static @Nullable HttpURLConnection openConnection( URL url, String basicAuth, boolean insertContentHeader, @Nullable SSLContext sc) throws MalformedURLException, IOException { + + //Prepare the connection + HttpURLConnection newHttpConnection = null; + { + URLConnection newConnection = url.openConnection(); + if (newConnection instanceof HttpURLConnection) { + LOG.debug("Setup connection to {} ", url.toString()); + + newHttpConnection = (HttpURLConnection)newConnection; + + newHttpConnection.setDoOutput(true); // Triggers POST. + newHttpConnection.setRequestProperty("Accept-Charset", charset); + if (basicAuth != null) { + newHttpConnection.setRequestProperty("Authorization", basicAuth); + } + if (insertContentHeader) { + newHttpConnection.setRequestProperty("Content-Type", CONTENT_TYPE_APPJSON); + } + + if (newHttpConnection instanceof HttpsURLConnection) { + LOG.debug("SSL connection setup with trust all."); + HttpsURLConnection newHttpsConnection = (HttpsURLConnection)newHttpConnection; + if (sc != null) { + newHttpsConnection.setSSLSocketFactory(sc.getSocketFactory()); + } else { + LOG.warn("No SSL Contect available"); + } + newHttpsConnection.setHostnameVerifier(allHostsValid); + } + } else { + LOG.warn("URL not a HTTP protocol: {}", url); + } + } + return newHttpConnection; + } + + /* ----------------- + * Private function for message creation and with templates + */ + + /** + * Get actual microseconds + * @return String + */ + private String getEpochTimeMicroseconds() { + long microseconds = System.nanoTime() / 1000; + return String.valueOf(microseconds); + } + + /** + * Assemble heartbeat message + * @param sb StringBuffer to be used or null to allocate + * @param epochTimeMicrosecondsString Text with time stamp + * @param sequence integer sequence number + * @param eventTimeValueNetconfFormatString like this: 2018-05-14T05:32:17.292Z + * @return StringBuffer with result + */ + private StringBuffer assembleHeartbeatFromTemplate( + StringBuffer sb, + String epochTimeMicrosecondsString, + int sequence, + String eventTimeValueNetconfFormatString) { + + if (sb == null) { + sb = new StringBuffer(); + } + sb.append("{\n" + + " \"event\": {\n" + + " \"commonEventHeader\": {\n" + + " \"domain\": \"heartbeat\",\n" + + " \"eventId\": \"testpattern-ab305d54-85b4-a31b-7db2-fb6b9e546015\",\n" + + " \"eventName\": \"heartbeat_Controller\",\n" + + " \"eventType\": \"Controller\",\n" + + " \"priority\": \"Low\",\n" + + " \"reportingEntityId\": \"\",\n" + + " \"reportingEntityName\": \""+entityName+"\",\n" + + " \"sequence\": "+String.valueOf(sequence)+",\n" + + " \"sourceId\": \"\",\n" + + " \"sourceName\": \""+entityName+"\",\n" + + " \"startEpochMicrosec\": "+epochTimeMicrosecondsString+",\n" + + " \"lastEpochMicrosec\": "+epochTimeMicrosecondsString+",\n" + + " \"version\": 3.0\n" + + " },\n" + + " \"heartbeatFields\": {\n" + + " \"additionalFields\": [\n" + + " {\n" + + " \"name\": \"eventTime\",\n" + + " \"value\": \""+eventTimeValueNetconfFormatString+"\"\n" + + " }\n" + + " ],\n" + + " \"heartbeatFieldsVersion\": 1.0,\n" + + " \"heartbeatInterval\": "+heartbeatIntervallSeconds+"\n" + + " }\n" + + " }\n" + + "}\n" + ); + + return sb; + } + + /** + * Assemble notification message + * @param sb StringBuffer to be used or null to allocate + * @param epochTimeMicrosecondsString Text with time stamp + * @param sequence integer sequence number + * @param mountpointName + * @param objId + * @param problemName + * @param severity + * @return StringBuffer with result + */ + + private StringBuffer assembleEventNotificationFromTemplate(StringBuffer sb, + String epochTimeMicrosecondsString, String sequence, + String mountpointName, String objId, String problemName, String severity, String eventTimeValueNetconfFormatString + ) { + + if (sb == null) { + sb = new StringBuffer(); + } + + ONFCoreNetworkElementRepresentation optionalNe = deviceManager != null ? deviceManager.getNeByMountpoint(mountpointName) : null; + InventoryInformation neInventory = optionalNe != null ? optionalNe.getInventoryInformation() : InventoryInformation.getDefault(); + + sb.append("{\n" + + " \"event\": {\n" + + " \"commonEventHeader\": {\n" + + " \"domain\": \"fault\",\n" + + " \"eventId\": \""+mountpointName+"_"+objId+"_"+problemName+"\",\n" + + " \"eventName\": \""+eventNamePrefix+"_"+problemName+"\",\n" + + " \"eventType\": \""+eventType+"\",\n" + + " \"sequence\": "+sequence+",\n" + + " \"priority\": \"High\",\n" + + " \"reportingEntityId\": \"\",\n" + + " \"reportingEntityName\": \""+entityName+"\",\n" + + " \"sourceId\": \"\",\n" + + " \"sourceName\": \""+mountpointName+"\",\n" + + " \"startEpochMicrosec\": "+epochTimeMicrosecondsString+",\n" + + " \"lastEpochMicrosec\": "+epochTimeMicrosecondsString+",\n" + + " \"version\": 3.0\n" + + " },\n" + + " \"faultFields\": {\n" + + " \"alarmAdditionalInformation\": [\n" + + " {\n" + + " \"name\": \"eventTime\",\n" + + " \"value\": \""+eventTimeValueNetconfFormatString+"\"\n" + + " },\n" + + " {\n" + + " \"name\": \"equipType\",\n" + + " \"value\": \""+neInventory.getType()+"\"\n" + + " },\n" + + " {\n" + + " \"name\": \"vendor\",\n" + + " \"value\": \""+neInventory.getVendor()+"\"\n" + + " },\n" + + " {\n" + + " \"name\": \"model\",\n" + + " \"value\": \""+neInventory.getModel()+"\"\n" + + " }\n" + + " ],\n" + + " \"faultFieldsVersion\":2.0,\n" + + " \"eventSourceType\": \""+eventSourceType+"\",\n" + + " \"alarmCondition\": \""+problemName+"\",\n" + + " \"alarmInterfaceA\": \""+objId+"\",\n" + + " \"specificProblem\": \""+problemName+"\",\n" + + " \"eventSeverity\": \""+severity+"\",\n" + + " \"vfStatus\": \"Active\"\n" + + " }\n" + + " }\n" + + "}\n" + ); + + return sb; + } + + /* ----------------- + * Convert internal type formats into the Ecomp format + */ + + private String convert(InternalSeverity severity ) { + switch( severity ) { + case NonAlarmed: + break; + case Warning: + return DCAE_WARNING; + case Minor: + return DCAE_MINOR; + case Major: + return DCAE_MAJOR; + case Critical: + return DCAE_CRITICAL; + } + return DCAE_NORMAL; + } + + + /** + * Time has to be converted into milliseconds + * @param timeAsString time as string + * @return as string + */ + private String convert(String timeAsString) { + + long microseconds = -1; + try { + microseconds = NETCONFTIME_CONVERTER.getTimeStampFromNetconfAsMilliseconds(timeAsString) * 1000; + } catch (IllegalArgumentException | ParseException e) { + LOG.info("Can not convert timeAsString", e); + } + return String.valueOf(microseconds); + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderClient.java new file mode 100644 index 000000000..0f817323f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderClient.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.HtDevicemanagerConfiguration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.IConfigChangedListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.DcaeConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.ProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class DcaeProviderClient implements AutoCloseable, ProviderClient { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeProviderClient.class); + + private final HtDevicemanagerConfiguration htConfig; + private final IConfigChangedListener configChangedListener; + + private final Object lock = new Object();; + private DcaeProviderWorker worker; + + public DcaeProviderClient(HtDevicemanagerConfiguration cfg, String entityName, DeviceManagerImpl deviceManager) { + LOG.info("Create"); + this.htConfig=cfg; + worker = new DcaeProviderWorker(this.htConfig.getDcae(), entityName, deviceManager); + this.configChangedListener = () -> { + LOG.info("Configuration change. Worker exchanged"); + synchronized(lock) { + worker.close(); + worker = new DcaeProviderWorker(DcaeConfig.reload(), entityName, deviceManager); + } + }; + this.htConfig.registerConfigChangedListener(configChangedListener ); + + } + + @Override + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification) { + synchronized(lock) { + worker.sendProblemNotification(mountPointName, notification); + } + } + + @Override + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification, boolean neDeviceAlarm) { + sendProblemNotification(mountPointName, notification); + } + + @Override + public void close() { + this.htConfig.unregisterConfigChangedListener(configChangedListener); + synchronized(lock) { + worker.close(); + } + } + + /* --------------------------------------------------------- + * Private + */ + +} + + + diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderTask.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderTask.java new file mode 100644 index 000000000..2a169db01 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderTask.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + * Event provider to ECOMP for heartbeat message + * + * @author herbert + * + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class DcaeProviderTask implements Runnable { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeProviderTask.class); + + private int t = 0; + private final DcaeMessages dcaeMessages; + + DcaeProviderTask(DcaeMessages dcaeMessages) { + LOG.info("Create eventprovider task"); + this.dcaeMessages = dcaeMessages; + } + + private void sendHeartbeat() { + dcaeMessages.postHeartBeat(); + } + + @Override + public void run() { + LOG.debug("DCAE provider heartbeat tick start {}", t++); + sendHeartbeat(); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderWorker.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderWorker.java new file mode 100644 index 000000000..17d09ecb2 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeProviderWorker.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.DcaeConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +class DcaeProviderWorker implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeProviderWorker.class); + + private static final int MIN_HEARTBEAT_TIME_SECONDS = 30; + + private final ScheduledExecutorService scheduler; + private final DcaeSenderImpl dcaepClient; + private final DcaeMessages dcaeMessages; + private final ScheduledFuture<?> taskReference; + + public DcaeProviderWorker(DcaeConfig configuration, String entityName, DeviceManagerImpl deviceManager) { + + //Start services + LOG.info("Configuration: "+configuration); + int heartbeatSeconds = configuration.getTimerPeriodSeconds(); + if ( heartbeatSeconds < MIN_HEARTBEAT_TIME_SECONDS ) { + heartbeatSeconds = MIN_HEARTBEAT_TIME_SECONDS; + LOG.info("Adjust heartbeat intervall to minimum of { } seconds.",heartbeatSeconds); + } + + dcaepClient = new DcaeSenderImpl(configuration.getEventReveicerUrl(), configuration.getUserCredentials()); + dcaeMessages = new DcaeMessages(dcaepClient, entityName, heartbeatSeconds, deviceManager); + + //Activate task + LOG.info("Create Fault manager client Task"); + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + Runnable task = new DcaeProviderTask(dcaeMessages); + + LOG.info("Fault task created with "+heartbeatSeconds+" Seconds"); + this.taskReference = this.scheduler.scheduleAtFixedRate(task, 0, heartbeatSeconds, TimeUnit.SECONDS); + LOG.info("Fault task scheduled"); + } + + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification) { + LOG.debug("Notification answer: {}", dcaeMessages.postNotification(mountPointName, notification)); + } + + @Override + public void close() { + this.taskReference.cancel(false); + try { + this.scheduler.shutdown(); + this.scheduler.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException | SecurityException e) { + LOG.debug("Schedler shutdown interrupted with exception: ",e); + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + } + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeSender.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeSender.java new file mode 100644 index 000000000..5ebc37d51 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeSender.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl; + +/** + * @author herbert + * + */ +public interface DcaeSender { + + public String sendDcaePost(String body); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeSenderImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeSenderImpl.java new file mode 100644 index 000000000..9b386add5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeconnector/impl/DcaeSenderImpl.java @@ -0,0 +1,236 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + * Client for ECOMP notification server + * + * Reference: @link + * http://stackoverflow.com/questions/13022717/java-and-https-url-connection-without-downloading-certificate + * + * @author herbert + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.Reader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.spec.InvalidKeySpecException; +import java.util.Base64; +import javax.net.ssl.SSLContext; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.http.BaseHTTPClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DcaeSenderImpl implements DcaeSender { + + private static final Logger LOG = LoggerFactory.getLogger(DcaeSenderImpl.class); + private static final String EMPTY = ""; + private static final String charset = "UTF-8"; + + private final String urlString; + private final String basicAuth; + + private SSLContext sc = null; + private URL url = null; + private HttpURLConnection connection = null; + + public DcaeSenderImpl(String url, String userCredentials) { + + LOG.info("DcaeSenderImpl setup start with {} {}", url, userCredentials); + + this.urlString = url; + this.basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes())); + + if (urlString != null && !urlString.equals("off")) { + try { + this.url = new URL(url); + sc = BaseHTTPClient.setupSsl(true); + } catch (KeyManagementException | NoSuchAlgorithmException | UnrecoverableKeyException + | CertificateException | KeyStoreException | InvalidKeySpecException | IOException e) { + LOG.warn("SSL setup failed: {}", e.getMessage()); + } + } + LOG.info("DcaeSenderImpl setup ends"); + } + + /** + * Send message to ECOMP Server + * + * @param body for POST message + */ + @Override + public String sendDcaePost(String body) { + + if (url != null) { + try { + connection = DcaeMessages.openConnection(url, basicAuth, true, sc); + if (connection != null) { + return processPost(connection, body); + } else { + LOG.warn("No SSL context available"); + } + } catch (IOException e) { + LOG.warn("Dcae post failed {}", e.getMessage()); + } + } + return EMPTY; + } + + /** + * Connect to Server and expect answer. + * + * @return with answer body + */ + public String testConnectServer() { + + if (url != null) { + try { + connection = DcaeMessages.openConnection(url, null, false, sc); + if (connection != null) { + return receiveInitialAnswer(connection); + } + } catch (IOException e) { + LOG.warn("Dcae post failed {}", e.getMessage()); + } + } + return EMPTY; + } + + /** + * Show status in readable form for testing + * + * @return String with result + */ + public String getStatusAsString() { + StringBuffer sb = new StringBuffer(); + + sb.append("URL: " + url.getPath() + " " + url.getPort() + " Host: " + url.getHost()); + sb.append("\n"); + if (connection != null) { + sb.append("Connection setup: "); + sb.append(connection.getClass().getName()); + sb.append(" "); + } else { + sb.append("Connection setup: No connection (server problem or switched off)"); + } + return sb.toString(); + + } + + + /*------------------------------------------------------------------------------ + * Private functions + */ + + + /** + * Send Post and wait for answer + * + * @param connection + * @param body + * @return + * @throws IOException + */ + private static String processPost(HttpURLConnection connection, String body) throws IOException { + + LOG.debug("Post message: {}", connection.getURL().toString()); + if (LOG.isTraceEnabled()) { + LOG.trace("Body: {} ", body); + } + + // Send the message to destination + try (OutputStream output = connection.getOutputStream()) { + output.write(body.getBytes(charset)); + } + + // Receive answer + InputStream response = null; + BufferedReader rd = null; + StringBuilder result = new StringBuilder(); + + try { + int responseCode = connection.getResponseCode(); + LOG.debug("Response code: {}", String.valueOf(responseCode)); + + if (responseCode >= 200 && responseCode < 300) { + response = connection.getInputStream(); + } else { + response = connection.getErrorStream(); + if (response == null) { + response = connection.getInputStream(); + } + } + if (response != null) { + rd = new BufferedReader(new InputStreamReader(response)); + String line; + while ((line = rd.readLine()) != null) { + result.append(line); + } + } + } catch (IOException e) { + LOG.debug("No response received: {}", e.getMessage()); + } finally { + if (response != null) { + response.close(); + } + if (rd != null) { + rd.close(); + } + } + + LOG.trace("Result: {} ", result); + return result.toString(); + } + + /** + * Read initial answer from Server after connect + * + * @param connection that was opened + * @return String with answer message + * @throws IOException + */ + private static String receiveInitialAnswer(URLConnection iConnection) throws IOException { + + + final StringBuffer response = new StringBuffer(); + + if (iConnection != null) { + + final Reader reader = new InputStreamReader(iConnection.getInputStream()); + final BufferedReader br = new BufferedReader(reader); + String line = ""; + while ((line = br.readLine()) != null) { + response.append(line); + response.append("\n"); + } + br.close(); + } + + return response.toString(); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/Checker.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/Checker.java new file mode 100644 index 000000000..1091c41eb --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/Checker.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + * (c) highstreet technologies GmbH + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Steps to Monitor the connection to a network element during state connected + */ +abstract class Checker { + + @SuppressWarnings("unused") + private static final Logger LOG = LoggerFactory.getLogger(Checker.class); + + /** + * Check action. + * @return true if reachable, false if not + */ + abstract boolean isReachableOnce(); + + /** + * Procedure to check the connection of one mountpoint + * @return true if reachable, false if not + */ + boolean isConnected() { + return isReachableOnce(); + } +} + diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java new file mode 100644 index 000000000..0141b2663 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorImpl.java @@ -0,0 +1,208 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + * (c) 2017 highstreet technologies GmbH + */ + +package org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl; + +import java.util.Enumeration; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.listener.ODLEventListener; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Implementation of concept "Active monitoring" of a device.<br> + * <br> + * For each existing mountpoint a task runs with 120s cycle time. Every 120 seconds the check actions are performed. + * The request is handled by the NETCONF layer with a (default)configured time-out of 60 seconds.<br> + * Generated alarms, by the object/node "SDN-Controller" are (enum DeviceMonitorProblems):<br> + * - notConnected(InternalSeverity.Warning)<br> + * - noConnectionMediator(InternalSeverity.Minor)<br> + * - noConnectionNe(InternalSeverity.Critical)<br> + * <br> + * 1. Mountpoint does not exist<br> + * If the mountpoint does not exists there are no related current alarms in the database.<br> + * <br> + * 2. Created mountpoint with state "Connecting" or "UnableToConnect"<br> + * If the Mountpoint is created and connection status is "Connecting" or "UnableToConnect".<br> + * - After about 2..4 Minutes ... raise alarm "notConnected" with severity warning<br> + * <br> + * 3. Created mountpoint with state "Connection"<br> + * There are two monitor activities.<br> + * 3a. Check of Mediator connection by requesting (typical) cached data.<br> + * - After about 60 seconds raise alarm: connection-loss-mediator with severity minor<br> + * - Request from Mediator: network-element<br> + * <br> + * 3b. Check connection to NEby requesting (typical) non-cached data.<br> + * - Only if AirInterface available. The first one is used.<br> + * - Requested are the currentAlarms<br> + * - After about 60 seconds raise alarm: connection-loss-network-element with severity critical<br> + * <br> + * @author herbert + */ + +public class DeviceMonitorImpl implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(DeviceMonitorImpl.class); + + private final ConcurrentHashMap<String, DeviceMonitorTask> queue; + private final ScheduledExecutorService scheduler; + private final ODLEventListener odlEventListener; + @SuppressWarnings("unused") + private final DataBroker dataBroker; //Future usage + + /*------------------------------------------------------------- + * Construction/ destruction of service + */ + + /** + * Basic implementation of devicemonitoring + * @param odlEventListener as destination for problems + */ + public DeviceMonitorImpl(DataBroker dataBroker, ODLEventListener odlEventListener) { + LOG.info("Construct {}", this.getClass().getSimpleName()); + + this.odlEventListener = odlEventListener; + this.dataBroker = dataBroker; + this.queue = new ConcurrentHashMap<>(); + this.scheduler = Executors.newScheduledThreadPool(10); + } + + /** + * Stop the service. Stop all running monitoring tasks. + */ + @Override + synchronized public void close() { + LOG.info("Close {}", this.getClass().getSimpleName()); + + Enumeration<String> e = queue.keys(); + while (e.hasMoreElements()) { + deviceDisconnectIndication(e.nextElement()); + } + + scheduler.shutdown(); + } + + /*------------------------------------------------------------- + * Start/ stop/ update service for Mountpoint + */ + + /** + * Notify of device state changes to "connected" for slave nodes + * @param mountPointNodeName name of mount point + */ + synchronized public void deviceConnectSlaveIndication(String mountPointNodeName) { + deviceConnectMasterIndication(mountPointNodeName, null); + } + + /** + * Notify of device state changes to "connected" + * @param mountPointNodeName name of mount point + * @param ne to monitor + */ + synchronized public void deviceConnectMasterIndication(String mountPointNodeName, DeviceMonitoredNe ne) { + + LOG.debug("ne changes to connected state {}",mountPointNodeName); + createMonitoringTask(mountPointNodeName); + if (queue.containsKey(mountPointNodeName)) { + DeviceMonitorTask task = queue.get(mountPointNodeName); + task.deviceConnectIndication(ne); + } else { + LOG.warn("Monitoring task not in queue: {} {} {}", mountPointNodeName, mountPointNodeName.hashCode(), queue.size()); + } + } + + /** + * Notify of device state change to "disconnected" + * Mount point supervision + * @param mountPointNodeName to deregister + */ + synchronized public void deviceDisconnectIndication(String mountPointNodeName) { + + LOG.debug("State changes to not connected state {}",mountPointNodeName); + createMonitoringTask(mountPointNodeName); + if (queue.containsKey(mountPointNodeName)) { + DeviceMonitorTask task = queue.get(mountPointNodeName); + task.deviceDisconnectIndication(); + } else { + LOG.warn("Monitoring task not in queue: {} {} {}", mountPointNodeName, mountPointNodeName.hashCode(), queue.size()); + } + } + + /** + * removeMountpointIndication deregisters a mountpoint for registration services + * @param mountPointNodeName to deregister + */ + synchronized public void removeMountpointIndication(String mountPointNodeName) { + + if (queue.containsKey(mountPointNodeName)) { + DeviceMonitorTask task = queue.get(mountPointNodeName); + //Remove from here + queue.remove(mountPointNodeName); + + //Clear all problems + task.removeMountpointIndication(); + LOG.debug("Task stopped: {}", mountPointNodeName); + } else { + LOG.warn("Task not in queue: {}", mountPointNodeName); + } + } + + /** + * Referesh database by raising all alarms again. + */ + public void refreshAlarmsInDb() { + synchronized(queue) { + for (DeviceMonitorTask task : queue.values()) { + task.refreshAlarms(); + } + } + } + + /*------------------------------------------------------------- + * Private functions + */ + + /** + * createMountpoint registers a new mountpoint monitoring service + * @param mountPointNodeName name of mountpoint + */ + synchronized private DeviceMonitorTask createMonitoringTask(String mountPointNodeName) { + + DeviceMonitorTask task; + LOG.debug("Register for monitoring {} {}",mountPointNodeName, mountPointNodeName.hashCode()); + + if (queue.containsKey(mountPointNodeName)) { + LOG.info("Monitoring task exists"); + task = queue.get(mountPointNodeName); + } else { + LOG.info("Do start of DeviceMonitor task"); + //Runnable task = new PerformanceManagerTask(queue, databaseService); + task = new DeviceMonitorTask(mountPointNodeName, this.odlEventListener); + queue.put(mountPointNodeName, task); + task.start(scheduler); + } + return task; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorProblems.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorProblems.java new file mode 100644 index 000000000..003c2002c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorProblems.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + * Problems generated by DeviceMonitor + * + * @author herbert + * + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; + +public enum DeviceMonitorProblems { + + /** + * Mountpoint is not connected via NETCONF with NE/Mediator = ssh connection + */ + connectionLossOAM(InternalSeverity.Major), + + /** + * Mountpoint is connected via Netconf to Mediator, but mediator is not responding. + * Connection state to NE is unknown. + */ + connectionLossMediator(InternalSeverity.Major), + + /** Mountpoint is connected via Netconf to Mediator. + * This connection is OK, but mediator <-> NE Connection is not OK + */ + connectionLossNeOAM(InternalSeverity.Major); + + InternalSeverity severity; + + DeviceMonitorProblems(InternalSeverity severity) { + this.severity = severity; + } + + InternalSeverity getSeverity() { + return severity; + } + +} + diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorTask.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorTask.java new file mode 100644 index 000000000..04d15cc19 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitorTask.java @@ -0,0 +1,320 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +/** + * @author herbert + * + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.Set; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.listener.ODLEventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DeviceMonitorTask implements Runnable { + + private static final Logger LOG = LoggerFactory.getLogger(DeviceMonitorTask.class); + private static final String LOGMARKER = "DMTick"; + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + + private final String mountPointName; + private final ODLEventListener odlEventListener; + private final Checker checkConnectionToMediator; + private final Checker checkConnectionToNe; + + private int tickCounter; //Added for each tick. Not relevant for internal status + + private ScheduledFuture<?> taskHandle; + private final Object lockNe = new Object(); //USe top lock access to member ne + private @Nullable DeviceMonitoredNe ne; //Indication if in status connect or disconnect + private @Nonnull Boolean mountpointConnectingStateSupervision; //Indication of mountpoint supervision + + private final Object lockDisconnectSupervisionTickout = new Object(); + private Integer disconnectSupervisionTickout; //Tickcounter of task ticks for "not connected indication" + private Set<DeviceMonitorProblems> currentProblems; //List with actual problems. Synchronized by itself + + /*------------------------------------------------------------ + * Construction + */ + + /** + * Setup monitoring task + * @param mountPointName to monitor + * @param odlEventListener to forward problems to + */ + public DeviceMonitorTask(String mountPointName, ODLEventListener odlEventListener) { + LOG.debug("Init task {}", DeviceMonitorTask.class.getSimpleName()); + + //Setup finals + this.mountPointName = mountPointName; + this.odlEventListener = odlEventListener; + this.checkConnectionToMediator = new Checker() { + @Override + boolean isReachableOnce() { + synchronized(lockNe) { + //mountpoint state "Connected" + //If for any reason the mountpoint is Connected, but Notconf messages are not received + return ne == null ? true : ne.checkIfConnectionToMediatorIsOk(); + } + } + }; + this.checkConnectionToNe = new Checker() { + @Override + boolean isReachableOnce() { + synchronized(lockNe) { + //mountpoint state "Connected" + //If netconf mediator (netconf application software for NE) has connection loss to managed device. + //The networkelement object is available, but there is no interfacepack available. + return ne == null ? true : ne.checkIfConnectionToNeIsOk(); + } + } + }; + + //Setup parameters + this.taskHandle = null; + this.tickCounter = 0; + this.ne = null; + this.mountpointConnectingStateSupervision = false; + this.currentProblems = Collections.synchronizedSet(EnumSet.noneOf(DeviceMonitorProblems.class)); + this.disconnectSupervisionTickout = 0; + + int removed = odlEventListener.removeAllCurrentProblemsOfNode(mountPointName); + LOG.debug("{} Init task removed fault entries {}", LOGMARKER, removed); + + } + + /** + * Start for each object an own instance of the thread. + * @param scheduler for all the threads. + */ + public void start(ScheduledExecutorService scheduler) { + LOG.info("{} {} DeviceMonitor task to create", LOGMARKER, tickCounter); + if (taskHandle == null) { + startDisconnectSupervision(); + taskHandle = scheduler.scheduleAtFixedRate(this, 0, 120, TimeUnit.SECONDS); + LOG.info("DeviceMonitor task scheduled"); + } else { + LOG.error("{} {} Task already running.", LOGMARKER, tickCounter); + } + } + + /** + * Call after NE change state to connected. + * Mountpoint exists. Status is Connecting. + * @param neParam that connected + */ + + public void deviceConnectIndication(DeviceMonitoredNe neParam) { + LOG.info("{} {} Connect {} and stop.", LOGMARKER, tickCounter, mountPointName); + clear(DeviceMonitorProblems.connectionLossOAM); + synchronized(lockNe) { + this.ne = neParam; + this.mountpointConnectingStateSupervision = false; + } + stopDisconnectSupervision(); + } + + /** + * If ne is disconnected do the related actions. + * - Mountpoint exists. Status is Connecting or UnableToConnect + */ + + public void deviceDisconnectIndication() { + LOG.info("{} {} Disconnect {} and start.", LOGMARKER, tickCounter, mountPointName); + clear(DeviceMonitorProblems.connectionLossOAM); + synchronized(lockNe) { + this.ne = null; + this.mountpointConnectingStateSupervision = true; + } + startDisconnectSupervision(); + } + + /** + * Do all actions to clean up the log if mountpoint has been deleted. + * - Mountpoint removed + * Prepare cancellation of the task and cancel task + */ + + public void removeMountpointIndication() { + for (DeviceMonitorProblems problem : DeviceMonitorProblems.values()) { + clear(problem); + } + //Cancel the task + if (this.taskHandle != null) { + this.taskHandle.cancel(false); + LOG.info("{} {} DeviceMonitor task canceled for {}", LOGMARKER, tickCounter, mountPointName); + } else { + LOG.error("{} {} Task already stopped", LOGMARKER, tickCounter); + } + } + + /** + * Referesh Alarms + */ + public void refreshAlarms() { + LOG.debug("{} Start refresh of all problems",LOGMARKER); + synchronized(currentProblems) { + for (DeviceMonitorProblems problem : currentProblems) { + LOG.debug("{} Refresh problem {} Raised-status {}",LOGMARKER, problem.name(), currentProblems.contains(problem)); + odlEventListener.onProblemNotification(mountPointName, problem.name(), problem.getSeverity()); + } + } + LOG.debug("{} Finish refresh of all problems",LOGMARKER); + } + + /*------------------------------------------------------------ + * Functions to clear/raise alarm + */ + + /** + * Raise a problem, but only once + * @param problem + */ + private void raise(DeviceMonitorProblems problem) { + LOG.debug("{} Raise problem {} Raised-status {}",LOGMARKER, problem.name(), currentProblems.contains(problem)); + synchronized(currentProblems) { + if (! currentProblems.contains(problem)) { + currentProblems.add(problem); + odlEventListener.onProblemNotification(mountPointName, problem.name(), problem.getSeverity()); + } + } + } + + /** + * Raise a problem, but only once + * @param problem + */ + private void clear(DeviceMonitorProblems problem) { + LOG.debug("{} Clear problem {} Raised-status {}",LOGMARKER, problem.name(), currentProblems.contains(problem)); + synchronized(currentProblems) { + if (currentProblems.contains(problem)) { + currentProblems.remove(problem); + odlEventListener.onProblemNotification(mountPointName, problem.name(), InternalSeverity.NonAlarmed); + } + } + } + + /** + * Process problem notification cascade + * @param isReachable + * @param problem + */ + private void clearRaiseIfConnected(Checker checker, DeviceMonitorProblems problem) { + LOG.debug("{} check start {} problem {} Raised-status {}",LOGMARKER, tickCounter, problem.name(), currentProblems.contains(problem)); + if (checker.isConnected()) { + clear(problem); + } else { + raise(problem); + } + LOG.debug("{} check end {} problem {} Raised-status {}",LOGMARKER, tickCounter, problem.name(), currentProblems.contains(problem)); + } + + /*------------------------------------------------------------ + * Functions to start/stop + */ + + private void startDisconnectSupervision() { + synchronized(lockDisconnectSupervisionTickout) { + this.disconnectSupervisionTickout = 2; + } + } + + private void stopDisconnectSupervision() { + synchronized(lockDisconnectSupervisionTickout) { + this.disconnectSupervisionTickout = 0; + } + } + + private boolean processDisconnectSupervisionAndCheckExceeded() { + synchronized(lockDisconnectSupervisionTickout) { + if (disconnectSupervisionTickout == 0) { + return true; + } else if (disconnectSupervisionTickout > 0) { + disconnectSupervisionTickout--; + } + return false; + } + } + + /*------------------------------------------------------------ + * TASK + */ + + /** + * Task to monitor connectivity to Network Elements. + * Connectivity problems lead to alarm indication. + */ + @Override + public void run() { + + try { + LOG.debug("{} UTCTime {} START mountpoint {} tick {} connecting supervision {} tickout {}", + LOGMARKER, + NETCONFTIME_CONVERTER.getTimeStamp(), + mountPointName, + tickCounter, + mountpointConnectingStateSupervision, + disconnectSupervisionTickout); + + if (mountpointConnectingStateSupervision) { + LOG.debug("{} {} Mountpoint supervision {}", LOGMARKER, tickCounter, mountPointName); + if (processDisconnectSupervisionAndCheckExceeded()) { + raise(DeviceMonitorProblems.connectionLossOAM); + } + + } else { + synchronized (lockNe) { + if (ne != null) { + //checks during "Connected" + clear(DeviceMonitorProblems.connectionLossOAM); //Always cleared never raised + LOG.debug("{} {} Prepare check", LOGMARKER, tickCounter); + ne.prepareCheck(); // Prepare ne check + // Mediator check + LOG.debug("{} {} Mediator check", LOGMARKER, tickCounter); + clearRaiseIfConnected(checkConnectionToMediator, DeviceMonitorProblems.connectionLossMediator); + + // NE check + LOG.debug("{} {} Ne check", LOGMARKER, tickCounter); + clearRaiseIfConnected(checkConnectionToNe, DeviceMonitorProblems.connectionLossNeOAM); + } else { + //Monitor switch off. + LOG.debug("{} {} Monitor switch off state", LOGMARKER, tickCounter); + clear(DeviceMonitorProblems.connectionLossOAM); //Always cleared never raised + clear(DeviceMonitorProblems.connectionLossMediator); //Always cleared never raised + clear(DeviceMonitorProblems.connectionLossNeOAM); //Always cleared never raised + } + } + } + } catch (Exception e) { + //Prevent stopping the task + LOG.warn("{} {} During DeviceMontoring task",LOGMARKER, tickCounter, e); + } + LOG.debug("{} {} END", LOGMARKER, tickCounter++); + + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitoredNe.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitoredNe.java new file mode 100644 index 000000000..ec19f17b9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/devicemonitor/impl/DeviceMonitoredNe.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl; + +/** + * @author herbert + * + */ +public interface DeviceMonitoredNe { + + /** + * Prepare subsequent check calls + */ + public void prepareCheck(); + + /** + * Test connection to mediator, by getting data that have to be called from NE + * @return true if connection working, false if not + */ + public boolean checkIfConnectionToMediatorIsOk(); + + /** + * Test connection to NE via mediator, by getting data that have to be called from NE + * @return true if connection working, false if not + */ + public boolean checkIfConnectionToNeIsOk(); + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerApiServiceImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerApiServiceImpl.java new file mode 100644 index 000000000..6e8d85bda --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerApiServiceImpl.java @@ -0,0 +1,200 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl; + +import com.google.common.util.concurrent.ListenableFuture; +import java.util.List; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceRPCServiceAPI; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.impl.MaintenanceServiceImpl; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ClearCurrentFaultByNodenameInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ClearCurrentFaultByNodenameOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ClearCurrentFaultByNodenameOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.DevicemanagerService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetRequiredNetworkElementKeysInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetRequiredNetworkElementKeysOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetRequiredNetworkElementKeysOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeOutputBuilder; +import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DeviceManagerApiServiceImpl implements DevicemanagerService, AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(DevicemanagerService.class); + + private final RpcRegistration<DevicemanagerService> rpcReg; + + private MaintenanceRPCServiceAPI maintenanceService; + private ResyncNetworkElementsListener resyncCallbackListener; + + DeviceManagerApiServiceImpl(final RpcProviderRegistry rpcProviderRegistry) { + // Register ourselves as the REST API RPC implementation + LOG.info("Register RPC Service "+DevicemanagerService.class.getSimpleName()); + this.maintenanceService = null; + this.rpcReg = rpcProviderRegistry.addRpcImplementation(DevicemanagerService.class, this); + } + + public void setMaintenanceService(MaintenanceServiceImpl maintenanceService2) { + this.maintenanceService = maintenanceService2; + } + + @Override + public void close() throws Exception { + LOG.info("Close RPC Service"); + if (rpcReg != null) { + rpcReg.close(); + } + } + + /*------------------------------- + * Interfaces for MaintenanceService + */ + + @Override + public ListenableFuture<RpcResult<GetRequiredNetworkElementKeysOutput>> getRequiredNetworkElementKeys( + GetRequiredNetworkElementKeysInput input) { + return getRequiredNetworkElementKeys(); + } + + // For casablanca version no input was generated. + public ListenableFuture<RpcResult<GetRequiredNetworkElementKeysOutput>> getRequiredNetworkElementKeys() { + + LOG.info("RPC Request: getRequiredNetworkElementKeys"); + RpcResultBuilder<GetRequiredNetworkElementKeysOutput> result; + try { + GetRequiredNetworkElementKeysOutputBuilder outputBuilder = maintenanceService.getRequiredNetworkElementKeys(); + result = RpcResultBuilder.success(outputBuilder); + } catch (Exception e) { + result = RpcResultBuilder.failed(); + result.withError(ErrorType.APPLICATION, "Exception", e); + } + return result.buildFuture(); + } + + @Override + public ListenableFuture<RpcResult<ShowRequiredNetworkElementOutput>> showRequiredNetworkElement( + ShowRequiredNetworkElementInput input) { + + LOG.info("RPC Request: showRequiredNetworkElement input: {}", input.getMountpointName()); + RpcResultBuilder<ShowRequiredNetworkElementOutput> result; + + try { + ShowRequiredNetworkElementOutputBuilder outputBuilder = maintenanceService.showRequiredNetworkElement(input); + result = RpcResultBuilder.success(outputBuilder); + } catch (Exception e) { + result = RpcResultBuilder.failed(); + result.withError(ErrorType.APPLICATION, "Exception", e); + } + return result.buildFuture(); + } + + @Override + public ListenableFuture<RpcResult<SetMaintenanceModeOutput>> setMaintenanceMode(SetMaintenanceModeInput input) { + + LOG.info("RPC Request: setMaintenanceMode input: {}", input.getMountpointName()); + RpcResultBuilder<SetMaintenanceModeOutput> result; + + try { + SetMaintenanceModeOutputBuilder outputBuilder = maintenanceService.setMaintenanceMode(input); + result = RpcResultBuilder.success(outputBuilder); + } catch (Exception e) { + result = RpcResultBuilder.failed(); + result.withError(ErrorType.APPLICATION, "Exception", e); + } + return result.buildFuture(); + + } + + + + @Override + public ListenableFuture<RpcResult<GetMaintenanceModeOutput>> getMaintenanceMode(GetMaintenanceModeInput input) { + + LOG.info("RPC Request: getMaintenanceMode input: {}", input.getMountpointName()); + RpcResultBuilder<GetMaintenanceModeOutput> result; + + try { + GetMaintenanceModeOutputBuilder outputBuilder = maintenanceService.getMaintenanceMode(input); + result = RpcResultBuilder.success(outputBuilder); + } catch (Exception e) { + result = RpcResultBuilder.failed(); + result.withError(ErrorType.APPLICATION, "Exception", e); + } + return result.buildFuture(); + + } + + @Override + public ListenableFuture<RpcResult<TestMaintenanceModeOutput>> testMaintenanceMode(TestMaintenanceModeInput input) { + LOG.info("RPC Request: getMaintenanceMode input: {}", input.getMountpointName()); + RpcResultBuilder<TestMaintenanceModeOutput> result; + + try { + TestMaintenanceModeOutputBuilder outputBuilder = maintenanceService.testMaintenanceMode(input); + result = RpcResultBuilder.success(outputBuilder); + } catch (Exception e) { + result = RpcResultBuilder.failed(); + result.withError(ErrorType.APPLICATION, "Exception", e); + } + return result.buildFuture(); + + } + + + @Override + public ListenableFuture<RpcResult<ClearCurrentFaultByNodenameOutput>> clearCurrentFaultByNodename( + ClearCurrentFaultByNodenameInput input) { + LOG.info("RPC Request: clearNetworkElementAlarms input: {}", input.getNodenames()); + RpcResultBuilder<ClearCurrentFaultByNodenameOutput> result; + try { + if(this.resyncCallbackListener!=null) { + List<String> nodeNames= this.resyncCallbackListener.doClearCurrentFaultByNodename(input.getNodenames()); + ClearCurrentFaultByNodenameOutputBuilder outputBuilder = new ClearCurrentFaultByNodenameOutputBuilder(); + outputBuilder.setNodenames(nodeNames); + result = RpcResultBuilder.success(outputBuilder); + } else { + result = RpcResultBuilder.failed(); + result.withError(ErrorType.APPLICATION, "Startup running" ); + } + } catch(Exception e) { + result = RpcResultBuilder.failed(); + result.withError(ErrorType.APPLICATION, "Exception", e); + } + return result.buildFuture(); + } + + public void setResyncListener(ResyncNetworkElementsListener listener) { + this.resyncCallbackListener = listener; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java new file mode 100644 index 000000000..fcd7c1bc9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerImpl.java @@ -0,0 +1,633 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl; + +import com.google.common.base.Optional; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.aaiconnector.impl.AaiProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementFactory; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementRepresentation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter.NotificationDelayService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.HtDevicemanagerConfiguration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.AkkaConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.EsConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.GeoConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.PmConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl.DcaeProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.devicemonitor.impl.DeviceMonitorImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.listener.NetconfChangeListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.listener.ODLEventListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClientImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClientImpl2; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.index.impl.IndexConfigService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.index.impl.IndexMwtnService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.index.impl.IndexUpdateService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.impl.MaintenanceServiceImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.PerformanceManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.service.MicrowaveHistoricalPerformanceWriterService; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.controller.md.sal.binding.api.MountPointService; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInputBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.NotificationsService; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class DeviceManagerImpl implements DeviceManagerService, AutoCloseable, ResyncNetworkElementsListener { + + private static final Logger LOG = LoggerFactory.getLogger(DeviceManagerImpl.class); + private static final String APPLICATION_NAME = "DeviceManager"; + private static final String MYDBKEYNAMEBASE = "SDN-Controller"; + + // http://sendateodl:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf + private static final InstanceIdentifier<Topology> NETCONF_TOPO_IID = + InstanceIdentifier.create(NetworkTopology.class).child(Topology.class, + new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName()))); + @SuppressWarnings("unused") + private static final String STARTUPLOG_FILENAME = "etc/devicemanager.startup.log"; + // private static final String STARTUPLOG_FILENAME2 = "data/cache/devicemanager.startup.log"; + + private DataBroker dataBroker = null; + private MountPointService mountPointService = null; + private RpcProviderRegistry rpcProviderRegistry = null; + @SuppressWarnings("unused") + private NotificationPublishService notificationPublishService = null; + + private final ConcurrentHashMap<String, ONFCoreNetworkElementRepresentation> networkElementRepresentations = + new ConcurrentHashMap<>(); + + private WebSocketServiceClient webSocketService; + private HtDatabaseEventsService databaseClientEvents; + private ODLEventListener odlEventListener; + private NetconfChangeListener netconfChangeListener; + private DeviceManagerApiServiceImpl rpcApiService; + private @Nullable PerformanceManagerImpl performanceManager = null; + private ProviderClient dcaeProviderClient; + private ProviderClient aotsMProvider; + private @Nullable AaiProviderClient aaiProviderClient; + private DeviceMonitorImpl deviceMonitor; + private IndexUpdateService updateService; + private IndexConfigService configService; + private IndexMwtnService mwtnService; + private HtDatabaseNode htDatabase; + private Boolean devicemanagerInitializationOk = false; + private MaintenanceServiceImpl maintenanceService; + private NotificationDelayService<ProblemNotificationXml> notificationDelayService; + private Thread threadDoClearCurrentFaultByNodename = null; + private int refreshCounter = 0; + private AkkaConfig akkaConfig; + + // Blueprint 1 + public DeviceManagerImpl() { + LOG.info("Creating provider for {}", APPLICATION_NAME); + } + + public void setDataBroker(DataBroker dataBroker) { + this.dataBroker = dataBroker; + } + + public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) { + this.rpcProviderRegistry = rpcProviderRegistry; + + } + + public void setNotificationPublishService(NotificationPublishService notificationPublishService) { + this.notificationPublishService = notificationPublishService; + } + + public void setMountPointService(MountPointService mountPointService) { + this.mountPointService = mountPointService; + } + + public void init() { + + LOG.info("Session Initiated start {}", APPLICATION_NAME); + + // Start RPC Service + this.rpcApiService = new DeviceManagerApiServiceImpl(rpcProviderRegistry); + // Get configuration + HtDevicemanagerConfiguration config = HtDevicemanagerConfiguration.getConfiguration(); + this.akkaConfig = null; + try { + this.akkaConfig = AkkaConfig.load(); + LOG.debug("akka.conf loaded: " + akkaConfig.toString()); + } catch (Exception e1) { + LOG.warn("problem loading akka.conf: " + e1.getMessage()); + } + GeoConfig geoConfig = null; + if (akkaConfig != null && akkaConfig.isCluster()) { + LOG.info("cluster mode detected"); + if (GeoConfig.fileExists()) { + try { + LOG.debug("try to load geoconfig"); + geoConfig = GeoConfig.load(); + } catch (Exception err) { + LOG.warn("problem loading geoconfig: " + err.getMessage()); + } + } else { + LOG.debug("no geoconfig file found"); + } + } else { + LOG.info("single node mode detected"); + } + + this.notificationDelayService = new NotificationDelayService<>(config); + + EsConfig dbConfig = config.getEs(); + LOG.debug("esConfig=" + dbConfig.toString()); + // Start database + htDatabase = HtDatabaseNode.start(dbConfig, akkaConfig, geoConfig); + if (htDatabase == null) { + LOG.error("Can only run with local database. Stop initialization of devicemanager."); + } else { + // init Database Values only if singleNode or clusterMember=1 + if (akkaConfig == null || akkaConfig.isSingleNode() || akkaConfig != null && akkaConfig.isCluster() + && akkaConfig.getClusterConfig().getRoleMemberIndex() == 1) { + // Create DB index if not existing and if database is running + try { + this.configService = new IndexConfigService(htDatabase); + this.mwtnService = new IndexMwtnService(htDatabase); + } catch (Exception e) { + LOG.warn("Can not start ES access clients to provide database index config, mwtn. ",e); + } + } + // start service for device maintenance service + this.maintenanceService = new MaintenanceServiceImpl(htDatabase); + // Websockets + try { + this.webSocketService = new WebSocketServiceClientImpl2(rpcProviderRegistry); + } catch (Exception e) { + LOG.error("Can not start websocket service. Loading mock class.", e); + this.webSocketService = new WebSocketServiceClientImpl(); + } + // DCAE + this.dcaeProviderClient = new DcaeProviderClient(config, dbConfig.getCluster(), this); + + this.aaiProviderClient = new AaiProviderClient(config, this); + // EM + EsConfig emConfig = dbConfig.cloneWithIndex("sdnevents"); + + if (emConfig == null) { + LOG.warn("No configuration available. Don't start event manager"); + } else { + this.databaseClientEvents = new HtDatabaseEventsService(htDatabase); + + String myDbKeyNameExtended = MYDBKEYNAMEBASE + "-" + dbConfig.getCluster(); + + + this.odlEventListener = new ODLEventListener(myDbKeyNameExtended, webSocketService, + databaseClientEvents, dcaeProviderClient, aotsMProvider, maintenanceService); + } + + // PM + PmConfig configurationPM = config.getPm(); + LOG.info("Performance manager configuration: {}", configurationPM); + if (!configurationPM.isPerformanceManagerEnabled()) { + + LOG.info("No configuration available. Don't start performance manager"); + } else { + @Nullable + MicrowaveHistoricalPerformanceWriterService databaseClientHistoricalPerformance; + databaseClientHistoricalPerformance = new MicrowaveHistoricalPerformanceWriterService(htDatabase); + this.performanceManager = new PerformanceManagerImpl(60, databaseClientHistoricalPerformance); + } + + // DUS (Database update service) + LOG.debug("start db update service"); + this.updateService = + new IndexUpdateService(htDatabase, dbConfig.getHost(), dbConfig.getCluster(), dbConfig.getNode()); + this.updateService.start(); + + // RPC Service for specific services + this.rpcApiService.setMaintenanceService(this.maintenanceService); + this.rpcApiService.setResyncListener(this); + // DM + // DeviceMonitor has to be available before netconfSubscriptionManager is + // configured + LOG.debug("start DeviceMonitor Service"); + this.deviceMonitor = new DeviceMonitorImpl(dataBroker, odlEventListener); + + // netconfSubscriptionManager should be the last one because this is a callback + // service + LOG.debug("start NetconfSubscriptionManager Service"); + // this.netconfSubscriptionManager = new + // NetconfSubscriptionManagerOfDeviceManager(this, dataBroker); + // this.netconfSubscriptionManager.register(); + this.netconfChangeListener = new NetconfChangeListener(this, dataBroker); + this.netconfChangeListener.register(); + + this.devicemanagerInitializationOk = true; + } + LOG.info("Session Initiated end. Initialization done {}", devicemanagerInitializationOk); + } + + @Override + public void close() throws Exception { + LOG.info("DeviceManagerImpl closing ..."); + + close(performanceManager); + close(dcaeProviderClient); + close(aaiProviderClient); + close(aotsMProvider); + close(deviceMonitor); + close(updateService, configService, mwtnService); + close(htDatabase); + close(netconfChangeListener); + close(maintenanceService); + close(rpcApiService); + close(notificationDelayService); + + LOG.info("DeviceManagerImpl closing done"); + } + + + /** + * Used to close all Services, that should support AutoCloseable Pattern + * + * @param toClose + * @throws Exception + */ + private void close(AutoCloseable... toCloseList) throws Exception { + for (AutoCloseable element : toCloseList) { + if (element != null) { + element.close(); + } + } + } + + /** + * For each mounted device a mountpoint is created and this listener is called. + * + */ + @Override + public void startListenerOnNodeForConnectedState(Action action, NodeId nNodeId, NetconfNode nNode) { + + String mountPointNodeName = nNodeId.getValue(); + LOG.info("Starting Event listener on Netconf for mountpoint {} Action {}", mountPointNodeName, action); + + boolean preConditionMissing = false; + if (mountPointService == null) { + preConditionMissing = true; + LOG.warn("No mountservice available."); + } + if (!devicemanagerInitializationOk) { + preConditionMissing = true; + LOG.warn("Devicemanager initialization still pending."); + } + if (preConditionMissing) { + return; + } + + if (networkElementRepresentations.containsKey(mountPointNodeName)) { + LOG.warn("Mountpoint {} already registered. Leave startup procedure.", mountPointNodeName); + return; + } + + if (!isMaster(nNode)) { + // Change Devicemonitor-status to connected ... for non master mountpoints. + deviceMonitor.deviceConnectSlaveIndication(mountPointNodeName); + return; + } + + InstanceIdentifier<Node> instanceIdentifier = + NETCONF_TOPO_IID.child(Node.class, new NodeKey(new NodeId(mountPointNodeName))); + + Optional<MountPoint> optionalMountPoint = null; + int timeout = 10000; + while (!(optionalMountPoint = mountPointService.getMountPoint(instanceIdentifier)).isPresent() && timeout > 0) { + + LOG.info("Event listener waiting for mount point for Netconf device :: Name : {}", mountPointNodeName); + try { + Thread.sleep(1000); + timeout -= 1000; + } catch (InterruptedException e) { + LOG.info("Event listener waiting for mount point for Netconf device :: Name : {} Time: {}", + mountPointNodeName, timeout); + // Restore interrupted state... + Thread.currentThread().interrupt(); + } + } + + if (!optionalMountPoint.isPresent()) { + LOG.warn("Event listener timeout while waiting for mount point for Netconf device :: Name : {} ", + mountPointNodeName); + return; + } + // Mountpoint is present for sure + MountPoint mountPoint = optionalMountPoint.get(); + + DataBroker netconfNodeDataBroker = mountPoint.getService(DataBroker.class).orNull(); + if (netconfNodeDataBroker == null) { + LOG.info("Mountpoint is slave mountpoint {}", mountPointNodeName); + return; + } + + LOG.info("Databroker service 1:{} 2:{}", dataBroker.hashCode(), netconfNodeDataBroker.hashCode()); + // getNodeInfoTest(dataBroker); + + // create automatic empty maintenance entry into db before reading and listening for problems + this.maintenanceService.createIfNotExists(mountPointNodeName); + + // Setup microwaveEventListener for Notificationservice + + // MicrowaveEventListener microwaveEventListener = new + // MicrowaveEventListener(mountPointNodeName, websocketmanagerService, + // xmlMapper, databaseClientEvents); + ONFCoreNetworkElementRepresentation ne = ONFCoreNetworkElementFactory.create(mountPointNodeName, dataBroker, + webSocketService, databaseClientEvents, instanceIdentifier, netconfNodeDataBroker, dcaeProviderClient, + aotsMProvider, maintenanceService, notificationDelayService); + networkElementRepresentations.put(mountPointNodeName, ne); + ne.doRegisterMicrowaveEventListener(mountPoint); + + // Register netconf stream + registerNotificationStream(mountPointNodeName, mountPoint, "NETCONF"); + + // -- Read data from NE + ne.initialReadFromNetworkElement(); + ne.initSynchronizationExtension(); + + // Setup Service that monitors registration/ deregistration of session + odlEventListener.registration(mountPointNodeName); + + if (aaiProviderClient != null) { + aaiProviderClient.onDeviceRegistered(mountPointNodeName); + } + // -- Register NE to performance manager + if (performanceManager != null) { + performanceManager.registration(mountPointNodeName, ne); + } + + deviceMonitor.deviceConnectMasterIndication(mountPointNodeName, ne); + + LOG.info("Starting Event listener on Netconf device :: Name : {} finished", mountPointNodeName); + } + + // removeListenerOnNode + @Override + public void leaveConnectedState(NodeId nNodeId, NetconfNode nNode) { + String mountPointNodeName = nNodeId.getValue(); + LOG.info("leaveConnectedState for device :: Name : {}", mountPointNodeName); + + this.maintenanceService.deleteIfNotRequired(mountPointNodeName); + ONFCoreNetworkElementRepresentation ne = networkElementRepresentations.remove(mountPointNodeName); + if (ne != null) { + int problems = ne.removeAllCurrentProblemsOfNode(); + LOG.debug("Removed all {} problems from database at deregistration for {}", problems, mountPointNodeName); + if (odlEventListener != null) { + odlEventListener.deRegistration(mountPointNodeName); + } + if (performanceManager != null) { + performanceManager.deRegistration(mountPointNodeName); + } + if (aaiProviderClient != null) { + aaiProviderClient.onDeviceUnregistered(mountPointNodeName); + } + } else { + LOG.info("No related ne object for mountpoint {} to deregister .", mountPointNodeName); + } + if (deviceMonitor != null) { + deviceMonitor.deviceDisconnectIndication(mountPointNodeName); + } + + } + + /* + * @Override public void mountpointNodeCreation(NodeId nNodeId, NetconfNode nNode) { String + * mountPointNodeName = nNodeId.getValue(); LOG.info("mountpointNodeCreation {} {}", + * nNodeId.getValue(), nNode.getConnectionStatus()); + * deviceMonitor.createMountpointIndication(mountPointNodeName); } + */ + @Override + public void mountpointNodeRemoved(NodeId nNodeId) { + String mountPointNodeName = nNodeId.getValue(); + LOG.info("mountpointNodeRemoved {}", nNodeId.getValue()); + deviceMonitor.removeMountpointIndication(mountPointNodeName); + } + + /** + * Async RPC Interface implementation + */ + @Override + public @Nonnull List<String> doClearCurrentFaultByNodename(@Nullable List<String> nodeNamesInput) + throws IllegalStateException { + + if (this.databaseClientEvents == null) { + throw new IllegalStateException("dbEvents service not instantiated"); + } + + if (threadDoClearCurrentFaultByNodename != null && threadDoClearCurrentFaultByNodename.isAlive()) { + throw new IllegalStateException("A clear task is already active"); + } else { + + // Create list of mountpoints if input is empty, using the content in ES + if (nodeNamesInput == null || nodeNamesInput.size() <= 0) { + nodeNamesInput = this.databaseClientEvents.getAllNodesWithCurrentAlarms(); + } + + // Filter all mountpoints from input that were found and are known to this Cluster-node instance of + // DeviceManager + final List<String> nodeNamesHandled = new ArrayList<>(); + for (String mountpointName : nodeNamesInput) { + LOG.info("Work with mountpoint {}", mountpointName); + + if (odlEventListener != null && mountpointName.equals(odlEventListener.getOwnKeyName())) { + + // SDN Controller related alarms + // -- can not be recreated on all nodes in connected state + // -- would result in a DCAE/AAI Notification + // Conclusion for 1810 Delivery ... not covered by RPC function (See issue #43) + LOG.info("Ignore SDN Controller related alarms for {}", mountpointName); + // this.databaseClientEvents.clearFaultsCurrentOfNode(mountpointName); + // nodeNamesHandled.add(mountpointName); + + } else { + + if (mountPointService != null) { + InstanceIdentifier<Node> instanceIdentifier = + NETCONF_TOPO_IID.child(Node.class, new NodeKey(new NodeId(mountpointName))); + Optional<MountPoint> optionalMountPoint = mountPointService.getMountPoint(instanceIdentifier); + + if (!optionalMountPoint.isPresent()) { + LOG.info("Remove Alarms for unknown mountpoint {}", mountpointName); + this.databaseClientEvents.clearFaultsCurrentOfNode(mountpointName); + nodeNamesHandled.add(mountpointName); + } else { + if (networkElementRepresentations.containsKey(mountpointName)) { + LOG.info("At node known mountpoint {}", mountpointName); + nodeNamesHandled.add(mountpointName); + } else { + LOG.info("At node unknown mountpoint {}", mountpointName); + } + } + } + } + } + + // Force a sync + if (this.deviceMonitor != null) { + this.deviceMonitor.refreshAlarmsInDb(); + } + + threadDoClearCurrentFaultByNodename = new Thread(() -> { + refreshCounter++; + LOG.info("Start refresh mountpoint task {}", refreshCounter); + // for(String nodeName:nodeNamesOutput) { + for (String nodeName : nodeNamesHandled) { + ONFCoreNetworkElementRepresentation ne = networkElementRepresentations.get(nodeName); + if (ne != null) { + LOG.info("Refresh mountpoint {}", nodeName); + ne.initialReadFromNetworkElement(); + } else { + LOG.info("Unhandled mountpoint {}", nodeName); + } + } + LOG.info("End refresh mountpoint task {}", refreshCounter); + }); + threadDoClearCurrentFaultByNodename.start(); + return nodeNamesHandled; + } + }; + + /** + * Indication if init() of devicemanager successfully done. + * + * @return true if init() was sucessfull. False if not done or not successfull. + */ + public boolean isDevicemanagerInitializationOk() { + return this.devicemanagerInitializationOk; + } + + /** + * Get initialization status of database. + * + * @return true if fully initialized false if not + */ + public boolean isDatabaseInitializationFinished() { + return htDatabase == null ? false : htDatabase.getInitialized(); + } + + /*--------------------------------------------------------------------- + * Private funtions + */ + + /** + * Do the stream creation for the device. + * + * @param mountPointNodeName + * @param mountPoint + */ + private void registerNotificationStream(String mountPointNodeName, MountPoint mountPoint, String streamName) { + + final Optional<RpcConsumerRegistry> optionalRpcConsumerService = + mountPoint.getService(RpcConsumerRegistry.class); + if (optionalRpcConsumerService.isPresent()) { + final RpcConsumerRegistry rpcConsumerRegitry = optionalRpcConsumerService.get(); + final NotificationsService rpcService = rpcConsumerRegitry.getRpcService(NotificationsService.class); + if (rpcService == null) { + LOG.warn("rpcService is null for mountpoint {}", mountPointNodeName); + } else { + final CreateSubscriptionInputBuilder createSubscriptionInputBuilder = + new CreateSubscriptionInputBuilder(); + createSubscriptionInputBuilder.setStream(new StreamNameType(streamName)); + LOG.info("Event listener triggering notification stream {} for node {}", streamName, + mountPointNodeName); + try { + CreateSubscriptionInput createSubscriptionInput = createSubscriptionInputBuilder.build(); + if (createSubscriptionInput == null) { + LOG.warn("createSubscriptionInput is null for mountpoint {}", mountPointNodeName); + } else { + rpcService.createSubscription(createSubscriptionInput); + } + } catch (NullPointerException e) { + LOG.warn("createSubscription failed"); + } + } + } else { + LOG.warn("No RpcConsumerRegistry avaialble."); + } + + } + + /** + * Get NE object + * + * @param mountpoint mount point name + * @return null or NE specific data + */ + public @Nullable ONFCoreNetworkElementRepresentation getNeByMountpoint(String mountpoint) { + + return networkElementRepresentations.get(mountpoint); + + } + + /* -- LOG related functions -- */ + + + private boolean isInClusterMode() { + return this.akkaConfig == null ? false : this.akkaConfig.isCluster(); + } + + private String getClusterNetconfNodeName() { + return this.akkaConfig == null ? "" : this.akkaConfig.getClusterConfig().getClusterSeedNodeName("abc"); + } + + private boolean isMaster(NetconfNode nnode) { + if (isInClusterMode()) { + LOG.debug("check if me is responsible for node"); + String masterNodeName = nnode.getClusteredConnectionStatus() == null ? "null" + : nnode.getClusteredConnectionStatus().getNetconfMasterNode(); + /* + * List<NodeStatus> clusterNodeStatusList=nnode.getClusteredConnectionStatus()==null?null:nnode. + * getClusteredConnectionStatus().getNodeStatus(); if(clusterNodeStatusList!=null) { for(NodeStatus + * s: clusterNodeStatusList) LOG.debug("node "+s.getNode()+ + * " with status "+(s.getStatus()==null?"null":s.getStatus().getName())); } + */ + String myNodeName = getClusterNetconfNodeName(); + LOG.debug("sdnMasterNode=" + masterNodeName + " and sdnMyNode=" + myNodeName); + if (!masterNodeName.equals(myNodeName)) { + LOG.debug("netconf change but me is not master for this node"); + return false; + } + } + return true; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerService.java new file mode 100644 index 000000000..817d78d42 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/DeviceManagerService.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; + +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; + +public interface DeviceManagerService { + + public enum Action { + ADD, + REMOVE, + UPDATE + } + /** + * Managed device is connected to node/mountpoint. + * @param action provide action + * @param nNodeId id of the mountpoint + * @param nNode mountpoint contents + */ + void startListenerOnNodeForConnectedState(Action action, NodeId nNodeId, NetconfNode nNode); + + /** + * Managed device is disconnected from node/mountpoint. + * @param nNodeId id of the mountpoint + * @param nNode mountpoint contents + */ + void leaveConnectedState(NodeId nNodeId, NetconfNode nNode); + + /** + * Removal indication of node/mountpoint. + * @param nNodeId id of the mountpoint + */ + void mountpointNodeRemoved(NodeId nNodeId); +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/ProviderClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/ProviderClient.java new file mode 100644 index 000000000..922b8a0e0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/ProviderClient.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; + +public interface ProviderClient extends AutoCloseable { + + /** + * Send out problem notification, that was created by a device/ or NE + * @param mountPointName related + * @param notification xml description + */ + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification); + + /** + * Send out problem notification + * @param mountPointName related + * @param notification xml description + * @param neDeviceAlarm true indicates an NE originated alarm, false an sdncontroller generated alarm + */ + public void sendProblemNotification(String mountPointName, ProblemNotificationXml notification, boolean neDeviceAlarm); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/ResyncNetworkElementsListener.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/ResyncNetworkElementsListener.java new file mode 100644 index 000000000..d202cde40 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/ResyncNetworkElementsListener.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl; + +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public interface ResyncNetworkElementsListener +{ + /** + * Handle API Request and clean up current alarms according to the list of mountpoint id's/devices + * Implement RPC function "clear-current-fault-by-nodename" + * @return List with + * @throws IllegalStateException Illegal state exception + */ + public @Nonnull List<String> doClearCurrentFaultByNodename(@Nullable List<String> nodeNamesInput) throws IllegalStateException; + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/service/HtDatabaseEventsService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/service/HtDatabaseEventsService.java new file mode 100644 index 000000000..90b07999c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/service/HtDatabaseEventsService.java @@ -0,0 +1,228 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.database.service; + +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Nonnull; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDataBaseReaderAndWriter; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.IndexClientBuilder; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElement12Equipment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsEventBase; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsFaultCurrent; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.EsFaultLog; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.EsEquipment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.EsToplevelEquipment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment.ExtendedEquipment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.MwtNotificationBase; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Event service, writing all events into the database into the appropriate index. + * + * @author herbert + */ +public class HtDatabaseEventsService { + private static final Logger LOG = LoggerFactory.getLogger(HtDatabaseEventsService.class); + + ///** Filename in the resources with maven initialized version information */ + //private static final String RESOURCENAME = "version.properties"; // could also be a constant + ///** Index name to be used */ + private static final String INDEX = "sdnevents"; + private static final String MAPPING = "/elasticsearch/index/sdnevents/sdneventsMapping.json"; + + private HtDatabaseClientAbstract client; + private HtDataBaseReaderAndWriter<EsEventBase> eventRWEventLog; + private HtDataBaseReaderAndWriter<EsFaultCurrent> eventRWFaultCurrent; + private HtDataBaseReaderAndWriter<EsFaultLog> eventRWFaultLog; + private HtDataBaseReaderAndWriter<EsEquipment> eventRWEquipment; + private HtDataBaseReaderAndWriter<EsToplevelEquipment> eventRWToplevelEquipment; + + + // --- Construct and initialize + + public HtDatabaseEventsService(HtDatabaseNode database) { + + LOG.info("Create {} start", HtDatabaseEventsService.class); + + try { + // Create control structure + IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX).setMappingSettingJsonFileName(MAPPING); + client = clientBuilder.create(database); + clientBuilder.close(); + + eventRWEventLog = new HtDataBaseReaderAndWriter<>(client, EsEventBase.ESDATATYPENAME, EsEventBase.class); + eventRWFaultLog = new HtDataBaseReaderAndWriter<>(client, EsFaultLog.ESDATATYPENAME, EsFaultLog.class); + eventRWFaultCurrent = new HtDataBaseReaderAndWriter<>(client, EsFaultCurrent.ESDATATYPENAME, EsFaultCurrent.class); + eventRWToplevelEquipment = new HtDataBaseReaderAndWriter<>(client, EsToplevelEquipment.ESDATATYPENAME, EsToplevelEquipment.class); + eventRWEquipment = new HtDataBaseReaderAndWriter<>(client, EsEquipment.ESDATATYPENAME, EsEquipment.class); + + + } catch (Exception e) { + LOG.error("Can not start database client. Exception: {}", e.getMessage()); + } + LOG.info("Create {} finished. DB Service {} started.", HtDatabaseEventsService.class, client != null ? "sucessfully" : "not" ); + } + + // --- Function + + public void writeEventLog(ObjectCreationNotificationXml event) { + writeEventGeneric(event); + } + + public void writeEventLog(ObjectDeletionNotificationXml event) { + writeEventGeneric(event); + } + + public void writeEventLog(AttributeValueChangedNotificationXml event) { + writeEventGeneric(event); + } + + private void writeEventGeneric(MwtNotificationBase event) { + if (client == null) { + LOG.debug("No DB, can not write: {}",event.toString()); + return; + } + + LOG.debug("Write event: {}",event.toString()); + EsEventBase eventBase = new EsEventBase(); + eventBase.setProblem(event); + eventRWEventLog.doWrite(eventBase); + } + + public void writeFaultLog(ProblemNotificationXml fault) { + if (client == null) { + LOG.debug("No DB, can not write: {}",fault.toString()); + return; + } + + LOG.debug("Write fault to faultlog: {}",fault.toString()); + EsFaultLog eventProblem = new EsFaultLog(); + eventProblem.setProblem(fault); + eventRWFaultLog.doWrite(eventProblem); + } + + public void updateFaultCurrent(ProblemNotificationXml fault) { + if (client == null) { + LOG.debug("No DB, can not write: {}",fault.toString()); + return; + } + + if (!fault.isNotManagedAsCurrentProblem()) { + EsFaultCurrent eventProblem = new EsFaultCurrent(); + eventProblem.setProblem(fault); + + if (eventProblem.isNoAlarmIndication()) { + LOG.debug("Remove from currentFaults: {}",fault.toString()); + eventRWFaultCurrent.doRemove(eventProblem); + } else { + LOG.debug("Write to currentFaults: {}",fault.toString()); + eventRWFaultCurrent.doWrite(eventProblem); + } + } else { + LOG.debug("Ingnore for currentFaults: {}",fault.toString()); + } + } + + /** + * Remove all entries for one node + * @param nodeName contains the mountpointname + * @return number of deleted entries + */ + public int clearFaultsCurrentOfNode(String nodeName) { + if (client == null) { + LOG.debug("No DB, can not delete for node: {}", nodeName); + return -1; + } + LOG.debug("Remove from currentFaults all faults for node: {}", nodeName); + return eventRWFaultCurrent.doRemoveByQuery(EsFaultCurrent.getQueryForOneNode(nodeName)); + } + + /** + * Remove all entries for one node + * @param nodeName contains the mountpointname + * @param objectId of element to be deleted + * @return number of deleted entries + */ + public int clearFaultsCurrentOfNodeWithObjectId(String nodeName, String objectId) { + if (client == null) { + LOG.debug("No DB, can not delete for node: {}", nodeName); + return -1; + } + LOG.debug("Remove from currentFaults all faults for node/objectId: {}/{}", nodeName, objectId); + return eventRWFaultCurrent.doRemoveByQuery(EsFaultCurrent.getQueryForOneNodeAndObjectId(nodeName, objectId)); + + } + + /** + * Deliver list with all mountpoint/node-names in the database. + * @return List of all mountpoint/node-names the had active alarms. + */ + public @Nonnull List<String> getAllNodesWithCurrentAlarms() { + if (client == null) { + LOG.debug("No DB, can not delete for all nodes"); + return new ArrayList<>(); + } + LOG.debug("Remove from currentFaults faults for all node"); + List<String> nodeNames = new ArrayList<>(); + + for (EsFaultCurrent fault : eventRWFaultCurrent.doReadAll()) { + String nodeName = fault.getProblem().getNodeName(); + if (!nodeNames.contains(nodeName)) { + //this.clearFaultsCurrentOfNode(nodeName); -> Function shifted + nodeNames.add(nodeName); + } + } + return nodeNames; + } + + + /** + * Write inventory to DB + * @param equipment all equipment of network element + */ + public void writeInventory(ONFCoreNetworkElement12Equipment equipment) { + if (client == null) { + LOG.debug("No DB, can not write for mountpoint: {}",equipment.getMountpoint()); + return; + } + + LOG.debug("Write inventory to database for mountpoint: {}",equipment.getMountpoint()); + + EsToplevelEquipment esToplevelEquipment = new EsToplevelEquipment(); + esToplevelEquipment.set(equipment); + eventRWToplevelEquipment.doWrite(esToplevelEquipment); + + List<ExtendedEquipment> equipmentList = equipment.getEquipmentList(); + EsEquipment esEquipment; + for (ExtendedEquipment equipment1 : equipmentList) { + esEquipment = new EsEquipment(); + esEquipment.set(equipment.getMountpoint(), equipment1); + eventRWEquipment.doWrite(esEquipment); + } + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsEventBase.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsEventBase.java new file mode 100644 index 000000000..d1731459e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsEventBase.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.database.types; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.MwtNotificationBase; + +/** + * + * Event from Network to be recorded in the database + * + */ + +public class EsEventBase extends EsObject { + + public static final String ESDATATYPENAME = "eventlog"; + + private MwtNotificationBase event; + + public MwtNotificationBase getProblem() { + return event; + } + + public void setProblem(MwtNotificationBase event) { + this.event = event; + } + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultCurrent.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultCurrent.java new file mode 100644 index 000000000..b39b2e296 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultCurrent.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.database.types; + +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; + +/** + * Event from Network to be recorded in the database + * + */ + +public class EsFaultCurrent extends EsObject { + + public static final String ESDATATYPENAME = "faultcurrent"; + //private static final String NOALARM = "NonAlarmed"; + + private ProblemNotificationXml faultCurrent; + + public ProblemNotificationXml getProblem() { + return faultCurrent; + } + + public void setProblem(ProblemNotificationXml fault) { + this.faultCurrent = fault; + setEsId(fault.genSpecificEsId()); + } + + public boolean isNoAlarmIndication() { + return faultCurrent.getSeverity().isNoAlarmIndication(); + } + + /** + * TODO: termquery to matchquery, termquery with scoring, not exact matching + * @param nodeName name of the node + * @return query builder + */ + public static QueryBuilder getQueryForOneNode( String nodeName) { + return QueryBuilders.termQuery("faultCurrent.nodeName", nodeName); + } + public static QueryBuilder getQueryForAll() { + return QueryBuilders.matchAllQuery(); + } + + public static QueryBuilder getQueryForOneNodeAndObjectId( String nodeName, String objectId) { + BoolQueryBuilder bq = QueryBuilders.boolQuery(); + bq.must(QueryBuilders.termQuery("faultCurrent.nodeName", nodeName)); + bq.must(QueryBuilders.termQuery("faultCurrent.objectId", objectId)); + return bq; + //return QueryBuilders.termQuery("faultCurrent.objectId", objectId); + + } + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultLog.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultLog.java new file mode 100644 index 000000000..87c77ea99 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsFaultLog.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.database.types; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; + +/** + * + * Event from Network to be recorded in the database + * + */ + +public class EsFaultLog extends EsObject { + + public static final String ESDATATYPENAME = "faultlog"; + + private ProblemNotificationXml fault; + + public ProblemNotificationXml getProblem() { + return fault; + } + + public void setProblem(ProblemNotificationXml fault) { + this.fault = fault; + } + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsVersionInfo.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsVersionInfo.java new file mode 100644 index 000000000..ca5b36717 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/EsVersionInfo.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.database.types; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.osgi.framework.Version; + +/** + * + * Create a VersionInfo Object Network to be recorded in the database + * + */ + +public class EsVersionInfo extends EsObject { + + public static final String ESDATATYPENAME = "versioninfo"; + private static final String EMPTY = ""; + + private Version bundleVersion; + private String build = EMPTY; + private String version = EMPTY; + + public EsVersionInfo() { + } + + public Version getBundleVersion() { + return bundleVersion; + } + + public void setBundleVersion(Version bundleVersion) { + this.bundleVersion = bundleVersion; + } + + public String getBuild() { + return build; + } + + public void setBuild(String build) { + this.build = build; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + @Override + public String toString() { + return "EsVersionInfo [bundleVersion=" + bundleVersion + ", build=" + build + ", version=" + version + "]"; + } + + + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/EsEquipment.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/EsEquipment.java new file mode 100644 index 000000000..5c70ad972 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/EsEquipment.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment; + +import java.util.ArrayList; +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.Equipment; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.equipment.g.ContainedHolder; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.equipment.g.ManufacturedThing; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.manufactured.thing.g.EquipmentInstance; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.manufactured.thing.g.EquipmentType; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.manufactured.thing.g.ManufacturerProperties; + +public class EsEquipment extends EsObject { + + public static final String ESDATATYPENAME = "inventoryequipment"; + + int treeLevel; + String parentUuid; + String mountpoint; + String uuid; + List<String> containedHolder; + String manufacturerName; + String manufacturerIdentifier; + String serial; + String date; + String version; + String description; + String partTypeId; + String modelIdentifier; + String typeName; + + + public EsEquipment set( String mountpoint, ExtendedEquipment extendedEquipment ) { + + Equipment equipment = extendedEquipment.getEquipment(); + + this.parentUuid = extendedEquipment.getParentUuid(); + this.treeLevel = extendedEquipment.getTreeLevel(); + this.mountpoint = mountpoint; + this.uuid = equipment.getUuid().getValue(); + this.setEsId(this.mountpoint+"/"+this.uuid); + + this.containedHolder = new ArrayList<>(); + List<ContainedHolder> containedHolderList = equipment.getContainedHolder(); + if (containedHolderList != null && !containedHolderList.isEmpty()) { + for (ContainedHolder containedHolderElement: containedHolderList) { + this.containedHolder.add(containedHolderElement.key().getUuid().getValue()); + } + } + ManufacturedThing manufacturedThing = equipment.getManufacturedThing(); + if (manufacturedThing != null) { + ManufacturerProperties manufacturedProperties = manufacturedThing.getManufacturerProperties(); + if (manufacturedProperties != null) { + this.manufacturerName = manufacturedProperties.getManufacturerName(); + this.manufacturerIdentifier = manufacturedProperties.getManufacturerIdentifier(); + } + EquipmentInstance equipmentInstance = manufacturedThing.getEquipmentInstance(); + if (equipmentInstance != null) { + this.serial = equipmentInstance.getSerialNumber(); + this.date = equipmentInstance.getManufactureDate(); + } + EquipmentType equipmentType = manufacturedThing.getEquipmentType(); + if (equipmentType != null) { + this.version = equipmentType.getVersion(); + this.description = equipmentType.getDescription(); + this.partTypeId = equipmentType.getPartTypeIdentifier(); + this.modelIdentifier = equipmentType.getModelIdentifier(); + this.typeName = equipmentType.getTypeName(); + } + } + + return this; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/EsToplevelEquipment.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/EsToplevelEquipment.java new file mode 100644 index 000000000..a2e7af787 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/EsToplevelEquipment.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment; + +import java.util.ArrayList; +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElement12Equipment; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; + +public class EsToplevelEquipment extends EsObject { + + public static final String ESDATATYPENAME = "inventorytoplevel"; + + String mountpoint; + List<String> uuidList; + + public EsToplevelEquipment set(ONFCoreNetworkElement12Equipment coreEquipment) { + + mountpoint = coreEquipment.getMountpoint(); + this.setEsId(mountpoint); + + uuidList = new ArrayList<>(); + for (UniversalId uuid : coreEquipment.getTopLevelEqUuidList()) { + uuidList.add(uuid.getValue()); + } + + return(this); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/ExtendedEquipment.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/ExtendedEquipment.java new file mode 100644 index 000000000..cdccd97ed --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/database/types/equipment/ExtendedEquipment.java @@ -0,0 +1,56 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.database.types.equipment; + +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.Equipment; + +public class ExtendedEquipment { + + private final String parentUuid; + private final int treeLevel; + private final Equipment equipment; + + /** + * Equipment with additional information beside NETCONF equipment + * + * @param parentUuid of parent equipment + * @param equipment NETCONF Equipment + * @param treeLevel level of tree starting with root at 0 + */ + public ExtendedEquipment(String parentUuid, Equipment equipment, int treeLevel) { + super(); + this.parentUuid = parentUuid; + this.equipment = equipment; + this.treeLevel = treeLevel; + } + + public String getParentUuid() { + return parentUuid; + } + + public Equipment getEquipment() { + return equipment; + } + + public int getTreeLevel() { + return treeLevel; + } + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/MicrowaveEventListener12.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/MicrowaveEventListener12.java new file mode 100644 index 000000000..6612f626b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/MicrowaveEventListener12.java @@ -0,0 +1,205 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.listener; + +import java.util.List; + +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElement12Equipment; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementCallback; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc.OnfMicrowaveModelNotification; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter.NotificationDelayFilter; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter.NotificationDelayService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.toggleAlarmFilter.NotificationDelayedListener; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.ProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.AttributeValueChangedNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceService; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ProblemNotification; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Important: Websocket notification must be the last action. + * @author herbert + * + */ //OnfMicrowaveModelNotification // +public class MicrowaveEventListener12 implements OnfMicrowaveModelNotification, NotificationDelayedListener<ProblemNotificationXml> { + + private static final Logger LOG = LoggerFactory.getLogger(MicrowaveEventListener12.class); + + private final String nodeName; + private final WebSocketServiceClient webSocketService; + //private final WebsocketmanagerService websocketmanagerService; + //private final XmlMapper xmlMapper; + private final HtDatabaseEventsService databaseService; + private final ProviderClient dcaeProvider; + private final @Nullable ProviderClient aotsmClient; + + private final MaintenanceService maintenanceService; + + private final NotificationDelayFilter<ProblemNotificationXml> delayFilter; + private final ONFCoreNetworkElementCallback ne; + + public MicrowaveEventListener12(String nodeName, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider,@Nullable ProviderClient aotsmClient, + MaintenanceService maintenanceService2,NotificationDelayService<ProblemNotificationXml> notificationDelayService, + ONFCoreNetworkElementCallback ne) { + super(); + this.nodeName = nodeName; + //this.websocketmanagerService = websocketmanagerService; + //this.xmlMapper = xmlMapper; + this.webSocketService = webSocketService; + this.databaseService = databaseService; + this.dcaeProvider = dcaeProvider; + this.aotsmClient = aotsmClient; + this.maintenanceService=maintenanceService2; + this.delayFilter=notificationDelayService.getInstance(nodeName, this);//12(nodeName,this); + this.ne = ne; + } + + + @Override + public void onAttributeValueChangedNotification(AttributeValueChangedNotificationXml notificationXml) { + + ne.notificationFromNeListener(notificationXml); + + databaseService.writeEventLog(notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + } + + + @Override + public void onObjectCreationNotification(ObjectCreationNotificationXml notificationXml) { + + databaseService.writeEventLog(notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + + } + + @Override + public void onObjectDeletionNotification(ObjectDeletionNotificationXml notificationXml) { + + databaseService.writeEventLog(notificationXml); + + webSocketService.sendViaWebsockets(nodeName, notificationXml); + } + + @Override + public void onProblemNotification(ProblemNotificationXml notificationXml) { + + databaseService.writeFaultLog(notificationXml); + databaseService.updateFaultCurrent(notificationXml); + + //ToggleAlarmFilter functionality + if(NotificationDelayFilter.isEnabled()) + { + if(notificationXml.getSeverity() == InternalSeverity.NonAlarmed) { + delayFilter.clearAlarmNotification(notificationXml.getProblem(), notificationXml); + } else { + delayFilter.pushAlarmNotification(notificationXml.getProblem(), notificationXml); + } + } + else + { + this.pushAlarmIfNotInMaintenance(notificationXml); + } + //end of ToggleAlarmFilter + + this.webSocketService.sendViaWebsockets(nodeName, notificationXml); + + } + + @Override + public void onNotificationDelay(ProblemNotificationXml notificationXml) { + + LOG.debug("Got delayed event of type :: {}", ProblemNotification.class.getSimpleName()); + this.pushAlarmIfNotInMaintenance(notificationXml); + + } + private void pushAlarmIfNotInMaintenance(ProblemNotificationXml notificationXml) + { + if(!this.maintenanceService.isONFObjectInMaintenance(nodeName, notificationXml.getObjectId(), notificationXml.getProblem())) + { + this.dcaeProvider.sendProblemNotification(nodeName, notificationXml); + if(this.aotsmClient!=null) { + this.aotsmClient.sendProblemNotification(nodeName, notificationXml); + } + } + else + { + LOG.debug("Notification will not be sent to external services. Device "+this.nodeName+" is in maintenance mode"); + } + } + private void initCurrentProblem(ProblemNotificationXml notificationXml) { + databaseService.updateFaultCurrent(notificationXml); + //to prevent push alarms on reconnect + //=> only pushed alarms are forwared to dcae + //dcaeProvider.sendProblemNotification(nodeName, notificationXml); + if(aotsmClient!=null) { + aotsmClient.sendProblemNotification(this.nodeName, notificationXml); + } + } + + /** + * Called to initialize with the current status and notify the clients + * @param notificationXmlList List with problems + */ + public void initCurrentProblemStatus(List<ProblemNotificationXml> notificationXmlList) { + + for (ProblemNotificationXml notificationXml : notificationXmlList) { + initCurrentProblem(notificationXml); + } + + } + + /** + * Called on exit to remove everything from the current list. + * @return Number of deleted objects + */ + public int removeAllCurrentProblemsOfNode() { + int deleted = databaseService.clearFaultsCurrentOfNode(nodeName); + return deleted; + } + + /** + * Called on exit to remove for one Object-Pac from the current list. + * @param objectId uuid of the interface-pac or equipment-pac + * @return Number of deleted objects + */ + public int removeObjectsCurrentProblemsOfNode(String objectId) { + int deleted = databaseService.clearFaultsCurrentOfNodeWithObjectId(nodeName, objectId); + return deleted; + } + + /** + * Write equipment data to database + * @param equipment to write + */ + public void writeEquipment(ONFCoreNetworkElement12Equipment equipment) { + databaseService.writeInventory(equipment); + } + + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/NetconfChangeListener.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/NetconfChangeListener.java new file mode 100644 index 000000000..1a92f37b7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/NetconfChangeListener.java @@ -0,0 +1,180 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.listener; + +import java.util.Collection; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerService.Action; +import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// 07.09.18 Switched to DataTreeChangeListener from ClusteredDataTreeChangeListener -> DM Service is running at all nodes +// This is not correct +public class NetconfChangeListener implements ClusteredDataTreeChangeListener<Node>, AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(NetconfChangeListener.class); + + private static final InstanceIdentifier<Node> NETCONF_NODE_TOPO_IID = InstanceIdentifier + .create(NetworkTopology.class) + .child(Topology.class, new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName()))) + .child(Node.class); + // Name of ODL controller NETCONF instance + private static final String CONTROLLER = "controller-config"; + + private final DeviceManagerService deviceManagerService; + private final DataBroker dataBroker; + private ListenerRegistration<NetconfChangeListener> dlcReg; + + public NetconfChangeListener(DeviceManagerService deviceManagerService, DataBroker dataBroker) { + this.deviceManagerService = deviceManagerService; + this.dataBroker = dataBroker; + } + + public void register() { + DataTreeIdentifier<Node> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, + NETCONF_NODE_TOPO_IID); + dlcReg = dataBroker.registerDataTreeChangeListener(treeId, this); + } + + @Override + public void close() { + if (dlcReg != null) { + dlcReg.close(); + } + } + /*--------------------------------------------------------------------------- + * Listener + */ + + @Override + public void onDataTreeChanged(Collection<DataTreeModification<Node>> changes) { + if (LOG.isTraceEnabled()) { + LOG.trace("OnDataChange, TreeChange {}", changes); + } else if (LOG.isDebugEnabled()) { + LOG.debug("OnDataChange, TreeChange"); + } + + for (final DataTreeModification<Node> change : changes) { + final DataObjectModification<Node> root = change.getRootNode(); + final ModificationType modificationType = root.getModificationType(); + if (LOG.isTraceEnabled()) { + LOG.trace("Handle this modificationType:{} path:{} root:{}", modificationType, change.getRootPath(), root); + } + switch (modificationType) { + case SUBTREE_MODIFIED: + // Change of subtree information + // update(change); OLD + doProcessing(Action.UPDATE, root.getDataAfter()); + break; + case WRITE: + // Create or modify top level node + // Treat an overwrite as an update + boolean update = root.getDataBefore() != null; + if (update) { + //update(change); + doProcessing(Action.UPDATE, root.getDataAfter()); + } else { + //add(change); + doProcessing(Action.ADD, root.getDataAfter()); + } + break; + case DELETE: + // Node removed + //remove(change); + doProcessing(Action.REMOVE, root.getDataBefore()); + break; + } + } + } + + /* ---------------------------------------------------------------- + * Functions to select the right node from DataObjectModification + */ + + /** + * Process event and forward to clients + * @param action + * @param node Basis node + */ + private void doProcessing(Action action, Node node) { + + NodeId nodeId; + NetconfNode nnode; + try { + NodeKey nodeKey = node.key(); + nodeId = nodeKey.getNodeId(); + nnode = node.augmentation(NetconfNode.class); + } catch (NullPointerException e) { + LOG.warn("Unexpected null .. stop processing.", e); + return; + } + + LOG.debug("doProcessing action {} {}",action, nodeId); + String nodeIdString = nodeId.getValue(); + // Do not forward any controller related events to devicemanager + if (nodeIdString.equals(CONTROLLER)) { + LOG.debug("Stop processing for [{}]", nodeIdString); + return; + } + + // Related to action + if (action == Action.REMOVE) { + deviceManagerService.mountpointNodeRemoved(nodeId); //Stop Monitor + deviceManagerService.leaveConnectedState(nodeId, nnode); //Remove Mountpoint handler + return; + } + + // Related to Mountpoint status + ConnectionStatus csts = nnode.getConnectionStatus(); + LOG.debug("NETCONF Node handled with status: {} {}", csts, nnode.getClusteredConnectionStatus()); + if (csts != null) { + switch (csts) { + case Connected: { + deviceManagerService.startListenerOnNodeForConnectedState(action, nodeId, nnode); + break; + } + case UnableToConnect: + case Connecting: { + deviceManagerService.leaveConnectedState(nodeId, nnode); + break; + } + } + } else { + LOG.debug("NETCONF Node handled with null status"); + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/ODLEventListener.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/ODLEventListener.java new file mode 100644 index 000000000..ace5f123d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/listener/ODLEventListener.java @@ -0,0 +1,208 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.listener; + +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.ProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.database.service.HtDatabaseEventsService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectCreationNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ObjectDeletionNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.ProblemNotificationXml; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.xml.WebSocketServiceClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceService; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ProblemNotification; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Responsible class for documenting changes in the ODL itself. The occurence of + * such an event is documented in the database and to clients. Specific example + * here is the registration or deregistration of a netconf device. This service + * has an own eventcounter to apply to the ONF Coremodel netconf behaviour. + * + * Important: Websocket notification must be the last action. + * + * @author herbert + */ + +public class ODLEventListener { + + private static final Logger LOG = LoggerFactory.getLogger(ODLEventListener.class); + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + + + private final String ownKeyName; + + private final WebSocketServiceClient webSocketService; + private final HtDatabaseEventsService databaseService; + private final ProviderClient dcaeProvider; + private final ProviderClient aotsMProvider; + private int eventNumber; + private final MaintenanceService maintenanceService; + /*--------------------------------------------------------------- + * Construct + */ + + /** + * Create a Service to document events to clients and within a database + * + * @param ownKeyName The name of this service, that is used in the + * database as identification key. + * @param webSocketService service to direct messages to clients + * @param databaseService service to write to the database + * @param dcaeProvider to deliver problems to + * @param maintenanceService2 + */ + @SuppressWarnings("javadoc") + public ODLEventListener(String ownKeyName, WebSocketServiceClient webSocketService, + HtDatabaseEventsService databaseService, ProviderClient dcaeProvider, + @Nullable ProviderClient aotsMProvider, MaintenanceService maintenanceService) { + super(); + + this.ownKeyName = ownKeyName; + this.webSocketService = webSocketService; + + this.databaseService = databaseService; + this.dcaeProvider = dcaeProvider; + this.aotsMProvider = aotsMProvider; + + this.eventNumber = 0; + this.maintenanceService = maintenanceService; + + } + + /*--------------------------------------------------------------- + * Functions + */ + + /** + * A registration of a mountpoint occured. + * + * @param registrationName Name of the event that is used as key in the + * database. + */ + + public void registration(String registrationName) { + + ObjectCreationNotificationXml cNotificationXml = new ObjectCreationNotificationXml(ownKeyName, + popEvntNumberAsString(), InternalDateAndTime.valueOf(NETCONFTIME_CONVERTER.getTimeStamp()), + registrationName); + + // Write first to prevent missing entries + databaseService.writeEventLog(cNotificationXml); + + webSocketService.sendViaWebsockets(registrationName, cNotificationXml); + + } + + /** + * A deregistration of a mountpoint occured. + * + * @param registrationName Name of the event that is used as key in the + * database. + */ + + public void deRegistration(String registrationName) { + + ObjectDeletionNotificationXml dNotificationXml = new ObjectDeletionNotificationXml(ownKeyName, + popEvntNumberAsString(), InternalDateAndTime.valueOf(NETCONFTIME_CONVERTER.getTimeStamp()), + registrationName); + + // Write first to prevent missing entries + databaseService.writeEventLog(dNotificationXml); + + webSocketService.sendViaWebsockets(registrationName, dNotificationXml); + + } + + /** + * At a mountpoint a problem situation is indicated + * + * @param registrationName indicating object within SDN controller, normally the + * mountpointName + * @param problemName that changed + * @param problemSeverity of the problem according to NETCONF/YANG + */ + + public void onProblemNotification(String registrationName, String problemName, InternalSeverity problemSeverity) { + LOG.debug("Got event of type :: {} or {} or {}", ProblemNotification.class.getSimpleName(), + org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ProblemNotification.class + .getSimpleName(), + org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ProblemNotification.class + .getSimpleName()); + // notification + + ProblemNotificationXml notificationXml = new ProblemNotificationXml(ownKeyName, registrationName, problemName, + problemSeverity, + // popEvntNumberAsString(), InternalDateAndTime.TESTPATTERN ); + popEvntNumberAsString(), InternalDateAndTime.valueOf(NETCONFTIME_CONVERTER.getTimeStamp())); + + databaseService.writeFaultLog(notificationXml); + databaseService.updateFaultCurrent(notificationXml); + + if (!maintenanceService.isONFObjectInMaintenance(registrationName, notificationXml.getObjectId(), + notificationXml.getProblem())) { + dcaeProvider.sendProblemNotification(ownKeyName, notificationXml); + if (aotsMProvider != null) { + aotsMProvider.sendProblemNotification(ownKeyName, notificationXml, false);// not a nealarm, its a + } + } // sdncontroller alarm + else { + LOG.debug("Notification will not be sent to external services. Device " + registrationName + + " is in maintenance mode"); + } + + webSocketService.sendViaWebsockets(registrationName, notificationXml); + } + + /** + * Called on exit to remove everything for a node from the current list. + * + * @param nodeName to remove all problems for + * @return Number of deleted objects + */ + public int removeAllCurrentProblemsOfNode(String nodeName) { + return databaseService.clearFaultsCurrentOfNodeWithObjectId(ownKeyName, nodeName); + } + + /*--------------------------------------------------------------- + * Get/Set + */ + + /** + * @return the ownKeyName + */ + public String getOwnKeyName() { + return ownKeyName; + } + + /*--------------------------------------------------------------- + * Private + */ + + private String popEvntNumberAsString() { + return String.valueOf(popEvntNumber()); + } + + private int popEvntNumber() { + return eventNumber++; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/AttributeValueChangedNotificationXml.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/AttributeValueChangedNotificationXml.java new file mode 100644 index 000000000..8ec5903d1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/AttributeValueChangedNotificationXml.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; + +@XmlRootElement(name = "AttributeValueChangedNotification") +public class AttributeValueChangedNotificationXml extends MwtNotificationBase implements GetEventType { + + private static String EVENTTYPE = "AttributeValueChangedNotification"; + + @XmlElement(name = "attributeName") + private String attributeName; + + @XmlElement(name = "newValue") + private String newValue; + + public AttributeValueChangedNotificationXml() { + + } + + /** + * Normalized notification + * @param nodeName name of mountpoint + * @param counter of notification + * @param timeStamp from ne + * @param objectIdRef from ne + * @param attributeName from ne + * @param newValue from ne + */ + public AttributeValueChangedNotificationXml(String nodeName, String counter, InternalDateAndTime timeStamp, String objectIdRef, + String attributeName, String newValue) { + super(nodeName, counter, timeStamp, objectIdRef); + this.attributeName = attributeName; + this.newValue = newValue; + } + + public String getAttributeName() { + return attributeName; + } + + public String getNewValue() { + return newValue; + } + + @Override + public String getEventType() { + return EVENTTYPE; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/GetEventType.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/GetEventType.java new file mode 100644 index 000000000..ba3e23c77 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/GetEventType.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +/** + * @author herbert + * + */ +public interface GetEventType { + public String getEventType(); +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/MwtNotificationBase.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/MwtNotificationBase.java new file mode 100644 index 000000000..149640641 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/MwtNotificationBase.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +import com.fasterxml.jackson.annotation.JsonProperty; +import javax.xml.bind.annotation.XmlElement; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; + +public class MwtNotificationBase { + + private static String EMPTY = "empty"; + + private String nodeName; + private String counter; + private String timeStamp; + private String objectId; + + public MwtNotificationBase() { + // For Jaxb + } + + public MwtNotificationBase(String nodeName, String counter, InternalDateAndTime timeStamp, String objectId) { + this.nodeName = nodeName; + this.counter = counter; + this.timeStamp = timeStamp.getValue(); + this.objectId = objectId; + if (this.objectId == null) { + this.objectId = EMPTY; + } + } + + @XmlElement(name = "nodeName") + public String getNodeName() { + return nodeName; + } + + @XmlElement(name = "counter") + public String getCounter() { + return counter; + } + + @XmlElement(name = "timeStamp") + public String getTimeStamp() { + return timeStamp; + } + + @XmlElement(name = "objectId") + public String getObjectId() { + return objectId; + } + + /** + * Type for the Database to document the the same name that is used in the websockets. + * @return String with type name of child class + */ + @JsonProperty("type") + public String getType() { + return this.getClass().getSimpleName(); + } + + @Override + public String toString() { + return "MwtNotificationBase [getType()="+ getType() + ", nodeName=" + nodeName + ", counter=" + counter + ", timeStamp=" + timeStamp + + ", objectId=" + objectId + "]"; + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ObjectCreationNotificationXml.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ObjectCreationNotificationXml.java new file mode 100644 index 000000000..b404073b7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ObjectCreationNotificationXml.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +import javax.xml.bind.annotation.XmlRootElement; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; + +@XmlRootElement(name = "ObjectCreationNotification") +public class ObjectCreationNotificationXml extends MwtNotificationBase implements GetEventType { + + private static String EVENTTYPE = "ObjectCreationNotification"; + + public ObjectCreationNotificationXml() { + + } + + /** + * Normalized notification + * @param nodeName name of mountpoint or instance that owns the problem + * @param counter of notification + * @param timeStamp from ne + * @param objectIdRef from ne + */ + public ObjectCreationNotificationXml(String nodeName, String counter, InternalDateAndTime timeStamp, String objectIdRef) { + super(nodeName, counter, timeStamp, objectIdRef); + } + + /*public ObjectCreationNotificationXml(String nodeName, org.opendaylight.yang.gen.v1.uri.onf.microwavemodel.notifications.rev160809.ObjectCreationNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + } + + public ObjectCreationNotificationXml(String nodeName, org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectCreationNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), + notification.getObjectIdRef().getValue()); + }*/ + + @Override + public String getEventType() { + return EVENTTYPE; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ObjectDeletionNotificationXml.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ObjectDeletionNotificationXml.java new file mode 100644 index 000000000..c61a94ac4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ObjectDeletionNotificationXml.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +import javax.xml.bind.annotation.XmlRootElement; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; + +@XmlRootElement(name = "ObjectDeletionNotification") +public class ObjectDeletionNotificationXml extends MwtNotificationBase implements GetEventType { + + private static String EVENTTYPE = "ObjectDeletionNotification"; + + public ObjectDeletionNotificationXml() { + + } + + /** + * Normalized notification + * @param nodeName name of mountpoint or instance that owns the problem + * @param counter of notification + * @param timeStamp from ne + * @param objectIdRef from ne + */ + public ObjectDeletionNotificationXml(String nodeName, String counter, InternalDateAndTime timeStamp, String objectIdRef) { + super(nodeName, counter, timeStamp, objectIdRef); + } + + /* + public ObjectDeletionNotificationXml(String nodeName, ObjectDeletionNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), +// notification.getObjectId().getValue()); + notification.getObjectIdRef().getValue()); + }*/ +/* + public ObjectDeletionNotificationXml(String nodeName, org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ObjectDeletionNotification notification) { + super(nodeName, notification.getCounter().toString(), InternalDateAndTime.valueOf(notification.getTimeStamp()), +// notification.getObjectId().getValue()); + notification.getObjectIdRef().getValue()); + } +*/ + @Override + public String getEventType() { + return EVENTTYPE; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ProblemNotificationXml.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ProblemNotificationXml.java new file mode 100644 index 000000000..282c1bad9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/ProblemNotificationXml.java @@ -0,0 +1,115 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalDateAndTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InternalSeverity; + +@XmlRootElement(name = "ProblemNotification") +public class ProblemNotificationXml extends MwtNotificationBase implements GetEventType { + + private static String EVENTTYPE = "ProblemNotification"; + private static final Pattern pattern = Pattern.compile(".*\\[layerProtocol=(.*)\\]"); + /** + * The leading indication for notification or events that are not in the + * currentProblem data of the ONF Coremodel + */ + private static final String NOCURRENTPROBLEMINDICATION = "#"; + + @XmlElement(name = "problem") + private String problem; + + @XmlElement(name = "severity") + private InternalSeverity severity; + + public ProblemNotificationXml() { + + } + + /** + * Generic Problem. All the parameters are of type Strings according to YANG + * specification. + * + * @param nodeName Name of mountpoint + * @param uuId Name of Interface Pac + * @param problemNameString Name of the problem + * @param problemSeverityString Severitycode of the problem + * @param counterString Counter from device + * @param internaltimeStampString Timestamp according to internal format. + */ + public ProblemNotificationXml(String nodeName, String uuId, String problemNameString, + InternalSeverity problemSeverityString, String counterString, InternalDateAndTime internaltimeStampString) { + super(nodeName, counterString, internaltimeStampString, uuId); + this.problem = problemNameString; + this.severity = problemSeverityString; + } + + public String getProblem() { + return problem; + } + + public InternalSeverity getSeverity() { + return severity; + } + + public boolean isNotManagedAsCurrentProblem() { + return problem.startsWith(NOCURRENTPROBLEMINDICATION); + } + + /** + * Create a specific ES id for the current log. + * + * @return a string with the generated ES Id + */ + @JsonIgnore + public String genSpecificEsId() { + + String uuId; + + Matcher matcher = pattern.matcher(getObjectId()); + if (matcher.matches() && matcher.groupCount() == 1) { + uuId = matcher.group(1); + } else { + uuId = getObjectId(); + } + + StringBuffer strBuf = new StringBuffer(); + strBuf.append(getNodeName()); + strBuf.append("/"); + strBuf.append(uuId); + strBuf.append("/"); + strBuf.append(getProblem()); + return strBuf.toString(); + } + + @Override + public String toString() { + return "ProblemNotificationXml [problem=" + problem + ", severity=" + severity + ", toString()=" + + super.toString() + "]"; + } + + @Override + public String getEventType() { + return EVENTTYPE; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClient.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClient.java new file mode 100644 index 000000000..8cfd63d39 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClient.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +/** + * Wrapper for forwarding websocket notifications to the websocket service, that is running as container. + * @author herbert + */ +public interface WebSocketServiceClient { + + public <T extends MwtNotificationBase & GetEventType> void sendViaWebsockets(String nodeName, T notificationXml); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl.java new file mode 100644 index 000000000..af1a32de3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.listener.ODLEventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * WrapperMock class for web-socket notifications to the web-socket service. + */ +public class WebSocketServiceClientImpl implements WebSocketServiceClient { + + private static final Logger LOG = LoggerFactory.getLogger(ODLEventListener.class); + + public WebSocketServiceClientImpl() { + } + + @Override + public <T extends MwtNotificationBase & GetEventType> void sendViaWebsockets(String nodeName, T notificationXml) { + LOG.info("Dummy to send websocket event {} for mountpoint {}", notificationXml.getClass().getSimpleName(), nodeName); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java new file mode 100644 index 000000000..0cc83cf50 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/WebSocketServiceClientImpl2.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +import java.util.concurrent.Future; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.listener.ODLEventListener; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketEventInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketEventOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.websocketmanager.rev150105.WebsocketmanagerService; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Wrapper for forwarding web-socket notifications to the web-socket service, that is running as + * bundle. + */ +public class WebSocketServiceClientImpl2 implements WebSocketServiceClient { + + private static final Logger LOG = LoggerFactory.getLogger(ODLEventListener.class); + + private final WebsocketmanagerService websocketmanagerService; + private final XmlMapper xmlMapper; + + /** + * Implementation of Websocket notification processor. + * + * @param rpcProviderRegistry to get MDSAL services. + */ + public WebSocketServiceClientImpl2(RpcProviderRegistry rpcProviderRegistry) { + super(); + this.websocketmanagerService = rpcProviderRegistry.getRpcService(WebsocketmanagerService.class); + this.xmlMapper = new XmlMapper(); + } + + @Override + public <T extends MwtNotificationBase & GetEventType> void sendViaWebsockets(String nodeName, T notificationXml) { + LOG.info("Send websocket event {} for mountpoint {}", notificationXml.getClass().getSimpleName(), nodeName); + + try { + WebsocketEventInputBuilder wsBuilder = new WebsocketEventInputBuilder(); + wsBuilder.setNodeName(nodeName); + wsBuilder.setEventType(notificationXml.getEventType()); + wsBuilder.setXmlEvent(xmlMapper.getXmlString(notificationXml)); + Future<RpcResult<WebsocketEventOutput>> result = websocketmanagerService.websocketEvent(wsBuilder.build()); + LOG.info("Send websocket result: {}", result.get().getResult().getResponse()); + } catch (Exception e) { + LOG.warn("Can not send websocket event {} for mountpoint {} {}", notificationXml.getClass().getSimpleName(), + nodeName, e.toString()); + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/XmlMapper.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/XmlMapper.java new file mode 100644 index 000000000..897795a0e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/impl/xml/XmlMapper.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.impl.xml; + +import java.io.StringWriter; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class XmlMapper { + private static final Logger LOG = LoggerFactory.getLogger(XmlMapper.class); + + public String getXmlString(MwtNotificationBase base) { + String xml; + JAXBContext jaxbContext; + try { + jaxbContext = JAXBContext.newInstance(AttributeValueChangedNotificationXml.class, + ObjectCreationNotificationXml.class, ObjectDeletionNotificationXml.class, + ProblemNotificationXml.class); + Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); + jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); + + StringWriter stringWriter = new StringWriter(); + jaxbMarshaller.marshal(base, stringWriter); + xml = stringWriter.toString(); + } catch (JAXBException e) { + LOG.warn("Problem in marshalling xml file {}", e); + xml = null; + } + return xml; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexConfigService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexConfigService.java new file mode 100644 index 000000000..25e18eb23 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexConfigService.java @@ -0,0 +1,58 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.index.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.IndexClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Setup index mwtn in the database + * @author herbert + * + */ +public class IndexConfigService implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(IndexConfigService.class); + + /** Index name to be used */ + private static final String INDEX = "config"; + /** Location of configuration data **/ + private static final String MODELDATA = "/elasticsearch/index/config"; + + private final HtDatabaseClientAbstract client; + + // --- Construct and initialize + + public IndexConfigService(HtDatabaseNode database) throws Exception { + LOG.info("Create {} start", this.getClass().getSimpleName()); + + IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX).setModelDataDirectory(MODELDATA); + client = clientBuilder.create(database); + clientBuilder.close(); + LOG.info("Create {} finished. DB Service sucessfully started.", this.getClass().getSimpleName()); + } + + @Override + public void close() throws Exception { + client.close(); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexMwtnService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexMwtnService.java new file mode 100644 index 000000000..4a9ac9881 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexMwtnService.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.index.impl; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.IndexClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Setup index mwtn in the database + * @author herbert + * + */ +public class IndexMwtnService implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(IndexMwtnService.class); + + /** Index name to be used */ + public static final String INDEX = "mwtn"; + /** Location of mapping data **/ + private static final String MAPPING = "/elasticsearch/index/mwtn/mwtnMapping.json"; + /** Location of configuration data **/ + private static final String MODELDATA = "/elasticsearch/index/mwtn/modelDescription"; + + private final HtDatabaseClientAbstract client; + + // --- Construct and initialize + + public IndexMwtnService(HtDatabaseNode database) throws Exception { + LOG.info("Create {} start", this.getClass().getSimpleName()); + + IndexClientBuilder clientBuilder = IndexClientBuilder.getBuilder(INDEX) + .setMappingSettingJsonFileName(MAPPING) + .setModelDataDirectory(MODELDATA); + client = clientBuilder.create(database); + clientBuilder.close(); + LOG.info("Create {} finished. DB Service sucessfully started.", this.getClass().getSimpleName()); + } + + /** + * Get client to be used in other services + * @return client + */ + public HtDatabaseClientAbstract getClient() { + return client; + } + + + + @Override + public void close() throws Exception { + client.close(); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexUpdateService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexUpdateService.java new file mode 100644 index 000000000..db567f28c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/index/impl/IndexUpdateService.java @@ -0,0 +1,111 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.index.impl; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseUpdateFile; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseWebAPIClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseUpdateFile.EsUpdateObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseUpdateFile.FileReadCallback; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class IndexUpdateService implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(IndexUpdateService.class); + + private static final String FILENAME = "etc/elasticsearch_update.zip"; + + private final HtDatabaseWebAPIClient webClient; + + private final boolean autoremove=true; + + @SuppressWarnings("unused") + private ScheduledFuture<?> taskHandle; + private final ScheduledExecutorService scheduler; + @SuppressWarnings("unused") + private final HtDatabaseNode database; + + private final FileReadCallback onReadUpdateFile = new FileReadCallback() + { + @Override + public void read(EsUpdateObject obj,String filename) { + try { + IndexUpdateService.this.webClient.sendRequest(obj.Uri, obj.Method, obj.Body); + LOG.info("run database update file {}", filename); + } catch (IOException e) { + LOG.warn("problem for request {}", obj.Uri); + } + } + + @Override + public void onerror(String filename,IOException e) { + LOG.warn("problem reading content file {} : {}", filename, e.getMessage()); + } + + }; + private final Runnable checkForUpdateTask = () -> { + File f=new File(FILENAME); + if(f.exists()) + { + LOG.debug("found update file {}", f.getAbsolutePath()); + try { + HtDatabaseUpdateFile updateFile=new HtDatabaseUpdateFile(FILENAME); + if(updateFile.readFiles(onReadUpdateFile)) + { + LOG.info("update successful"); + } + updateFile.close(); + if(IndexUpdateService.this.autoremove) + { + boolean res = f.delete(); + LOG.debug("autodelete updatefile done {}", res); + } + + } catch (IOException e) { + LOG.warn("problem with update file: {}", e.getMessage()); + } + } + }; + + + + public IndexUpdateService(HtDatabaseNode database, String esNodeserverName, String esClusterName, String esNodeName) { + this.database = database; + this.webClient = new HtDatabaseWebAPIClient(); + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + } + public void start() + { + this.taskHandle = this.scheduler.scheduleAtFixedRate(checkForUpdateTask, 0, 120, TimeUnit.SECONDS); + } + public void stop() + { + this.scheduler.shutdown(); + } + @Override + public void close() throws Exception { + stop(); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/MaintenanceRPCServiceAPI.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/MaintenanceRPCServiceAPI.java new file mode 100644 index 000000000..3687625a0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/MaintenanceRPCServiceAPI.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.maintenance; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetRequiredNetworkElementKeysOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeOutputBuilder; + +public interface MaintenanceRPCServiceAPI { + + public GetRequiredNetworkElementKeysOutputBuilder getRequiredNetworkElementKeys(); + + public ShowRequiredNetworkElementOutputBuilder showRequiredNetworkElement(ShowRequiredNetworkElementInput input); + + public GetMaintenanceModeOutputBuilder getMaintenanceMode(GetMaintenanceModeInput input); + + public SetMaintenanceModeOutputBuilder setMaintenanceMode(SetMaintenanceModeInput input); + + public TestMaintenanceModeOutputBuilder testMaintenanceMode(TestMaintenanceModeInput input); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/MaintenanceService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/MaintenanceService.java new file mode 100644 index 000000000..e9aec4146 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/MaintenanceService.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.maintenance; + +public interface MaintenanceService { + + /** + * Verify maintenance state of given object according to the filter settings. + * The object is specified by the criteria provided in the parameters. + * The data _id (uuid) is equal to the mountpointReference. + * @param mountpointReference used as reference, to query the data from database. + * @param objectIdRef first level id in onf core model, delivered by notification objectid + * @param problem problem name of device, delivered in problem notification + * @return boolean indication + */ + boolean isONFObjectInMaintenance(String mountpointReference, String objectIdRef, String problem); + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceFilter.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceFilter.java new file mode 100644 index 000000000..46b434217 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceFilter.java @@ -0,0 +1,227 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types; + +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSetter; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Collections; +import java.util.Map; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.maintenance.mode.g.Filter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.maintenance.mode.g.filter.Definition; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.DataContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * One filter element to describe a maintenance status for an object referenced by definition. + * TODO: Merge Filter and ES driven implementation + */ +public class EsMaintenanceFilter implements Filter { + + private static final Logger LOG = LoggerFactory.getLogger(EsMaintenanceFilter.class); + + private static ZoneId EsMaintenanceFilterTimeZone = ZoneId.of("UTC"); + //private static DateTimeFormatter FORMAT = DateTimeFormatter.ISO_DATE_TIME; // "1986-04-08T12:30:00" + private static DateTimeFormatter FORMAT = DateTimeFormatter.ISO_OFFSET_DATE_TIME; // 2011-12-03T10:15:30+01:00 + private static ZonedDateTime EMPTYDATETIME = ZonedDateTime.ofInstant(Instant.EPOCH, EsMaintenanceFilterTimeZone); + private static String EMPTY = ""; + + //yang tools + @JsonIgnore + private final Map<java.lang.Class<? extends Augmentation<Filter>>, Augmentation<Filter>> augmentation = Collections.emptyMap(); + + @JsonIgnore + private ZonedDateTime start = EMPTYDATETIME; + @JsonIgnore + private ZonedDateTime end = EMPTYDATETIME; + + private EsMaintenanceFilterDefinition definition = new EsMaintenanceFilterDefinition(); + private String description = EMPTY; + + // For jackson + public EsMaintenanceFilter() { + } + + public EsMaintenanceFilter(Filter filter) { + setStartAsString(filter.getStartDate()); + setEndAsString(filter.getEndDate()); + description = filter.getDescription(); + definition = new EsMaintenanceFilterDefinition(filter.getDefinition()); + } + + /*------ + * start + */ + public ZonedDateTime getStart() { + return start; + } + @JsonGetter("start") + public String getStartAsString() { + return toString(start); + } + public void setStart(ZonedDateTime start) { + this.start = start; + } + @JsonSetter("start") + public void setStartAsString(String startAsString) { + this.start = valueOf(startAsString); + } + + /*------ + * end + */ + public ZonedDateTime getEnd() { + return end; + } + @JsonGetter("end") + public String getEndAsString() { + return toString(end); + } + public void setEnd(ZonedDateTime end) { + this.end = end; + } + @JsonSetter("end") + public void setEndAsString(String endAsString) { + this.end = valueOf(endAsString); + } + + /*----------------- + * other parameters + */ + + public EsMaintenanceFilterDefinition getDefinition2() { + return definition; + } + public void setDefinition(EsMaintenanceFilterDefinition definition) { + this.definition = definition; + } + @Override + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + + /** + * Get the actual time in the Filter time zone. + * @return actual Time + */ + public static ZonedDateTime getNow() { + return ZonedDateTime.now(EsMaintenanceFilterTimeZone); + } + + + /** + * Verify if the filter is active for an object + * @param now point of time to verify + * @return if the object is covered by filter and now within point of time + */ + public boolean isInMaintenance(String objectIdRef, String problem, ZonedDateTime now) { + return definition.appliesToObjectReference(objectIdRef, problem) && isInPeriod(start, end, now); + } + + @Override + public String toString() { + return "EsMaintenanceFilter [start=" + start + ", end=" + end + ", definition=" + definition + ", description=" + + description + "]"; + } + + /*--------------------------------------------- + * YANG tools related functions for interface + */ + + @Override + public Class<? extends DataContainer> getImplementedInterface() { + return Filter.class; + } + + @SuppressWarnings("unchecked") + @Override + public <E extends Augmentation<Filter>> E augmentation(Class<E> augmentationType) { + return (E) augmentation.get(augmentationType); + } + + @Override + public Definition getDefinition() { + return definition; + } + + @Override + public String getStartDate() { + return getStartAsString(); + } + + @Override + public String getEndDate() { + return getEndAsString(); + } + + /*--------------------------------------------- + * private static helper functions to verify + */ + + /** + * Compare the if probe is within the range of start and end. + * @param start of range + * @param end of range + * @param probe time to verify + * @return boolean result true if (start <= probe <= end) + */ + public static boolean isInPeriod(ZonedDateTime start, ZonedDateTime end, ZonedDateTime probe) { + return start.compareTo(end) < 0 && start.compareTo(probe) <= 0 && end.compareTo(probe) >= 0; + } + + /** + * Convert to time value to String + * @param ldt ZonedDateTime format + * @return String output + */ + public static String toString(ZonedDateTime ldt) { + if(ldt==null) { + return ""; + } + return ldt.format(FORMAT); + } + + /** + * Convert String to time value + * @param zoneTimeString with time + * @return ZonedDateTime string + */ + public static ZonedDateTime valueOf(String zoneTimeString) { + if (zoneTimeString == null || zoneTimeString.isEmpty()) { + LOG.warn("Null or empty zoneTimeString"); + return EMPTYDATETIME; + } + try { + return ZonedDateTime.parse(zoneTimeString, FORMAT); + } catch (DateTimeParseException e) { + LOG.warn("Can not parse zoneTimeString '{}'",zoneTimeString); + return EMPTYDATETIME; + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceFilterDefinition.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceFilterDefinition.java new file mode 100644 index 000000000..c548a98e2 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceFilterDefinition.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types; + +import java.util.Collections; +import java.util.Map; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.maintenance.mode.g.filter.Definition; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.DataContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class EsMaintenanceFilterDefinition implements Definition { + + private static final Logger LOG = LoggerFactory.getLogger(EsMaintenanceFilterDefinition.class); + private static final String ALL = ""; + + //yang tools + @JsonIgnore + private final Map<java.lang.Class<? extends Augmentation<Definition>>, Augmentation<Definition>> augmentation = Collections.emptyMap(); + + private String objectIdRef = ALL; + private String problem = ALL; + + public EsMaintenanceFilterDefinition() { + } + + public EsMaintenanceFilterDefinition(Definition definition) { + objectIdRef = definition.getObjectIdRef(); + problem = definition.getProblem(); + } + + @Override + @JsonProperty("object-id-ref") + public String getObjectIdRef() { + return objectIdRef; + } + + @JsonProperty("object-id-ref") + public void setObjectIdRef(String objectIdRef) { + this.objectIdRef = objectIdRef == null ? ALL : objectIdRef; + } + + @Override + @JsonProperty("problem") + public String getProblem() { + return problem; + } + + @JsonProperty("problem") + public void setProblem(String pProblem) { + this.problem = pProblem == null ? ALL : pProblem; + } + + public boolean appliesToObjectReference(String pObjectIdRef, String pProblem) { + boolean res = (pObjectIdRef.isEmpty() || pObjectIdRef.contains(pObjectIdRef)) && (pProblem.isEmpty() || pProblem.contains(pProblem)); + LOG.debug("Check result applies {}: {} {} against: {}",res, pObjectIdRef, pProblem, this); + return res; + } + + @Override + public String toString() { + return "EsMaintenanceFilterDefinition [objectIdRef=" + objectIdRef + ", problem=" + problem + "]"; + } + + @Override + public Class<? extends DataContainer> getImplementedInterface() { + return Definition.class; + } + + @Override + public <E extends Augmentation<Definition>> @Nullable E augmentation(Class<E> augmentationType) { + return null; + } + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceMode.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceMode.java new file mode 100644 index 000000000..456c146b1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/database/types/EsMaintenanceMode.java @@ -0,0 +1,181 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.MaintenanceModeG; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.maintenance.mode.g.Filter; +import org.opendaylight.yangtools.yang.binding.DataContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Database record entry for maintenance mode, as specified. Used for read operations Structure: _id + * : Contains the mountpoint name, must be specified before read. startTime: String representing + * Java LocalDateTime with absolute UTC Time endTime: String representing Java LocalDateTime with + * absolute UTC Time JSON Structure example { "_index": "mwtn_v1", "_type": "maintenancemode", + * "_id": "LumpiWave-Z3", "_score": 1, "_source": { "node": "LumpiWave-Z3", "filter": [ { + * "definition": { "object-id-ref": "", "problem": "" }, "description": "", "start": + * "2018-01-01T10:00+00:00", "end": "2018-10-10T10:00+00:00" }, { "definition": { "object-id-ref": + * "network-element", "problem": "power-alarm" }, "description": "", "start": + * "2018-01-01T10:00+00:00", "end": "2018-10-10T10:00+00:00" } ] } }, + * + * Two filters for all element and one for network-element power-alarm + */ + +public class EsMaintenanceMode extends EsObject implements MaintenanceModeG { + + @SuppressWarnings("unused") + private static final Logger LOG = LoggerFactory.getLogger(EsMaintenanceMode.class); + + public static final String ESDATATYPENAME = "maintenancemode"; + + private static final EsMaintenanceMode NOT_IN_MAINTENANCE = new EsMaintenanceMode("notinmaintenance"); + + private String node; + + @JsonDeserialize(as = ArrayList.class) + private List<EsMaintenanceFilter> filter; + + private boolean active; + + // for jackson + public EsMaintenanceMode() { + this.active = false; + this.filter = new ArrayList<>(); + } + + public EsMaintenanceMode(String mountpoint) { + this(); + this.setEsId(mountpoint); + this.node = mountpoint; + } + + public EsMaintenanceMode(MaintenanceModeG maintenanceModeG) { + this.setEsId(maintenanceModeG.getMountpointName()); + this.node = maintenanceModeG.getNodeName(); + List<Filter> filters = maintenanceModeG.getFilter(); + if (filter != null) { + for (Filter filterElement : filters) { + this.filter.add(new EsMaintenanceFilter(filterElement)); + } + } + } + + + public String getNode() { + return node; + } + + public void setNode(String node) { + this.node = node; + } + + public List<EsMaintenanceFilter> getFilter2() { + return filter; + } + + public void setActive(boolean a) { + this.active = a; + } + + /** + * Replace list with new one. + * + * @param filterList new filter list + */ + public void setFilter(List<EsMaintenanceFilter> filterList) { + this.filter = filterList; + } + + /** + * Add one filter to internal list + * + * @param pFilter the Filter + */ + public void addFilter(EsMaintenanceFilter pFilter) { + this.filter.add(pFilter); + } + + /** + * Verify maintenance status + * + * @param objectIdRef NETCONF object id + * @param problem name that was provided + * @param now time to verify with + * @return true if in maintenance status + */ + public boolean isONFObjectInMaintenance(String objectIdRef, String problem, ZonedDateTime now) { + if (!active) { + return false; + } + boolean res = false; + if (this != NOT_IN_MAINTENANCE) { + for (EsMaintenanceFilter oneFilter : filter) { + if (oneFilter.isInMaintenance(objectIdRef, problem, now)) { + res = true; + break; + } + } + } + return res; + } + + /** Shortcut **/ + public boolean isONFObjectInMaintenance(String objectIdRef, String problem) { + return isONFObjectInMaintenance(objectIdRef, problem, EsMaintenanceFilter.getNow()); + } + + @Override + public String toString() { + return "EsMaintenanceMode [node=" + node + ", filter=" + filter + ", active=" + active + "]"; + } + + public static EsMaintenanceMode getNotInMaintenance() { + return NOT_IN_MAINTENANCE; + } + + /*--------------------------------------------- + * yang tools related functions + */ + + @Override + public Class<? extends DataContainer> getImplementedInterface() { + return MaintenanceModeG.class; + } + + @Override + public String getMountpointName() { + return this.getEsId(); + } + + @Override + public String getNodeName() { + return node; + } + + @Override + public List<Filter> getFilter() { + return filter.isEmpty() ? null : new ArrayList<>(filter); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/impl/MaintenanceServiceImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/impl/MaintenanceServiceImpl.java new file mode 100644 index 000000000..1db3433e2 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/maintenance/impl/MaintenanceServiceImpl.java @@ -0,0 +1,269 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.maintenance.impl; + +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.Nonnull; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsBaseRequireNetworkElement; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDataBaseReaderAndWriter; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.index.impl.IndexMwtnService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceRPCServiceAPI; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.MaintenanceService; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types.EsMaintenanceFilter; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types.EsMaintenanceFilterDefinition; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types.EsMaintenanceMode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetMaintenanceModeOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.GetRequiredNetworkElementKeysOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.SetMaintenanceModeOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.ShowRequiredNetworkElementOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.TestMaintenanceModeOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.devicemanager.rev190109.show.required.network.element.output.RequiredNetworkElementBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MaintenanceServiceImpl implements MaintenanceService, MaintenanceRPCServiceAPI, AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(MaintenanceServiceImpl.class); + + /** + * Use the Client Index + */ + private HtDataBaseReaderAndWriter<EsMaintenanceMode> maintenanceRW; + private HtDataBaseReaderAndWriter<EsBaseRequireNetworkElement> requiredNeRW; + + public MaintenanceServiceImpl(HtDatabaseClientAbstract client) { + + LOG.info("Create {} start", MaintenanceServiceImpl.class); + + try { + // Create control structure + maintenanceRW = new HtDataBaseReaderAndWriter<>(client, EsMaintenanceMode.ESDATATYPENAME, EsMaintenanceMode.class); + requiredNeRW = new HtDataBaseReaderAndWriter<>(client, EsBaseRequireNetworkElement.ESDATATYPENAME, EsBaseRequireNetworkElement.class); + + } catch (Exception e) { + LOG.error("Can not start database client. Exception: {}", e.getMessage()); + } + LOG.info("Create {} finished. DB Service {} started.", MaintenanceServiceImpl.class, client != null ? "sucessfully" : "not" ); + + } + + public MaintenanceServiceImpl(HtDatabaseNode database) { + this(getDatabaseClient(database)); + } + + private static HtDatabaseClientAbstract getDatabaseClient(HtDatabaseNode database) { + return new HtDatabaseClientAbstract(IndexMwtnService.INDEX,database); + } + + /** + * Get existing object for mountpoint to manage maintenance mode + * @return Object with configuration + */ + private @Nonnull EsMaintenanceMode getMaintenance(String mountpointId) + { + EsMaintenanceMode deviceMaintenanceMode = null; + if (maintenanceRW != null) { + deviceMaintenanceMode = maintenanceRW.doRead(mountpointId); + } + + return deviceMaintenanceMode == null ? EsMaintenanceMode.getNotInMaintenance() : deviceMaintenanceMode; + } + /** + * Check in required ne if entry exists for mountpointNodeName + * @param mountPointNodeName + * @return + */ + private boolean isRequireNe(String mountPointNodeName) { + EsBaseRequireNetworkElement ne=null; + if( requiredNeRW!=null) + { + LOG.debug("searching for entry in required-networkelement for "+mountPointNodeName); + ne = requiredNeRW.doRead(mountPointNodeName); + } else { + LOG.warn("cannot read db. no db reader writer initialized"); + } + return ne!=null; + } + public EsMaintenanceMode createIfNotExists(String mountpointId) + { + EsMaintenanceMode deviceMaintenanceMode = null; + if (maintenanceRW != null) + { + deviceMaintenanceMode = maintenanceRW.doRead(mountpointId); + if(deviceMaintenanceMode==null) + { + LOG.debug("creating empty maintenance object in database"); + deviceMaintenanceMode=new EsMaintenanceMode(mountpointId); + EsMaintenanceFilter filter = new EsMaintenanceFilter(); + filter.setDescription(""); + filter.setStart(null); + filter.setEnd(null); + EsMaintenanceFilterDefinition definition=new EsMaintenanceFilterDefinition(); + definition.setObjectIdRef(""); + definition.setProblem(""); + filter.setDefinition(definition); + deviceMaintenanceMode.addFilter(filter ); + maintenanceRW.doWrite(deviceMaintenanceMode); + } else { + LOG.debug("maintenance object already exists in database"); + } + } else { + LOG.warn("cannot create maintenance obj. db reader/writer is null"); + } + + return deviceMaintenanceMode; + } + public void deleteIfNotRequired(String mountPointNodeName) { + + if(!this.isRequireNe(mountPointNodeName)) + { + EsMaintenanceMode deviceMaintenanceMode = new EsMaintenanceMode(mountPointNodeName); + if (maintenanceRW != null) + { + LOG.debug("removing maintenance object in database for "+mountPointNodeName); + maintenanceRW.doRemove(deviceMaintenanceMode); + } else { + LOG.warn("cannot create maintenance obj. db reader/writer is null"); + } + } + + } + + + + /*------------------------------------------------- + * Interface AutoClosable + */ + + @Override + public void close() throws Exception { + } + + /*------------------------------------------------- + * Interface MaintenanceRPCServiceAPI + */ + + @Override + public GetRequiredNetworkElementKeysOutputBuilder getRequiredNetworkElementKeys() { + GetRequiredNetworkElementKeysOutputBuilder outputBuilder = new GetRequiredNetworkElementKeysOutputBuilder(); + List<EsMaintenanceMode> all = maintenanceRW != null ? maintenanceRW.doReadAll() : new ArrayList<>(); + List<String> mountpointList = new ArrayList<>(); + for (EsMaintenanceMode oneOfAll : all) { + mountpointList.add(oneOfAll.getEsId()); + + } + outputBuilder.setMountpointNames(mountpointList); + return outputBuilder; + } + + @Override + public ShowRequiredNetworkElementOutputBuilder showRequiredNetworkElement(ShowRequiredNetworkElementInput input) { + ShowRequiredNetworkElementOutputBuilder outputBuilder = new ShowRequiredNetworkElementOutputBuilder(); + EsMaintenanceMode maintenanceMode = new EsMaintenanceMode(input.getMountpointName()); + if (maintenanceRW != null) { + maintenanceMode = maintenanceRW.doRead(maintenanceMode); + } + if (maintenanceMode != null) { + RequiredNetworkElementBuilder valueBuilder = new RequiredNetworkElementBuilder(); + + valueBuilder.setMountpointName(maintenanceMode.getNode()); + valueBuilder.setStatus(String.valueOf(maintenanceMode.isONFObjectInMaintenance("",""))); + valueBuilder.setDescription("Pretty description here"); + outputBuilder.setRequiredNetworkElement(valueBuilder.build()); + } else { + LOG.warn("No info in database for {}",input.getMountpointName()); + } + return outputBuilder; + } + + @Override + public GetMaintenanceModeOutputBuilder getMaintenanceMode(GetMaintenanceModeInput input) { + EsMaintenanceMode maintenanceMode = null; + GetMaintenanceModeOutputBuilder outputBuilder; + if (maintenanceRW != null) { + maintenanceMode = maintenanceRW.doRead(input.getMountpointName()); + } + if (maintenanceMode != null) { + outputBuilder = new GetMaintenanceModeOutputBuilder(maintenanceMode); + } else { + throw new IllegalArgumentException("No info in database for "+input.getMountpointName()); + } + return outputBuilder; + } + + @Override + public SetMaintenanceModeOutputBuilder setMaintenanceMode(SetMaintenanceModeInput input) { + + SetMaintenanceModeOutputBuilder outputBuilder = new SetMaintenanceModeOutputBuilder(); + if (maintenanceRW != null) { + EsMaintenanceMode m = new EsMaintenanceMode(input); + if (maintenanceRW.doWrite(m) == null) { + throw new IllegalArgumentException("Problem writing to database: "+input.getMountpointName()); + } + outputBuilder = new SetMaintenanceModeOutputBuilder(m); + LOG.info("Wrote maintenance object {}", m.toString()); + } + return outputBuilder; + } + + @Override + public TestMaintenanceModeOutputBuilder testMaintenanceMode(TestMaintenanceModeInput input) { + + StringBuffer resultString = new StringBuffer(); + + EsMaintenanceMode maintenanceMode = getMaintenance(input.getMountpointName()); + + TestMaintenanceModeOutputBuilder outputBuilder = new TestMaintenanceModeOutputBuilder(maintenanceMode); + + ZonedDateTime now = EsMaintenanceFilter.valueOf(input.getTestDate()); + + resultString.append("In database table: "); + resultString.append(!(EsMaintenanceMode.getNotInMaintenance() == maintenanceMode)); + resultString.append(" Maintenance active: "); + resultString.append(maintenanceMode.isONFObjectInMaintenance(input.getObjectIdRef(), input.getProblemName(), now)); + resultString.append(" at Timestamp: "); + resultString.append(now); + + outputBuilder.setResultString(resultString.toString()); + + return outputBuilder; + } + + /*------------------------------------------------- + * Interface MaintenaceService + */ + + @Override + public boolean isONFObjectInMaintenance(String mountpointReference, String objectIdRef, String problem) { + EsMaintenanceMode maintenanceMode = getMaintenance(mountpointReference); + boolean res = maintenanceMode.isONFObjectInMaintenance(objectIdRef, problem); + LOG.debug("inMaintenance={} for mountpoint/id/problem:{} {} {} Definition: {}",res, mountpointReference, objectIdRef, problem, this ); + return res; + } + + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/PerformanceManagerImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/PerformanceManagerImpl.java new file mode 100644 index 000000000..b4c5abd7d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/PerformanceManagerImpl.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl; + +import javax.annotation.Nullable; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementRepresentation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.service.MicrowaveHistoricalPerformanceWriterService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PerformanceManagerImpl implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(PerformanceManagerImpl.class); + + private @Nullable PerformanceManagerTask task; + + public PerformanceManagerImpl(long seconds, MicrowaveHistoricalPerformanceWriterService databaseService) { + + LOG.info("Construct begin {} with {} Seconds",PerformanceManagerImpl.class.getSimpleName(), seconds); + + if (MicrowaveHistoricalPerformanceWriterService.isAvailable(databaseService)) { + + LOG.info("Do start of PM task"); + task = new PerformanceManagerTask(seconds, databaseService); + task.start(); + LOG.info("PM task scheduled"); + + } else { + LOG.info("Database not available. Do not start PM task"); + } + + LOG.info("Construct end {}",PerformanceManagerImpl.class.getSimpleName()); + } + + @Override + public void close() { + LOG.info("Close {}", PerformanceManagerImpl.class.getSimpleName()); + if (task != null) { + task.stop(); + } + } + + public void registration(String mountPointNodeName, ONFCoreNetworkElementRepresentation ne) { + LOG.debug("Register {}",mountPointNodeName); + if (task != null) { + task.registration(mountPointNodeName, ne); + } + } + + public void deRegistration(String mountPointNodeName) { + LOG.debug("Deregister {}",mountPointNodeName); + if (task != null) { + task.deRegistration(mountPointNodeName); + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/PerformanceManagerTask.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/PerformanceManagerTask.java new file mode 100644 index 000000000..ef2a0b8db --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/PerformanceManagerTask.java @@ -0,0 +1,238 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl; + +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.ONFCoreNetworkElementRepresentation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.AllPm; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.service.MicrowaveHistoricalPerformanceWriterService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class PerformanceManagerTask implements Runnable { + + private static final Logger LOG = LoggerFactory.getLogger(PerformanceManagerTask.class); + private static final String LOGMARKER = "PMTick"; + + private int tickCounter = 0; + + private final ConcurrentHashMap<String, ONFCoreNetworkElementRepresentation> queue = new ConcurrentHashMap<>(); + private final MicrowaveHistoricalPerformanceWriterService databaseService; + private final ScheduledExecutorService scheduler; + private final long seconds; + + private ScheduledFuture<?> taskHandle = null; + private Iterator<ONFCoreNetworkElementRepresentation> neIterator = null; + private ONFCoreNetworkElementRepresentation actualNE = null; + + /** + * Constructor of PM Task + * @param seconds seconds to call PM Task + * @param databaseService DB Service to load PM data to + */ + + public PerformanceManagerTask(long seconds, MicrowaveHistoricalPerformanceWriterService databaseService) { + + LOG.debug("Init task {}", PerformanceManagerTask.class.getSimpleName()); + this.seconds = seconds; + this.databaseService = databaseService; + this.scheduler = Executors.newSingleThreadScheduledExecutor(); + + } + + /** + * Start PM Task + */ + public void start() { + LOG.info("PM task created"); + taskHandle = this.scheduler.scheduleAtFixedRate(this, 0, seconds, TimeUnit.SECONDS); + LOG.info("PM task scheduled"); + } + + /** + * Stop everything + */ + public void stop() { + LOG.info("Stop {}", PerformanceManagerImpl.class.getSimpleName()); + if (taskHandle != null) { + taskHandle.cancel(true); + try { + scheduler.awaitTermination(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + LOG.debug("Schdule stopped.",e); + // Restore interrupted state... + Thread.currentThread().interrupt(); + } + } + } + + /** + * Add NE/Mountpoint to PM Processig + * @param mountPointNodeName to be added + * @param ne that is connected to the mountpoint + */ + public void registration(String mountPointNodeName, ONFCoreNetworkElementRepresentation ne) { + queue.put(mountPointNodeName, ne); + } + + /** + * Remove mountpoint/NE from PM process + * @param mountPointNodeName that has to be removed + */ + public void deRegistration(String mountPointNodeName) { + LOG.debug("Deregister {}",mountPointNodeName); + ONFCoreNetworkElementRepresentation removedNE = queue.remove(mountPointNodeName); + + if ( removedNE == null) { + LOG.warn("Couldn't delete {}",mountPointNodeName); + } + } + + + /*-------------------------------------------------------------- + * Task to read PM data from NE + */ + + /** + * Task runner to read all performance data from Network Elements. + * Catch exceptions to make sure, that the Task is not stopped. + */ + @Override + public void run() { + + LOG.debug("{} start {} Start with mountpoint {}",LOGMARKER, tickCounter, actualNE == null ? "No NE" : actualNE.getMountPointNodeName()); + + //Proceed to next NE/Interface + getNextInterface(); + + LOG.debug("{} {} Next interface to handle {}", LOGMARKER, tickCounter, + actualNE == null ? "No NE/IF" : actualNE.getMountPointNodeName() + " " + actualNE.pmStatusToString()); + + if (actualNE != null) { + try { + LOG.debug("{} Start to read PM from NE ({})", LOGMARKER, tickCounter); + AllPm allPm = actualNE.getHistoricalPM(); + LOG.debug("{} {} Got PM list. Start write to DB", LOGMARKER, tickCounter); + databaseService.writePM(allPm); + LOG.debug("{} {} PM List end.", LOGMARKER, tickCounter); + } catch (Exception e) { + LOG.warn("{} {} PM read/write failed. Write log entry {}", LOGMARKER, tickCounter, e); + String msg = e.getMessage(); + if (msg == null || msg.isEmpty()) { + if (e.getCause() != null) { + msg = e.getCause().toString(); + } + if (msg == null || msg.isEmpty()){ + msg = "No message or cause"; + } + } + databaseService.writePMLog(actualNE.getMountPointNodeName(), actualNE.pmStatusToString(), msg); + } + } + + LOG.debug("{} end {}",LOGMARKER, tickCounter); + tickCounter++; + } + + /** + * Reset queue to start from beginning + */ + private void resetQueue() { + actualNE = null; + neIterator = null; + } + + /** + * Get then next interface in the list. + * First try to find a next on the actual NE. + * If not available search next interface at a NE + * Special Situations to handle: Empty queue, NEs, but no interfaces + */ + private void getNextInterface() { + boolean started = false; + int loopCounter = 0; + + LOG.debug("{} {} getNextInterface enter. Queue size {} ", LOGMARKER, tickCounter, queue.size()); + + if (actualNE != null && !queue.containsValue(actualNE)) { + LOG.debug("{} {} NE Removed duringprocessing A",LOGMARKER, tickCounter); + resetQueue(); + } + + while (true) { + + if (loopCounter++ >= 1000) { + LOG.error("{} {} Problem in PM iteration. endless condition reached", LOGMARKER, tickCounter); + resetQueue(); + break; + } + + LOG.debug("{} {} Loop ne {}:neiterator {}:Interfaceiterator:{} Loop:{}", + LOGMARKER, + tickCounter, + actualNE == null? "null" : actualNE.getMountPointNodeName(), + neIterator == null ? "null" : neIterator.hasNext(), + actualNE == null ? "null" : actualNE.hasNext(), + loopCounter); + + if (actualNE != null && actualNE.hasNext()) { + // Yes, there is an interface, deliver back + LOG.debug("{} {} getNextInterface yes A",LOGMARKER, tickCounter); + actualNE.next(); + break; + + } else { + // No element in neInterfaceInterator .. get next NE and try + if (neIterator != null && neIterator.hasNext()) { + // Set a new NE + LOG.debug("{} {} Next NE A",LOGMARKER, tickCounter); + actualNE = neIterator.next(); + actualNE.resetPMIterator(); + + } else { + // Goto start condition 1) first entry 2) end of queue reached + LOG.debug("{} {} Reset",LOGMARKER, tickCounter); + resetQueue(); + + if (queue.isEmpty()) { + LOG.debug("{} {} no nextInterfac. queue empty",LOGMARKER, tickCounter); + break; + } else if (!started){ + LOG.debug("{} {} getNextInterface start condition. Get interator.",LOGMARKER, tickCounter); + neIterator = queue.values().iterator(); + started = true; + } else { + LOG.debug("{} {} no nextInterface",LOGMARKER, tickCounter); + break; + } + } + } + } //while + + if (actualNE != null && !queue.containsValue(actualNE)) { + LOG.debug("{} {} NE Removed duringprocessing B",LOGMARKER, tickCounter); + resetQueue(); + } + + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/service/MicrowaveHistoricalPerformanceWriterService.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/service/MicrowaveHistoricalPerformanceWriterService.java new file mode 100644 index 000000000..4782f3305 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/service/MicrowaveHistoricalPerformanceWriterService.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.service; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDataBaseReaderAndWriter; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseClientAbstract; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.IndexClientBuilder; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.AllPm; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types.EsHistoricalPerformance15Minutes; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types.EsHistoricalPerformance24Hours; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types.EsHistoricalPerformanceLogEntry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MicrowaveHistoricalPerformanceWriterService { + + private static final Logger LOG = LoggerFactory.getLogger(MicrowaveHistoricalPerformanceWriterService.class); + private static final String INDEX = "sdnperformance"; + private static final String MAPPING = "/elasticsearch/index/sdnperformance/sdnperformanceMapping.json"; + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + + + private HtDatabaseClientAbstract client; + private HtDataBaseReaderAndWriter<EsHistoricalPerformance15Minutes> historicalPerformance15mRW; + private HtDataBaseReaderAndWriter<EsHistoricalPerformance24Hours> historicalPerformance24hRW; + private HtDataBaseReaderAndWriter<EsHistoricalPerformanceLogEntry> historicalPerformanceLogRW; + + public MicrowaveHistoricalPerformanceWriterService(HtDatabaseNode database) { + + LOG.info("Create {} start", MicrowaveHistoricalPerformanceWriterService.class); + + try { + + IndexClientBuilder clientBuilder = + IndexClientBuilder.getBuilder(INDEX).setMappingSettingJsonFileName(MAPPING); + client = clientBuilder.create(database); + clientBuilder.close(); + + historicalPerformance15mRW = new HtDataBaseReaderAndWriter<>(client, + EsHistoricalPerformance15Minutes.ESDATATYPENAME, EsHistoricalPerformance15Minutes.class); + historicalPerformance24hRW = new HtDataBaseReaderAndWriter<>(client, + EsHistoricalPerformance24Hours.ESDATATYPENAME, EsHistoricalPerformance24Hours.class); + historicalPerformanceLogRW = new HtDataBaseReaderAndWriter<>(client, + EsHistoricalPerformanceLogEntry.ESDATATYPENAME, EsHistoricalPerformanceLogEntry.class); + + } catch (Exception e) { + client = null; + LOG.error("Can not start database client. Exception: {}", e.getMessage()); + } + + LOG.info("Create {} finished. DB Service {} started.", MicrowaveHistoricalPerformanceWriterService.class, + client != null ? "sucessfully" : "not"); + } + + + public void writePM(AllPm pm) { + + LOG.debug("Write {} pm records", pm.size()); + + LOG.debug("Write 15m write to DB"); + historicalPerformance15mRW.doWrite(pm.getPm15()); + LOG.debug("Write 15m done, Write 24h write to DB"); + historicalPerformance24hRW.doWrite(pm.getPm24()); + LOG.debug("Write 24h done"); + + } + + public void writePMLog(String mountpointName, String layerProtocolName, String msg) { + + LOG.debug("Write PM Log: {}", msg); + EsHistoricalPerformanceLogEntry logEntry = new EsHistoricalPerformanceLogEntry(mountpointName, + layerProtocolName, NETCONFTIME_CONVERTER.getTimeStamp().getValue(), msg); + historicalPerformanceLogRW.doWrite(logEntry); + LOG.debug("Write PM Log done"); + + } + + + static public boolean isAvailable(MicrowaveHistoricalPerformanceWriterService s) { + + if (s == null || s.client == null) { + return false; + } + return true; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformance15Minutes.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformance15Minutes.java new file mode 100644 index 000000000..6754fced9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformance15Minutes.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types; + +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class EsHistoricalPerformance15Minutes extends EsHistoricalPerformanceBase { + + public static final String ESDATATYPENAME = "historicalperformance15min"; + + private static final Logger LOG = LoggerFactory.getLogger(EsHistoricalPerformance15Minutes.class); + + public EsHistoricalPerformance15Minutes(String nodeName, Lp lp) { + super(nodeName, lp); + } + + public <T extends OtnHistoryDataG> EsHistoricalPerformance15Minutes setHistoricalRecord15Minutes(OtnHistoryDataG record) { + if (record.getGranularityPeriod() != org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType.Period15Min) { + LOG.warn("Granularity mismatch for {} expected {} found {}", getNodeName(),getUuidInterface(), org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType.Period15Min, record.getGranularityPeriod()); + } + set(record); + return this; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformance24Hours.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformance24Hours.java new file mode 100644 index 000000000..03c68451d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformance24Hours.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types; + +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; + +public class EsHistoricalPerformance24Hours extends EsHistoricalPerformanceBase { + + public static final String ESDATATYPENAME = "historicalperformance24h"; + + public EsHistoricalPerformance24Hours(String nodeName, Lp lp) { + super(nodeName, lp); + } + + public <T extends OtnHistoryDataG> EsHistoricalPerformance24Hours setHistoricalRecord24Hours(T record) { + set(record); + return this; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformanceBase.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformanceBase.java new file mode 100644 index 000000000..5f8370f60 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformanceBase.java @@ -0,0 +1,165 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.LinkIdentifyingObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.util.NetconfTimeStamp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; + +public class EsHistoricalPerformanceBase extends EsObject { + + private static final Logger LOG = LoggerFactory.getLogger(EsHistoricalPerformanceBase.class); + private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter(); + + @JsonIgnore private final String nodeName; + @JsonIgnore private final String uuidInterface; + @JsonIgnore private final String layerProtocolName; + + @JsonIgnore private String radioSignalId = null; //Meaning of connection Id + @JsonIgnore private String timeStamp = null; + @JsonIgnore private Boolean suspectIntervalFlag = null; + @JsonIgnore private String granularityPeriod = null; //Representation of GranularityPeriodType + @JsonIgnore private String scannerId = null; + @JsonIgnore private Object performanceData = null; + + + public EsHistoricalPerformanceBase(String nodeName, Lp actualInterface) { + this.nodeName = nodeName; + this.uuidInterface = actualInterface.getUuid().getValue(); + this.layerProtocolName = actualInterface.getLayerProtocolName().getValue(); + + } + + protected <T extends OtnHistoryDataG> void set(T record) { + if (record == null) { + LOG.warn("PM Record: null record. Can not handle"); + return; + } + + if (LOG.isTraceEnabled()) { + LOG.trace("PM Record: class {} '{}' ", record.getClass().getSimpleName(), record); + } + + timeStamp = NETCONFTIME_CONVERTER.getTimeStampFromNetconf(record.getPeriodEndTime().getValue()); + suspectIntervalFlag = record.isSuspectIntervalFlag(); + granularityPeriod = getYangGranularityPeriodString( record.getGranularityPeriod() ); + scannerId = record.getHistoryDataId(); + + if (record instanceof LinkIdentifyingObject) { + radioSignalId = ((LinkIdentifyingObject) record).getSignalId(); + } + + performanceData = new EsPerformanceData(record); + setEsId(genSpecificEsId(record.getPeriodEndTime().getValue())); + } + + + @JsonGetter("node-name") + public String getNodeName() { + return nodeName; + } + + @JsonGetter("uuid-interface") + public String getUuidInterface() { + return uuidInterface; + } + + @JsonGetter("layer-protocol-name") + public String getLayerProtocolName() { + return layerProtocolName; + } + + @JsonGetter("radio-signal-id") + public String getRadioSignalId() { + return radioSignalId; + } + + @JsonGetter("time-stamp") + public String getTimeStamp() { + return timeStamp; + } + + @JsonGetter("suspect-interval-flag") + public Boolean getSuspect() { + return suspectIntervalFlag; + } + + @JsonGetter("granularity-period") + public String getGranularityPeriod() { + return granularityPeriod; + } + + @JsonGetter("scanner-id") + public String getScannerId() { + return scannerId; + } + + @JsonGetter("performance-data") + public Object getData() { + return performanceData; + } + + + + //Adapt JSON Text + //@JsonGetter("granularityPeriod") + + private static String getYangGranularityPeriodString(org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType yangGanularityPeriod) { + switch(yangGanularityPeriod == null ? org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.GranularityPeriodType.Unknown : yangGanularityPeriod) { + case Period15Min: + return "PERIOD_15MIN"; + case Period24Hours: + return "PERIOD_24HOURS"; + default: + return "PERIOD_UNKOWN"; + } + } + + /** + * Create a specific ES id for the current log. + * @param time is the input. + * @return a string with the generated ES Id + */ + protected String genSpecificEsId(String time) { + + StringBuffer strBuf = new StringBuffer(); + strBuf.append(nodeName); + strBuf.append("/"); + strBuf.append(uuidInterface); + strBuf.append("/"); + strBuf.append(time == null || time.isEmpty() ? "Empty" : time); + + return strBuf.toString(); + } + + @Override + public String toString() { + return "EsHistoricalPerformanceBase [nodeName=" + nodeName + ", uuidInterface=" + uuidInterface + + ", layerProtocolName=" + layerProtocolName + ", radioSignalId=" + radioSignalId + ", timeStamp=" + + timeStamp + ", suspectIntervalFlag=" + suspectIntervalFlag + ", granularityPeriod=" + + granularityPeriod + ", scannerId=" + scannerId + ", performanceData=" + performanceData + "]"; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformanceLogEntry.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformanceLogEntry.java new file mode 100644 index 000000000..ebbf8b435 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsHistoricalPerformanceLogEntry.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.EsObject; + +/** + * + * Event from Network to be recorded in the database + * + */ + +public class EsHistoricalPerformanceLogEntry extends EsObject { + + public static final String ESDATATYPENAME = "performancelog"; + + private String mountpoint; + private String interfaceIdx; + private String timeStamp; + private String logText; + + /** + * Create Log entry for NE/Interfaceproblems during PM execution + * @param mountpoint Name of + * @param interfaceIdx Name of + * @param timeStamp Time and date of occurence + * @param logText to write + */ + public EsHistoricalPerformanceLogEntry(String mountpoint, String interfaceIdx, String timeStamp, String logText) { + super(); + this.mountpoint = mountpoint; + this.interfaceIdx = interfaceIdx; + this.timeStamp = timeStamp; + this.logText = logText; + } + + /** + * For jackson purpose + */ + EsHistoricalPerformanceLogEntry() { + } + + /** + * @return the mountpoint + */ + public String getMountpoint() { + return mountpoint; + } + + /** + * @return the interfaceIdx + */ + public String getInterfaceIdx() { + return interfaceIdx; + } + + /** + * @return the timeStamp + */ + public String getTimeStamp() { + return timeStamp; + } + + /** + * @return the logText + */ + public String getLogText() { + return logText; + } + + + + public static String getEsdatatypename() { + return ESDATATYPENAME; + } + + } diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsPerformanceData.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsPerformanceData.java new file mode 100644 index 000000000..ef25f0282 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/performancemanager/impl/database/types/EsPerformanceData.java @@ -0,0 +1,444 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types; + +import com.fasterxml.jackson.annotation.JsonGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ExtendedAirInterfaceHistoricalPerformanceType12; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ExtendedAirInterfaceHistoricalPerformanceType1211; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.container.ExtendedAirInterfaceHistoricalPerformanceType1211p; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.g._874._1.model.rev170320.OtnHistoryDataG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfaceHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.AirInterfacePerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ContainerHistoricalPerformanceTypeG; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev170324.ContainerPerformanceTypeG; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class EsPerformanceData { + + @JsonIgnore + private static final Logger LOG = LoggerFactory.getLogger(EsPerformanceData.class); + + @JsonIgnore + private AirInterfacePerformanceTypeG dataAirInterface12 = null; + @JsonIgnore + private ContainerPerformanceTypeG dataEthContainer12 = null; + + @JsonIgnore + private org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AirInterfacePerformanceTypeG dataAirInterface1211 = null; + @JsonIgnore + private org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ContainerPerformanceTypeG dataEthContainer1211 = null; + + @JsonIgnore + private org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AirInterfacePerformanceTypeG dataAirInterface1211p = null; + @JsonIgnore + private org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ContainerPerformanceTypeG dataEthContainer1211p = null; + + public <T extends OtnHistoryDataG> EsPerformanceData(T otnHistoryData) { + + if (otnHistoryData instanceof AirInterfaceHistoricalPerformanceTypeG) { + this.dataAirInterface12 = ((AirInterfaceHistoricalPerformanceTypeG) otnHistoryData).getPerformanceData(); + } else if (otnHistoryData instanceof ContainerHistoricalPerformanceTypeG) { + this.dataEthContainer12 = ((ContainerHistoricalPerformanceTypeG) otnHistoryData).getPerformanceData(); + } else if (otnHistoryData instanceof ExtendedAirInterfaceHistoricalPerformanceType12) { + this.dataAirInterface12 = ((ExtendedAirInterfaceHistoricalPerformanceType12) otnHistoryData) + .getAirInterfaceHistoricalPerformanceType().getPerformanceData(); + } else if (otnHistoryData instanceof org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AirInterfaceHistoricalPerformanceTypeG) { + this.dataAirInterface1211 = ((org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.AirInterfaceHistoricalPerformanceTypeG) otnHistoryData) + .getPerformanceData(); + } else if (otnHistoryData instanceof org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ContainerHistoricalPerformanceTypeG) { + this.dataEthContainer1211 = ((org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev180907.ContainerHistoricalPerformanceTypeG) otnHistoryData) + .getPerformanceData(); + } else if (otnHistoryData instanceof ExtendedAirInterfaceHistoricalPerformanceType1211) { + this.dataAirInterface1211 = ((ExtendedAirInterfaceHistoricalPerformanceType1211) otnHistoryData) + .getAirInterfaceHistoricalPerformanceType().getPerformanceData(); + } else if (otnHistoryData instanceof org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AirInterfaceHistoricalPerformanceTypeG) { + this.dataAirInterface1211p = ((org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.AirInterfaceHistoricalPerformanceTypeG) otnHistoryData) + .getPerformanceData(); + } else if (otnHistoryData instanceof org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ContainerHistoricalPerformanceTypeG) { + this.dataEthContainer1211p = ((org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.ContainerHistoricalPerformanceTypeG) otnHistoryData) + .getPerformanceData(); + } else if (otnHistoryData instanceof ExtendedAirInterfaceHistoricalPerformanceType1211p) { + this.dataAirInterface1211p = ((ExtendedAirInterfaceHistoricalPerformanceType1211p) otnHistoryData) + .getAirInterfaceHistoricalPerformanceType().getPerformanceData(); + } else { + LOG.warn("Can not assign historical performance type {}", otnHistoryData.getClass().getName()); + } + } + + @JsonGetter("es") + public java.lang.Integer getEs() { + return dataAirInterface12 != null ? dataAirInterface12.getEs() + : dataAirInterface1211 != null ? dataAirInterface1211.getEs() + : dataAirInterface1211p != null ? dataAirInterface1211p.getEs() : null; + } + + @JsonGetter("ses") + java.lang.Integer getSes() { + return dataAirInterface12 != null ? dataAirInterface12.getSes() + : dataAirInterface1211 != null ? dataAirInterface1211.getSes() + : dataAirInterface1211p != null ? dataAirInterface1211p.getSes() : null; + } + + @JsonGetter("cses") + java.lang.Integer getCses() { + return dataAirInterface12 != null ? dataAirInterface12.getCses() + : dataAirInterface1211 != null ? dataAirInterface1211.getCses() + : dataAirInterface1211p != null ? dataAirInterface1211p.getCses() : null; + } + + @JsonGetter("unavailability") + java.lang.Integer getUnavailability() { + return dataAirInterface12 != null ? dataAirInterface12.getUnavailability() + : dataAirInterface1211 != null ? dataAirInterface1211.getUnavailability() + : dataAirInterface1211p != null ? dataAirInterface1211p.getUnavailability() : null; + } + + @JsonGetter("tx-level-min") + java.lang.Byte getTxLevelMin() { + return dataAirInterface12 != null ? dataAirInterface12.getTxLevelMin() + : dataAirInterface1211 != null ? dataAirInterface1211.getTxLevelMin() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTxLevelMin() : null; + } + + @JsonGetter("tx-level-max") + java.lang.Byte getTxLevelMax() { + return dataAirInterface12 != null ? dataAirInterface12.getTxLevelMax() + : dataAirInterface1211 != null ? dataAirInterface1211.getTxLevelMax() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTxLevelMax() : null; + } + + @JsonGetter("tx-level-avg") + java.lang.Byte getTxLevelAvg() { + return dataAirInterface12 != null ? dataAirInterface12.getTxLevelAvg() + : dataAirInterface1211 != null ? dataAirInterface1211.getTxLevelAvg() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTxLevelAvg() : null; + } + + @JsonGetter("rx-level-min") + java.lang.Byte getRxLevelMin() { + return dataAirInterface12 != null ? dataAirInterface12.getRxLevelMin() + : dataAirInterface1211 != null ? dataAirInterface1211.getRxLevelMin() + : dataAirInterface1211p != null ? dataAirInterface1211p.getRxLevelMin() : null; + } + + @JsonGetter("rx-level-max") + java.lang.Byte getRxLevelMax() { + return dataAirInterface12 != null ? dataAirInterface12.getRxLevelMax() + : dataAirInterface1211 != null ? dataAirInterface1211.getRxLevelMax() + : dataAirInterface1211p != null ? dataAirInterface1211p.getRxLevelMax() : null; + } + + @JsonGetter("rx-level-avg") + java.lang.Byte getRxLevelAvg() { + return dataAirInterface12 != null ? dataAirInterface12.getRxLevelAvg() + : dataAirInterface1211 != null ? dataAirInterface1211.getRxLevelAvg() + : dataAirInterface1211p != null ? dataAirInterface1211p.getRxLevelAvg() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time2-states") + java.lang.Integer getTime2States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime2States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime2States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime2States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time4-states-s") + java.lang.Integer getTime4StatesS() { + return dataAirInterface12 != null ? dataAirInterface12.getTime4StatesS() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime4StatesS() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime4StatesS() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time4-states") + java.lang.Integer getTime4States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime4States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime4States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime4States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time8-states") + java.lang.Integer getTime8States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime8States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime8States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime8States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time16-states-s") + java.lang.Integer getTime16StatesS() { + return dataAirInterface12 != null ? dataAirInterface12.getTime16StatesS() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime16StatesS() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime16StatesS() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time16-states") + java.lang.Integer getTime16States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime16States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime16States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime16States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time32-states") + java.lang.Integer getTime32States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime32States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime32States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime32States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time64-states") + java.lang.Integer getTime64States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime64States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime64States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime64States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time128-states") + java.lang.Integer getTime128States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime128States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime128States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime128States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time256-states") + java.lang.Integer getTime256States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime256States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime256States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime256States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time512-states") + java.lang.Integer getTime512States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime512States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime512States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime512States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time512-states-l") + java.lang.Integer getTime512StatesL() { + return dataAirInterface12 != null ? dataAirInterface12.getTime512StatesL() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime512StatesL() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime512StatesL() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time1024-states") + java.lang.Integer getTime1024States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime1024States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime1024States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime1024States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time1024-states-l") + java.lang.Integer getTime1024StatesL() { + return dataAirInterface12 != null ? dataAirInterface12.getTime1024StatesL() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime1024StatesL() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime1024StatesL() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time2048-states") + java.lang.Integer getTime2048States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime2048States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime2048States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime2048States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time2048-states-l") + java.lang.Integer getTime2048StatesL() { + return dataAirInterface12 != null ? dataAirInterface12.getTime2048StatesL() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime2048StatesL() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime2048StatesL() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time4096-states") + java.lang.Integer getTime4096States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime4096States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime4096States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime4096States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time4096-states-l") + java.lang.Integer getTime4096StatesL() { + return dataAirInterface12 != null ? dataAirInterface12.getTime4096StatesL() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime4096StatesL() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime4096StatesL() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time8192-states") + java.lang.Integer getTime8192States() { + return dataAirInterface12 != null ? dataAirInterface12.getTime8192States() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime8192States() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTime8192States() : null; + } + + @SuppressWarnings("deprecation") + @JsonGetter("time8192-states-l") + java.lang.Integer getTime8192StatesL() { + return dataAirInterface12 != null ? dataAirInterface12.getTime8192StatesL() + : dataAirInterface1211 != null ? dataAirInterface1211.getTime8192StatesL() + : dataAirInterface1211p != null ? dataAirInterface1211p.getEs() : null; + } + + @JsonGetter("snir-min") + java.lang.Byte getSnirMin() { + return dataAirInterface12 != null ? dataAirInterface12.getSnirMin() + : dataAirInterface1211 != null ? dataAirInterface1211.getSnirMin() + : dataAirInterface1211p != null ? dataAirInterface1211p.getSnirMin() : null; + } + + @JsonGetter("snir-max") + java.lang.Byte getSnirMax() { + return dataAirInterface12 != null ? dataAirInterface12.getSnirMax() + : dataAirInterface1211 != null ? dataAirInterface1211.getSnirMax() + : dataAirInterface1211p != null ? dataAirInterface1211p.getSnirMax() : null; + } + + @JsonGetter("snir-avg") + java.lang.Byte getSnirAvg() { + return dataAirInterface12 != null ? dataAirInterface12.getSnirAvg() + : dataAirInterface1211 != null ? dataAirInterface1211.getSnirAvg() + : dataAirInterface1211p != null ? dataAirInterface1211p.getSnirAvg() : null; + } + + @JsonGetter("xpd-min") + java.lang.Byte getXpdMin() { + return dataAirInterface12 != null ? dataAirInterface12.getXpdMin() + : dataAirInterface1211 != null ? dataAirInterface1211.getXpdMin() + : dataAirInterface1211p != null ? dataAirInterface1211p.getXpdMin() : null; + } + + @JsonGetter("xpd-max") + java.lang.Byte getXpdMax() { + return dataAirInterface12 != null ? dataAirInterface12.getXpdMax() + : dataAirInterface1211 != null ? dataAirInterface1211.getXpdMax() + : dataAirInterface1211p != null ? dataAirInterface1211p.getXpdMax() : null; + } + + @JsonGetter("xpd-avg") + java.lang.Byte getXpdAvg() { + return dataAirInterface12 != null ? dataAirInterface12.getXpdAvg() + : dataAirInterface1211 != null ? dataAirInterface1211.getXpdAvg() + : dataAirInterface1211p != null ? dataAirInterface1211p.getXpdAvg() : null; + } + + @JsonGetter("rf-temp-min") + java.lang.Byte getRfTempMin() { + return dataAirInterface12 != null ? dataAirInterface12.getRfTempMin() + : dataAirInterface1211 != null ? dataAirInterface1211.getRfTempMin() + : dataAirInterface1211p != null ? dataAirInterface1211p.getRfTempMin() : null; + } + + @JsonGetter("rf-temp-max") + java.lang.Byte getRfTempMax() { + return dataAirInterface12 != null ? dataAirInterface12.getRfTempMax() + : dataAirInterface1211 != null ? dataAirInterface1211.getRfTempMax() + : dataAirInterface1211p != null ? dataAirInterface1211p.getRfTempMax() : null; + } + + @JsonGetter("rf-temp-avg") + java.lang.Byte getRfTempAvg() { + return dataAirInterface12 != null ? dataAirInterface12.getRfTempAvg() + : dataAirInterface1211 != null ? dataAirInterface1211.getRfTempAvg() + : dataAirInterface1211p != null ? dataAirInterface1211p.getRfTempAvg() : null; + } + + @JsonGetter("defect-blocks-sum") + java.lang.Short getDefectBlocksSum() { + return dataAirInterface12 != null ? dataAirInterface12.getDefectBlocksSum() + : dataAirInterface1211 != null ? dataAirInterface1211.getDefectBlocksSum() + : dataAirInterface1211p != null ? dataAirInterface1211p.getDefectBlocksSum() : null; + } + + @JsonGetter("time-period") + java.lang.Integer getTimePeriod() { + return dataAirInterface12 != null ? dataAirInterface12.getTimePeriod() + : dataEthContainer12 != null ? dataEthContainer12.getTimePeriod() + : dataAirInterface1211 != null ? dataAirInterface1211.getTimePeriod() + : dataEthContainer1211 != null ? dataEthContainer1211.getTimePeriod() + : dataAirInterface1211p != null ? dataAirInterface1211p.getTimePeriod() + : dataEthContainer1211p != null ? dataEthContainer1211p.getTimePeriod() + : null; + } + + @JsonGetter("tx-ethernet-bytes-max-s") + java.lang.Integer getTxEthernetBytesMaxS() { + return dataEthContainer12 != null ? dataEthContainer12.getTxEthernetBytesMaxS() + : dataEthContainer1211 != null ? dataEthContainer1211.getTxEthernetBytesMaxS() + : dataEthContainer1211p != null ? dataEthContainer1211p.getTxEthernetBytesMaxS() : null; + } + + @JsonGetter("tx-ethernet-bytes-max-m") + java.lang.Long getTxEthernetBytesMaxM() { + return dataEthContainer12 != null ? dataEthContainer12.getTxEthernetBytesMaxM() + : dataEthContainer1211 != null ? dataEthContainer1211.getTxEthernetBytesMaxM() + : dataEthContainer1211p != null ? dataEthContainer1211p.getTxEthernetBytesMaxM() : null; + } + + @JsonGetter("tx-ethernet-bytes-sum") + java.lang.Long getTxEthernetBytesSum() { + return dataEthContainer12 != null ? dataEthContainer12.getTxEthernetBytesSum() + : dataEthContainer1211 != null ? dataEthContainer1211.getTxEthernetBytesSum() + : dataEthContainer1211p != null ? dataEthContainer1211p.getTxEthernetBytesSum() : null; + } + + @Override + public String toString() { + return "EsPerformanceData [getEs()=" + getEs() + ", getSes()=" + getSes() + ", getCses()=" + getCses() + + ", getUnavailability()=" + getUnavailability() + ", getTxLevelMin()=" + getTxLevelMin() + + ", getTxLevelMax()=" + getTxLevelMax() + ", getTxLevelAvg()=" + getTxLevelAvg() + ", getRxLevelMin()=" + + getRxLevelMin() + ", getRxLevelMax()=" + getRxLevelMax() + ", getRxLevelAvg()=" + getRxLevelAvg() + + ", getTime2States()=" + getTime2States() + ", getTime4StatesS()=" + getTime4StatesS() + + ", getTime4States()=" + getTime4States() + ", getTime8States()=" + getTime8States() + + ", getTime16StatesS()=" + getTime16StatesS() + ", getTime16States()=" + getTime16States() + + ", getTime32States()=" + getTime32States() + ", getTime64States()=" + getTime64States() + + ", getTime128States()=" + getTime128States() + ", getTime256States()=" + getTime256States() + + ", getTime512States()=" + getTime512States() + ", getTime512StatesL()=" + getTime512StatesL() + + ", getTime1024States()=" + getTime1024States() + ", getTime1024StatesL()=" + getTime1024StatesL() + + ", getTime2048States()=" + getTime2048States() + ", getTime2048StatesL()=" + getTime2048StatesL() + + ", getTime4096States()=" + getTime4096States() + ", getTime4096StatesL()=" + getTime4096StatesL() + + ", getTime8192States()=" + getTime8192States() + ", getTime8192StatesL()=" + getTime8192StatesL() + + ", getSnirMin()=" + getSnirMin() + ", getSnirMax()=" + getSnirMax() + ", getSnirAvg()=" + getSnirAvg() + + ", getXpdMin()=" + getXpdMin() + ", getXpdMax()=" + getXpdMax() + ", getXpdAvg()=" + getXpdAvg() + + ", getRfTempMin()=" + getRfTempMin() + ", getRfTempMax()=" + getRfTempMax() + ", getRfTempAvg()=" + + getRfTempAvg() + ", getDefectBlocksSum()=" + getDefectBlocksSum() + ", getTimePeriod()=" + + getTimePeriod() + ", getTxEthernetBytesMaxS()=" + getTxEthernetBytesMaxS() + + ", getTxEthernetBytesMaxM()=" + getTxEthernetBytesMaxM() + ", getTxEthernetBytesSum()=" + + getTxEthernetBytesSum() + "]"; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/GeoLocation.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/GeoLocation.java new file mode 100644 index 000000000..1838c33c7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/GeoLocation.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.ptp.impl; + +/** + * Path list with logical-termination-point list + "path" : [{ + "path-id": "4d778388-41c8-11e7-a919-92ebcb67fe33", + "path-name": "NE-10-ClockIdentity", + "layer-protocol-name": "PTP", + "directionality": "unidirectional", + "logical-termination-point": [{ + "ltp-reference":"yep", + "physical-port-reference": "shelf:1-slot:1-Card-port:5", + "node-reference":"NE-10", + "site-reference": "site-a", + "site-name": "GUI-Label", + "geo-location": { + "longitude": "54.123456", + "latitude": "13.123456" + }] + }] + + * @author herbert + */ + +public class GeoLocation { + String longitude; + String latitude; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/LogicalTerminationPoint.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/LogicalTerminationPoint.java new file mode 100644 index 000000000..6efd3f90c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/LogicalTerminationPoint.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.ptp.impl; + +/** + * Path list with logical-termination-point list + "path" : [{ + "path-id": "4d778388-41c8-11e7-a919-92ebcb67fe33", + "path-name": "NE-10-ClockIdentity", + "layer-protocol-name": "PTP", + "directionality": "unidirectional", + "logical-termination-point": [{ + "ltp-reference":"yep", + "physical-port-reference": "shelf:1-slot:1-Card-port:5", + "node-reference":"NE-10", + "site-reference": "site-a", + "site-name": "GUI-Label", + "geo-location": { + "longitude": "54.123456", + "latitude": "13.123456" + }] + }] + + + * @author herbert + * + */ +public class LogicalTerminationPoint { + + String ltpReference; + String physicalPortReference; + String nodeReference; + String siteReference; + String siteName; + GeoLocation geoLocation; + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/Path.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/Path.java new file mode 100644 index 000000000..60a236d14 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/Path.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.ptp.impl; + +import java.util.List; + +/** + * Path list with logical-termination-point list + "path" : [{ + "path-id": "4d778388-41c8-11e7-a919-92ebcb67fe33", + "path-name": "NE-10-ClockIdentity", + "layer-protocol-name": "PTP", + "directionality": "unidirectional", + "logical-termination-point": [{ + "ltp-reference":"yep", + "physical-port-reference": "shelf:1-slot:1-Card-port:5", + "node-reference":"NE-10", + "site-reference": "site-a", + "site-name": "GUI-Label", + "geo-location": { + "longitude": "54.123456", + "latitude": "13.123456" + }] + }] + * @author herbert + * + */ +public class Path { + + String pathId; + String pathName; + String layperProtocolName; + String directionality; + List<LogicalTerminationPoint> logicalTerminationPoints; + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/PtpManagerImpl.java b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/PtpManagerImpl.java new file mode 100644 index 000000000..3bb16938e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/ptp/impl/PtpManagerImpl.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.ptp.impl; + +/** + * @author herbert + * + */ +public class PtpManagerImpl { + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/elasticsearch.yml b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/elasticsearch.yml new file mode 100644 index 000000000..896d51616 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/elasticsearch.yml @@ -0,0 +1,103 @@ +# ======================== Elasticsearch Configuration ========================= +# +# NOTE: Elasticsearch comes with reasonable defaults for most settings. +# Before you set out to tweak and tune the configuration, make sure you +# understand what are you trying to accomplish and the consequences. +# +# The primary way of configuring a node is via this file. This template lists +# the most important settings you may want to configure for a production cluster. +# +# Please see the documentation for further information on configuration options: +# <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html> +# +# ---------------------------------- Cluster ----------------------------------- +# +# Use a descriptive name for your cluster: +# +cluster.name: $clustername +# +# ------------------------------------ Node ------------------------------------ +# +# Use a descriptive name for the node: +# +node.name: $nodename +# +# Add custom attributes to the node: +# +# node.rack: r1 +# +# ----------------------------------- Paths ------------------------------------ +# +# Path to directory where to store the data (separate multiple locations by comma): +# +# path.data: /path/to/data +path.data: etc +path.home: data +path.plugins: etc/elasticsearch-plugins +# +# Path to log files: +# +# path.logs: /path/to/logs +# +# ----------------------------------- Memory ----------------------------------- +# +# Lock the memory on startup: +# +# bootstrap.mlockall: true +# +# Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory +# available on the system and that the owner of the process is allowed to use this limit. +# +# Elasticsearch performs poorly when the system is swapping the memory. +# +# ---------------------------------- Network ----------------------------------- +# +# Set the bind address to a specific IP (IPv4 or IPv6): +# +# network.host: 192.168.0.1 +network.bind_host: 0.0.0.0 +network.publish_host: $hostname +# +# Set a custom port for HTTP: +# +# http.port: 9200 +# +# For more information, see the documentation at: +# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html> +# +# --------------------------------- Discovery ---------------------------------- +# +# Pass an initial list of hosts to perform discovery when new node is started: +# The default list of hosts is ["127.0.0.1", "[::1]"] +# +# discovery.zen.ping.unicast.hosts: ["host1", "host2"] +# +# Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1): +# +# discovery.zen.minimum_master_nodes: 3 +# +# For more information, see the documentation at: +# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html> +# +# ---------------------------------- Gateway ----------------------------------- +# +# Block initial recovery after a full cluster restart until N nodes are started: +# +# gateway.recover_after_nodes: 3 +# +# For more information, see the documentation at: +# <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html> +# +# ---------------------------------- Various ----------------------------------- +# +# Disable starting multiple nodes on a single system: +# +# node.max_local_storage_nodes: 1 +# +# Require explicit names when deleting indices: +# +# action.destructive_requires_name: true + +# Required for Kibana 4.x support +index.max_result_window: 2147483647 +#transport.tcp.port: 9301 diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/config/opendaylight.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/config/opendaylight.json new file mode 100644 index 000000000..2c93d8662 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/config/opendaylight.json @@ -0,0 +1,21 @@ +{ + "sdn-controller" : { + "dlux" : { + "ip-version" : "ipv4", + "host" : "localhost", + "port" : 8181, + "transport-protocol" : "http", + "username" : "admin", + "password" : "admin" + }, + "main" : { + "ip-version" : "ipv4", + "host" : "localhost", + "port" : 8181, + "transport-protocol" : "http", + "username" : "admin", + "password" : "admin" + } + } +} + diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/CoreModel-ForMicrowave.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/CoreModel-ForMicrowave.json new file mode 100644 index 000000000..596584efc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/CoreModel-ForMicrowave.json @@ -0,0 +1,751 @@ +{ + "schema-information": { + "ForwardingDomain": { + "id": "ForwardingDomain", + "uml-id": "_oGql-FLNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The ForwardingDomain (FD) object class models the topological component which represents the opportunity to enable forwarding (of specific transport characteristic information at one or more protocol layers) between points represented by the LTP in the model. The FD object provides the context for instructing the formation, adjustment and removal of FCs and hence offers the potential to enable forwarding. The LTPs available are those defined at the boundary of the FD. At a lowere level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs) and the FD representing the switch matrix can be further partitioned." + ] + }, + "layerProtocolNameList": { + "id": "layerProtocolNameList", + "uml-id": "_oGqmAlLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_P-Hp8MD4EeSoNOrYOfaryg", + "order-number": 1, + "is-read-only": false, + "description": [ + "One or more protocol layers at which the FD represents the opportunity to enable forwarding between LTP that bound it." + ] + }, + "_lowerLevelFdRefList": { + "id": "_lowerLevelFdRefList", + "uml-id": "_oGqmBVLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGql-FLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "description": [ + "The FD object class supports a recursive aggregation relationship (HigherLevelFdEncompassesLowerLevelFds) such that the internal construction of an FD can be exposed as multiple lower level FDs and associated Links (partitioning). The aggregated FDs and Links form an interconnected topology that provides and describes the capability of the aggregating FD. Note that the model actually represents aggregation of lower level FDs into higher level FDs as views rather than FD partition, and supports multiple views. Aggregation allow reallocation of capacity from lower level FDs to different higher level FDs as if the network is reorganized (as the association is aggregation not composition)." + ] + }, + "_fcRefList": { + "id": "_fcRefList", + "uml-id": "_oGql_1LNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGqmC1LNEeO75dO39GbF8Q", + "order-number": 3, + "is-read-only": false, + "description": [ + "An FD contains one or more FCs. A contained FC connects LTPs that bound the FD." + ] + }, + "ForwardingConstruct": { + "id": "ForwardingConstruct", + "uml-id": "_oGqmC1LNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs at a particular specific layerProtocol. Like the LTP the FC supports any transport protocol including all circuit and packet forms. It is used to effect forwarding of transport characteristic (layer protocol) information. An FC can be in only one FD. The ForwardingConstruct is a Forwarding entity. At a low level of the recursion, a FC represents a cross-connection within an NE. It may also represent a fragment of a cross-connection under certain circumstances. The FC object can be used to represent many different structures including point-to-point (P2P), point-to-multipoint (P2MP), rooted-multipoint (RMP) and multipoint-to-multipoint (MP2MP) bridge and selector structure for linear, ring or mesh protection schemes." + ] + }, + "_lowerLevelFcRefList": { + "id": "_lowerLevelFcRefList", + "uml-id": "_i7UzkFYfEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_oGqmC1LNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "description": [ + "An FC object supports a recursive aggregation relationship such that the internal construction of an FC can be exposed as multiple lower level FC objects (partitioning). Aggregation is used as for the FD to allow changes in hierarchy." + ] + }, + "_fcPortList": { + "id": "_fcPortList", + "uml-id": "_gqUk0FYgEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "The association of the FC to LTPs is made via FcPorts (essentially the ports of the FC)." + ] + }, + "_fcSwitchList": { + "id": "_fcSwitchList", + "uml-id": "_d_droFYhEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_a97NQFYhEeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "If an FC exposes protection (having two FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects. The arrangement of switches for a particular instance is described by a referenced FcSpec" + ] + }, + "forwardingDirection": { + "id": "forwardingDirection", + "uml-id": "_9_yMUEDAEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_dV67AEC8EeWxhL2B6Peg6A", + "order-number": 5, + "is-read-only": false, + "description": [ + "The directionality of the ForwardingConstruct. Is applicable to simple ForwardingConstructs where all FcPorts are BIDIRECTIONAL (the ForwardingConstruct will be BIDIRECTIONAL) or UNIDIRECTIONAL (the ForwardingConstruct will be UNIDIRECTIONAL). Is not present in more complex cases." + ] + }, + "NetworkElement": { + "id": "NetworkElement", + "uml-id": "_oGqnr1LNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The Network Element (NE) object class represents a network element (traditional NE) in the data plane. A data plane network element is essentially a consolidation of capabilities that can be viewed and controlled through a single management-control port. In the direct interface from an SDN controller to a network element in the data plane, the NetworkElement object defines the scope of control for the resources within the network element For example internal transfer of user information between the external terminations (ports of the NE), encapsulation, multiplexing/demultiplexing, and OAM functions, etc. The NetworkElement provides the scope of the naming space for identifying objects representing the resources within the data plane network element. NE is really a product bundling or some view of management scope, management access, session. The NE is not directly part of topology but brings meaning to the FD context and the LTP context (and hence the links)." + ] + }, + "_fdRefList": { + "id": "_fdRefList", + "uml-id": "_oGqnslLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGql-FLNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": false, + "description": [ + "Represents the FD that is completely within the boundary of the NE. At a low level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs) and the FD representing the switch matrix can be further partitioned. Where an FD is referenced by the NeEncompassesFd association, any FDs that it encompasses (i.e., that are associated with it by HigherLevelFdEncompassesLowerLevelFds), must also be encompassed by the NE and hence must have the NeEncompassesFd association." + ] + }, + "FcPort": { + "id": "FcPort", + "uml-id": "_b_lUAFYgEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The association of the FC to LTPs is made via FcPorts. The FcPort object class models the access to the FC function. The traffic forwarding between the associated FcPorts of the FC depends upon the type of FC and may be associated with FcSwitch object instances. In cases where there is resilience the FcPort may convey the resilience role of the access to the FC. It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. The FcPort replaces the Protection Unit of a traditional protection model. The ForwadingConstruct can be considered as a component and the FcPort as a Port on that component" + ] + }, + "role": { + "id": "role", + "uml-id": "_Ykm6QFeGEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_DUU_sGZ_EeWrX_JIGzXlSg", + "order-number": 2, + "is-read-only": false, + "description": [ + "Each FcPort of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function." + ] + }, + "fcPortDirection": { + "id": "fcPortDirection", + "uml-id": "_1HbEgEDAEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_2WpC8EC7EeWxhL2B6Peg6A", + "order-number": 3, + "is-read-only": false, + "description": [ + "The orientation of defined flow at the FcPort." + ] + }, + "LayerProtocol": { + "id": "LayerProtocol", + "uml-id": "_gROecFYXEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Each transport layer is represented by a LayerProtocol (LP) instance. The LayerProtocol instances it can be used for controlling termination and monitoring functionality. It can also be used for controlling the adaptation (i.e. encapsulation and/or multiplexing of client signal), tandem connection monitoring, traffic conditioning and/or shaping functionality at an intermediate point along a connection. Where the client - server relationship is fixed 1:1 and immutable, the layers can be encapsulated in a single LTP instance. Where the is a n:1 relationship between client and server, the layers must be split over two separate instances of LTP." + ] + }, + "configuredClientCapacity": { + "id": "configuredClientCapacity", + "uml-id": "_CUJD4BicEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "description": [ + "Provides a summarized view of the client capacity that is configurable for use. Note the cleint LTP association should provide all necessary detail hence this attribute is questionable." + ] + }, + "lpDirection": { + "id": "lpDirection", + "uml-id": "_GuuSYEDBEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_RWILYEDAEeWQeOKbNUpP9A", + "order-number": 3, + "is-read-only": false, + "description": [ + "The overall directionality of the LP. - A BIDIRECTIONAL LP will have some SINK and/or SOURCE flowss. - A SINK LP can only contain elements with SINK flows or CONTRA_DIRECTION_SOURCE flows - A SOURCE LP can only contain SOURCE flows or CONTRA_DIRECTION_SINK flows" + ] + }, + "terminationState": { + "id": "terminationState", + "uml-id": "_p2YfoGeEEeWmgIwAIZlYKQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "description": [ + "Indicates whether the layer is terminated and if so how." + ] + }, + "LogicalTerminationPoint": { + "id": "LogicalTerminationPoint", + "uml-id": "_eEpDMFX4EeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers. The structure of LTP supports all transport protocols including circuit and packet forms." + ] + }, + "_serverLtpRefList": { + "id": "_serverLtpRefList", + "uml-id": "_D4N9IFX5EeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "description": [ + "References contained LTPs representing servers of this LTP in an inverse multiplexing configuration (e.g. VCAT)." + ] + }, + "_clientLtpRefList": { + "id": "_clientLtpRefList", + "uml-id": "_3Y4zAFYWEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "References contained LTPs representing client traffic of this LTP for normal cases of multiplexing." + ] + }, + "_lpList": { + "id": "_lpList", + "uml-id": "_lvFOQFYXEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_gROecFYXEeOVGaP4lO41SQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "Ordered list of LayerProtocols that this LTP is comprised of where the first entry in the list is the lowest server layer (e.g. physical)" + ] + }, + "_connectedLtpRef": { + "id": "_connectedLtpRef", + "uml-id": "_CHM6YFYYEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Applicable in a simple context where two LTPs are associated via a non-adjustable enabled forwarding. Reduces clutter removing the need for two additional LTPs and an FC with a pair of FcPorts." + ] + }, + "_peerLtpRef": { + "id": "_peerLtpRef", + "uml-id": "_TkuhMFYYEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "description": [ + "References contained LTPs representing the reversal of orientation of flow where two LTPs are associated via a non-adjustable enabled forwarding and where the referenced LTP is fully dependent on the this LTP." + ] + }, + "physicalPortReference": { + "id": "physicalPortReference", + "uml-id": "_RLDi4BieEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 6, + "is-read-only": false, + "description": [ + "One or more text labels for the unmodelled physical port associated with the LTP. In many cases there is no associated physical port" + ] + }, + "_ltpRefList": { + "id": "_ltpRefList", + "uml-id": "_vq1NIBigEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 7, + "is-read-only": false, + "description": [ + "References one or more LTPs in other views that represent this LTP. The referencing LTP is the rovider of capability." + ] + }, + "ltpDirection": { + "id": "ltpDirection", + "uml-id": "_S811EEDBEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_RWILYEDAEeWQeOKbNUpP9A", + "order-number": 8, + "is-read-only": false, + "description": [ + "The overall directionality of the LTP. - A BIDIRECTIONAL LTP must have at least some LPs that are BIDIRECTIONAL but may also have some SINK and/or SOURCE LPs. - A SINK LTP can only contain SINK LPs - A SOURCE LTP can only contain SOURCE LPs" + ] + }, + "FcSwitch": { + "id": "FcSwitch", + "uml-id": "_a97NQFYhEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The FcSwitch object class models the switched forwarding of traffic (traffic flow) between FcPorts and is present where there is protection functionality in the FC. If an FC exposes protection (having two FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects to represent the alternative flow choices visible at the edge of the FC. The FC switch represents and defines a protection switch structure encapsulated in the FC. Essentially performs the functoion of the Protection Group in a traditional model. Associates to 2 or more FcPorts each playing the role of a Protection Unit. One or more protection FcPorts (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) FcPorts where eith protection or working can feed one or more protected FcPort. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1).. May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state." + ] + }, + "holdOffTime": { + "id": "holdOffTime", + "uml-id": "_oGqn6FLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": false, + "description": [ + "This attribute indicates the time, in seconds, between declaration of unacceptable quality of signal on the currently selected FcPort, and the initialization of the protection switching algorithm." + ] + }, + "waitToRestoreTime": { + "id": "waitToRestoreTime", + "uml-id": "_oGqn5lLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "description": [ + "If the protection system is revertive, this attribute specifies the amount of time, in seconds, to wait after the preferred FcPort returns to an acceptable state of operaion (e.g a fault has cleared) before restoring traffic to that preferred FcPort." + ] + }, + "protType": { + "id": "protType", + "uml-id": "_oGqn6lLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_c3Hu8Gb3EeWrX_JIGzXlSg", + "order-number": 3, + "is-read-only": false, + "description": [ + "Indicates the protection scheme that is used for the ProtectionGroup." + ] + }, + "operType": { + "id": "operType", + "uml-id": "_oGqn41LNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGqjf1LNEeO75dO39GbF8Q", + "order-number": 4, + "is-read-only": false, + "description": [ + "This attribute whether or not the protection scheme is revertive or non-revertive." + ] + }, + "_selectedFcPortRefList": { + "id": "_selectedFcPortRefList", + "uml-id": "_2PdiYI8lEeOw_ste-s6RrA", + "uml-type": "ownedAttribute", + "type": "_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "description": [ + "Indicates which points are selected by the switch." + ] + }, + "Name": { + "id": "Name", + "uml-id": "_BUcVEI2tEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Name: A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity." + ] + }, + "nameList": { + "id": "nameList", + "uml-id": "_ajjMYI2uEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "List of names." + ] + }, + "GlobalClass": { + "id": "GlobalClass", + "uml-id": "_iVJ1kI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents a type of thing (an Entity) that has instances which can exist in their own right (independently of any others). Entity: Has identity, defined boundary, properties, functionality and lifecycle in a global context. (consider in the context of an Object Class: (usage) The representation of a thing that may be an entity or an inseparable Entity Feature)" + ] + }, + "LocalClass": { + "id": "LocalClass", + "uml-id": "_k5nWYI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A LocalClass represents a Feature of an Entity. It is inseparable from a GlobalClass but is a distinct feature of that GlobalClass such that the instances of LocalClass are able to have associations to other instances.. Feature of an Entity: An inseparable, externally distinguishable part of an entity. The mandatory LocalId of the LocalClass instance is unique in the context of the GlobalClass from which it is inseparable. (consider in the context of an Object Class: (usage) The representation of a thing that may be an entity or an inseparable feature of an entity)" + ] + }, + "localIdList": { + "id": "localIdList", + "uml-id": "_RMJegI22EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "An identifier that is unique in the context of some scope that is less than the global scope. (consider in the context of Identifier: A property of an entity/role with a value that is unique within an identifier space, where the identifier space is itself unique, and immutable. The identifier therefore represents the identity of the entity/role. An identifier carries no semantics with respect to the purpose of the entity.)" + ] + }, + "Label": { + "id": "Label", + "uml-id": "_u0HQoI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A property of an entity with a value that is not expected to be unique and is allowed to change. A label carries no semantics with respect to the purpose of the entity and has no effect on the entity behavior or state." + ] + }, + "labelList": { + "id": "labelList", + "uml-id": "_olrqYI2uEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "List of labels." + ] + }, + "Extension": { + "id": "Extension", + "uml-id": "_bCi74I22EeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Extension provides an opportunity to define properties not declared in the class that extend the class enabling a realization with simple ad-hoc extension of standard classes to be conformant." + ] + }, + "extensionList": { + "id": "extensionList", + "uml-id": "_uQqu4I28EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "List of simple name-value extentions" + ] + }, + "UniversalIdAuthority": { + "id": "UniversalIdAuthority", + "uml-id": "_StA-4I23EeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the authority that controls the allocation of UUIDs." + ] + }, + "NameAndValueAuthority": { + "id": "NameAndValueAuthority", + "uml-id": "_ulDtsI3AEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the authority that controls the legal valuse for the names and values of a name/value attribute." + ] + }, + "uuid": { + "id": "uuid", + "uml-id": "_U1tnkI31EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 0, + "is-read-only": false, + "description": [ + "The UUID for the NameValueAuthority." + ] + }, + "ConditionalPackage": { + "id": "ConditionalPackage", + "uml-id": "_-ZWVQJP0EeOqfpp-ZJSmaA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The base class for conditional packages." + ] + }, + "State_Pac": { + "id": "State_Pac", + "uml-id": "_RG6VILEtEeSZUdYfPSdgew", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Provides general state attributes." + ] + }, + "operationalState": { + "id": "operationalState", + "uml-id": "_dO6owLEtEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_lNclkLEtEeSZUdYfPSdgew", + "order-number": 1, + "is-read-only": true, + "description": [ + "The operational state is used to indicate whether or not the resource is installed and working" + ] + }, + "administrativeControl": { + "id": "administrativeControl", + "uml-id": "_7gqwALEtEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_-xPeALEvEeSZUdYfPSdgew", + "order-number": 2, + "is-read-only": false, + "description": [ + "The administrativeControl state provides control of the availability of specific resources without modification to the provisioning of those resources. The value is the current control target. The actual administrativeState may or may not be at target." + ] + }, + "administrativeState": { + "id": "administrativeState", + "uml-id": "_AjGvILEuEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_KSKOYLEuEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": true, + "description": [ + "Shows whether or not the client has permission to use or has a prohibition against using the resource. The administrative state expresses usage permissions for specific resources without modification to the provisioning of those resources." + ] + }, + "lifecycleState": { + "id": "lifecycleState", + "uml-id": "_PzqZ0GgiEeWmgIwAIZlYKQ", + "uml-type": "ownedAttribute", + "type": "_YSsboGgiEeWmgIwAIZlYKQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Used to track the planned deployment, allocation to clients and withdrawal of resources." + ] + }, + "LayerProtocolName": { + "id": "LayerProtocolName", + "uml-id": "_P-Hp8MD4EeSoNOrYOfaryg", + "uml-type": "uml:DataType", + "description": [ + "Provides a controlled list of layer protocol names and indicates the naming authority. Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference. Layer protocol names include: - Layer 1 (L1): OTU, ODU - Layer 2 (L2): Carrier Grade Ethernet (ETY, ETH), MPLS-TP (MT)" + ] + }, + "PortRole": { + "id": "PortRole", + "uml-id": "_DUU_sGZ_EeWrX_JIGzXlSg", + "uml-type": "uml:DataType", + "description": [ + "The role of a port in the context of the function of the forwarding entity that it bounds" + ] + }, + "ProtectionType": { + "id": "ProtectionType", + "uml-id": "_c3Hu8Gb3EeWrX_JIGzXlSg", + "uml-type": "uml:DataType", + "description": [ + "Identifies the type of rotection of an FcSwitch." + ] + }, + "DateAndTime": { + "id": "DateAndTime", + "uml-id": "_oGqi1lLNEeO75dO39GbF8Q", + "uml-type": "uml:DataType", + "description": [ + "This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000 .. 9999 year MM 01 .. 12 month dd 01 .. 31 day hh 00 .. 23 hour mm 00 .. 59 minute ss 00 .. 59 second s .0 .. .9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00 .. 23 time zone difference in hours Mm 00 .. 59 time zone difference in minutes." + ] + }, + "NameAndValue": { + "id": "NameAndValue", + "uml-id": "_y7oy8I3tEeO38ZmbECnvbg", + "uml-type": "uml:DataType", + "description": [ + "A scoped name-value pair" + ] + }, + "valueName": { + "id": "valueName", + "uml-id": "_77PyQI3tEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "The name of the value. The value need not have a name." + ] + }, + "UniversalId": { + "id": "UniversalId", + "uml-id": "_SU3Q4I30EeO38ZmbECnvbg", + "uml-type": "uml:DataType", + "description": [ + "The univeral ID value where the mechanism for generation is defned by some authority not directly referenced in the structure." + ] + }, + "value": { + "id": "value", + "uml-id": "_cbx2gI30EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The specific value of the universal id" + ] + }, + "_oGqjf1LNEeO75dO39GbF8Q": { + "id": "OperType", + "uml-id": "_oGqjf1LNEeO75dO39GbF8Q", + "enum": [ + "REVERTIVE", + "NON-REVERTIVE" + ], + "is-read-only": false, + "description": [ + "The operation type associated with the protection mechanism (either non-revertive or revertive)." + ] + }, + "_2WpC8EC7EeWxhL2B6Peg6A": { + "id": "PortDirection", + "uml-id": "_2WpC8EC7EeWxhL2B6Peg6A", + "enum": [ + "BIDIRECTIONAL", + "INPUT", + "OUTPUT", + "UNIDENTIFIED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The orientation of flow at the Port of a Forwarding entity" + ] + }, + "_dV67AEC8EeWxhL2B6Peg6A": { + "id": "ForwardingDirection", + "uml-id": "_dV67AEC8EeWxhL2B6Peg6A", + "enum": [ + "BIDIRECTIONAL", + "UNIDIRECTIONAL", + "UNDEFINED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The directionality of a Forwarding entity." + ] + }, + "_RWILYEDAEeWQeOKbNUpP9A": { + "id": "TerminationDirection", + "uml-id": "_RWILYEDAEeWQeOKbNUpP9A", + "enum": [ + "BIDIRECTIONAL", + "SINK", + "SOURCE", + "UNDEFINED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The directionality of a termination entity" + ] + }, + "_T5GykEDNEeWQeOKbNUpP9A": { + "id": "ExtendedTerminationDirection", + "uml-id": "_T5GykEDNEeWQeOKbNUpP9A", + "enum": [ + "CONTRA_DIRECTION_SINK", + "CONTRA_DIRECTION_SOURCE" + ], + "is-read-only": false, + "description": [ + "Extended to include contra-direction considerations. Only applies to LP and elements of LP not to LTP??" + ] + }, + "_6anG8GeEEeWmgIwAIZlYKQ": { + "id": "TerminationState", + "uml-id": "_6anG8GeEEeWmgIwAIZlYKQ", + "enum": [ + "LP_CAN_NEVER_TERMINATE", + "LT_NOT_TERMINATED", + "TERMINATED_SERVER_TO_CLIENT_FLOW", + "TERMINATED_CLIENT_TO_SERVER_FLOW", + "TERMINATED_BIDIRECTIONAL", + "LT_PERMENANTLY_TERMINATED", + "TERMINATION_STATE_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "Provides support for the range of behaviours and specific states that an LP can take with respect to termination of the signal. Indicates to what degree the LayerTermination is terminated." + ] + }, + "_lNclkLEtEeSZUdYfPSdgew": { + "id": "OperationalState", + "uml-id": "_lNclkLEtEeSZUdYfPSdgew", + "enum": [ + "DISABLED", + "ENABLED" + ], + "is-read-only": false, + "description": [ + "The possible values of the operationalState." + ] + }, + "_KSKOYLEuEeSZUdYfPSdgew": { + "id": "AdministrativeState", + "uml-id": "_KSKOYLEuEeSZUdYfPSdgew", + "enum": [ + "LOCKED", + "UNLOCKED" + ], + "is-read-only": false, + "description": [ + "The possible values of the administrativeState." + ] + }, + "_-xPeALEvEeSZUdYfPSdgew": { + "id": "AdministrativeControl", + "uml-id": "_-xPeALEvEeSZUdYfPSdgew", + "enum": [ + "UNLOCK", + "LOCK_PASSIVE", + "LOCK_ACTIVE", + "LOCK_IMMEDIATE" + ], + "is-read-only": false, + "description": [ + "The possible values of the current target administrative state." + ] + }, + "_McyhcGgeEeWmgIwAIZlYKQ": { + "id": "ExtendedAdminState", + "uml-id": "_McyhcGgeEeWmgIwAIZlYKQ", + "enum": [ + "SHUTTING_DOWN_ACTIVE", + "SHUTTING_DOWN_PASSIVE" + ], + "is-read-only": false, + "description": [ + "Possible extentions to AdministrativeState" + ] + }, + "_YSsboGgiEeWmgIwAIZlYKQ": { + "id": "LifecycleState", + "uml-id": "_YSsboGgiEeWmgIwAIZlYKQ", + "enum": [ + "PLANNED", + "POTENTIAL", + "INSTALLED", + "PENDING_REMOVAL" + ], + "is-read-only": false, + "description": [ + "The possible values of the lifecycleState." + ] + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/G.874.1-ForMicrowave.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/G.874.1-ForMicrowave.json new file mode 100644 index 000000000..5c5daa757 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/G.874.1-ForMicrowave.json @@ -0,0 +1,546 @@ +{ + "schema-information": { + "OTN_CurrentData": { + "id": "OTN_CurrentData", + "uml-id": "_OxyHAOGJEeGhaeLtr7IxXg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This object class is an abstract class from which the OTN layer-specific CurrentData object classes are inherited. This object class is a subclass of the Q.822 CurrentData object class, which in turn is a subclass of X.739 Scanner object class. It inherits the following attributes: scannerId, operationalState, granularityPeriod, administrativeState, suspectIntervalFlag, elapsedTime, observedObjectClass, and observedObjectInstance." + ] + }, + "timestamp": { + "id": "timestamp", + "uml-id": "_bGwfoOGJEeGhaeLtr7IxXg", + "uml-type": "ownedAttribute", + "type": "_X-HZUNwbEeGoneTbGt8X0A", + "order-number": 1, + "is-read-only": false, + "description": [ + "The timestamp associated with when the current data was collected." + ] + }, + "OTN_HistoryData": { + "id": "OTN_HistoryData", + "uml-id": "_dQ2mYOGOEeGhaeLtr7IxXg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This object class is an abstract class from which the OTN layer-specific HistoryData object classes are inherited." + ] + }, + "«Q.822»-CurrentData": { + "id": "«Q.822»-CurrentData", + "uml-id": "_M8IDMceIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "suspectIntervalFlag": { + "id": "suspectIntervalFlag", + "uml-id": "_M8IDNceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "description": [ + "This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are:- Suspect data were detected by the actual resource doing data collection.- Transition of the administrativeState attribute to/from the 'lock' state.- Transition of the operationalState to/from the 'disabled' state.- Scheduler setting that inhibits the collection function.- The performance counters were reset during the interval.- The currentData (or subclass) object instance was created during the monitoring period." + ] + }, + "elapsedTime": { + "id": "elapsedTime", + "uml-id": "_M8IDOMeIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false + }, + "«Q.822»-HistoryData": { + "id": "«Q.822»-HistoryData", + "uml-id": "_M8IDVMeIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "historyDataId": { + "id": "historyDataId", + "uml-id": "_M8IDWMeIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1 + }, + "periodEndTime": { + "id": "periodEndTime", + "uml-id": "_M8IDWceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false + }, + "«X.739»-Scanner": { + "id": "«X.739»-Scanner", + "uml-id": "_7wb90ceIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "scannerId": { + "id": "scannerId", + "uml-id": "_7wb91ceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1 + }, + "granularityPeriod": { + "id": "granularityPeriod", + "uml-id": "_M8IDWseIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "_Y6WUEEamEeabNPX3o7rjtw", + "order-number": 2, + "is-read-only": false + }, + "administrativeState": { + "id": "administrativeState", + "uml-id": "_7wb92seIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_KSKOYLEuEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": false + }, + "«X.721»-Top": { + "id": "«X.721»-Top", + "uml-id": "_BMJ0EceTEeS6-cawxfHpnA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This is the top level of managed object class hierarchy and every other managed object class is a specialization of either this generic class (top) or a specialization of subclass of top. The parameter miscellaneousError is to be used when a processing failure has occurred and the error condition encountered does not match any of object's defined specific error types." + ] + }, + "objectClass": { + "id": "objectClass", + "uml-id": "_BMJ0FceTEeS6-cawxfHpnA", + "uml-type": "ownedAttribute", + "type": "_ltGzFMeUEeS6-cawxfHpnA", + "order-number": 1, + "is-read-only": false, + "description": [ + "ObjectClass ::= CHOICE{ globalForm [0] OBJECT IDENTIFIER, localForm [1] INTEGER}" + ] + }, + "nameBinding": { + "id": "nameBinding", + "uml-id": "_BMJ0F8eTEeS6-cawxfHpnA", + "uml-type": "ownedAttribute", + "type": "_ltGzFMeUEeS6-cawxfHpnA", + "order-number": 2, + "is-read-only": false + }, + "DateAndTime": { + "id": "DateAndTime", + "uml-id": "_X-HZUNwbEeGoneTbGt8X0A", + "uml-type": "uml:DataType", + "description": [ + "This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000 .. 9999 year MM 01 .. 12 month dd 01 .. 31 day hh 00 .. 23 hour mm 00 .. 59 minute ss 00 .. 59 second s .0 .. .9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00 .. 23 time zone difference in hours Mm 00 .. 59 time zone difference in minutes." + ] + }, + "_5G6YQOo-EeCjNNLZCc6mew": { + "id": "Directionality", + "uml-id": "_5G6YQOo-EeCjNNLZCc6mew", + "enum": [ + "SINK", + "SOURCE", + "BIDIRECTIONAL" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for directionality of the termination point." + ] + }, + "_rU8aMOpfEeCjNNLZCc6mew": { + "id": "GccAccess", + "uml-id": "_rU8aMOpfEeCjNNLZCc6mew", + "enum": [ + "GCC1", + "GCC2", + "GCC1_AND_GCC2" + ], + "is-read-only": false, + "description": [ + "This enumeration indicates the GCC access represented by the entity." + ] + }, + "_W7-1oOpiEeCjNNLZCc6mew": { + "id": "OperationalState", + "uml-id": "_W7-1oOpiEeCjNNLZCc6mew", + "enum": [ + "ENABLED", + "DISABLED" + ], + "is-read-only": false, + "description": [ + "The list of valid operational states for the connection." + ] + }, + "_g0zCsOsDEeCjNNLZCc6mew": { + "id": "OperType", + "uml-id": "_g0zCsOsDEeCjNNLZCc6mew", + "enum": [ + "REVERTIVE", + "NON-REVERTIVE" + ], + "is-read-only": [ + "The operation type associated with the protection mechanism (either non-revertive or revertive)." + ] + }, + "_Jl09gOsKEeCjNNLZCc6mew": { + "id": "ExtCmdOperation", + "uml-id": "_Jl09gOsKEeCjNNLZCc6mew", + "enum": [ + "EXERCISE", + "MANUAL_SWITCH", + "FORCED_SWITCH", + "LOCKOUT", + "RELEASE_OF_MANUAL_SWITCH", + "RELEASE_OF_FORCED_SWITCH", + "RELEASE_OF_LOCKOUT" + ], + "is-read-only": false, + "description": [ + "This enumeration contains the options for the actions that instruct the protection system for performing specific protection switching operations." + ] + }, + "_bwxBQOw5EeCjNNLZCc6mew": { + "id": "AdministrativeState", + "uml-id": "_bwxBQOw5EeCjNNLZCc6mew", + "enum": [ + "UNLOCKED", + "LOCKED", + "SHUTTING_DOWN" + ], + "is-read-only": false, + "description": [ + "For more information on Administrative State, See ITU-T Recs. X.731 and M.3100." + ] + }, + "_ChQ5oOw-EeCjNNLZCc6mew": { + "id": "OCTk_NimKBitRate", + "uml-id": "_ChQ5oOw-EeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ] + }, + "_ZBtyUOw_EeCjNNLZCc6mew": { + "id": "TimDetMo", + "uml-id": "_ZBtyUOw_EeCjNNLZCc6mew", + "enum": [ + "DAPI", + "SAPI", + "BOTH" + ], + "is-read-only": false, + "description": [ + "List of modes for trace identifier mismatch detection." + ] + }, + "_HF864OxAEeCjNNLZCc6mew": { + "id": "OCTk_NimProblemList", + "uml-id": "_HF864OxAEeCjNNLZCc6mew", + "enum": [ + "LOS_P", + "OCI", + "SSF_P", + "SSF_O", + "SSF", + "TIM", + "DEG", + "BDI" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_WPoNoO3eEeCjNNLZCc6mew": { + "id": "TcmMonitoring", + "uml-id": "_WPoNoO3eEeCjNNLZCc6mew", + "enum": [ + "INTRUSIVE", + "NON-INTRUSIVE" + ], + "is-read-only": false, + "description": [ + "Monitoring types for the tandem connection monitoring function." + ] + }, + "_OI-7wO6QEeCjNNLZCc6mew": { + "id": "TcmMode", + "uml-id": "_OI-7wO6QEeCjNNLZCc6mew", + "enum": [ + "OPERATIONAL", + "TRANSPARENT", + "MONITOR" + ], + "is-read-only": false, + "description": [ + "List of value modes for the sink side of the tandem connection monitoring function." + ] + }, + "_ZnM8cO6ZEeCjNNLZCc6mew": { + "id": "OPSMnk_TtpKBitRate", + "uml-id": "_ZnM8cO6ZEeCjNNLZCc6mew", + "enum": [ + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ] + }, + "_pV-F8O6aEeCjNNLZCc6mew": { + "id": "OPSMnk_TtpProblemList", + "uml-id": "_pV-F8O6aEeCjNNLZCc6mew", + "enum": [ + "LOS", + "LOL" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_QW1SYO6bEeCjNNLZCc6mew": { + "id": "OPSn_TtpProblemList", + "uml-id": "_QW1SYO6bEeCjNNLZCc6mew", + "enum": [ + "LOS" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_o-oukO6bEeCjNNLZCc6mew": { + "id": "OTM-n_KBitRates", + "uml-id": "_o-oukO6bEeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "2.5_10_G", + "10_40_G", + "2.5_10_40_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ] + }, + "_KRCG4O6dEeCjNNLZCc6mew": { + "id": "DomainInterface", + "uml-id": "_KRCG4O6dEeCjNNLZCc6mew", + "enum": [ + "INTRA_DOMAIN", + "INTER_DOMAIN" + ], + "is-read-only": false, + "description": [ + "This enumeration provides the options for the interface associated with OTMn." + ] + }, + "_EOPyIO6qEeCjNNLZCc6mew": { + "id": "OTM-n_OpticalReach", + "uml-id": "_EOPyIO6qEeCjNNLZCc6mew", + "enum": [ + "INTRA_OFFICE", + "SHORTHAUL", + "LONGHAUL" + ], + "is-read-only": false, + "description": [ + "The valid options for reach of the optical cable." + ] + }, + "_6Bt3QO6qEeCjNNLZCc6mew": { + "id": "AprStatus", + "uml-id": "_6Bt3QO6qEeCjNNLZCc6mew", + "enum": [ + "ON", + "OFF" + ], + "is-read-only": false, + "description": [ + "The enumeration of the options for the Automatic Power Reduction Status." + ] + }, + "_FLzNQO6vEeCjNNLZCc6mew": { + "id": "OTSn_TtpProblemList", + "uml-id": "_FLzNQO6vEeCjNNLZCc6mew", + "enum": [ + "BDI_P", + "BDI_O", + "BDI", + "TIM", + "LOS_P", + "LOS_O", + "LOS" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_NAElYO6wEeCjNNLZCc6mew": { + "id": "OTUk_CtpAdaptation", + "uml-id": "_NAElYO6wEeCjNNLZCc6mew", + "enum": [ + "REGULAR", + "NONE", + "VENDOR_SPECIFIC", + "FUNCTIONALLY_STANDARDIZED" + ], + "is-read-only": false, + "description": [ + "The adaptation options for OTUk_ConnectionTermationPoints." + ] + }, + "_wgRHcO6wEeCjNNLZCc6mew": { + "id": "OTUk_CtpKBitRate", + "uml-id": "_wgRHcO6wEeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ] + }, + "_6Y_gEO6wEeCjNNLZCc6mew": { + "id": "OTUk_CtpProblemList", + "uml-id": "_6Y_gEO6wEeCjNNLZCc6mew", + "enum": [ + "LOF", + "AIS", + "LOM" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_xHNWMO6xEeCjNNLZCc6mew": { + "id": "OTUk_TtpProblemList", + "uml-id": "_xHNWMO6xEeCjNNLZCc6mew", + "enum": [ + "TIM", + "DEG", + "BDI", + "SSF" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ] + }, + "_KRQ3MK8KEeG_zYhfU3oMYg": { + "id": "MonitoredDirection", + "uml-id": "_KRQ3MK8KEeG_zYhfU3oMYg", + "enum": [ + "SINK", + "SOURCE" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for directionality for nonintrusive monitoring." + ] + }, + "_qBme4LuYEeGeqZLpdvU3BA": { + "id": "DegThrType", + "uml-id": "_qBme4LuYEeGeqZLpdvU3BA", + "enum": [ + "PERCENTAGE", + "NUMBER_ERRORED_BLOCKS" + ], + "is-read-only": false, + "description": [ + "<p>The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.</p>" + ] + }, + "_Parz8NwAEeGoneTbGt8X0A": { + "id": "LinkType", + "uml-id": "_Parz8NwAEeGoneTbGt8X0A", + "enum": [ + "DWDM", + "CWDM", + "NO_WDM" + ], + "is-read-only": false + }, + "_V1TuANwAEeGoneTbGt8X0A": { + "id": "ApplicationIdentifierType", + "uml-id": "_V1TuANwAEeGoneTbGt8X0A", + "enum": [ + "STANDARD", + "PROPRIETARY" + ], + "is-read-only": false + }, + "_yt7S4PzgEeG3u-aQKIiCtg": { + "id": "ApsChannel", + "uml-id": "_yt7S4PzgEeG3u-aQKIiCtg", + "enum": [ + "PATH", + "TCM1", + "TCM2", + "TCM3", + "TCM4", + "TCM5", + "TCM6", + "SECTION" + ], + "is-read-only": false + }, + "_LG3yQOVVEeKyU85eduW_rA": { + "id": "DelayMeasurementRole", + "uml-id": "_LG3yQOVVEeKyU85eduW_rA", + "enum": [ + "CONTROLLER", + "RESPONDER" + ], + "is-read-only": false + }, + "_7fy9sJSCEeOLxKCUIYtzCg": { + "id": "ResizeOperationType", + "uml-id": "_7fy9sJSCEeOLxKCUIYtzCg", + "enum": [ + "INCREASE_BW", + "DECREASE_BW" + ], + "is-read-only": false + }, + "_Y6WUEEamEeabNPX3o7rjtw": { + "id": "GranularityPeriodType", + "uml-id": "_Y6WUEEamEeabNPX3o7rjtw", + "enum": [ + "UNKNOWN", + "PERIOD_15MIN", + "PERIOD_24HOURS" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for granularity period of the performance data." + ] + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-AirInterface.yin.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-AirInterface.yin.json new file mode 100755 index 000000000..2aeb80f95 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-AirInterface.yin.json @@ -0,0 +1,45 @@ +{
+ "module": {
+ "name": "MicrowaveModel-ObjectClasses-AirInterface",
+ "MicrowaveModel-ObjectClasses-AirInterface": {
+ "MW_AirInterface_Pac": {
+ "type": "list",
+ "key": "layerProtocol",
+ "airInterfaceCapability": {
+ "name": "airInterfaceCapability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "airInterfaceConfiguration": {
+ "name": "airInterfaceConfiguration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "airInterfaceStatus": {
+ "name": "airInterfaceStatus",
+ "local-name": "status",
+ "type": "container"
+ },
+ "airInterfaceCurrentProblems": {
+ "name": "airInterfaceCurrentProblems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "airInterfaceCurrentPerformance": {
+ "name": "airInterfaceCurrentPerformance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "airInterfaceHistoricalPerformances": {
+ "name": "airInterfaceHistoricalPerformances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ },
+ "CoChannelGroup": {
+ "type": "list",
+ "key": "coChannelGroupId"
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-EthernetContainer.yin.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-EthernetContainer.yin.json new file mode 100755 index 000000000..2af4d50da --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-EthernetContainer.yin.json @@ -0,0 +1,41 @@ +{
+ "module": {
+ "name": "MicrowaveModel-ObjectClasses-EthernetContainer",
+ "MicrowaveModel-ObjectClasses-EthernetContainer": {
+ "MW_EthernetContainer_Pac": {
+ "type": "list",
+ "key": "layerProtocol",
+ "ethernetContainerCapability": {
+ "name": "ethernetContainerCapability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "ethernetContainerConfiguration": {
+ "name": "ethernetContainerConfiguration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "ethernetContainerStatus": {
+ "name": "ethernetContainerStatus",
+ "local-name": "status",
+ "type": "container"
+ },
+ "ethernetContainerCurrentProblems": {
+ "name": "ethernetContainerCurrentProblems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "ethernetContainerCurrentPerformance": {
+ "name": "ethernetContainerCurrentPerformance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "ethernetContainerHistoricalPerformances": {
+ "name": "ethernetContainerHistoricalPerformances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-PureEthernetStructure.yin.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-PureEthernetStructure.yin.json new file mode 100755 index 000000000..20726f879 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel-ObjectClasses-PureEthernetStructure.yin.json @@ -0,0 +1,41 @@ +{
+ "module": {
+ "name": "MicrowaveModel-ObjectClasses-PureEthernetStructure",
+ "MicrowaveModel-ObjectClasses-PureEthernetStructure": {
+ "MW_PureEthernetStructure_Pac": {
+ "type": "list",
+ "key": "layerProtocol",
+ "pureEthernetStructureCapability": {
+ "name": "pureEthernetStructureCapability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "pureEthernetStructureConfiguration": {
+ "name": "pureEthernetStructureConfiguration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "pureEthernetStructureStatus": {
+ "name": "pureEthernetStructureStatus",
+ "local-name": "status",
+ "type": "container"
+ },
+ "pureEthernetStructureCurrentProblems": {
+ "name": "pureEthernetStructureCurrentProblems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "pureEthernetStructureCurrentPerformance": {
+ "name": "pureEthernetStructureCurrentPerformance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "pureEthernetStructureHistoricalPerformances": {
+ "name": "pureEthernetStructureHistoricalPerformances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel.json new file mode 100644 index 000000000..34d0503ad --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/MicrowaveModel.json @@ -0,0 +1,2940 @@ +{ + "schema-information": { + "MW_AirInterface_Pac": { + "id": "MW_AirInterface_Pac", + "uml-id": "__1kQ0Hf4EeW-M8kopGJqEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "LTP(MWPS-TTP)" + ] + }, + "airInterfaceCapability": { + "id": "airInterfaceCapability", + "uml-id": "_Dr1uMIekEeWaZYk7gpuOtw", + "uml-type": "ownedAttribute", + "type": "_-LlKoIejEeWaZYk7gpuOtw", + "order-number": 2, + "is-read-only": true + }, + "airInterfaceConfiguration": { + "id": "airInterfaceConfiguration", + "uml-id": "_AEmSAIe1EeWnUdmvl3PBkw", + "uml-type": "ownedAttribute", + "type": "_KOcsUIe0EeWnUdmvl3PBkw", + "order-number": 3, + "is-read-only": false + }, + "airInterfaceStatus": { + "id": "airInterfaceStatus", + "uml-id": "_Vp35cnmgEeWsUsDOj_Trdg", + "uml-type": "ownedAttribute", + "type": "_iCTioHmIEeWRAfnL3fvovg", + "order-number": 4, + "is-read-only": true + }, + "airInterfaceCurrentProblems": { + "id": "airInterfaceCurrentProblems", + "uml-id": "_ZeRYInmgEeWsUsDOj_Trdg", + "uml-type": "ownedAttribute", + "type": "_UF8VcHmIEeWRAfnL3fvovg", + "order-number": 5, + "is-read-only": true + }, + "airInterfaceCurrentPerformance": { + "id": "airInterfaceCurrentPerformance", + "uml-id": "_65_4M6S6EeWyu_jasKgNwA", + "uml-type": "ownedAttribute", + "type": "_CX-iIKS6EeWyu_jasKgNwA", + "order-number": 6, + "is-read-only": true + }, + "airInterfaceHistoricalPerformances": { + "id": "airInterfaceHistoricalPerformances", + "uml-id": "__8icYJHfEeWKxoYCXp1XkQ", + "uml-type": "ownedAttribute", + "type": "_fChNMHmHEeWRAfnL3fvovg", + "order-number": 7, + "is-read-only": true + }, + "AirInterfaceCapability": { + "id": "AirInterfaceCapability", + "uml-id": "_-LlKoIejEeWaZYk7gpuOtw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the 'analog' capabilities of modem and transmitter of the microwave device. Value ranges of attributes are not independently (e.g. min. and max. transmit power depends on modulation). Legal combinations of values are expressed in transmissionModeTypes." + ] + }, + "typeOfEquipment": { + "id": "typeOfEquipment", + "uml-id": "_gK4jMJUBEeWIaZzoaYJ6_A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "This parameter indicates the equipment type. Instead of uploading the complete set of capabilities, capabilities of the same equipment type could be reused. Should be unique for a combination of modem, radio and their respective firmware." + ] + }, + "txFrequencyMin": { + "id": "txFrequencyMin", + "uml-id": "_90Xe0HfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the minimum transmit frequency tunable at the air interface." + ] + }, + "txFrequencyMax": { + "id": "txFrequencyMax", + "uml-id": "_-1ztsHfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the maximum transmit frequency tunable at the air interface." + ] + }, + "rxFrequencyMin": { + "id": "rxFrequencyMin", + "uml-id": "_BLqx0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the minimum receive frequency tunable at the air interface." + ] + }, + "rxFrequencyMax": { + "id": "rxFrequencyMax", + "uml-id": "_CSBV4HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the maximum receive frequency tunable at the air interface." + ] + }, + "adaptiveModulationIsAvail": { + "id": "adaptiveModulationIsAvail", + "uml-id": "_ClmuUHffEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "In case the device is capable of adaptive modulation, this field shall contain a 'true'." + ] + }, + "mimoIsAvail": { + "id": "mimoIsAvail", + "uml-id": "_qXBrkH2eEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": true, + "description": [ + "In case the device is capable of MIMO, this field shall contain a 'true'." + ] + }, + "mimoChannels": { + "id": "mimoChannels", + "uml-id": "_qysT4H2eEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 8, + "is-read-only": true, + "unit": "channels", + "description": [ + "Maximum number (n) of spatial multiplexing streams that can be conveyed by an n x n MIMO configuration." + ] + }, + "alicIsAvail": { + "id": "alicIsAvail", + "uml-id": "_a3HgMIL9EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of Adjacent Link Interference Cancelation (canceling of interference cause by transmitters located at the same site), this field shall contain a 'true'." + ] + }, + "atpcIsAvail": { + "id": "atpcIsAvail", + "uml-id": "_iRRtgHftEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of ATPC, this field shall contain a 'true'." + ] + }, + "atpcRange": { + "id": "atpcRange", + "uml-id": "_ErwNYHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 11, + "is-read-only": true, + "unit": "dB", + "description": [ + "Extent of the ATPC range." + ] + }, + "loopBackIsAvail": { + "id": "loopBackIsAvail", + "uml-id": "_UxjEkIMHEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 13, + "is-read-only": true, + "description": [ + "In case the radio is capable of looping back header information of the air interface, this field shall contain a 'true'." + ] + }, + "maintenanceTimerRange": { + "id": "maintenanceTimerRange", + "uml-id": "_I1FYsMWZEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 14, + "is-read-only": true, + "unit": "s", + "description": [ + "Available time periods for maintenance configurations (e.g. the loop back of microwave header information) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360')." + ] + }, + "supportedChannelPlanList": { + "id": "supportedChannelPlanList", + "uml-id": "_zUKUgPXVEeW9zIqh2WHHww", + "uml-type": "ownedAttribute", + "type": "_oQf6IPXSEeW9zIqh2WHHww", + "order-number": 16, + "is-read-only": true, + "description": [ + "List of channel spacing that are supported by the device." + ] + }, + "AirInterfaceConfiguration": { + "id": "AirInterfaceConfiguration", + "uml-id": "_KOcsUIe0EeWnUdmvl3PBkw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Configuration of the radio link." + ] + }, + "airInterfaceName": { + "id": "airInterfaceName", + "uml-id": "_XMDggIL5EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "Operator specific microwave link ID (often used for coding area, type of element and sequential number)." + ] + }, + "radioSignalID": { + "id": "radioSignalID", + "uml-id": "_QY9KoHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "description": [ + "The value zero might be used to make the microwave to disable the link ID check." + ] + }, + "txFrequency": { + "id": "txFrequency", + "uml-id": "_UNE8gHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Center frequency of the transmit channel. The values to be configured have to exactly match the values listed in the international agreement referenced in channelPlanID. In case of automated selection of the transmit frequency this field shall describe the lowest center frequency selectable." + ] + }, + "rxFrequency": { + "id": "rxFrequency", + "uml-id": "_W7ayEHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Center frequency of the receive channel." + ] + }, + "txChannelBandwidth": { + "id": "txChannelBandwidth", + "uml-id": "_bhAdIHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ] + }, + "rxChannelBandwidth": { + "id": "rxChannelBandwidth", + "uml-id": "_eKIbgHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Bandwidth of the receive channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ] + }, + "polarization": { + "id": "polarization", + "uml-id": "_bVebEI99EeWFluv9KLLl5A", + "uml-type": "ownedAttribute", + "type": "_e85NsI99EeWFluv9KLLl5A", + "order-number": 7, + "is-read-only": false, + "description": [ + "Allows documenting the polarization of the air interface." + ] + }, + "powerIsOn": { + "id": "powerIsOn", + "uml-id": "_p4eR8Hf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "Power ON. Activation of the entire radio in a split mount configuration shall be expressed as a 'true'." + ] + }, + "transmitterIsOn": { + "id": "transmitterIsOn", + "uml-id": "_uYVvgHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": false, + "description": [ + "Activation of the transmitter inside the radio shall be expressed as a 'true'." + ] + }, + "receiverIsOn": { + "id": "receiverIsOn", + "uml-id": "_q_XcwEgnEeathrAE0htMiA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": false, + "description": [ + "Maintenance Feature" + ] + }, + "txPower": { + "id": "txPower", + "uml-id": "_ZEXmIHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 11, + "is-read-only": false, + "unit": "dBm", + "description": [ + "Transmit power to be configured on the microwave link. Signed Byte is required. The actually operated transmit power might be lower depending on adaptive modulation and ATPC." + ] + }, + "adaptiveModulationIsOn": { + "id": "adaptiveModulationIsOn", + "uml-id": "_0jhfYHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 12, + "is-read-only": false, + "description": [ + "Adaptive Modulation. Activation of adaptive modulation shall be expressed as a 'true'." + ] + }, + "modulationMin": { + "id": "modulationMin", + "uml-id": "_dM_BUHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 13, + "is-read-only": false, + "unit": "symbols", + "description": [ + "Minimum modulation to be configured (in case adaptive modulation is not used, this value represents also the fixed modulation). The modulation scheme shall be described by the number of symbols (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ] + }, + "modulationMax": { + "id": "modulationMax", + "uml-id": "_gAHQQHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 14, + "is-read-only": false, + "unit": "symbols", + "description": [ + "Maximum modulation to be configured. The value of this field is only relevant, if Adaptive Modulation has been activated. The modulation scheme shall be described by the number of symbols (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ] + }, + "xpicIsOn": { + "id": "xpicIsOn", + "uml-id": "_4hi0IHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 15, + "is-read-only": false, + "description": [ + "Activation of Cross Polarization Interference Cancelation shall be expressed as a 'true'. In case XPIC is not available for the current combination of channel bandwidth and modulation or the hardware in general, this parameter shall always be set to 'false'." + ] + }, + "mimoIsOn": { + "id": "mimoIsOn", + "uml-id": "_7t4fIH2dEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 16, + "is-read-only": false, + "description": [ + "Activation of Multiple Input Multiple Output (MIMO) shall be expressed as a 'true'." + ] + }, + "alicIsOn": { + "id": "alicIsOn", + "uml-id": "_FmWHMHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 17, + "is-read-only": false, + "description": [ + "Activation of Adjacent Link Interference Cancelation (ALIC) shall be expressed as a 'true'." + ] + }, + "atpcIsOn": { + "id": "atpcIsOn", + "uml-id": "_9Hz0oHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 18, + "is-read-only": false, + "description": [ + "ATPC. Activation of Automated Transmit Power Control shall be expressed as a 'true'." + ] + }, + "atpcThreshUpper": { + "id": "atpcThreshUpper", + "uml-id": "_pR7yMHgAEeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 19, + "is-read-only": false, + "unit": "dBm", + "description": [ + "If the receive level is higher than the upper threshold value, the transmitter is notified to decrease transmit power." + ] + }, + "atpcThreshLower": { + "id": "atpcThreshLower", + "uml-id": "_sIlPMHgAEeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 20, + "is-read-only": false, + "unit": "dBm", + "description": [ + "If the receive level is lower than the lower threshold value, the transmitter is notified to increase transmit power." + ] + }, + "autoFreqSelectIsOn": { + "id": "autoFreqSelectIsOn", + "uml-id": "_dG5VAIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 21, + "is-read-only": false, + "description": [ + "Activation of automatically selecting the transmit frequency in unlicensed bands shall be expressed as a 'true'." + ] + }, + "autoFreqSelectRange": { + "id": "autoFreqSelectRange", + "uml-id": "_yH9XMIMCEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 22, + "is-read-only": false, + "unit": "channels", + "description": [ + "Number of transmit channels (starting at the center frequency defined in txFrequency and with channel bandwidth according to txChannelBandwidth) that define the range within the transmit frequency can automatically been chosen." + ] + }, + "modulationIsOn": { + "id": "modulationIsOn", + "uml-id": "_kxXzwIMGEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 23, + "is-read-only": false, + "description": [ + "Maintenance Feature" + ] + }, + "loopBackIsOn": { + "id": "loopBackIsOn", + "uml-id": "_PyRvsHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 26, + "is-read-only": false, + "description": [ + "Maintenance Feature" + ] + }, + "maintenanceTimer": { + "id": "maintenanceTimer", + "uml-id": "_7-oTwCd5EeaJA6AVLNrv_w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 27, + "is-read-only": false, + "unit": "s", + "description": [ + "Time of existence of any maintenance configuration (e.g. the loop back of microwave header information). Valid values are defined in AirInterface::AirInterfaceCapability::maintenanceTimerRange." + ] + }, + "AirInterfaceStatus": { + "id": "AirInterfaceStatus", + "uml-id": "_iCTioHmIEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Measurements of current values on the air interface and operational status of the device." + ] + }, + "txFrequencyCur": { + "id": "txFrequencyCur", + "uml-id": "_YZq7gK4tEeWXs6m-9H3KvA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Center frequency of the currently operated transmit channel." + ] + }, + "rxFrequencyCur": { + "id": "rxFrequencyCur", + "uml-id": "_33IdUIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Center frequency of the currently operated receive channel." + ] + }, + "txLevelCur": { + "id": "txLevelCur", + "uml-id": "_L3B5wHgIEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 3, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Current transmit level." + ] + }, + "rxLevelCur": { + "id": "rxLevelCur", + "uml-id": "_OHN9AHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 4, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Current receive level." + ] + }, + "modulationCur": { + "id": "modulationCur", + "uml-id": "_RBMa0HizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 5, + "is-read-only": true, + "unit": "symbols", + "description": [ + "Currently operated modulation on transmit path. The modulation scheme shall be described by the number of symbols (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ] + }, + "informationRateCur": { + "id": "informationRateCur", + "uml-id": "_UYyBsHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 6, + "is-read-only": true, + "unit": "%", + "description": [ + "Information rate of the currently operated coding scheme." + ] + }, + "xpdCur": { + "id": "xpdCur", + "uml-id": "_Z7NvgHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 8, + "is-read-only": true, + "unit": "dB", + "description": [ + "Currently measured cross polarization discrimination." + ] + }, + "rfTempCur": { + "id": "rfTempCur", + "uml-id": "_d6wuQHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 9, + "is-read-only": true, + "unit": "Celsius", + "description": [ + "Current temperature (in degree Celsius) of the radio module inside the outdoor unit." + ] + }, + "radioPowerIsUp": { + "id": "radioPowerIsUp", + "uml-id": "_sFKXcHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 11, + "is-read-only": true, + "description": [ + "If the radio unit has power and is switched on, this shall be expressed as a 'true'." + ] + }, + "linkIsUp": { + "id": "linkIsUp", + "uml-id": "_5JBPUHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 12, + "is-read-only": true, + "description": [ + "If connection is established to the remote site with the same linkID, this shall be expressed as a 'true'." + ] + }, + "xpicIsUp": { + "id": "xpicIsUp", + "uml-id": "_ESRbsHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 13, + "is-read-only": true, + "description": [ + "If XPIC is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "mimoIsUp": { + "id": "mimoIsUp", + "uml-id": "_DVaQwIL6EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 14, + "is-read-only": true, + "description": [ + "If MIMO is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "alicIsUp": { + "id": "alicIsUp", + "uml-id": "_Hte-UHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 15, + "is-read-only": true, + "description": [ + "If Adjacent Link Interference Cancelation (ALIC) is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "atpcIsUp": { + "id": "atpcIsUp", + "uml-id": "_VimCgMjNEeWYRsWW_rqpgw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 16, + "is-read-only": true, + "description": [ + "If ATPC is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "autoFreqSelectIsUp": { + "id": "autoFreqSelectIsUp", + "uml-id": "_-PXKsIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 17, + "is-read-only": true, + "description": [ + "If automated frequency selection is currently actually working (not just configured), this shall be expressed as a 'true'." + ] + }, + "loopBackIsUp": { + "id": "loopBackIsUp", + "uml-id": "_S9prAHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 18, + "is-read-only": true, + "description": [ + "If loop back of the air interface header is currently active (not just configured), this shall be expressed as a 'true'." + ] + }, + "localEndPointId": { + "id": "localEndPointId", + "uml-id": "_pEsgcFQHEeaCXY7nSBqs6w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 19, + "is-read-only": true, + "description": [ + "The value of the localEndPointId is a vendor specific identifier of the air interface, used by the node to discover a microwave radio link." + ] + }, + "remoteEndPointId": { + "id": "remoteEndPointId", + "uml-id": "_r3cU4FQHEeaCXY7nSBqs6w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 20, + "is-read-only": true, + "description": [ + "The value of the remoteEndPointId is a vendor specific identifier or the airinterface at the remote side, used to by the node to discover a microwave radio link." + ] + }, + "AirInterfaceCurrentProblems": { + "id": "AirInterfaceCurrentProblems", + "uml-id": "_UF8VcHmIEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "AirInterfaceCurrentPerformance": { + "id": "AirInterfaceCurrentPerformance", + "uml-id": "_CX-iIKS6EeWyu_jasKgNwA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface at a particular moment." + ] + }, + "AirInterfaceHistoricalPerformances": { + "id": "AirInterfaceHistoricalPerformances", + "uml-id": "_fChNMHmHEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface for a pre-defined measurement interval." + ] + }, + "CoChannelGroup": { + "id": "CoChannelGroup", + "uml-id": "_XBs2YJQrEeWOu_cDl8dd7w", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Required for configuring XPIC, MIMO and ALIC." + ] + }, + "coChannelGroupId": { + "id": "coChannelGroupId", + "uml-id": "_pIjBgEy7EeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1 + }, + "airInterfaceList": { + "id": "airInterfaceList", + "uml-id": "_tIadUCJeEeaCUo1MUtSuEg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "List of air interfaces, which are part of the co-channel (XPIC, MIMO, ALIC) group." + ] + }, + "sortOfCoChannelGroup": { + "id": "sortOfCoChannelGroup", + "uml-id": "_ZrjZcJRrEeWIaZzoaYJ6_A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 3, + "is-read-only": false, + "description": [ + "Type of group of air interfaces with the same transmit and receive frequency. The values shall be chosen from the following _list:'XPIC', 'MIMO', 'ALIC';" + ] + }, + "MW_AirInterfaceHsbEndPoint_Pac": { + "id": "MW_AirInterfaceHsbEndPoint_Pac", + "uml-id": "_CXKgMJRbEeWMYJZn43K_Aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The EndPoint (EP) object class models the access to the FC function. Each EndPoint instance has a role (e.g., working, protection, protected, hub, spoke, leaf, root, etc.) with respect to the FC function. The association of the FC to LTPs is made via EndPoints (essentially the ports of the FC) where each EndPoint (EP) of the FC has a role in the context of the FC. The traffic forwarding between the associated End PointsEPs of the FC depends upon the type of FC and may be associated with FCSwitch object instances. In cases where there is protection conveys the protecting role of the access to the FC. The EP replaces the Protection Unit of a traditional protection model. It represents a protected (resilient/reliable) point or a protecting (unreliable working or protection) point." + ] + }, + "role": { + "id": "role", + "uml-id": "_CXKgNpRbEeWMYJZn43K_Aw", + "uml-type": "ownedAttribute", + "type": "_01_dYJReEeWxIPEwZQ_gmw", + "order-number": 1, + "is-read-only": false + }, + "endpoint": { + "id": "endpoint", + "uml-id": "_dglVQLYgEeWOio-Gg6Q2sw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "is-key": 1 + }, + "MW_AirInterfaceHsbFcSwitch_Pac": { + "id": "MW_AirInterfaceHsbFcSwitch_Pac", + "uml-id": "_CXNjgJRbEeWMYJZn43K_Aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents and defines a protection switch structure encapsulated in the forwarding construct. Essentially performs the function of Protection Group. Associates to 2 or more Endpoints each playing the role of a Protection Unit. One or more protection EndPoints (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) Endpoints where either protection or working can feed one or more protected Endpoint. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1). May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state." + ] + }, + "protType": { + "id": "protType", + "uml-id": "_CXNjiJRbEeWMYJZn43K_Aw", + "uml-type": "ownedAttribute", + "type": "_DaB5IJRgEeWxIPEwZQ_gmw", + "order-number": 1, + "is-read-only": false, + "description": [ + "Indicates the protection scheme that is used for the ProtectionGroup." + ] + }, + "airInterfaceHsbConfigurationIsFaultySeverity": { + "id": "airInterfaceHsbConfigurationIsFaultySeverity", + "uml-id": "_80BlAJ2gEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "The level of severity of an airInterfaceHsbConfigurationIsFaulty alarm shall be chosen from an enumeration." + ] + }, + "airInterfaceHsbIsPartlyDownSeverity": { + "id": "airInterfaceHsbIsPartlyDownSeverity", + "uml-id": "_r382sJ2mEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 3, + "is-read-only": false, + "description": [ + "The level of severity for one link out of the HSB configuration being down shall be chosen from an enumeration." + ] + }, + "airInterfaceHsbIsDownSeverity": { + "id": "airInterfaceHsbIsDownSeverity", + "uml-id": "_sRGWgJ2mEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 4, + "is-read-only": false, + "description": [ + "The level of severity of the total HSB configuration being down shall be chosen from an enumeration." + ] + }, + "fcswitch": { + "id": "fcswitch", + "uml-id": "_FS83ILYhEeWOio-Gg6Q2sw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_a97NQFYhEeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "is-key": 1 + }, + "MW_AirInterfaceDiversity_Pac": { + "id": "MW_AirInterfaceDiversity_Pac", + "uml-id": "_WbgFcHgFEeWfutScSwFT9A", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "LTP(MWS-CTP-xD)" + ] + }, + "airInterfaceDiversityCapability": { + "id": "airInterfaceDiversityCapability", + "uml-id": "_mQ_9YJICEeWUdbnmmNiTAA", + "uml-type": "ownedAttribute", + "type": "_vxH2wIekEeWaZYk7gpuOtw", + "order-number": 2, + "is-read-only": true + }, + "airInterfaceDiversityConfiguration": { + "id": "airInterfaceDiversityConfiguration", + "uml-id": "_wXazw5ICEeWUdbnmmNiTAA", + "uml-type": "ownedAttribute", + "type": "_43RTMIe1EeWnUdmvl3PBkw", + "order-number": 3, + "is-read-only": false + }, + "airInterfaceDiversityCurrentProblems": { + "id": "airInterfaceDiversityCurrentProblems", + "uml-id": "_zA4JU5ICEeWUdbnmmNiTAA", + "uml-type": "ownedAttribute", + "type": "_CAvhEHvtEeWzooKF5kx0aw", + "order-number": 5, + "is-read-only": true + }, + "airInterfaceDiversityCurrentPerformance": { + "id": "airInterfaceDiversityCurrentPerformance", + "uml-id": "_XpGjA6jDEeWlgMiFXLmCIQ", + "uml-type": "ownedAttribute", + "type": "_GIsAQKjDEeWlgMiFXLmCIQ", + "order-number": 6, + "is-read-only": true + }, + "airInterfaceDiversityHistoricalPerformances": { + "id": "airInterfaceDiversityHistoricalPerformances", + "uml-id": "_z8F0Y5ICEeWUdbnmmNiTAA", + "uml-type": "ownedAttribute", + "type": "_8IIu8HvsEeWzooKF5kx0aw", + "order-number": 7, + "is-read-only": true + }, + "AirInterfaceDiversityCapability": { + "id": "AirInterfaceDiversityCapability", + "uml-id": "_vxH2wIekEeWaZYk7gpuOtw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the capabilities in implementing different types of air interface diversity." + ] + }, + "availableKindsOfDiversity": { + "id": "availableKindsOfDiversity", + "uml-id": "_luAGENyVEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "_pTliINyUEeW-SfXlFFFI0Q", + "order-number": 1, + "is-read-only": true, + "description": [ + "Available types of diversity to be listed." + ] + }, + "AirInterfaceDiversityConfiguration": { + "id": "AirInterfaceDiversityConfiguration", + "uml-id": "_43RTMIe1EeWnUdmvl3PBkw", + "uml-type": "uml:Class", + "is-read-only": false + }, + "airInterfaceDiversity": { + "id": "airInterfaceDiversity", + "uml-id": "_hynTIHi_EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "_pTliINyUEeW-SfXlFFFI0Q", + "order-number": 1, + "is-read-only": false, + "description": [ + "Type of air interface diversity configured at the link." + ] + }, + "airInterfaceLtpList": { + "id": "airInterfaceLtpList", + "uml-id": "_xRMKgNyXEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "_multiplicity:2-ThisAirInterfaceDiversity::AirInterfaceDiversityConfiguration::airInterfaceDiversity::diversityType::numberOfAirInterfacesMax" + ] + }, + "AirInterfaceDiversityStatus": { + "id": "AirInterfaceDiversityStatus", + "uml-id": "_-O9RgHvsEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false + }, + "snirCur": { + "id": "snirCur", + "uml-id": "_B7G0AEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 1, + "is-read-only": true, + "unit": "dB", + "description": [ + "Currently measured signal to (noise+interference) ratio of the combined signals." + ] + }, + "airInterfaceDiversityStatus": { + "id": "airInterfaceDiversityStatus", + "uml-id": "_EKZYcJOXEeWz-6sqLzUedw", + "uml-type": "ownedAttribute", + "type": "_DUJs8JOXEeWz-6sqLzUedw", + "order-number": 2, + "is-read-only": true, + "description": [ + "Status of the air interface bundle." + ] + }, + "AirInterfaceDiversityCurrentProblems": { + "id": "AirInterfaceDiversityCurrentProblems", + "uml-id": "_CAvhEHvtEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false + }, + "AirInterfaceDiversityCurrentPerformance": { + "id": "AirInterfaceDiversityCurrentPerformance", + "uml-id": "_GIsAQKjDEeWlgMiFXLmCIQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface diversity configuration at a particular moment." + ] + }, + "AirInterfaceDiversityHistoricalPerformances": { + "id": "AirInterfaceDiversityHistoricalPerformances", + "uml-id": "_8IIu8HvsEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface diversity configuration for a pre-defined measurement interval." + ] + }, + "MW_PureEthernetStructure_Pac": { + "id": "MW_PureEthernetStructure_Pac", + "uml-id": "__OTQ0UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The pureEthernetStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting Ethernet traffic only." + ] + }, + "pureEthernetStructureCapability": { + "id": "pureEthernetStructureCapability", + "uml-id": "_dJcm0VAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTQ4EaeEeas2eqI3oKNtg", + "order-number": 2, + "is-read-only": true + }, + "pureEthernetStructureConfiguration": { + "id": "pureEthernetStructureConfiguration", + "uml-id": "_kHaeglAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTQ8UaeEeas2eqI3oKNtg", + "order-number": 3, + "is-read-only": false + }, + "pureEthernetStructureStatus": { + "id": "pureEthernetStructureStatus", + "uml-id": "_lsNSEFAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTQ_UaeEeas2eqI3oKNtg", + "order-number": 4, + "is-read-only": true + }, + "pureEthernetStructureCurrentProblems": { + "id": "pureEthernetStructureCurrentProblems", + "uml-id": "_nCtK8lAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTRCUaeEeas2eqI3oKNtg", + "order-number": 5, + "is-read-only": true + }, + "pureEthernetStructureCurrentPerformance": { + "id": "pureEthernetStructureCurrentPerformance", + "uml-id": "_ocuR4VAfEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTRD0aeEeas2eqI3oKNtg", + "order-number": 6, + "is-read-only": true + }, + "pureEthernetStructureHistoricalPerformances": { + "id": "pureEthernetStructureHistoricalPerformances", + "uml-id": "_Xb6U4FAiEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "__OTRE0aeEeas2eqI3oKNtg", + "order-number": 7, + "is-read-only": true + }, + "PureEthernetStructureCapability": { + "id": "PureEthernetStructureCapability", + "uml-id": "__OTQ4EaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "No TDM transport." + ] + }, + "PureEthernetStructureConfiguration": { + "id": "PureEthernetStructureConfiguration", + "uml-id": "__OTQ8UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "PureEthernetStructureStatus": { + "id": "PureEthernetStructureStatus", + "uml-id": "__OTQ_UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "PureEthernetStructureCurrentProblems": { + "id": "PureEthernetStructureCurrentProblems", + "uml-id": "__OTRCUaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "PureEthernetStructureCurrentPerformance": { + "id": "PureEthernetStructureCurrentPerformance", + "uml-id": "__OTRD0aeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of an pure Ethernet microwave at a particular moment." + ] + }, + "PureEthernetStructureHistoricalPerformances": { + "id": "PureEthernetStructureHistoricalPerformances", + "uml-id": "__OTRE0aeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of an pure Ethernet microwave for a pre-defined measurement interval." + ] + }, + "MW_HybridMwStructure_Pac": { + "id": "MW_HybridMwStructure_Pac", + "uml-id": "_Bzxo0UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The HybridMwStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM and Ethernet traffic." + ] + }, + "hybridMwStructureCapability": { + "id": "hybridMwStructureCapability", + "uml-id": "_2nQhIFAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_Bzxo4EagEeas2eqI3oKNtg", + "order-number": 2, + "is-read-only": true + }, + "hybridMwStructureConfiguration": { + "id": "hybridMwStructureConfiguration", + "uml-id": "_3-63oVAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_Bzxo8UagEeas2eqI3oKNtg", + "order-number": 3, + "is-read-only": false + }, + "hybridMwStructureStatus": { + "id": "hybridMwStructureStatus", + "uml-id": "_5fWvolAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_Bzxo_UagEeas2eqI3oKNtg", + "order-number": 4, + "is-read-only": true + }, + "hybridMwStructureCurrentProblems": { + "id": "hybridMwStructureCurrentProblems", + "uml-id": "_6ZbLMlAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_BzxpCUagEeas2eqI3oKNtg", + "order-number": 5, + "is-read-only": true + }, + "hybridMwStructureCurrentPerformance": { + "id": "hybridMwStructureCurrentPerformance", + "uml-id": "_7FMFAFAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_BzxpD0agEeas2eqI3oKNtg", + "order-number": 6, + "is-read-only": true + }, + "hybridMwStructureHistoricalPerformances": { + "id": "hybridMwStructureHistoricalPerformances", + "uml-id": "_8CWQ0VAjEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_BzxpE0agEeas2eqI3oKNtg", + "order-number": 7, + "is-read-only": true + }, + "HybridMwStructureCapability": { + "id": "HybridMwStructureCapability", + "uml-id": "_Bzxo4EagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "TDM transport is available." + ] + }, + "structureId": { + "id": "structureId", + "uml-id": "_Bzxo5EagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Identifies the Structure for bundling and container." + ] + }, + "supportedTdmStructureTypesList": { + "id": "supportedTdmStructureTypesList", + "uml-id": "_tA-uQEduEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_jRAQsEdoEeax2rWez10Siw", + "order-number": 2, + "is-read-only": true, + "description": [ + "Lists the TDM frame types that are supported." + ] + }, + "HybridMwStructureConfiguration": { + "id": "HybridMwStructureConfiguration", + "uml-id": "_Bzxo8UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "structureType": { + "id": "structureType", + "uml-id": "_cduh4EdvEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_jRAQsEdoEeax2rWez10Siw", + "order-number": 1, + "is-read-only": false, + "description": [ + "TDM frame to be applied." + ] + }, + "numberOfTdmSegmentsToBeReserved": { + "id": "numberOfTdmSegmentsToBeReserved", + "uml-id": "_Bzxo9EagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 2, + "is-read-only": false, + "description": [ + "Allows to configure the number of segments reserved for TDM frames of the type specified in HybridMwStructure::HybridMwStructureConfiguration::structureType" + ] + }, + "HybridMwStructureStatus": { + "id": "HybridMwStructureStatus", + "uml-id": "_Bzxo_UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "segmentStatusList": { + "id": "segmentStatusList", + "uml-id": "_BzxpAEagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_KwZVcMUCEeW3xsRKtpCLuA", + "order-number": 1, + "is-read-only": true, + "description": [ + "Multiplicity = HybridMwStructure::StructureConfiguration::tdmReservedNumberOfSegments + 1" + ] + }, + "HybridMwStructureCurrentProblems": { + "id": "HybridMwStructureCurrentProblems", + "uml-id": "_BzxpCUagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "HybridMwStructureCurrentPerformance": { + "id": "HybridMwStructureCurrentPerformance", + "uml-id": "_BzxpD0agEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of a hybrid microwave at a particular moment." + ] + }, + "HybridMwStructureHistoricalPerformances": { + "id": "HybridMwStructureHistoricalPerformances", + "uml-id": "_BzxpE0agEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of a hybrid microwave for a pre-defined measurement interval." + ] + }, + "MW_EthernetContainer_Pac": { + "id": "MW_EthernetContainer_Pac", + "uml-id": "_4uEBgUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "LTP(Client)" + ] + }, + "ethernetContainerCapability": { + "id": "ethernetContainerCapability", + "uml-id": "_vWwdEVAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uEBmEafEeas2eqI3oKNtg", + "order-number": 2, + "is-read-only": true + }, + "ethernetContainerConfiguration": { + "id": "ethernetContainerConfiguration", + "uml-id": "_v8JCEFAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uEBwUafEeas2eqI3oKNtg", + "order-number": 3, + "is-read-only": false + }, + "ethernetContainerStatus": { + "id": "ethernetContainerStatus", + "uml-id": "_wvtNAVAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uECAUafEeas2eqI3oKNtg", + "order-number": 4, + "is-read-only": true + }, + "ethernetContainerCurrentProblems": { + "id": "ethernetContainerCurrentProblems", + "uml-id": "_xUWyMlAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uECDUafEeas2eqI3oKNtg", + "order-number": 5, + "is-read-only": true + }, + "ethernetContainerCurrentPerformance": { + "id": "ethernetContainerCurrentPerformance", + "uml-id": "_x7K6kFAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uECE0afEeas2eqI3oKNtg", + "order-number": 6, + "is-read-only": true + }, + "ethernetContainerHistoricalPerformances": { + "id": "ethernetContainerHistoricalPerformances", + "uml-id": "_ynDJIFAlEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_4uECF0afEeas2eqI3oKNtg", + "order-number": 7, + "is-read-only": true + }, + "EthernetContainerCapability": { + "id": "EthernetContainerCapability", + "uml-id": "_4uEBmEafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "bundlingIsAvail": { + "id": "bundlingIsAvail", + "uml-id": "_96g-oEanEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": true, + "description": [ + "This attribute has to be set on 'true', if the device allows combining resources from several air interfaces for transporting this Ethernet container." + ] + }, + "packetCompressionIsAvail": { + "id": "packetCompressionIsAvail", + "uml-id": "_4uEBp0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "In case packet compression can be activated, but not configured to a certain type, packetCompressionAvail shall be set on 'true', but none of the compression level specific booleans." + ] + }, + "layer2CompressionIsAvail": { + "id": "layer2CompressionIsAvail", + "uml-id": "_4uEBqkafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": true, + "description": [ + "Packet compression on layer 2 available at the device." + ] + }, + "vlanCompressionIsAvail": { + "id": "vlanCompressionIsAvail", + "uml-id": "_4uEBrUafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "Packet compression on VLAN layer available at the device." + ] + }, + "qInQCompressionIsAvail": { + "id": "qInQCompressionIsAvail", + "uml-id": "_4uEBsEafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 5, + "is-read-only": true, + "description": [ + "Packet compression on layer of a second VLAN available at the device." + ] + }, + "mplsCompressionIsAvail": { + "id": "mplsCompressionIsAvail", + "uml-id": "_4uEBs0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "Packet compression on mpls layer available at the device." + ] + }, + "ipv4CompressionIsAvail": { + "id": "ipv4CompressionIsAvail", + "uml-id": "_4uEBtkafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": true, + "description": [ + "Packet compression on layer 3 for IPv4 available at the device." + ] + }, + "ipv6CompressionIsAvail": { + "id": "ipv6CompressionIsAvail", + "uml-id": "_4uEBuUafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": true, + "description": [ + "Packet compression on layer 3 for IPv6 available at the device." + ] + }, + "layer4CompressionIsAvail": { + "id": "layer4CompressionIsAvail", + "uml-id": "_4uEBvEafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": true, + "description": [ + "Packet compression on layer 4 (TCP and UDP header) available at the device." + ] + }, + "encryptionIsAvail": { + "id": "encryptionIsAvail", + "uml-id": "_4uPM8E58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "Shall be marked 'true', if Ethernet payload encryption is available." + ] + }, + "EthernetContainerConfiguration": { + "id": "EthernetContainerConfiguration", + "uml-id": "_4uEBwUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "segmentsIDList": { + "id": "segmentsIDList", + "uml-id": "_4uEBy0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "Lists the segments used for transporting this Ethernet container. In case EthernetContainer::ContainerCapability::bundlingIsAvail==0, all TypeDefinitions::segmentIdType::structureId must be identical in the list." + ] + }, + "packetCompressionIsOn": { + "id": "packetCompressionIsOn", + "uml-id": "_4uEB1UafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": false, + "description": [ + "In case packet compression is activated, but no type is activated, it is assumed that the device chooses the optimum." + ] + }, + "layer2CompressionIsOn": { + "id": "layer2CompressionIsOn", + "uml-id": "_4uEB2kafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "description": [ + "Packet compression on layer 2 configured at the device." + ] + }, + "vlanCompressionIsOn": { + "id": "vlanCompressionIsOn", + "uml-id": "_4uEB30afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 5, + "is-read-only": false, + "description": [ + "Packet compression on VLAN layer configured at the device." + ] + }, + "qInQCompressionIsOn": { + "id": "qInQCompressionIsOn", + "uml-id": "_4uEB5EafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": false, + "description": [ + "Packet compression on layer of a second VLAN configured at the device." + ] + }, + "mplsCompressionIsOn": { + "id": "mplsCompressionIsOn", + "uml-id": "_4uEB6UafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": false, + "description": [ + "Packet compression on MPLS layer configured at the device." + ] + }, + "ipv4CompressionIsOn": { + "id": "ipv4CompressionIsOn", + "uml-id": "_4uEB7kafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "Packet compression on layer 3 for IPv4 configured at the device." + ] + }, + "ipv6CompressionIsOn": { + "id": "ipv6CompressionIsOn", + "uml-id": "_4uEB80afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": false, + "description": [ + "Packet compression on layer 3 for IPv6 configured at the device." + ] + }, + "layer4CompressionIsOn": { + "id": "layer4CompressionIsOn", + "uml-id": "_4uEB-EafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": false, + "description": [ + "Packet compression on layer 4 (TCP and UDP header) configured at the device." + ] + }, + "encryptionIsOn": { + "id": "encryptionIsOn", + "uml-id": "_uI7bIE58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 11, + "is-read-only": false, + "description": [ + "Activates encryption of the Ethernet payload." + ] + }, + "cryptographicKey": { + "id": "cryptographicKey", + "uml-id": "_psRpoE58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 12, + "is-read-only": false, + "description": [ + "Key for transforming plaintext into cipher text data." + ] + }, + "EthernetContainerStatus": { + "id": "EthernetContainerStatus", + "uml-id": "_4uECAUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "EthernetContainerCurrentProblems": { + "id": "EthernetContainerCurrentProblems", + "uml-id": "_4uECDUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "EthernetContainerCurrentPerformance": { + "id": "EthernetContainerCurrentPerformance", + "uml-id": "_4uECE0afEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the Ethernet container at a particular moment." + ] + }, + "EthernetContainerHistoricalPerformances": { + "id": "EthernetContainerHistoricalPerformances", + "uml-id": "_4uECF0afEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the Ethernet container for a pre-defined measurement interval." + ] + }, + "MW_TdmContainer_Pac": { + "id": "MW_TdmContainer_Pac", + "uml-id": "_ecCeMUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "LTP(Client)" + ] + }, + "layerProtocol": { + "id": "layerProtocol", + "uml-id": "_m_QIglpKEeax66gMnmfzpQ", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_gROecFYXEeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid" + ] + }, + "tdmContainerCapability": { + "id": "tdmContainerCapability", + "uml-id": "_-bytElAmEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCeSEaqEeas2eqI3oKNtg", + "order-number": 2, + "is-read-only": true + }, + "tdmContainerConfiguration": { + "id": "tdmContainerConfiguration", + "uml-id": "__LKUglAmEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCecUaqEeas2eqI3oKNtg", + "order-number": 3, + "is-read-only": false + }, + "tdmContainerStatus": { + "id": "tdmContainerStatus", + "uml-id": "__vOq4lAmEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCesUaqEeas2eqI3oKNtg", + "order-number": 4, + "is-read-only": true + }, + "tdmContainerCurrentProblems": { + "id": "tdmContainerCurrentProblems", + "uml-id": "_AWdqAlAnEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCevUaqEeas2eqI3oKNtg", + "order-number": 5, + "is-read-only": true + }, + "tdmContainerCurrentPerformance": { + "id": "tdmContainerCurrentPerformance", + "uml-id": "_AzXoclAnEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCew0aqEeas2eqI3oKNtg", + "order-number": 6, + "is-read-only": true + }, + "tdmContainerHistoricalPerformances": { + "id": "tdmContainerHistoricalPerformances", + "uml-id": "_BXIc0lAnEea9Wek8ROfqag", + "uml-type": "ownedAttribute", + "type": "_ecCex0aqEeas2eqI3oKNtg", + "order-number": 7, + "is-read-only": true + }, + "TdmContainerCapability": { + "id": "TdmContainerCapability", + "uml-id": "_ecCeSEaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Bundling is not available." + ] + }, + "supportedTdmContainerTypesList": { + "id": "supportedTdmContainerTypesList", + "uml-id": "_R5hG0EdwEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_rgbigEdjEeax2rWez10Siw", + "order-number": 1, + "is-read-only": true, + "description": [ + "Lists the TDM containers that are supported." + ] + }, + "supportedAlarms": { + "id": "supportedAlarms", + "uml-id": "_ecCeb0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 92, + "is-read-only": true, + "description": [ + "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device." + ] + }, + "TdmContainerConfiguration": { + "id": "TdmContainerConfiguration", + "uml-id": "_ecCecUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "containerID": { + "id": "containerID", + "uml-id": "_ecCeS0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "ContainterID in Netconf must be the same as EthernetPortID in OpenFlow so a connection can be made between the two items, which separately exist in the controller." + ] + }, + "containerType": { + "id": "containerType", + "uml-id": "_o_-2oEdxEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_rgbigEdjEeax2rWez10Siw", + "order-number": 2, + "is-read-only": false, + "description": [ + "Type of TDM container." + ] + }, + "segmentID": { + "id": "segmentID", + "uml-id": "_ecCee0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "Multiplicity = 1; One segment per TDM container; Type of segment must match type of container;" + ] + }, + "problemKindSeverityList": { + "id": "problemKindSeverityList", + "uml-id": "_ecCerUaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_OMPgwGz0Eeaf-__BRLM84g", + "order-number": 94, + "is-read-only": false, + "description": [ + "Severity of the problem to be configured." + ] + }, + "TdmContainerStatus": { + "id": "TdmContainerStatus", + "uml-id": "_ecCesUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "lastStatusChange": { + "id": "lastStatusChange", + "uml-id": "_ecCetEaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": true, + "description": [ + "_format:yyyyMMddhhmmss.s[Z|{+|-}HHMm]; yyyy='0000'..'9999' year; MM='01'..'12' month; dd='01'..'31' day; hh='00'..'23' hour; mm='00'..'59' minute; ss='00'..'59' second; s='.0'..'.9'tenth of second (set to '.0' if EMS or NE cannot support this granularity); Z='Z' indicates UTC (rather than local time); {+|-}='+' or '-' delta from UTC; HH='00'..'23' time zone difference in hours; Mm='00'..'59' time zone difference in minutes." + ] + }, + "TdmContainerCurrentProblems": { + "id": "TdmContainerCurrentProblems", + "uml-id": "_ecCevUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false + }, + "currentProblemList": { + "id": "currentProblemList", + "uml-id": "_ecCewEaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "__h1n4MXpEeWJ6KZuc0h_vw", + "order-number": 1, + "is-read-only": true + }, + "TdmContainerCurrentPerformance": { + "id": "TdmContainerCurrentPerformance", + "uml-id": "_ecCew0aqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the TDM container at a particular moment." + ] + }, + "currentPerformanceDataList": { + "id": "currentPerformanceDataList", + "uml-id": "_ecCexkaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_pA5AQGz6Eeaf-__BRLM84g", + "order-number": 1, + "is-read-only": true, + "description": [ + "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too." + ] + }, + "TdmContainerHistoricalPerformances": { + "id": "TdmContainerHistoricalPerformances", + "uml-id": "_ecCex0aqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the TDM container for a pre-defined measurement interval." + ] + }, + "historicalPerformanceDataList": { + "id": "historicalPerformanceDataList", + "uml-id": "_ecCeykaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_pTaToGz6Eeaf-__BRLM84g", + "order-number": 1, + "is-read-only": true + }, + "MwCurrentProblem": { + "id": "MwCurrentProblem", + "uml-id": "_LKRM4JNQEeWuAeXkr703BA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "According to ITU-T G.874.1?" + ] + }, + "sequenceNumber": { + "id": "sequenceNumber", + "uml-id": "_YadH4CJbEeaHpPYk5sscIg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Unique sequence number of the current problem object." + ] + }, + "timeStamp": { + "id": "timeStamp", + "uml-id": "_lB4EQJN1EeWuAeXkr703BA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": true, + "description": [ + "_format:yyyyMMddhhmmss.s[Z|{+|-}HHMm]; yyyy='0000'..'9999' year; MM='01'..'12' month; dd='01'..'31' day; hh='00'..'23' hour; mm='00'..'59' minute; ss='00'..'59' second; s='.0'..'.9'tenth of second (set to '.0' if EMS or NE cannot support this granularity); Z='Z' indicates UTC (rather than local time); {+|-}='+' or '-' delta from UTC; HH='00'..'23' time zone difference in hours; Mm='00'..'59' time zone difference in minutes." + ] + }, + "channelPlanType": { + "id": "channelPlanType", + "uml-id": "_oQf6IPXSEeW9zIqh2WHHww", + "uml-type": "uml:DataType" + }, + "supportedChannelPlan": { + "id": "supportedChannelPlan", + "uml-id": "_8gpNIHfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Unique name (e.g. CEPT/ERC/REC (01) 04 Annex 5) of an international agreement that describe allocations of frequency channels, to which this air interface complies. Corresponding channel plans to be delivered by the hardware vendor and to be stored by the operator in the controller/application attached database." + ] + }, + "duplexDistanceIsVariable": { + "id": "duplexDistanceIsVariable", + "uml-id": "_OPxkQK42EeWxIavXll_b0A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "To be set on 'true', if the distance between transmitted and received frequency is variable." + ] + }, + "duplexDistance": { + "id": "duplexDistance", + "uml-id": "_BEr_wIMEEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Distance between transmitted and received frequency." + ] + }, + "autoFreqSelectIsAvail": { + "id": "autoFreqSelectIsAvail", + "uml-id": "_te6XMIL8EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of automatically selecting the transmit frequency in unlicensed bands, this field shall contain a 'true'." + ] + }, + "transmissionModeList": { + "id": "transmissionModeList", + "uml-id": "_nwbvcPXREeW9zIqh2WHHww", + "uml-type": "ownedAttribute", + "type": "_zG34sPXQEeW9zIqh2WHHww", + "order-number": 5, + "is-read-only": true + }, + "transmissionModeType": { + "id": "transmissionModeType", + "uml-id": "_zG34sPXQEeW9zIqh2WHHww", + "uml-type": "uml:DataType" + }, + "transmissionModeId": { + "id": "transmissionModeId", + "uml-id": "_afdYoNumEeWHIeLurhMv0A", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Indentifies the transmissionMode for internal reference." + ] + }, + "channelBandwidth": { + "id": "channelBandwidth", + "uml-id": "_FteJEHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ] + }, + "modulationScheme": { + "id": "modulationScheme", + "uml-id": "_G4H-UHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 3, + "is-read-only": true, + "unit": "symbols", + "description": [ + "Modulation scheme, which is base to the other characteristics described in the same transmissionModeType data type. The modulation scheme shall be described by the number of symbols (e.g. BPSK->'2' or 256QAM->'256')." + ] + }, + "informationRate": { + "id": "informationRate", + "uml-id": "_jE7-EHf4EeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 4, + "is-read-only": true, + "unit": "%", + "description": [ + "Information rate of the coding scheme in %." + ] + }, + "txPowerMin": { + "id": "txPowerMin", + "uml-id": "_I3nJ0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 5, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the minimum transmit power the modem can operate in dBm." + ] + }, + "txPowerMax": { + "id": "txPowerMax", + "uml-id": "_KB7A0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 6, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the maximum transmit power the modem can operate in dBm." + ] + }, + "rxThreshold": { + "id": "rxThreshold", + "uml-id": "_LCr6QHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 7, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level required to decode the received signal with a Bit Error Rate of 1e-6 or less." + ] + }, + "amUpshiftLevel": { + "id": "amUpshiftLevel", + "uml-id": "_MGguwHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 8, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level that has to be exceeded to shift into a higher modulation scheme." + ] + }, + "amDownshiftLevel": { + "id": "amDownshiftLevel", + "uml-id": "_NIvAwHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 9, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level that has to be exceeded for not shifting into a lower modulation scheme." + ] + }, + "xpicIsAvail": { + "id": "xpicIsAvail", + "uml-id": "_QHd9kHfvEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "In case the Air Interface Port is capable of XPIC, this field shall contain a 'true'." + ] + }, + "airInterfaceProblemSeverityType": { + "id": "airInterfaceProblemSeverityType", + "uml-id": "_ZKdWgGnuEeaZwMagYjVCHQ", + "uml-type": "uml:DataType" + }, + "airInterfaceCurrentProblemType": { + "id": "airInterfaceCurrentProblemType", + "uml-id": "_umuZUMXjEeW3xsRKtpCLuA", + "uml-type": "uml:DataType" + }, + "airInterfacePerformanceType": { + "id": "airInterfacePerformanceType", + "uml-id": "_OvFYwEQbEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the air interface." + ] + }, + "es": { + "id": "es", + "uml-id": "_DbVzpUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of errored seconds." + ] + }, + "ses": { + "id": "ses", + "uml-id": "_DbVzqUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of severely errored seconds." + ] + }, + "cses": { + "id": "cses", + "uml-id": "_DbVzrUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of consecutive severely errored seconds." + ] + }, + "unavailability": { + "id": "unavailability", + "uml-id": "_DbVzsUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "s", + "description": [ + "Total time of unavailability in seconds." + ] + }, + "txLevelMin": { + "id": "txLevelMin", + "uml-id": "_DbVztUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 5, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Minimum transmit power. Signed integers are required." + ] + }, + "txLevelMax": { + "id": "txLevelMax", + "uml-id": "_DbVzuUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 6, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Maximum transmit power. Signed integers are required." + ] + }, + "txLevelAvg": { + "id": "txLevelAvg", + "uml-id": "_DbVzvUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 7, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Averaged transmit power. Signed integers are required." + ] + }, + "rxLevelMin": { + "id": "rxLevelMin", + "uml-id": "_DbVzwUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 8, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Minimum receive level. Signed integers are required." + ] + }, + "rxLevelMax": { + "id": "rxLevelMax", + "uml-id": "_DbVzxUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 9, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Maximum receive level. Signed integers are required." + ] + }, + "rxLevelAvg": { + "id": "rxLevelAvg", + "uml-id": "_DbVzyUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 10, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Averaged receive level. Signed integers are required." + ] + }, + "time2Symbols": { + "id": "time2Symbols", + "uml-id": "_DbVzzUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": true, + "unit": "s" + }, + "time4SymbolsS": { + "id": "time4SymbolsS", + "uml-id": "_DbVz0kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 12, + "is-read-only": true, + "unit": "s", + "description": [ + "Sum of all seconds the transmitter operated in e.g. 4QAM strong." + ] + }, + "time4Symbols": { + "id": "time4Symbols", + "uml-id": "_DbVz2EQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 13, + "is-read-only": true, + "unit": "s" + }, + "time8Symbols": { + "id": "time8Symbols", + "uml-id": "_DbVz3UQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 14, + "is-read-only": true, + "unit": "s" + }, + "time16SymbolsS": { + "id": "time16SymbolsS", + "uml-id": "_DbVz4kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 15, + "is-read-only": true, + "unit": "s" + }, + "time16Symbols": { + "id": "time16Symbols", + "uml-id": "_DbVz50QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 16, + "is-read-only": true, + "unit": "s" + }, + "time32Symbols": { + "id": "time32Symbols", + "uml-id": "_DbVz7EQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 17, + "is-read-only": true, + "unit": "s" + }, + "time64Symbols": { + "id": "time64Symbols", + "uml-id": "_DbVz8UQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 18, + "is-read-only": true, + "unit": "s" + }, + "time128Symbols": { + "id": "time128Symbols", + "uml-id": "_DbVz9kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 19, + "is-read-only": true, + "unit": "s" + }, + "time256Symbols": { + "id": "time256Symbols", + "uml-id": "_DbVz-0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 20, + "is-read-only": true, + "unit": "s" + }, + "time512Symbols": { + "id": "time512Symbols", + "uml-id": "_DbV0AEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 21, + "is-read-only": true, + "unit": "s" + }, + "time512SymbolsL": { + "id": "time512SymbolsL", + "uml-id": "_DbV0BUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 22, + "is-read-only": true, + "unit": "s" + }, + "time1024Symbols": { + "id": "time1024Symbols", + "uml-id": "_DbV0CkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 23, + "is-read-only": true, + "unit": "s" + }, + "time1024SymbolsL": { + "id": "time1024SymbolsL", + "uml-id": "_DbV0D0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 24, + "is-read-only": true, + "unit": "s" + }, + "time2048Symbols": { + "id": "time2048Symbols", + "uml-id": "_DbV0FEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 25, + "is-read-only": true, + "unit": "s" + }, + "time2048SymbolsL": { + "id": "time2048SymbolsL", + "uml-id": "_DbV0GUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 26, + "is-read-only": true, + "unit": "s" + }, + "time4096Symbols": { + "id": "time4096Symbols", + "uml-id": "_DbV0HkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 27, + "is-read-only": true, + "unit": "s" + }, + "time4096SymbolsL": { + "id": "time4096SymbolsL", + "uml-id": "_DbV0I0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 28, + "is-read-only": true, + "unit": "s" + }, + "time8192Symbols": { + "id": "time8192Symbols", + "uml-id": "_DbV0KEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 29, + "is-read-only": true, + "unit": "s" + }, + "time8192SymbolsL": { + "id": "time8192SymbolsL", + "uml-id": "_DbV0LUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 30, + "is-read-only": true, + "unit": "s" + }, + "xpdMin": { + "id": "xpdMin", + "uml-id": "_DbV0PkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 34, + "is-read-only": true, + "unit": "dB", + "description": [ + "Minimum cross polarization discrimination." + ] + }, + "xpdMax": { + "id": "xpdMax", + "uml-id": "_DbV0QkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 35, + "is-read-only": true, + "unit": "dB", + "description": [ + "Maximum cross polarization discrimination." + ] + }, + "xpdAvg": { + "id": "xpdAvg", + "uml-id": "_DbV0RkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 36, + "is-read-only": true, + "unit": "dB", + "description": [ + "Averaged cross polarization discrimination." + ] + }, + "rfTempMin": { + "id": "rfTempMin", + "uml-id": "_DbV0SkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 37, + "is-read-only": true, + "unit": "C", + "description": [ + "Lowest temperature (in degree Celsius) of the radio module inside the outdoor unit." + ] + }, + "rfTempMax": { + "id": "rfTempMax", + "uml-id": "_DbV0TkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 38, + "is-read-only": true, + "unit": "C", + "description": [ + "Highest temperature (in degree Celsius) of the radio module inside the outdoor unit." + ] + }, + "rfTempAvg": { + "id": "rfTempAvg", + "uml-id": "_DbV0UkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 39, + "is-read-only": true, + "unit": "C", + "description": [ + "Averaged temperature (in degree Celsius) of the radio module inside the outdoor unit." + ] + }, + "defectBlocksSum": { + "id": "defectBlocksSum", + "uml-id": "_DbV0VkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 40, + "is-read-only": true, + "unit": "blocks", + "description": [ + "Total number of blocks that were defect after receiving and could not be corrected by the FEC." + ] + }, + "airInterfaceCurrentPerformanceType": { + "id": "airInterfaceCurrentPerformanceType", + "uml-id": "_pQ_y4GoHEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ] + }, + "airInterfaceHistoricalPerformanceType": { + "id": "airInterfaceHistoricalPerformanceType", + "uml-id": "_t18kwGoHEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ] + }, + "diversityType": { + "id": "diversityType", + "uml-id": "_pTliINyUEeW-SfXlFFFI0Q", + "uml-type": "uml:DataType" + }, + "diversityName": { + "id": "diversityName", + "uml-id": "_uYhboNyUEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'spaceDiversity', 'frequencyDiversity'" + ] + }, + "numberOfAirInterfacesMax": { + "id": "numberOfAirInterfacesMax", + "uml-id": "_wKDDoNyUEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 2, + "is-read-only": true, + "unit": "air interfaces", + "description": [ + "Maximum number of air interfaces that could be part of this kind of diversity." + ] + }, + "airInterfaceDiversityProblemSeverityType": { + "id": "airInterfaceDiversityProblemSeverityType", + "uml-id": "_2kMRYGzzEeaf-__BRLM84g", + "uml-type": "uml:DataType" + }, + "airInterfaceDiversityCurrentProblemType": { + "id": "airInterfaceDiversityCurrentProblemType", + "uml-id": "_z1XWgMXlEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType" + }, + "airInterfaceDiversityPerformanceType": { + "id": "airInterfaceDiversityPerformanceType", + "uml-id": "_EH3QgEQdEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the air interface diversity group." + ] + }, + "snirMin": { + "id": "snirMin", + "uml-id": "_nG-NsEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 1, + "is-read-only": true, + "unit": "dB", + "description": [ + "Minimum signal to (noise+interference) ratio of the combined signals." + ] + }, + "snirMax": { + "id": "snirMax", + "uml-id": "_n_OEUEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 2, + "is-read-only": true, + "unit": "dB", + "description": [ + "Maximum signal to (noise+interference) ratio of the combined signals." + ] + }, + "snirAvg": { + "id": "snirAvg", + "uml-id": "_oU3kMEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 3, + "is-read-only": true, + "unit": "dB", + "description": [ + "Average signal to (noise+interference) ratio of the combined signals." + ] + }, + "airInterfaceDiversityCurrentPerformanceType": { + "id": "airInterfaceDiversityCurrentPerformanceType", + "uml-id": "_n4wTgGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ] + }, + "airInterfaceDiversityHistoricalPerformanceType": { + "id": "airInterfaceDiversityHistoricalPerformanceType", + "uml-id": "_pG0pIGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ] + }, + "tdmStructureType": { + "id": "tdmStructureType", + "uml-id": "_jRAQsEdoEeax2rWez10Siw", + "uml-type": "uml:DataType" + }, + "tdmStructureName": { + "id": "tdmStructureName", + "uml-id": "_1bJF4EdoEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ] + }, + "tdmSegmentSize": { + "id": "tdmSegmentSize", + "uml-id": "_hPq1oEdpEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kbit/s", + "description": [ + "Size of the TDM segment in kbit/s. Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;" + ] + }, + "maxNumberOfSegmentsReservable": { + "id": "maxNumberOfSegmentsReservable", + "uml-id": "_EJnsgEdpEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EByte", + "order-number": 3, + "is-read-only": true, + "unit": "segments", + "description": [ + "Device specific maximum number of segments (not depending on current air interface configuration) that can be reserved for this type of segment on a single air interface." + ] + }, + "structureProblemSeverityType": { + "id": "structureProblemSeverityType", + "uml-id": "_LPgp4Gz0Eeaf-__BRLM84g", + "uml-type": "uml:DataType" + }, + "structureCurrentProblemType": { + "id": "structureCurrentProblemType", + "uml-id": "_UC0gAMXnEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType" + }, + "structurePerformanceType": { + "id": "structurePerformanceType", + "uml-id": "_kzEicEQdEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the Structure." + ] + }, + "structureCurrentPerformanceType": { + "id": "structureCurrentPerformanceType", + "uml-id": "_o7jNQGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ] + }, + "structureHistoricalPerformanceType": { + "id": "structureHistoricalPerformanceType", + "uml-id": "_pNAJoGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ] + }, + "tdmContainerType": { + "id": "tdmContainerType", + "uml-id": "_rgbigEdjEeax2rWez10Siw", + "uml-type": "uml:DataType" + }, + "tdmContainerName": { + "id": "tdmContainerName", + "uml-id": "_rgbigkdjEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'e1','t1','j1','e3','t3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ] + }, + "tdmContainerSize": { + "id": "tdmContainerSize", + "uml-id": "_rgbihEdjEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kbit/s", + "description": [ + "Capacity required for transporting this type of container (in kbit/s). Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;" + ] + }, + "segmentIDType": { + "id": "segmentIDType", + "uml-id": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "uml-type": "uml:DataType", + "description": [ + "Combinations of structureId and segmentId must be unique inside the device to assure that every resource is used just once." + ] + }, + "structureIdRef": { + "id": "structureIdRef", + "uml-id": "_N4GKkMKvEeWwLJhHQlOGSQ", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1 + }, + "segmentIdRef": { + "id": "segmentIdRef", + "uml-id": "_nVubgMKvEeWwLJhHQlOGSQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 2, + "is-read-only": false, + "is-key": 2 + }, + "segmentStatusType": { + "id": "segmentStatusType", + "uml-id": "_KwZVcMUCEeW3xsRKtpCLuA", + "uml-type": "uml:DataType" + }, + "segmentStatusTypeId": { + "id": "segmentStatusTypeId", + "uml-id": "_7JBAYOLbEeWM2vUDE3Xqhw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EShort", + "order-number": 1, + "is-read-only": true, + "is-key": 1 + }, + "segmentIsReservedForTdm": { + "id": "segmentIsReservedForTdm", + "uml-id": "__1DMwMUCEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "The number of segments, which is configured by Structure::StructureConfiguration::tdmReservedNumberOfSegements, has to be reserved for TDM. Starting from the lowest index value, these segments have to be marked with a 'true' in segmentIsReservedForTdm." + ] + }, + "operationalStatus": { + "id": "operationalStatus", + "uml-id": "_ZA94EMUCEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_lNclkLEtEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": true, + "description": [ + "Current operational status of each segment." + ] + }, + "containerProblemSeverityType": { + "id": "containerProblemSeverityType", + "uml-id": "_OMPgwGz0Eeaf-__BRLM84g", + "uml-type": "uml:DataType" + }, + "problemKindName": { + "id": "problemKindName", + "uml-id": "_OMQH0Gz0Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "Name of the alarm according to Container::ContainerCapability::supportedAlarms" + ] + }, + "problemKindSeverity": { + "id": "problemKindSeverity", + "uml-id": "_OMQH02z0Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "Severity of this type of alarm." + ] + }, + "containerCurrentProblemType": { + "id": "containerCurrentProblemType", + "uml-id": "__h1n4MXpEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType" + }, + "problemName": { + "id": "problemName", + "uml-id": "__h1n4cXpEeWJ6KZuc0h_vw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "Name of the alarm according to Container::ContainerCapability::supportedAlarms" + ] + }, + "problemSeverity": { + "id": "problemSeverity", + "uml-id": "__h1n48XpEeWJ6KZuc0h_vw", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "Severity of the alarm." + ] + }, + "containerPerformanceType": { + "id": "containerPerformanceType", + "uml-id": "_U9tW0EQeEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the Container." + ] + }, + "txEthernetBytesMaxS": { + "id": "txEthernetBytesMaxS", + "uml-id": "_MaHB8H1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "Bytes/s", + "description": [ + "Required data volume = 31bit" + ] + }, + "txEthernetBytesMaxM": { + "id": "txEthernetBytesMaxM", + "uml-id": "_M3NNoH1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#ELong", + "order-number": 2, + "is-read-only": true, + "unit": "Bytes/min", + "description": [ + "Required data volume = 37bit" + ] + }, + "txEthernetBytesSum": { + "id": "txEthernetBytesSum", + "uml-id": "_NWtNEH1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#ELong", + "order-number": 3, + "is-read-only": true, + "unit": "Bytes", + "description": [ + "Required data volume = 47bit" + ] + }, + "timePeriod": { + "id": "timePeriod", + "uml-id": "_Nyme4H1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "s", + "description": [ + "Required data volume = 17bit" + ] + }, + "containerCurrentPerformanceType": { + "id": "containerCurrentPerformanceType", + "uml-id": "_pA5AQGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ] + }, + "containerHistoricalPerformanceType": { + "id": "containerHistoricalPerformanceType", + "uml-id": "_pTaToGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ] + }, + "performanceData": { + "id": "performanceData", + "uml-id": "_i5STYGz7Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "_U9tW0EQeEea3g-FxAUaYRg", + "order-number": 1, + "is-read-only": true + }, + "_eIml0JH1EeWUdbnmmNiTAA": { + "id": "severityType", + "uml-id": "_eIml0JH1EeWUdbnmmNiTAA", + "enum": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ], + "is-read-only": false, + "description": [ + "According to ITU-T M.3160" + ] + }, + "_e85NsI99EeWFluv9KLLl5A": { + "id": "polarizationType", + "uml-id": "_e85NsI99EeWFluv9KLLl5A", + "enum": [ + "not-specified", + "horizontal", + "vertical" + ], + "is-read-only": false + }, + "_DaB5IJRgEeWxIPEwZQ_gmw": { + "id": "protectionType", + "uml-id": "_DaB5IJRgEeWxIPEwZQ_gmw", + "enum": [ + "hsb" + ], + "is-read-only": false + }, + "_01_dYJReEeWxIPEwZQ_gmw": { + "id": "roleType", + "uml-id": "_01_dYJReEeWxIPEwZQ_gmw", + "enum": [ + "working", + "protection", + "protected" + ], + "is-read-only": false + }, + "_DUJs8JOXEeWz-6sqLzUedw": { + "id": "airInterfaceDiversityStatusType", + "uml-id": "_DUJs8JOXEeWz-6sqLzUedw", + "enum": [ + "groupDown", + "notAllAiActive", + "allAiActive" + ], + "is-read-only": false + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/core-model.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/core-model.schema-information.json new file mode 100644 index 000000000..fd957f315 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/core-model.schema-information.json @@ -0,0 +1,2296 @@ +{ + "schema-information": { + "forwarding-domain": { + "id": "forwarding-domain", + "uml-id": "_oGql-FLNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The ForwardingDomain (FD) class models the topological component that represents the opportunity to enable forwarding (of specific transport characteristic information at one or more protocol layers) between points represented by the LTP in the model. The FD object provides the context for and constrains the formation, adjustment and removal of FCs and hence offers the potential to enable forwarding. The LTPs available are those defined at the boundary of the FD. At a lower level of recursion an FD could represent a fabric (switch matrix) in a Network Element (NE). An NE can encompass more than one switch matrix and hence more than one FD. The FD representing a switch matrix can be further partitioned. The FD corresponds to a subnetwork [ITU-T G.800], FlowDomain [TMF 612] and a MultiLayerSubNetwork (MLSN) [TMF 612]. As in the TMF concept of MLSN and unlike the ITU-T concet of subnetwork model the FD can support more than one layer-protocol." + ], + "uml-name": "ForwardingDomain" + }, + "layer-protocol-name": { + "id": "layer-protocol-name", + "uml-id": "_P-Hp8MD4EeSoNOrYOfaryg", + "uml-type": "uml:DataType", + "description": [ + "Provides a controlled list of layer protocol names and indicates the naming authority. Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference. Layer protocol names include: - Layer 1 (L1): OTU, ODU - Layer 2 (L2): Carrier Grade Ethernet (ETY, ETH), MPLS-TP (MT)" + ], + "uml-name": "LayerProtocolName" + }, + "lower-level-fd": { + "id": "lower-level-fd", + "uml-id": "_oGqmBVLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGql-FLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "description": [ + "The FD class supports a recursive aggregation relationship (HigherLevelFdEncompassesLowerLevelFds) such that the internal construction of an FD can be exposed as multiple lower level FDs and associated Links (partitioning). The aggregated FDs and Links form an interconnected topology that provides and describes the capability of the aggregating FD. Note that the model actually represents aggregation of lower level FDs into higher level FDs as views rather than FD partition, and supports multiple views. Aggregation allow reallocation of capacity from lower level FDs to different higher level FDs as if the network is reorganized (as the association is aggregation not composition)." + ], + "uml-name": "_lowerLevelFd" + }, + "fc": { + "id": "fc", + "uml-id": "_oGql_1LNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGqmC1LNEeO75dO39GbF8Q", + "order-number": 3, + "is-read-only": false, + "description": [ + "An FD aggregares one or more FCs. A aggregated FC connects LTPs that bound the FD." + ], + "uml-name": "_fc" + }, + "ltp": { + "id": "ltp", + "uml-id": "_8SXNrD-HEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "uml-name": "_ltp" + }, + "lower-level-link": { + "id": "lower-level-link", + "uml-id": "_dm_ngBiQEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "_oGqnjVLNEeO75dO39GbF8Q", + "order-number": 5, + "is-read-only": false, + "description": [ + "The FD encompasses Links that interconnect lower level FDs and collect links that are wholly within the bounds of the FD. See also _lowerLevelFd." + ], + "uml-name": "_lowerLevelLink" + }, + "forwarding-construct": { + "id": "forwarding-construct", + "uml-id": "_oGqmC1LNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The ForwardingConstruct (FC) class models enabled constrained potential for forwarding between two or more LTPs at a particular specific layerProtocol. Like the LTP, the FC supports any transport protocol including all circuit and packet forms. It is used to effect forwarding of transport characteristic (layer protocol) information. An FC can be in only one FD. The ForwardingConstruct is a Forwarding entity. At a low level of the recursion, a FC represents a cross-connection within an NE. It may also represent a fragment of a cross-connection under certain circumstances. The FC object can be used to represent many different structures including point-to-point (P2P), point-to-multipoint (P2MP), rooted-multipoint (RMP) and multipoint-to-multipoint (MP2MP) bridge and selector structures for linear, ring or mesh protection schemes." + ], + "uml-name": "ForwardingConstruct" + }, + "lower-level-fc": { + "id": "lower-level-fc", + "uml-id": "_i7UzkFYfEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_oGqmC1LNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "description": [ + "An FC object supports a recursive aggregation relationship such that the internal construction of an FC can be exposed as multiple lower level FC objects (partitioning). Aggregation is used as for the FD to allow changes in hierarchy. FC aggregation reflects FD aggregation. The FC represents a Cross-Connection in an NE. The Cross-Connection in an NE is not necessarily the lowest level of FC partitioning." + ], + "uml-name": "_lowerLevelFc" + }, + "fc-route": { + "id": "fc-route", + "uml-id": "_A8SFwFYgEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_9UVusFYfEeOVGaP4lO41SQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "An FC object can have zero or more routes, each of which is defined as a list of lower level FC objects describing the flow across the network." + ], + "uml-name": "_fcRoute" + }, + "fc-port": { + "id": "fc-port", + "uml-id": "_b_lUAFYgEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The association of the FC to LTPs is made via FcPorts. The FcPort class models the access to the FC function. The traffic forwarding between the associated FcPorts of the FC depends upon the type of FC and may be associated with FcSwitch object instances. In cases where there is resilience, the FcPort may convey the resilience role of the access to the FC. It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. The FcPort replaces the Protection Unit of a traditional protection model. The ForwardingConstruct can be considered as a component and the FcPort as a Port on that component." + ], + "uml-name": "FcPort" + }, + "fc-switch": { + "id": "fc-switch", + "uml-id": "_a97NQFYhEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The FcSwitch class models the switched forwarding of traffic (traffic flow) between FcPorts and is present where there is protection functionality in the FC. If an FC exposes protection (having two or more FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects to represent the alternative flow choices visible at the edge of the FC. The FC switch represents and defines a protection switch structure encapsulated in the FC. Essentially performs one of the functions of the Protection Group in a traditional model. It associates to 2 or more FcPorts each playing the role of a Protection Unit. One or more protection, i.e. standby/backup, FcPorts provide protection for one or more working (i.e. regular/main/preferred) FcPorts where either protection or working can feed one or more protected FcPort. The switch may be used in revertive or non-revertive (symmetric) mode. When in revertive mode it may define a waitToRestore time. It may be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 and 1:1). It may be locked out (prevented from switching), force switched or manual switched. It will indicate switch state and change of state. The switch can be switched away from all sources such that it becomes open and hence two coordinated switches can both feed the same LTP so long as at least one of the two is switched away from all sources (is open ). The ability for a Switch to be high impedance allows bidirectional ForwardingConstructs to be overlaid on the same bidirectional LTP where the appropriate control is enabled to prevent signal conflict. This ability allows multiple alternate routes to be present that otherwise would be in conflict." + ], + "uml-name": "FcSwitch" + }, + "forwarding-direction": { + "id": "forwarding-direction", + "uml-id": "_9_yMUEDAEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_dV67AEC8EeWxhL2B6Peg6A", + "order-number": 6, + "is-read-only": false, + "description": [ + "The directionality of the ForwardingConstruct. Is applicable to simple ForwardingConstructs where all FcPorts are BIDIRECTIONAL (the ForwardingConstruct will be BIDIRECTIONAL) or UNIDIRECTIONAL (the ForwardingConstruct will be UNIDIRECTIONAL). Is not present in more complex cases." + ], + "uml-name": "forwardingDirection", + "controlType": [ + "bidirectional", + "unidirectional", + "undefined-or-unknown" + ] + }, + "is-protection-lock-out": { + "id": "is-protection-lock-out", + "uml-id": "_ls-wcMN9EeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": false, + "description": [ + "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of. This overrides all other protection control states including forced. If the item is locked out then it cannot be used under any circumstances. Note: Only relevant when part of a protection scheme." + ], + "uml-name": "isProtectionLockOut", + "controlType": "checkbox" + }, + "service-priority": { + "id": "service-priority", + "uml-id": "_3co20MOCEeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": false, + "description": [ + "Relevant where service FCs are competing for server resources. Used to determine which signal FC is allocated resource. The priority of the service with respect to other services . Lower numeric value means higher priority. Covers cases such as preemptable." + ], + "uml-name": "servicePriority", + "controlType": "number" + }, + "supported-link": { + "id": "supported-link", + "uml-id": "_0172EFHnEeaDuo8VlVeg_g", + "uml-type": "ownedAttribute", + "type": "_oGqnjVLNEeO75dO39GbF8Q", + "order-number": 9, + "is-read-only": false, + "description": [ + "An FC that spans between LTPs that terminate the LayerProtocol usually supports one or more links in the client layer." + ], + "uml-name": "_supportedLink" + }, + "network-element": { + "id": "network-element", + "uml-id": "_oGqnr1LNEeO75dO39GbF8Q", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The Network Element (NE) class represents a network element (traditional NE) in the data plane. A data plane network element is essentially a consolidation of capabilities that can be viewed and controlled through a single management-control port. In the direct interface from an SDN controller to a network element in the data plane, the NetworkElement object defines the scope of control for the resources within the network element For example internal transfer of user information between the external terminations (ports of the NE), encapsulation, multiplexing/demultiplexing, and OAM functions, etc. The NetworkElement provides the scope of the naming space for identifying objects representing the resources within the data plane network element. NE is really a product bundling or some view of management scope, management access, session. The NE is not directly part of topology but brings meaning to the FD context and the LTP context (and hence the links)." + ], + "uml-name": "NetworkElement" + }, + "fd": { + "id": "fd", + "uml-id": "_oGqnslLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGql-FLNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": false, + "description": [ + "Represents the FD that is completely within the boundary of the NE. At a low level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs) and the FD representing the switch matrix can be further partitioned. Where an FD is referenced by the NeEncompassesFd association, any FDs that it encompasses (i.e., that are associated with it by HigherLevelFdEncompassesLowerLevelFds), must also be encompassed by the NE and hence must have the NeEncompassesFd association." + ], + "uml-name": "_fd" + }, + "role": { + "id": "role", + "uml-id": "_Ykm6QFeGEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_DUU_sGZ_EeWrX_JIGzXlSg", + "order-number": 2, + "is-read-only": false, + "description": [ + "Each FcPort of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function." + ], + "uml-name": "role" + }, + "fc-port-direction": { + "id": "fc-port-direction", + "uml-id": "_1HbEgEDAEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_2WpC8EC7EeWxhL2B6Peg6A", + "order-number": 3, + "is-read-only": false, + "description": [ + "The orientation of defined flow at the FcPort." + ], + "uml-name": "fcPortDirection", + "controlType": [ + "bidirectional", + "input", + "output", + "unidentified-or-unknown" + ] + }, + "selection-priority": { + "id": "selection-priority", + "uml-id": "_02awkMOEEeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": false, + "description": [ + "The preference priority of the resource in the protection scheme for a particular FC. The lower the value the higher the priority. A lower value of selection priority is preferred If two resources have the same value they are of equal priory. There is no preference between equal priorities. If a resource with the lowest value selection priority fails then the next lowest value available (may be the same value) is picked. Hence on failure of the current resource the next best available will be selected. If there are several equal values the choice is essentially arbitrary). If the scheme is revertive then when a resource of higher priority than the currently selected resource recovers it will be selected. This is equivalent to working/protection but allows for all static scheme types with n:m capability. In simple schemes 0 = working and 1 = protecting." + ], + "uml-name": "selectionPriority", + "controlType": "number" + }, + "is-internal-port": { + "id": "is-internal-port", + "uml-id": "_CSlIwNViEeWhfIeymCGl5Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "The FcPort is not exposed and cannot have associated LTPs. This form of FcPort is used to enable chaining of FcSwitches or FcRoutes in complex network protection scenarios." + ], + "uml-name": "isInternalPort", + "controlType": "checkbox" + }, + "fc-route-feeds-fc-port-egress": { + "id": "fc-route-feeds-fc-port-egress", + "uml-id": "_xbsp8TLREea40e5DA9KE3w", + "uml-type": "ownedAttribute", + "type": "_9UVusFYfEeOVGaP4lO41SQ", + "order-number": 7, + "is-read-only": false, + "description": [ + "Identifies which route(s) currently actively forward to the FcPort to exit the FC to an LTP (or for an internal FcPort to propagate to the next internal switch/route)." + ], + "uml-name": "_fcRouteFeedsFcPortEgress" + }, + "layer-protocol": { + "id": "layer-protocol", + "uml-id": "_gROecFYXEeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The projection of an LTP into each transport layer is represented by a LayerProtocol (LP) instance. A LayerProtocol instances can be used for controlling termination and monitoring functionality. It can also be used for controlling the adaptation (i.e. encapsulation and/or multiplexing of client signal), tandem connection monitoring, traffic conditioning and/or shaping functionality at an intermediate point along a connection. Where the client - server relationship is fixed 1:1 and immutable, the layers can be encapsulated in a single LTP instance. Where there is a n:1 relationship between client and server, the layers must be split over two separate instances of LTP." + ], + "uml-name": "LayerProtocol" + }, + "configured-client-capacity": { + "id": "configured-client-capacity", + "uml-id": "_CUJD4BicEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2swpathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "visible": false, + "description": [ + "Provides a summarized view of the client capacity that is configurable for use. Note the client LTP association should provide all necessary detail hence this attribute is questionable." + ], + "uml-name": "configuredClientCapacity" + }, + "lp-direction": { + "id": "lp-direction", + "uml-id": "_GuuSYEDBEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_RWILYEDAEeWQeOKbNUpP9A", + "order-number": 3, + "is-read-only": false, + "description": [ + "The overall directionality of the LP. - A BIDIRECTIONAL LP will have some SINK and/or SOURCE flows. - A SINK LP can only contain elements with SINK flows or CONTRA_DIRECTION_SOURCE flows - A SOURCE LP can only contain SOURCE flows or CONTRA_DIRECTION_SINK flows" + ], + "uml-name": "lpDirection", + "controlType": [ + "bidirectional", + "sink", + "source", + "undefined-or-unknown" + ] + }, + "termination-state": { + "id": "termination-state", + "uml-id": "_p2YfoGeEEeWmgIwAIZlYKQ", + "uml-type": "ownedAttribute", + "type": "_6anG8GeEEeWmgIwAIZlYKQpathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "description": [ + "Indicates whether the layer is terminated and if so how." + ], + "uml-name": "terminationState" + }, + "config-and-switch-controller": { + "id": "config-and-switch-controller", + "uml-id": "_d6vwsMQhEeWlWIVxswb46A", + "uml-type": "ownedAttribute", + "type": "_k1gHQJo5EeOyHKqw-cQ_eg", + "order-number": 5, + "is-read-only": false, + "description": [ + "A switch controller external to the LayerProtocol. The controller will coordinate one or more switches in one or more FCs related to the LayerProtocol" + ], + "uml-name": "_configAndSwitchController" + }, + "fc-blocks-signal-to-lp": { + "id": "fc-blocks-signal-to-lp", + "uml-id": "_OW-PsMjVEeWSlYzRfsq8lQ", + "uml-type": "ownedAttribute", + "type": "_zMwrsMjVEeWSlYzRfsq8lQ", + "order-number": 7, + "is-read-only": false, + "visible":false, + "uml-name": "fcBlocksSignalToLp" + }, + "logical-termination-point": { + "id": "logical-termination-point", + "uml-id": "_eEpDMFX4EeOVGaP4lO41SQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The LogicalTerminationPoint (LTP) class encapsulates the termination and adaptation functions of one or more transport layers represented by instances of LayerProtocol. The encapsulated transport layers have a simple fixed 1:1 client-server relationship defined by association end ordering. The structure of LTP supports all transport protocols including circuit and packet forms." + ], + "uml-name": "LogicalTerminationPoint" + }, + "server-ltp": { + "id": "server-ltp", + "uml-id": "_D4N9IFX5EeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "description": [ + "References contained LTPs representing servers of this LTP in an inverse multiplexing configuration (e.g. VCAT)." + ], + "uml-name": "_serverLtp" + }, + "client-ltp": { + "id": "client-ltp", + "uml-id": "_3Y4zAFYWEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "References contained LTPs representing client traffic of this LTP for normal cases of multiplexing." + ], + "uml-name": "_clientLtp" + }, + "lp": { + "id": "lp", + "uml-id": "_lvFOQFYXEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_gROecFYXEeOVGaP4lO41SQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "Ordered list of LayerProtocols that this LTP is comprised of where the first entry in the list is the lowest server layer (e.g. physical)." + ], + "uml-name": "_lp" + }, + "connected-ltp": { + "id": "connected-ltp", + "uml-id": "_CHM6YFYYEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Applicable in a simple context where two LTPs are associated via a non-adjustable enabled forwarding. Reduces clutter removing the need for two additional LTPs and an FC with a pair of FcPorts." + ], + "uml-name": "_connectedLtp" + }, + "peer-ltp": { + "id": "peer-ltp", + "uml-id": "_TkuhMFYYEeOVGaP4lO41SQ", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "description": [ + "References contained LTPs representing the reversal of orientation of flow where two LTPs are associated via a non-adjustable enabled forwarding and where the referenced LTP is fully dependent on the this LTP." + ], + "uml-name": "_peerLtp" + }, + "physical-port-reference": { + "id": "physical-port-reference", + "uml-id": "_RLDi4BieEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 6, + "is-read-only": false, + "description": [ + "One or more text labels for the unmodelled physical port associated with the LTP. In many cases there is no associated physical port." + ], + "uml-name": "physicalPortReference", + "controlType": "text" + }, + "ltp-in-other-view": { + "id": "ltp-in-other-view", + "uml-id": "_vq1NIBigEeSh8KVgZCMyDw", + "uml-type": "ownedAttribute", + "type": "_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 7, + "is-read-only": false, + "description": [ + "References one or more LTPs in other views that represent this LTP. The referencing LTP is the provider of capability." + ], + "uml-name": "_ltpInOtherView" + }, + "ltp-direction": { + "id": "ltp-direction", + "uml-id": "_S811EEDBEeWQeOKbNUpP9A", + "uml-type": "ownedAttribute", + "type": "_RWILYEDAEeWQeOKbNUpP9A", + "order-number": 8, + "is-read-only": false, + "description": [ + "The overall directionality of the LTP. - A BIDIRECTIONAL LTP must have at least some LPs that are BIDIRECTIONAL but may also have some SINK and/or SOURCE LPs. - A SINK LTP can only contain SINK LPs - A SOURCE LTP can only contain SOURCE LPs" + ], + "uml-name": "ltpDirection", + "controlType": [ + "bidirectional", + "sink", + "source", + "undefined-or-unknown" + ] + }, + "configuration-and-switch-controller": { + "id": "configuration-and-switch-controller", + "uml-id": "_k1gHQJo5EeOyHKqw-cQ_eg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the capability to control and coordinate switches, to add/delete/modify FCs and to add/delete/modify LTPs/LPs so as to realize a protection scheme." + ], + "uml-name": "ConfigurationAndSwitchController" + }, + "switch-rule": { + "id": "switch-rule", + "uml-id": "_oxb_EJo-EeOyHKqw-cQ_eg", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "description": [ + "A sketch of the presence of complex rules governing the switch behavior." + ], + "uml-name": "switchRule" + }, + "control-parameters": { + "id": "control-parameters", + "uml-id": "_k40wIVJKEeaDuo8VlVeg_g", + "uml-type": "ownedAttribute", + "type": "_T5-osJ4HEeOO3om500DFKg", + "order-number": 10, + "is-read-only": false, + "uml-name": "_controlParameters" + }, + "profile-proxy": { + "id": "profile-proxy", + "uml-id": "_DEWvsJozEeOyHKqw-cQ_eg", + "uml-type": "ownedAttribute", + "type": "_rgdnkJoyEeOyHKqw-cQ_eg", + "order-number": 5, + "is-read-only": false, + "description": [ + "Provides a set of predefined values for switch control in place of the direct values available via the FcSwitch or via _configurationAndSwitchControl." + ], + "uml-name": "_profileProxy" + }, + "local-pac": { + "id": "local-pac", + "uml-id": "_JOA30MOxEeWwZ527PhfFSA", + "uml-type": "uml:DataType", + "description": [ + "Provides the properties of a LocalClass via composition." + ], + "uml-name": "Local_Pac" + }, + "global-pac": { + "id": "global-pac", + "uml-id": "_iBsM0MOxEeWwZ527PhfFSA", + "uml-type": "uml:DataType", + "description": [ + "Provides the properties of a GlobalClass via composition." + ], + "uml-name": "Global_Pac" + }, + "is-frozen": { + "id": "is-frozen", + "uml-id": "_Xt2wEMOyEeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": false, + "description": [ + "Temporarily prevents any switch action to be taken and, as such, freezes the current state. Until the freeze is cleared, additional near-end external commands are rejected and fault condition changes and received APS messages are ignored. All administrative controls of any aspect of protection are rejected." + ], + "uml-name": "isFrozen", + "controlType": "checkbox" + }, + "is-coordinated-switching-both-ends": { + "id": "is-coordinated-switching-both-ends", + "uml-id": "_QuZt0MO2EeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "The C&SC is operating such that switching at both ends of each flow acorss the FC is coordinated at both ingress and egress ends." + ], + "uml-name": "isCoordinatedSwitchingBothEnds", + "controlType": "checkbox" + }, + "subordinate-controller": { + "id": "subordinate-controller", + "uml-id": "_OjA04MQlEeWlWIVxswb46A", + "uml-type": "ownedAttribute", + "type": "_k1gHQJo5EeOyHKqw-cQ_eg", + "order-number": 9, + "is-read-only": false, + "description": [ + "A C&SC that is fully or partially subordinate this C&SC. A peer is considered as partially subordinate in that the peer will respond to requests for action from this C&SC but will also make requests for action to be carried out by this C&SC. Where there is a peer relationship each controller in the peering will see the other controller as subordinate." + ], + "uml-name": "_subordinateController" + }, + "control-parameters-pac": { + "id": "control-parameters-pac", + "uml-id": "_T5-osJ4HEeOO3om500DFKg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A list of control parameters to apply to a switch." + ], + "uml-name": "ControlParameters_Pac" + }, + "reversion-mode": { + "id": "reversion-mode", + "uml-id": "_oGqn41LNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_oGqjf1LNEeO75dO39GbF8Q", + "order-number": 3, + "is-read-only": false, + "description": [ + "Moved to ControlParameter_Pac... This attribute whether or not the protection scheme is revertive or non-revertive." + ], + "uml-name": "reversionMode", + "controlType": [ + "revertive", + "non-revertive" + ] + }, + "wait-to-revert-time": { + "id": "wait-to-revert-time", + "uml-id": "_eSxzEJ4IEeOO3om500DFKg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "description": [ + "If the protection system is revertive, this attribute specifies the time, in minutes, to wait after a fault clears on a higher priority (preferred) resource before reverting to the preferred resource." + ], + "uml-name": "waitToRevertTime", + "controlType": "number" + }, + "prot-type": { + "id": "prot-type", + "uml-id": "_oGqn6lLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "_c3Hu8Gb3EeWrX_JIGzXlSg", + "order-number": 2, + "is-read-only": false, + "description": [ + "Indicates the protection scheme that is used for the ProtectionGroup." + ], + "uml-name": "protType" + }, + "hold-off-time": { + "id": "hold-off-time", + "uml-id": "_oGqn6FLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": false, + "description": [ + "Moved to ControlParameter_Pac... This attribute indicates the time, in seconds, between declaration of unacceptable quality of signal on the currently selected FcPort, and the initialization of the protection switching algorithm." + ], + "uml-name": "holdOffTime", + "controlType": "number" + }, + "network-scheme-specification": { + "id": "network-scheme-specification", + "uml-id": "_doxoIDLIEea40e5DA9KE3w", + "uml-type": "ownedAttribute", + "type": "_w-HB8DLEEea40e5DA9KE3w", + "order-number": 5, + "is-read-only": false, + "uml-name": "_networkSchemeSpecification" + }, + "selected-fc-port": { + "id": "selected-fc-port", + "uml-id": "_2PdiYI8lEeOw_ste-s6RrA", + "uml-type": "ownedAttribute", + "type": "_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Indicates which points are selected by the switch. Depending on the switch spec (via Fcspec) - more than one FcPort can be selected at any one time (e.g. egress switch, ingress packet switch) - zero FcPorts can be selected. For an ingress switch this indicates that the switch common (egress) is high impedance ." + ], + "uml-name": "_selectedFcPort" + }, + "internal-configuration-and-switch-control": { + "id": "internal-configuration-and-switch-control", + "uml-id": "_tbetAJ4HEeOO3om500DFKg", + "uml-type": "ownedAttribute", + "type": "_k1gHQJo5EeOyHKqw-cQ_eg", + "order-number": 6, + "is-read-only": false, + "description": [ + "A switch controller encapsulated in the FcSwitch." + ], + "uml-name": "_internalConfigurationAndSwitchControl" + }, + "switch-control": { + "id": "switch-control", + "uml-id": "_LSnbYMOGEeWwZ527PhfFSA", + "uml-type": "ownedAttribute", + "type": "_e-7DYMOFEeWwZ527PhfFSA", + "order-number": 7, + "is-read-only": false, + "description": [ + "Degree of administrative control applied to the switch selection." + ], + "uml-name": "switchControl", + "controlType": [ + "normal", + "manual", + "forced" + ] + }, + "switch-selects-ports": { + "id": "switch-selects-ports", + "uml-id": "_FBaoAMQTEeWlWIVxswb46A", + "uml-type": "ownedAttribute", + "type": "_2WpC8EC7EeWxhL2B6Peg6A", + "order-number": 8, + "is-read-only": false, + "description": [ + "Indicates whether the switch selects from ingress to the FC or to egress of the FC, or both." + ], + "uml-name": "switchSelectsPorts", + "controlType": [ + "bidirectional", + "input", + "output", + "unidentified-or-unknown" + ] + }, + "switch-selection-reason": { + "id": "switch-selection-reason", + "uml-id": "_XjsGkCi_EeaGGvAxxSe1uA", + "uml-type": "ownedAttribute", + "type": "_zRKlICi9EeaGGvAxxSe1uA", + "order-number": 9, + "is-read-only": true, + "description": [ + "The reason for the current switch selection." + ], + "uml-name": "switchSelectionReason", + "controlType": [] + }, + "wait-to-restore-time": { + "id": "wait-to-restore-time", + "uml-id": "_oGqn5lLNEeO75dO39GbF8Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": false, + "description": [ + "Moved to ControlParameter_Pac and changed to waitToRevert... If the protection system is revertive, this attribute specifies the amount of time, in seconds, to wait after the preferred FcPort returns to an acceptable state of operation (e.g. a fault has cleared) before restoring traffic to that preferred FcPort." + ], + "uml-name": "waitToRestoreTime", + "controlType": "number" + }, + "name": { + "id": "name", + "uml-id": "_YCL8kMDZEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "_XUarEMDuEeWbqPZwR-Ot6A", + "order-number": 4, + "is-read-only": false, + "description": [ + "If the element is a name." + ], + "uml-name": "name" + }, + "global-class": { + "id": "global-class", + "uml-id": "_iVJ1kI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents a type of thing (an Entity) that has instances which can exist in their own right (independently of any others). Entity: Has identity, defined boundary, properties, functionality and lifecycle in a global context. (consider in the context of a Class: (usage) The representation of a thing that may be an entity or an inseparable Entity Feature)." + ], + "uml-name": "GlobalClass" + }, + "local-id": { + "id": "local-id", + "uml-id": "_cq2mQMDYEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "_dCdzAMDuEeWbqPZwR-Ot6A", + "order-number": 2, + "is-read-only": false, + "description": [ + "If the element is a localId (where the element above in the hierarchy must be the context in which the specific localId is relevant)." + ], + "uml-name": "localId" + }, + "uuid": { + "id": "uuid", + "uml-id": "_KeLlAMDZEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 3, + "is-read-only": false, + "description": [ + "If the element is a uuid (where this element could be the top of a hierarchy but may also be at some level in the hierarchy where address navigation is considered necessary to assist in location of the UUID)." + ], + "uml-name": "uuid" + }, + "local-class": { + "id": "local-class", + "uml-id": "_k5nWYI2wEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A LocalClass represents a Feature of an Entity. It is inseparable from a GlobalClass but is a distinct feature of that GlobalClass such that the instances of LocalClass are able to have associations to other instances.. Feature of an Entity: An inseparable, externally distinguishable part of an entity. The mandatory LocalId of the LocalClass instance is unique in the context of the GlobalClass from which it is inseparable. (consider in the context of a Class: (usage) The representation of a thing that may be an entity or an inseparable feature of an entity)" + ], + "uml-name": "LocalClass" + }, + "label": { + "id": "label", + "uml-id": "_olrqYI2uEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "List of labels." + ], + "uml-name": "label" + }, + "extension": { + "id": "extension", + "uml-id": "_uQqu4I28EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "_y7oy8I3tEeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "description": [ + "List of simple name-value extensions." + ], + "uml-name": "extension" + }, + "universal-id-authority": { + "id": "universal-id-authority", + "uml-id": "_StA-4I23EeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the authority that controls the allocation of UUIDs." + ], + "uml-name": "UniversalIdAuthority" + }, + "name-and-value-authority": { + "id": "name-and-value-authority", + "uml-id": "_ulDtsI3AEeO38ZmbECnvbg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the authority that controls the legal values for the names and values of a name/value attribute." + ], + "uml-name": "NameAndValueAuthority" + }, + "conditional-package": { + "id": "conditional-package", + "uml-id": "_-ZWVQJP0EeOqfpp-ZJSmaA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The base class for conditional packages." + ], + "uml-name": "ConditionalPackage" + }, + "state-pac": { + "id": "state-pac", + "uml-id": "_RG6VILEtEeSZUdYfPSdgew", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Provides general state attributes." + ], + "uml-name": "State_Pac" + }, + "operational-state": { + "id": "operational-state", + "uml-id": "_dO6owLEtEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_lNclkLEtEeSZUdYfPSdgew", + "order-number": 1, + "is-read-only": true, + "description": [ + "The operational state is used to indicate whether or not the resource is installed and working." + ], + "uml-name": "operationalState", + "controlType": [ + "disabled", + "enabled" + ] + }, + "administrative-control": { + "id": "administrative-control", + "uml-id": "_7gqwALEtEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_-xPeALEvEeSZUdYfPSdgew", + "order-number": 2, + "is-read-only": false, + "description": [ + "The administrativeControl state provides control of the availability of specific resources without modification to the provisioning of those resources. The value is the current control target. The actual administrativeState may or may not be at target." + ], + "uml-name": "administrativeControl", + "controlType": [ + "unlock", + "lock-passive", + "lock-active", + "lock-immediate" + ] + }, + "adminisatratve-state": { + "id": "adminisatratve-state", + "uml-id": "_AjGvILEuEeSZUdYfPSdgew", + "uml-type": "ownedAttribute", + "type": "_KSKOYLEuEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": true, + "description": [ + "Shows whether or not the client has permission to use or has a prohibition against using the resource. The administrative state expresses usage permissions for specific resources without modification to the provisioning of those resources." + ], + "uml-name": "adminisatratveState", + "controlType": [ + "locked", + "unlocked" + ] + }, + "lifecycle-state": { + "id": "lifecycle-state", + "uml-id": "_PzqZ0GgiEeWmgIwAIZlYKQ", + "uml-type": "ownedAttribute", + "type": "_YSsboGgiEeWmgIwAIZlYKQ", + "order-number": 4, + "is-read-only": false, + "description": [ + "Used to track the planned deployment, allocation to clients and withdrawal of resources." + ], + "uml-name": "lifecycleState", + "controlType": [ + "planned", + "potential", + "installed", + "pending-removal" + ] + }, + "general-directives": { + "id": "general-directives", + "uml-id": "_9hyUwD0TEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "GeneralDirectives" + }, + "necessary-initial-condition-constraints": { + "id": "necessary-initial-condition-constraints", + "uml-id": "_J_v_YD0WEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NecessaryInitialConditionConstraints" + }, + "is-not": { + "id": "is-not", + "uml-id": "_pzNRQD3XEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "uml-name": "IsNot", + "controlType": "checkbox" + }, + "operation-details": { + "id": "operation-details", + "uml-id": "_J5Hc0T0fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_g1SeoD0UEeaRI-H69PghuA", + "order-number": 7, + "is-read-only": false, + "uml-name": "_operationDetails" + }, + "action-verb": { + "id": "action-verb", + "uml-id": "_93jegD0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_ljUl4D3WEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "actionVerb", + "controlType": [ + "create-post-add", + "set-update-put-modify-write-add", + "get-read", + "delete-remove" + ] + }, + "necessary-initialcondition-constraints": { + "id": "necessary-initialcondition-constraints", + "uml-id": "_Kc7UgD0fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_J_v_YD0WEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_necessaryInitialconditionConstraints" + }, + "operation-envelope": { + "id": "operation-envelope", + "uml-id": "_52IiYD0TEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "OperationEnvelope" + }, + "operation-set": { + "id": "operation-set", + "uml-id": "_c9yBkD0UEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "OperationSet" + }, + "generaldirectives": { + "id": "generaldirectives", + "uml-id": "_Ios90j0fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_9hyUwD0TEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "generaldirectives" + }, + "operationidentifiers": { + "id": "operationidentifiers", + "uml-id": "_JQNpwT0fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_AZx1kD0UEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "operationidentifiers" + }, + "operation-identifiers": { + "id": "operation-identifiers", + "uml-id": "_AZx1kD0UEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "OperationIdentifiers" + }, + "after-operation-set": { + "id": "after-operation-set", + "uml-id": "_olu8ID0UEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_c9yBkD0UEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "_afterOperationSet" + }, + "before-operation-set": { + "id": "before-operation-set", + "uml-id": "_xIFXsj0UEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_c9yBkD0UEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_beforeOperationSet" + }, + "effort-and-action": { + "id": "effort-and-action", + "uml-id": "_GWLtID0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_L4Y9QE2DEeaGxdXEiNf4tA", + "order-number": 3, + "is-read-only": false, + "uml-name": "effortAndAction", + "controlType": [ + "best-effort", + "exact-match" + ] + }, + "pause-resume-rule": { + "id": "pause-resume-rule", + "uml-id": "_ObfAUD0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_ndXVME2DEeaGxdXEiNf4tA", + "order-number": 4, + "is-read-only": false, + "uml-name": "pauseResumeRule", + "controlType": [ + "no-pause-possible" + ] + }, + "operationset": { + "id": "operationset", + "uml-id": "_hsSioj0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_c9yBkD0UEeaRI-H69PghuA", + "order-number": 5, + "is-read-only": false, + "uml-name": "operationset" + }, + "is-short-lived": { + "id": "is-short-lived", + "uml-id": "_mdwtkD0VEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": false, + "uml-name": "isShortLived", + "controlType": "checkbox" + }, + "conector-in-holder": { + "id": "conector-in-holder", + "uml-id": "_-zMBkkO-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_o366YEONEeasL6dcjI1vEA", + "order-number": 1, + "is-read-only": false, + "uml-name": "conectorInHolder" + }, + "connector-on-equipment-for-holder": { + "id": "connector-on-equipment-for-holder", + "uml-id": "_s5FpwEONEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A rule class (an abstract specialization of Connector) that represents a connector on an equipment that is intended to mate with a connector in a holder." + ], + "uml-name": "ConnectorOnEquipmentForHolder" + }, + "connector-cable-end": { + "id": "connector-cable-end", + "uml-id": "_KCS_IkOPEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_6hyUEEONEeasL6dcjI1vEA", + "order-number": 1, + "is-read-only": false, + "uml-name": "connectorCableEnd" + }, + "connector-on-equipment-for-cable": { + "id": "connector-on-equipment-for-cable", + "uml-id": "_1OKeUEONEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A rule class (an abstract specialization of Connector) that represents a connector exposed on an equipment such that a cable may be plugged in." + ], + "uml-name": "ConnectorOnEquipmentForCable" + }, + "function-enablers": { + "id": "function-enablers", + "uml-id": "_1vzsYERJEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_N-qJ8EQyEeasL6dcjI1vEA", + "order-number": 8, + "is-read-only": false, + "uml-name": "_functionEnablers" + }, + "power-state": { + "id": "power-state", + "uml-id": "_Q9fSkEQyEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "powerState" + }, + "mechanical-functions": { + "id": "mechanical-functions", + "uml-id": "_KxkFYEQ-EeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the dynamic aspects of the mechanical functions of the equipment." + ], + "uml-name": "MechanicalFunctions" + }, + "rotation-speed": { + "id": "rotation-speed", + "uml-id": "_M1XJIEQ-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "rotationSpeed" + }, + "physical-properties": { + "id": "physical-properties", + "uml-id": "_t0pzs0RJEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_QloVwEQ-EeasL6dcjI1vEA", + "order-number": 7, + "is-read-only": false, + "uml-name": "_physicalProperties" + }, + "temperature": { + "id": "temperature", + "uml-id": "_Vlnd0EQ-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "temperature" + }, + "holder-monitors": { + "id": "holder-monitors", + "uml-id": "_6K62skRSEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_5vdx8EQfEeasL6dcjI1vEA", + "order-number": 4, + "is-read-only": false, + "uml-name": "_holderMonitors" + }, + "is-active": { + "id": "is-active", + "uml-id": "_KFzmEERTEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "uml-name": "isActive", + "controlType": "checkbox" + }, + "is-actual-mismatch-with-expected": { + "id": "is-actual-mismatch-with-expected", + "uml-id": "_XRKNEERTEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": false, + "uml-name": "isActualMismatchWithExpected", + "controlType": "checkbox" + }, + "aggregate-function": { + "id": "aggregate-function", + "uml-id": "_VHOWskglEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_8SXNZT-HEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "_aggregateFunction" + }, + "location": { + "id": "location", + "uml-id": "_lNf7kHpKEeaVjtpstJMDXA", + "uml-type": "ownedAttribute", + "type": "_bh_VAHpJEeaVjtpstJMDXA", + "order-number": 18, + "is-read-only": false, + "uml-name": "_location" + }, + "equipment-location": { + "id": "equipment-location", + "uml-id": "_RUXMYEQwEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_A15msMDaEeWbqPZwR-Ot6A", + "order-number": 1, + "is-read-only": false, + "uml-name": "equipmentLocation" + }, + "geographical-location": { + "id": "geographical-location", + "uml-id": "_XOQ_AEQwEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_A15msMDaEeWbqPZwR-Ot6A", + "order-number": 2, + "is-read-only": false, + "uml-name": "geographicalLocation" + }, + "category": { + "id": "category", + "uml-id": "_jbGZ8Ec-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_WCZv8Ec9EeasL6dcjI1vEA", + "order-number": 12, + "is-read-only": false, + "uml-name": "_category" + }, + "equipment-instance": { + "id": "equipment-instance", + "uml-id": "_CE4sUkRCEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_UB7QwEQuEeasL6dcjI1vEA", + "order-number": 3, + "is-read-only": false, + "uml-name": "_equipmentInstance" + }, + "manufacture-date": { + "id": "manufacture-date", + "uml-id": "_YrPlQEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "manufactureDate" + }, + "serial-number": { + "id": "serial-number", + "uml-id": "_cpqioEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "serialNumber" + }, + "asset-instance-identifier": { + "id": "asset-instance-identifier", + "uml-id": "_yWCIcEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "assetInstanceIdentifier" + }, + "equipment-type": { + "id": "equipment-type", + "uml-id": "_1KggkERBEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_BP8YcEQuEeasL6dcjI1vEA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_equipmentType" + }, + "description": { + "id": "description", + "uml-id": "_-5svQEQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "description" + }, + "model-identifier": { + "id": "model-identifier", + "uml-id": "_oUmxsEQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "modelIdentifier" + }, + "part-type-identifier": { + "id": "part-type-identifier", + "uml-id": "_3ypNAEQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "partTypeIdentifier" + }, + "type-name": { + "id": "type-name", + "uml-id": "_j105QEQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 4, + "is-read-only": false, + "uml-name": "typeName" + }, + "version": { + "id": "version", + "uml-id": "_mig3EEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 5, + "is-read-only": false, + "uml-name": "version" + }, + "holder-structure": { + "id": "holder-structure", + "uml-id": "_U93mQEc8EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_0U3TwEc7EeasL6dcjI1vEA", + "order-number": 7, + "is-read-only": false, + "uml-name": "_holderStructure" + }, + "holder-category": { + "id": "holder-category", + "uml-id": "_r240kERLEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_0K-KoERLEeasL6dcjI1vEA", + "order-number": 1, + "is-read-only": false, + "uml-name": "holderCategory", + "controlType": [ + "slot" + ] + }, + "is-captive": { + "id": "is-captive", + "uml-id": "_4XbukERMEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": false, + "uml-name": "isCaptive", + "controlType": "checkbox" + }, + "is-guided": { + "id": "is-guided", + "uml-id": "_-1CEIERMEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": false, + "uml-name": "isGuided", + "controlType": "checkbox" + }, + "is-quantised-space": { + "id": "is-quantised-space", + "uml-id": "_Lj7_sERNEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "uml-name": "isQuantisedSpace", + "controlType": "checkbox" + }, + "manufactured-thing": { + "id": "manufactured-thing", + "uml-id": "_XtDuokRCEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_GgBQUERBEeasL6dcjI1vEA", + "order-number": 4, + "is-read-only": false, + "uml-name": "_manufacturedThing" + }, + "manufacturer-properties": { + "id": "manufacturer-properties", + "uml-id": "_gdoY8EQtEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the properties of the manufacturer." + ], + "uml-name": "ManufacturerProperties" + }, + "operator-augmented-equipment-type": { + "id": "operator-augmented-equipment-type", + "uml-id": "_Yw99EEc_EeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents the invariant properties of the equipment asset allocated by the operator that define and characterise the type." + ], + "uml-name": "OperatorAugmentedEquipmentType" + }, + "manufacturer-identifier": { + "id": "manufacturer-identifier", + "uml-id": "_VTQLMEQtEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "manufacturerIdentifier" + }, + "manufacturer-name": { + "id": "manufacturer-name", + "uml-id": "_cC-A8EQsEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "manufacturerName" + }, + "mechanical-features": { + "id": "mechanical-features", + "uml-id": "_X1TkUkRFEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_qZGr8EQfEeasL6dcjI1vEA", + "order-number": 6, + "is-read-only": false, + "uml-name": "_mechanicalFeatures" + }, + "asset-type-identifier": { + "id": "asset-type-identifier", + "uml-id": "_uHNXkEQuEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_G1gboD4AEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "assetTypeIdentifier" + }, + "physical-characteristics": { + "id": "physical-characteristics", + "uml-id": "_Kiw98URKEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_TsDsQEQfEeasL6dcjI1vEA", + "order-number": 10, + "is-read-only": false, + "uml-name": "_physicalCharacteristics" + }, + "weight-characeristics": { + "id": "weight-characeristics", + "uml-id": "_87dRMEQ9EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "weightCharaceristics" + }, + "fire-characteristics": { + "id": "fire-characteristics", + "uml-id": "__oPnkEQ9EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 2, + "is-read-only": false, + "uml-name": "fireCharacteristics" + }, + "materials": { + "id": "materials", + "uml-id": "_BoTa0EQ-EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 3, + "is-read-only": false, + "uml-name": "materials" + }, + "physical-rating": { + "id": "physical-rating", + "uml-id": "_EjPzoUdMEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_SRtkMEdLEeasL6dcjI1vEA", + "order-number": 8, + "is-read-only": false, + "uml-name": "_physicalRating" + }, + "thermal-rating": { + "id": "thermal-rating", + "uml-id": "_fDkGEEdLEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "thermalRating" + }, + "power-rating": { + "id": "power-rating", + "uml-id": "_i-N9wEdLEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 2, + "is-read-only": false, + "uml-name": "powerRating" + }, + "position": { + "id": "position", + "uml-id": "_4DkhskddEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_FWDLAERWEeasL6dcjI1vEA", + "order-number": 1, + "is-read-only": false, + "uml-name": "_position" + }, + "relative-position": { + "id": "relative-position", + "uml-id": "_U_6mYERXEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "relativePosition" + }, + "spatial-properties-of-type": { + "id": "spatial-properties-of-type", + "uml-id": "_bAAS0kRSEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_LAvh8EQfEeasL6dcjI1vEA", + "order-number": 3, + "is-read-only": false, + "uml-name": "_spatialPropertiesOfType" + }, + "height": { + "id": "height", + "uml-id": "_k_CVUEQyEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 1, + "is-read-only": false, + "uml-name": "height" + }, + "width": { + "id": "width", + "uml-id": "_n6nVoEQyEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 2, + "is-read-only": false, + "uml-name": "width" + }, + "length": { + "id": "length", + "uml-id": "_uIPVgEQyEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 3, + "is-read-only": false, + "uml-name": "length" + }, + "swapability": { + "id": "swapability", + "uml-id": "_wwGXEUc8EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_kr_E8Ec8EeasL6dcjI1vEA", + "order-number": 11, + "is-read-only": false, + "uml-name": "_swapability" + }, + "is-hot-swappable": { + "id": "is-hot-swappable", + "uml-id": "_yb3zEEQgEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "uml-name": "isHotSwappable", + "controlType": "checkbox" + }, + "cable": { + "id": "cable", + "uml-id": "_8SXNbD-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Basic model representing a cable with connectors fitted where the cable is short (e.g. patch cord, in-station cabling). This is intentionally a very basic representation of a cable. In a more sophisticated representation cable ends might be represented that then associate to the attached connector. At this point it is assumed that the basic model is sufficient." + ], + "uml-name": "Cable" + }, + "connector": { + "id": "connector", + "uml-id": "_8SXNcD-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents a connector that may be fully exposed (e.g. to plug in a cable or on the end of a cable) or partially exposed (e.g. backplane to plug in another piece of equipment such as a module)." + ], + "uml-name": "Connector" + }, + "pin": { + "id": "pin", + "uml-id": "_8SXNnT-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "An individual physical connection point (male or female). May be capable of carrying electrical or optical signals. A pin may have more than one wire/fiber attached but is such that all attached things get exactly the same signal set." + ], + "uml-name": "Pin" + }, + "orientation": { + "id": "orientation", + "uml-id": "_DKSfwGpCEeaBUOurxzA2sw", + "uml-type": "ownedAttribute", + "type": "_y2WM8EQ-EeasL6dcjI1vEA", + "order-number": 2, + "is-read-only": false, + "uml-name": "orientation", + "controlType": [ + "male", + "female", + "symmetric-neutral" + ] + }, + "pin-layout": { + "id": "pin-layout", + "uml-id": "_Fzd-QEQ_EeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The structuring of pins in a connector." + ], + "uml-name": "PinLayout" + }, + "connector-type": { + "id": "connector-type", + "uml-id": "_NBXLMEgXEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_aL8EoGnNEeaBUOurxzA2sw", + "order-number": 8, + "is-read-only": false, + "uml-name": "connectorType" + }, + "equipment": { + "id": "equipment", + "uml-id": "_8SXNej-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents any relevant physical thing. Can be either field replaceable or not field replaceable. Note: The model is currently constrained to inside plant." + ], + "uml-name": "Equipment" + }, + "contained-holder": { + "id": "contained-holder", + "uml-id": "_ayDQMj-NEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNjj-HEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_containedHolder" + }, + "exposed-cable": { + "id": "exposed-cable", + "uml-id": "_Fy4CYj-fEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNbD-HEeaRI-H69PghuA", + "order-number": 3, + "is-read-only": false, + "uml-name": "_exposedCable" + }, + "mechanicall-functions": { + "id": "mechanicall-functions", + "uml-id": "_-Ci-o0RJEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_KxkFYEQ-EeasL6dcjI1vEA", + "order-number": 9, + "is-read-only": false, + "uml-name": "_mechanicallFunctions" + }, + "is-field-replaceable": { + "id": "is-field-replaceable", + "uml-id": "_f1p94D-WEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 14, + "is-read-only": true, + "description": [ + "Indicates whether or not the equipment can be removed and replaced in the field (i.e. in a deployment) by normal operations personnel." + ], + "uml-name": "isFieldReplaceable", + "controlType": "checkbox" + }, + "function-block": { + "id": "function-block", + "uml-id": "_8SXNfj-HEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNiz-HEeaRI-H69PghuA", + "order-number": 15, + "is-read-only": false, + "uml-name": "_functionBlock" + }, + "expected-equipment": { + "id": "expected-equipment", + "uml-id": "_8SXNfz-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A definition of the restrictions on the equipment that is expected to be present in the physical network at a particular place . The expected equipment will state the type and may constrain any other invariant properties. It may also provide desired ranges for dynami properties." + ], + "uml-name": "ExpectedEquipment" + }, + "actual-equipment": { + "id": "actual-equipment", + "uml-id": "_8SXNZD-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The equipment that is actually present in the physical network. It will expose all dynamic properties and some critical static properties." + ], + "uml-name": "ActualEquipment" + }, + "holder": { + "id": "holder", + "uml-id": "_8SXNjj-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents a space in an equipment in which another equipment can be fitted in the field." + ], + "uml-name": "Holder" + }, + "occupying-fru": { + "id": "occupying-fru", + "uml-id": "_X1q3Qj-QEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNej-HEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "description": [ + "The FRU that is occupying the holder. A holder may be unoccupied. An FRU may occupy more hat one holder (using or blocking are intentionally not distinguished here)." + ], + "uml-name": "_occupyingFru" + }, + "holder-location": { + "id": "holder-location", + "uml-id": "_l6LE4ERTEeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_A15msMDaEeWbqPZwR-Ot6A", + "order-number": 5, + "is-read-only": false, + "uml-name": "holderLocation" + }, + "supported-equipment": { + "id": "supported-equipment", + "uml-id": "_RKzmokg0EeasL6dcjI1vEA", + "uml-type": "ownedAttribute", + "type": "_Ghvk8EguEeasL6dcjI1vEA", + "order-number": 9, + "is-read-only": false, + "uml-name": "_supportedEquipment" + }, + "expected-holder": { + "id": "expected-holder", + "uml-id": "_MEUpIEmhEeaDccCv6BIgdg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A definition of a holder expected in the ActualEquipment (i.e. an ActualHolder) as part of the constraints provided by the ExpectedEquipment." + ], + "uml-name": "ExpectedHolder" + }, + "actual-holder": { + "id": "actual-holder", + "uml-id": "_NwJ40EmhEeaDccCv6BIgdg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A holder in the ActualEquipment." + ], + "uml-name": "ActualHolder" + }, + "pin-group": { + "id": "pin-group", + "uml-id": "_8SXNrj-HEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNnj-HEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "uml-name": "_pinGroup" + }, + "port": { + "id": "port", + "uml-id": "_8SXNpD-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A conceptual access point for a group of signals (where that group of signals cannot be separated)." + ], + "uml-name": "Port" + }, + "signal-ref-pt": { + "id": "signal-ref-pt", + "uml-id": "_8SXNrz-HEeaRI-H69PghuA", + "uml-type": "ownedAttribute", + "type": "_8SXNqz-HEeaRI-H69PghuA", + "order-number": 2, + "is-read-only": false, + "uml-name": "_signalRefPt" + }, + "elemental-signals": { + "id": "elemental-signals", + "uml-id": "_B4oXwEddEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The elemental (sub-atomic) parts of an indivisible signal where processing in the LTP is required to extract the elemental signals." + ], + "uml-name": "ElementalSignals" + }, + "signal-ref-pt-group": { + "id": "signal-ref-pt-group", + "uml-id": "_8SXNrT-HEeaRI-H69PghuA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A physical indivisible group of signals." + ], + "uml-name": "SignalRefPtGroup" + }, + "group-of-pins": { + "id": "group-of-pins", + "uml-id": "_uMSwAEdcEeasL6dcjI1vEA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "A group of pins from one or more connectors relevant for some purpose." + ], + "uml-name": "GroupOfPins" + }, + "port-role": { + "id": "port-role", + "uml-id": "_DUU_sGZ_EeWrX_JIGzXlSg", + "uml-type": "uml:DataType", + "description": [ + "The role of a port in the context of the function of the forwarding entity that it bounds." + ], + "uml-name": "PortRole" + }, + "protection-type": { + "id": "protection-type", + "uml-id": "_c3Hu8Gb3EeWrX_JIGzXlSg", + "uml-type": "uml:DataType", + "description": [ + "Identifies the type of protection of an FcSwitch." + ], + "uml-name": "ProtectionType" + }, + "date-and-time": { + "id": "date-and-time", + "uml-id": "_oGqi1lLNEeO75dO39GbF8Q", + "uml-type": "uml:DataType", + "description": [ + "This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000 .. 9999 year MM 01 .. 12 month dd 01 .. 31 day hh 00 .. 23 hour mm 00 .. 59 minute ss 00 .. 59 second s .0 .. .9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00 .. 23 time zone difference in hours Mm 00 .. 59 time zone difference in minutes." + ], + "uml-name": "DateAndTime" + }, + "to-be-defined": { + "id": "to-be-defined", + "uml-id": "_aL8EoGnNEeaBUOurxzA2sw", + "uml-type": "uml:DataType", + "description": [ + "This type is used when the actual type of the attrbute is expected to be complex but where the type has not yet been developed. This type should only be used for attributes that are experimental." + ], + "uml-name": "ToBeDefined" + }, + "name-and-value": { + "id": "name-and-value", + "uml-id": "_y7oy8I3tEeO38ZmbECnvbg", + "uml-type": "uml:DataType", + "description": [ + "A scoped name-value pair." + ], + "uml-name": "NameAndValue" + }, + "value-name": { + "id": "value-name", + "uml-id": "_77PyQI3tEeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The name of the value. The value need not have a name." + ], + "uml-name": "valueName", + "controlType": "text" + }, + "value": { + "id": "value", + "uml-id": "_cbx2gI30EeO38ZmbECnvbg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The specific value of the universal id." + ], + "uml-name": "value", + "controlType": "text" + }, + "universal-id": { + "id": "universal-id", + "uml-id": "_SU3Q4I30EeO38ZmbECnvbg", + "uml-type": "uml:DataType", + "description": [ + "The universal ID value where the mechanism for generation is defined by some authority not directly referenced in the structure. A example structure is [IETF RFC4122]." + ], + "uml-name": "UniversalId" + }, + "address": { + "id": "address", + "uml-id": "_A15msMDaEeWbqPZwR-Ot6A", + "uml-type": "uml:DataType", + "description": [ + "A description of location via a hierarchy of narrowing contexts." + ], + "uml-name": "Address" + }, + "address-name": { + "id": "address-name", + "uml-id": "_W76bkMDaEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The name of the address (to allow the specific hierarchy to be distinguished from others for the same entity)." + ], + "uml-name": "addressName", + "controlType": "text" + }, + "address-element": { + "id": "address-element", + "uml-id": "_M_WWsMDYEeWbqPZwR-Ot6A", + "uml-type": "uml:DataType", + "description": [ + "One element of a hierarchy of elements. Note that the element must have one and only one value chosen from a list of potential value types." + ], + "uml-name": "AddressElement" + }, + "local-id-and-class": { + "id": "local-id-and-class", + "uml-id": "_dCdzAMDuEeWbqPZwR-Ot6A", + "uml-type": "uml:DataType", + "description": [ + "The localId and the class of entity that it identifies." + ], + "uml-name": "LocalIdAndClass" + }, + "class-of-instance": { + "id": "class-of-instance", + "uml-id": "_NBaUwMDvEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The class to which the name refers." + ], + "uml-name": "classOfInstance", + "controlType": "text" + }, + "name-and-class": { + "id": "name-and-class", + "uml-id": "_XUarEMDuEeWbqPZwR-Ot6A", + "uml-type": "uml:DataType", + "description": [ + "The name and the class of entity that it names." + ], + "uml-name": "NameAndClass" + }, + "address-element-name": { + "id": "address-element-name", + "uml-id": "_3mdl0MpUEeWSlYzRfsq8lQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "The name of the address element (e.g. shelf as an element of a shelf/slot/port addressing scheme). The remainder of the structure has the reference for the shelf." + ], + "uml-name": "addressElementName", + "controlType": "text" + }, + "arbitrary-element": { + "id": "arbitrary-element", + "uml-id": "_nPsCsMDzEeWbqPZwR-Ot6A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 5, + "is-read-only": false, + "description": [ + "Where the element is from some external model that is not formally represented in this model." + ], + "uml-name": "arbitraryElement", + "controlType": "text" + }, + "2-wp-c8-ec7-ee-wxh-l2-b6-peg6-a": { + "id": "2-wp-c8-ec7-ee-wxh-l2-b6-peg6-a", + "uml-id": "_2WpC8EC7EeWxhL2B6Peg6A", + "enum": [ + "BIDIRECTIONAL", + "INPUT", + "OUTPUT", + "UNIDENTIFIED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The orientation of flow at the Port of a Forwarding entity" + ], + "uml-name": "_2WpC8EC7EeWxhL2B6Peg6A" + }, + "d-v67-aec8-ee-wxh-l2-b6-peg6-a": { + "id": "d-v67-aec8-ee-wxh-l2-b6-peg6-a", + "uml-id": "_dV67AEC8EeWxhL2B6Peg6A", + "enum": [ + "BIDIRECTIONAL", + "UNIDIRECTIONAL", + "UNDEFINED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The directionality of a Forwarding entity." + ], + "uml-name": "_dV67AEC8EeWxhL2B6Peg6A" + }, + "rwilyeda-ee-w-qe-o-kb-n-up-p9-a": { + "id": "rwilyeda-ee-w-qe-o-kb-n-up-p9-a", + "uml-id": "_RWILYEDAEeWQeOKbNUpP9A", + "enum": [ + "BIDIRECTIONAL", + "SINK", + "SOURCE", + "UNDEFINED_OR_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "The directionality of a termination entity." + ], + "uml-name": "_RWILYEDAEeWQeOKbNUpP9A" + }, + "t5-gyk-edn-ee-w-qe-o-kb-n-up-p9-a": { + "id": "t5-gyk-edn-ee-w-qe-o-kb-n-up-p9-a", + "uml-id": "_T5GykEDNEeWQeOKbNUpP9A", + "enum": [ + "CONTRA_DIRECTION_SINK", + "CONTRA_DIRECTION_SOURCE" + ], + "is-read-only": false, + "description": [ + "Extended to include contra-direction considerations. Only applies to LP and elements of LP not to LTP." + ], + "uml-name": "_T5GykEDNEeWQeOKbNUpP9A" + }, + "6-an-g8-ge-e-ee-wmg-iw-ai-zl-ykq": { + "id": "6-an-g8-ge-e-ee-wmg-iw-ai-zl-ykq", + "uml-id": "_6anG8GeEEeWmgIwAIZlYKQ", + "enum": [ + "LP_CAN_NEVER_TERMINATE", + "LT_NOT_TERMINATED", + "TERMINATED_SERVER_TO_CLIENT_FLOW", + "TERMINATED_CLIENT_TO_SERVER_FLOW", + "TERMINATED_BIDIRECTIONAL", + "LT_PERMENANTLY_TERMINATED", + "TERMINATION_STATE_UNKNOWN" + ], + "is-read-only": false, + "description": [ + "Provides support for the range of behaviours and specific states that an LP can take with respect to termination of the signal. Indicates to what degree the LayerTermination is terminated." + ], + "uml-name": "_6anG8GeEEeWmgIwAIZlYKQ" + }, + "sthcg-ci-eea-g-gv-axx-se1-u-a": { + "id": "sthcg-ci-eea-g-gv-axx-se1-u-a", + "uml-id": "_sthcgCi-EeaGGvAxxSe1uA", + "enum": [ + "WAIT_TO_REVERT", + "SIGNAL_DEGRADE", + "SIGNAL_FAIL" + ], + "is-read-only": false, + "description": [ + "The cause of the current protection state." + ], + "uml-name": "_sthcgCi-EeaGGvAxxSe1uA" + }, + "y-i-kvs-mog-ee-ww-z527-phf-fsa": { + "id": "y-i-kvs-mog-ee-ww-z527-phf-fsa", + "uml-id": "_yIKvsMOGEeWwZ527PhfFSA", + "enum": [ + "LOCK_OUT" + ], + "is-read-only": false, + "description": [ + "Possible degrees of administrative control applied to the Route selection." + ], + "uml-name": "_yIKvsMOGEeWwZ527PhfFSA" + }, + "csw-hk-ci-eea-g-gv-axx-se1-u-a": { + "id": "csw-hk-ci-eea-g-gv-axx-se1-u-a", + "uml-id": "_cswHkCi-EeaGGvAxxSe1uA", + "enum": [], + "is-read-only": false, + "description": [ + "The cause of the current route selection." + ], + "uml-name": "_cswHkCi-EeaGGvAxxSe1uA" + }, + "e-7-dymof-ee-ww-z527-phf-fsa": { + "id": "e-7-dymof-ee-ww-z527-phf-fsa", + "uml-id": "_e-7DYMOFEeWwZ527PhfFSA", + "enum": [ + "NORMAL", + "MANUAL", + "FORCED" + ], + "is-read-only": false, + "uml-name": "_e-7DYMOFEeWwZ527PhfFSA" + }, + "z-r-kl-i-ci9-eea-g-gv-axx-se1-u-a": { + "id": "z-r-kl-i-ci9-eea-g-gv-axx-se1-u-a", + "uml-id": "_zRKlICi9EeaGGvAxxSe1uA", + "enum": [], + "is-read-only": false, + "description": [ + "Explains the reason for the current switch state." + ], + "uml-name": "_zRKlICi9EeaGGvAxxSe1uA" + }, + "o-gqjf1-ln-ee-o75-d-o39-gb-f8-q": { + "id": "o-gqjf1-ln-ee-o75-d-o39-gb-f8-q", + "uml-id": "_oGqjf1LNEeO75dO39GbF8Q", + "enum": [ + "REVERTIVE", + "NON-REVERTIVE" + ], + "is-read-only": false, + "description": [ + "The reversion mode associated with protection." + ], + "uml-name": "_oGqjf1LNEeO75dO39GbF8Q" + }, + "l-nclk-l-et-ee-sz-ud-yf-p-sdgew": { + "id": "l-nclk-l-et-ee-sz-ud-yf-p-sdgew", + "uml-id": "_lNclkLEtEeSZUdYfPSdgew", + "enum": [ + "DISABLED", + "ENABLED" + ], + "is-read-only": false, + "description": [ + "The possible values of the operationalState." + ], + "uml-name": "_lNclkLEtEeSZUdYfPSdgew" + }, + "kskoyl-eu-ee-sz-ud-yf-p-sdgew": { + "id": "kskoyl-eu-ee-sz-ud-yf-p-sdgew", + "uml-id": "_KSKOYLEuEeSZUdYfPSdgew", + "enum": [ + "LOCKED", + "UNLOCKED" + ], + "is-read-only": false, + "description": [ + "The possible values of the administrativeState." + ], + "uml-name": "_KSKOYLEuEeSZUdYfPSdgew" + }, + "-x-pe-al-ev-ee-sz-ud-yf-p-sdgew": { + "id": "-x-pe-al-ev-ee-sz-ud-yf-p-sdgew", + "uml-id": "_-xPeALEvEeSZUdYfPSdgew", + "enum": [ + "UNLOCK", + "LOCK_PASSIVE", + "LOCK_ACTIVE", + "LOCK_IMMEDIATE" + ], + "is-read-only": false, + "description": [ + "The possible values of the current target administrative state.", + "Reflects the current control action when the entity is not in the desired state." + ], + "uml-name": "_-xPeALEvEeSZUdYfPSdgew" + }, + "mcyhc-gge-ee-wmg-iw-ai-zl-ykq": { + "id": "mcyhc-gge-ee-wmg-iw-ai-zl-ykq", + "uml-id": "_McyhcGgeEeWmgIwAIZlYKQ", + "enum": [ + "SHUTTING_DOWN_ACTIVE", + "SHUTTING_DOWN_PASSIVE" + ], + "is-read-only": false, + "description": [ + "Possible extensions to AdministrativeState." + ], + "uml-name": "_McyhcGgeEeWmgIwAIZlYKQ" + }, + "y-ssbo-ggi-ee-wmg-iw-ai-zl-ykq": { + "id": "y-ssbo-ggi-ee-wmg-iw-ai-zl-ykq", + "uml-id": "_YSsboGgiEeWmgIwAIZlYKQ", + "enum": [ + "PLANNED", + "POTENTIAL", + "INSTALLED", + "PENDING_REMOVAL" + ], + "is-read-only": false, + "description": [ + "The possible values of the lifecycleState." + ], + "uml-name": "_YSsboGgiEeWmgIwAIZlYKQ" + }, + "lj-ul4-d3-w-eea-ri-h69-pghu-a": { + "id": "lj-ul4-d3-w-eea-ri-h69-pghu-a", + "uml-id": "_ljUl4D3WEeaRI-H69PghuA", + "enum": [ + "CREATE_POST_ADD", + "SET_UPDATE_PUT_MODIFY_WRITE_ADD", + "GET_READ", + "DELETE_REMOVE" + ], + "is-read-only": false, + "uml-name": "_ljUl4D3WEeaRI-H69PghuA" + }, + "iyt74-d3-k-eea-ri-h69-pghu-a": { + "id": "iyt74-d3-k-eea-ri-h69-pghu-a", + "uml-id": "_IYT74D3kEeaRI-H69PghuA", + "enum": [ + "STRUCTURE_IS_NOT", + "NEW_STRUCTURE_AND_VALUES", + "INCREMENTAL_STRUCTURE_AND_VALUES", + "ONLY_VALUES_IN_EXISTING_STRUCTURE", + "DEFINED_BY_VERB" + ], + "is-read-only": false, + "uml-name": "_IYT74D3kEeaRI-H69PghuA" + }, + "l4-y9-qe2-d-eea-gxd-x-ei-nf4-t-a": { + "id": "l4-y9-qe2-d-eea-gxd-x-ei-nf4-t-a", + "uml-id": "_L4Y9QE2DEeaGxdXEiNf4tA", + "enum": [ + "BEST_EFFORT", + "EXACT_MATCH" + ], + "is-read-only": false, + "uml-name": "_L4Y9QE2DEeaGxdXEiNf4tA" + }, + "nd-xvme2-d-eea-gxd-x-ei-nf4-t-a": { + "id": "nd-xvme2-d-eea-gxd-x-ei-nf4-t-a", + "uml-id": "_ndXVME2DEeaGxdXEiNf4tA", + "enum": [ + "NO_PAUSE_POSSIBLE" + ], + "is-read-only": false, + "uml-name": "_ndXVME2DEeaGxdXEiNf4tA" + }, + "y2-wm8-eq-eeas-l6-dcj-i1-v-ea": { + "id": "y2-wm8-eq-eeas-l6-dcj-i1-v-ea", + "uml-id": "_y2WM8EQ-EeasL6dcjI1vEA", + "enum": [ + "MALE", + "FEMALE", + "SYMMETRIC_NEUTRAL" + ], + "is-read-only": false, + "description": [ + "Most connector schems are asymmetric such that there are two orientations of the connector where a mating is only possible between two connectors of different orientations. A multi-pin connector may have a mix of pin orientations. In this case it is expected that the dominant orientation of pin is chosen for the connector orientation." + ], + "uml-name": "_y2WM8EQ-EeasL6dcjI1vEA" + }, + "m-mo-bg-e-qv-eeas-l6-dcj-i1-v-ea": { + "id": "m-mo-bg-e-qv-eeas-l6-dcj-i1-v-ea", + "uml-id": "_mMOBgEQvEeasL6dcjI1vEA", + "enum": [ + "SUBRACK", + "CIRCUIT_PACK", + "SMALL_FORMFACTOR_PLUGGABLE", + "STAND_ALONE_UNIT", + "RACK" + ], + "is-read-only": false, + "description": [ + "The form of equipment." + ], + "uml-name": "_mMOBgEQvEeasL6dcjI1vEA" + }, + "0-k-ko-erl-eeas-l6-dcj-i1-v-ea": { + "id": "0-k-ko-erl-eeas-l6-dcj-i1-v-ea", + "uml-id": "_0K-KoERLEeasL6dcjI1vEA", + "enum": [ + "SLOT" + ], + "is-read-only": false, + "description": [ + "The form of holder." + ], + "uml-name": "_0K-KoERLEeasL6dcjI1vEA" + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/g.874.1-model.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/g.874.1-model.schema-information.json new file mode 100644 index 000000000..b8e4d4ab6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/g.874.1-model.schema-information.json @@ -0,0 +1,602 @@ +{ + "schema-information": { + "otn-current-data": { + "id": "otn-current-data", + "uml-id": "_OxyHAOGJEeGhaeLtr7IxXg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This object class is an abstract class from which the OTN layer-specific CurrentData object classes are inherited. This object class is a subclass of the Q.822 CurrentData object class, which in turn is a subclass of X.739 Scanner object class. It inherits the following attributes: scannerId, operationalState, granularityPeriod, administrativeState, suspectIntervalFlag, elapsedTime, observedObjectClass, and observedObjectInstance." + ], + "uml-name": "OTN_CurrentData" + }, + "timestamp": { + "id": "timestamp", + "uml-id": "_bGwfoOGJEeGhaeLtr7IxXg", + "uml-type": "ownedAttribute", + "type": "_X-HZUNwbEeGoneTbGt8X0A", + "order-number": 1, + "is-read-only": false, + "description": [ + "The timestamp associated with when the current data was collected." + ], + "uml-name": "timestamp" + }, + "otn-history-data": { + "id": "otn-history-data", + "uml-id": "_dQ2mYOGOEeGhaeLtr7IxXg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This object class is an abstract class from which the OTN layer-specific HistoryData object classes are inherited." + ], + "uml-name": "OTN_HistoryData" + }, + "suspect-interval-flag": { + "id": "suspect-interval-flag", + "uml-id": "_M8IDNceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 1, + "is-read-only": false, + "description": [ + "This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are:- Suspect data were detected by the actual resource doing data collection.- Transition of the administrativeState attribute to/from the 'lock' state.- Transition of the operationalState to/from the 'disabled' state.- Scheduler setting that inhibits the collection function.- The performance counters were reset during the interval.- The currentData (or subclass) object instance was created during the monitoring period." + ], + "uml-name": "suspectIntervalFlag", + "controlType": "checkbox" + }, + "«q.822»-current-data": { + "id": "«q.822»-current-data", + "uml-id": "_M8IDMceIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "«Q.822»-CurrentData" + }, + "elapsed-time": { + "id": "elapsed-time", + "uml-id": "_M8IDOMeIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "uml-name": "elapsedTime", + "controlType": "number" + }, + "«q.822»-history-data": { + "id": "«q.822»-history-data", + "uml-id": "_M8IDVMeIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "«Q.822»-HistoryData" + }, + "history-data-id": { + "id": "history-data-id", + "uml-id": "_M8IDWMeIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "uml-name": "historyDataId", + "controlType": "text" + }, + "period-end-time": { + "id": "period-end-time", + "uml-id": "_M8IDWceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": false, + "uml-name": "periodEndTime" + }, + "granularity-period": { + "id": "granularity-period", + "uml-id": "_M8IDWseIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "_Y6WUEEamEeabNPX3o7rjtw", + "order-number": 2, + "is-read-only": false, + "uml-name": "granularityPeriod", + "controlType": [ + "unknown", + "period-15-min", + "period-24-hours" + ] + }, + "«x.739»-scanner": { + "id": "«x.739»-scanner", + "uml-id": "_7wb90ceIEeSfd5vyUJsimg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "«X.739»-Scanner" + }, + "scanner-id": { + "id": "scanner-id", + "uml-id": "_7wb91ceIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "uml-name": "scannerId", + "controlType": "text" + }, + "administrative-state": { + "id": "administrative-state", + "uml-id": "_7wb92seIEeSfd5vyUJsimg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_KSKOYLEuEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": false, + "uml-name": "administrativeState" + }, + "«x.721»-top": { + "id": "«x.721»-top", + "uml-id": "_BMJ0EceTEeS6-cawxfHpnA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "This is the top level of managed object class hierarchy and every other managed object class is a specialization of either this generic class (top) or a specialization of subclass of top. The parameter miscellaneousError is to be used when a processing failure has occurred and the error condition encountered does not match any of object's defined specific error types." + ], + "uml-name": "«X.721»-Top" + }, + "object-class": { + "id": "object-class", + "uml-id": "_BMJ0FceTEeS6-cawxfHpnA", + "uml-type": "ownedAttribute", + "type": "_ltGzFMeUEeS6-cawxfHpnA", + "order-number": 1, + "is-read-only": false, + "description": [ + "ObjectClass ::= CHOICE{ globalForm [0] OBJECT IDENTIFIER, localForm [1] INTEGER}" + ], + "uml-name": "objectClass" + }, + "name-binding": { + "id": "name-binding", + "uml-id": "_BMJ0F8eTEeS6-cawxfHpnA", + "uml-type": "ownedAttribute", + "type": "_ltGzFMeUEeS6-cawxfHpnA", + "order-number": 2, + "is-read-only": false, + "uml-name": "nameBinding" + }, + "date-and-time": { + "id": "date-and-time", + "uml-id": "_X-HZUNwbEeGoneTbGt8X0A", + "uml-type": "uml:DataType", + "description": [ + "This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000 .. 9999 year MM 01 .. 12 month dd 01 .. 31 day hh 00 .. 23 hour mm 00 .. 59 minute ss 00 .. 59 second s .0 .. .9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00 .. 23 time zone difference in hours Mm 00 .. 59 time zone difference in minutes." + ], + "uml-name": "DateAndTime" + }, + "5-g6-yq-oo-ee-cj-nnlz-cc6-mew": { + "id": "5-g6-yq-oo-ee-cj-nnlz-cc6-mew", + "uml-id": "_5G6YQOo-EeCjNNLZCc6mew", + "enum": [ + "SINK", + "SOURCE", + "BIDIRECTIONAL" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for directionality of the termination point." + ], + "uml-name": "_5G6YQOo-EeCjNNLZCc6mew" + }, + "r-u8-a-m-opf-ee-cj-nnlz-cc6-mew": { + "id": "r-u8-a-m-opf-ee-cj-nnlz-cc6-mew", + "uml-id": "_rU8aMOpfEeCjNNLZCc6mew", + "enum": [ + "GCC1", + "GCC2", + "GCC1_AND_GCC2" + ], + "is-read-only": false, + "description": [ + "This enumeration indicates the GCC access represented by the entity." + ], + "uml-name": "_rU8aMOpfEeCjNNLZCc6mew" + }, + "w7-1-o-opi-ee-cj-nnlz-cc6-mew": { + "id": "w7-1-o-opi-ee-cj-nnlz-cc6-mew", + "uml-id": "_W7-1oOpiEeCjNNLZCc6mew", + "enum": [ + "ENABLED", + "DISABLED" + ], + "is-read-only": false, + "description": [ + "The list of valid operational states for the connection." + ], + "uml-name": "_W7-1oOpiEeCjNNLZCc6mew" + }, + "g0-z-cs-os-d-ee-cj-nnlz-cc6-mew": { + "id": "g0-z-cs-os-d-ee-cj-nnlz-cc6-mew", + "uml-id": "_g0zCsOsDEeCjNNLZCc6mew", + "enum": [ + "REVERTIVE", + "NON-REVERTIVE" + ], + "is-read-only": false, + "description": [ + "The operation type associated with the protection mechanism (either non-revertive or revertive)." + ], + "uml-name": "_g0zCsOsDEeCjNNLZCc6mew" + }, + "jl09-g-os-k-ee-cj-nnlz-cc6-mew": { + "id": "jl09-g-os-k-ee-cj-nnlz-cc6-mew", + "uml-id": "_Jl09gOsKEeCjNNLZCc6mew", + "enum": [ + "EXERCISE", + "MANUAL_SWITCH", + "FORCED_SWITCH", + "LOCKOUT", + "RELEASE_OF_MANUAL_SWITCH", + "RELEASE_OF_FORCED_SWITCH", + "RELEASE_OF_LOCKOUT" + ], + "is-read-only": false, + "description": [ + "This enumeration contains the options for the actions that instruct the protection system for performing specific protection switching operations." + ], + "uml-name": "_Jl09gOsKEeCjNNLZCc6mew" + }, + "bwx-bq-ow5-ee-cj-nnlz-cc6-mew": { + "id": "bwx-bq-ow5-ee-cj-nnlz-cc6-mew", + "uml-id": "_bwxBQOw5EeCjNNLZCc6mew", + "enum": [ + "UNLOCKED", + "LOCKED", + "SHUTTING_DOWN" + ], + "is-read-only": false, + "description": [ + "For more information on Administrative State, See ITU-T Recs. X.731 and M.3100." + ], + "uml-name": "_bwxBQOw5EeCjNNLZCc6mew" + }, + "ch-q5-o-ow-ee-cj-nnlz-cc6-mew": { + "id": "ch-q5-o-ow-ee-cj-nnlz-cc6-mew", + "uml-id": "_ChQ5oOw-EeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ], + "uml-name": "_ChQ5oOw-EeCjNNLZCc6mew" + }, + "z-bty-u-ow-ee-cj-nnlz-cc6-mew": { + "id": "z-bty-u-ow-ee-cj-nnlz-cc6-mew", + "uml-id": "_ZBtyUOw_EeCjNNLZCc6mew", + "enum": [ + "DAPI", + "SAPI", + "BOTH" + ], + "is-read-only": false, + "description": [ + "List of modes for trace identifier mismatch detection." + ], + "uml-name": "_ZBtyUOw_EeCjNNLZCc6mew" + }, + "hf864-ox-a-ee-cj-nnlz-cc6-mew": { + "id": "hf864-ox-a-ee-cj-nnlz-cc6-mew", + "uml-id": "_HF864OxAEeCjNNLZCc6mew", + "enum": [ + "LOS_P", + "OCI", + "SSF_P", + "SSF_O", + "SSF", + "TIM", + "DEG", + "BDI" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_HF864OxAEeCjNNLZCc6mew" + }, + "w-po-no-o3-e-ee-cj-nnlz-cc6-mew": { + "id": "w-po-no-o3-e-ee-cj-nnlz-cc6-mew", + "uml-id": "_WPoNoO3eEeCjNNLZCc6mew", + "enum": [ + "INTRUSIVE", + "NON-INTRUSIVE" + ], + "is-read-only": false, + "description": [ + "Monitoring types for the tandem connection monitoring function." + ], + "uml-name": "_WPoNoO3eEeCjNNLZCc6mew" + }, + "oi-7-w-o6-q-ee-cj-nnlz-cc6-mew": { + "id": "oi-7-w-o6-q-ee-cj-nnlz-cc6-mew", + "uml-id": "_OI-7wO6QEeCjNNLZCc6mew", + "enum": [ + "OPERATIONAL", + "TRANSPARENT", + "MONITOR" + ], + "is-read-only": false, + "description": [ + "List of value modes for the sink side of the tandem connection monitoring function." + ], + "uml-name": "_OI-7wO6QEeCjNNLZCc6mew" + }, + "zn-m8-c-o6-z-ee-cj-nnlz-cc6-mew": { + "id": "zn-m8-c-o6-z-ee-cj-nnlz-cc6-mew", + "uml-id": "_ZnM8cO6ZEeCjNNLZCc6mew", + "enum": [ + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ], + "uml-name": "_ZnM8cO6ZEeCjNNLZCc6mew" + }, + "p-v-f8-o6-a-ee-cj-nnlz-cc6-mew": { + "id": "p-v-f8-o6-a-ee-cj-nnlz-cc6-mew", + "uml-id": "_pV-F8O6aEeCjNNLZCc6mew", + "enum": [ + "LOS", + "LOL" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_pV-F8O6aEeCjNNLZCc6mew" + }, + "qw1-syo6-b-ee-cj-nnlz-cc6-mew": { + "id": "qw1-syo6-b-ee-cj-nnlz-cc6-mew", + "uml-id": "_QW1SYO6bEeCjNNLZCc6mew", + "enum": [ + "LOS" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_QW1SYO6bEeCjNNLZCc6mew" + }, + "o-ouk-o6-b-ee-cj-nnlz-cc6-mew": { + "id": "o-ouk-o6-b-ee-cj-nnlz-cc6-mew", + "uml-id": "_o-oukO6bEeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "2.5_10_G", + "10_40_G", + "2.5_10_40_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ], + "uml-name": "_o-oukO6bEeCjNNLZCc6mew" + }, + "krcg4-o6-d-ee-cj-nnlz-cc6-mew": { + "id": "krcg4-o6-d-ee-cj-nnlz-cc6-mew", + "uml-id": "_KRCG4O6dEeCjNNLZCc6mew", + "enum": [ + "INTRA_DOMAIN", + "INTER_DOMAIN" + ], + "is-read-only": false, + "description": [ + "This enumeration provides the options for the interface associated with OTMn." + ], + "uml-name": "_KRCG4O6dEeCjNNLZCc6mew" + }, + "eo-py-io6-q-ee-cj-nnlz-cc6-mew": { + "id": "eo-py-io6-q-ee-cj-nnlz-cc6-mew", + "uml-id": "_EOPyIO6qEeCjNNLZCc6mew", + "enum": [ + "INTRA_OFFICE", + "SHORTHAUL", + "LONGHAUL" + ], + "is-read-only": false, + "description": [ + "The valid options for reach of the optical cable." + ], + "uml-name": "_EOPyIO6qEeCjNNLZCc6mew" + }, + "6-bt3-qo6-q-ee-cj-nnlz-cc6-mew": { + "id": "6-bt3-qo6-q-ee-cj-nnlz-cc6-mew", + "uml-id": "_6Bt3QO6qEeCjNNLZCc6mew", + "enum": [ + "ON", + "OFF" + ], + "is-read-only": false, + "description": [ + "The enumeration of the options for the Automatic Power Reduction Status." + ], + "uml-name": "_6Bt3QO6qEeCjNNLZCc6mew" + }, + "f-lz-nqo6-v-ee-cj-nnlz-cc6-mew": { + "id": "f-lz-nqo6-v-ee-cj-nnlz-cc6-mew", + "uml-id": "_FLzNQO6vEeCjNNLZCc6mew", + "enum": [ + "BDI_P", + "BDI_O", + "BDI", + "TIM", + "LOS_P", + "LOS_O", + "LOS" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_FLzNQO6vEeCjNNLZCc6mew" + }, + "na-el-yo6-w-ee-cj-nnlz-cc6-mew": { + "id": "na-el-yo6-w-ee-cj-nnlz-cc6-mew", + "uml-id": "_NAElYO6wEeCjNNLZCc6mew", + "enum": [ + "REGULAR", + "NONE", + "VENDOR_SPECIFIC", + "FUNCTIONALLY_STANDARDIZED" + ], + "is-read-only": false, + "description": [ + "The adaptation options for OTUk_ConnectionTermationPoints." + ], + "uml-name": "_NAElYO6wEeCjNNLZCc6mew" + }, + "wg-r-hc-o6-w-ee-cj-nnlz-cc6-mew": { + "id": "wg-r-hc-o6-w-ee-cj-nnlz-cc6-mew", + "uml-id": "_wgRHcO6wEeCjNNLZCc6mew", + "enum": [ + "2.5_G", + "10_G", + "40_G", + "100_G" + ], + "is-read-only": false, + "description": [ + "Provides an enumeration with the meaning of each k value." + ], + "uml-name": "_wgRHcO6wEeCjNNLZCc6mew" + }, + "6-y-g-eo6-w-ee-cj-nnlz-cc6-mew": { + "id": "6-y-g-eo6-w-ee-cj-nnlz-cc6-mew", + "uml-id": "_6Y_gEO6wEeCjNNLZCc6mew", + "enum": [ + "LOF", + "AIS", + "LOM" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_6Y_gEO6wEeCjNNLZCc6mew" + }, + "x-hnwmo6-x-ee-cj-nnlz-cc6-mew": { + "id": "x-hnwmo6-x-ee-cj-nnlz-cc6-mew", + "uml-id": "_xHNWMO6xEeCjNNLZCc6mew", + "enum": [ + "TIM", + "DEG", + "BDI", + "SSF" + ], + "is-read-only": false, + "description": [ + "The valid list of problems for the entity." + ], + "uml-name": "_xHNWMO6xEeCjNNLZCc6mew" + }, + "krq3-mk8-k-ee-g-z-yhf-u3-o-m-yg": { + "id": "krq3-mk8-k-ee-g-z-yhf-u3-o-m-yg", + "uml-id": "_KRQ3MK8KEeG_zYhfU3oMYg", + "enum": [ + "SINK", + "SOURCE" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for directionality for nonintrusive monitoring." + ], + "uml-name": "_KRQ3MK8KEeG_zYhfU3oMYg" + }, + "q-bme4-lu-y-ee-geq-z-lpdv-u3-ba": { + "id": "q-bme4-lu-y-ee-geq-z-lpdv-u3-ba", + "uml-id": "_qBme4LuYEeGeqZLpdvU3BA", + "enum": [ + "PERCENTAGE", + "NUMBER_ERRORED_BLOCKS" + ], + "is-read-only": false, + "description": [ + "<p>The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.</p>" + ], + "uml-name": "_qBme4LuYEeGeqZLpdvU3BA" + }, + "parz8-nw-a-ee-gone-tb-gt8-x0-a": { + "id": "parz8-nw-a-ee-gone-tb-gt8-x0-a", + "uml-id": "_Parz8NwAEeGoneTbGt8X0A", + "enum": [ + "DWDM", + "CWDM", + "NO_WDM" + ], + "is-read-only": false, + "uml-name": "_Parz8NwAEeGoneTbGt8X0A" + }, + "v1-tu-a-nw-a-ee-gone-tb-gt8-x0-a": { + "id": "v1-tu-a-nw-a-ee-gone-tb-gt8-x0-a", + "uml-id": "_V1TuANwAEeGoneTbGt8X0A", + "enum": [ + "STANDARD", + "PROPRIETARY" + ], + "is-read-only": false, + "uml-name": "_V1TuANwAEeGoneTbGt8X0A" + }, + "yt7-s4-pzg-ee-g3-u-a-qk-ii-ctg": { + "id": "yt7-s4-pzg-ee-g3-u-a-qk-ii-ctg", + "uml-id": "_yt7S4PzgEeG3u-aQKIiCtg", + "enum": [ + "PATH", + "TCM1", + "TCM2", + "TCM3", + "TCM4", + "TCM5", + "TCM6", + "SECTION" + ], + "is-read-only": false, + "uml-name": "_yt7S4PzgEeG3u-aQKIiCtg" + }, + "lg3-y-qovv-ee-ky-u85-edu-w-r-a": { + "id": "lg3-y-qovv-ee-ky-u85-edu-w-r-a", + "uml-id": "_LG3yQOVVEeKyU85eduW_rA", + "enum": [ + "CONTROLLER", + "RESPONDER" + ], + "is-read-only": false, + "uml-name": "_LG3yQOVVEeKyU85eduW_rA" + }, + "7-fy9-s-jsc-ee-o-lx-kcui-ytz-cg": { + "id": "7-fy9-s-jsc-ee-o-lx-kcui-ytz-cg", + "uml-id": "_7fy9sJSCEeOLxKCUIYtzCg", + "enum": [ + "INCREASE_BW", + "DECREASE_BW" + ], + "is-read-only": false, + "uml-name": "_7fy9sJSCEeOLxKCUIYtzCg" + }, + "y6-wue-eam-eeab-npx3-o7-rjtw": { + "id": "y6-wue-eam-eeab-npx3-o7-rjtw", + "uml-id": "_Y6WUEEamEeabNPX3o7rjtw", + "enum": [ + "UNKNOWN", + "PERIOD_15MIN", + "PERIOD_24HOURS" + ], + "is-read-only": false, + "description": [ + "The enumeration with the options for granularity period of the performance data." + ], + "uml-name": "_Y6WUEEamEeabNPX3o7rjtw" + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/maintenancemode.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/maintenancemode.json new file mode 100644 index 000000000..3d0a41424 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/maintenancemode.json @@ -0,0 +1,22 @@ +{ + "maintenancemode": { + "DragonWave-Z3":{ + "node":"DragonWave-Z3", + "filter": [{ + "definition":{}, + "description":"", + "start":"2018-01-01T10:00+00:00", + "end":"2018-10-10T10:00+00:00" + }] + }, + "MaintenanceMode":{ + "node":"MaintenanceMode", + "filter": [{ + "definition":{}, + "description":"", + "start":"2018-01-01T10:00+00:00", + "end":"2018-10-10T10:00+00:00" + }] + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.schema-information.json new file mode 100644 index 000000000..656863480 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.schema-information.json @@ -0,0 +1,3161 @@ +{ + "schema-information": { + "mw-air-interface-pac": { + "id": "mw-air-interface-pac", + "uml-id": "__1kQ0Hf4EeW-M8kopGJqEA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MW_AirInterface_Pac" + }, + "layer-protocol": { + "id": "layer-protocol", + "uml-id": "_m_QIglpKEeax66gMnmfzpQ", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_gROecFYXEeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid" + ], + "uml-name": "_layerProtocol" + }, + "air-interface-capability-list": { + "id": "air-interface-capability-list", + "uml-id": "_-LlKoIejEeWaZYk7gpuOtw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the 'analog' capabilities of modem and transmitter of the microwave device. Value ranges of attributes are not independently (e.g. min. and max. transmit power depends on modulation). Legal combinations of values are expressed in transmissionModeTypes." + ], + "uml-name": "AirInterfaceCapability" + }, + "air-interface-configuration": { + "id": "air-interface-configuration", + "uml-id": "_KOcsUIe0EeWnUdmvl3PBkw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Configuration of the radio link." + ], + "uml-name": "AirInterfaceConfiguration" + }, + "air-interface-status": { + "id": "air-interface-status", + "uml-id": "_iCTioHmIEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Measurements of current values on the air interface and operational status of the device." + ], + "uml-name": "AirInterfaceStatus" + }, + "air-interface-current-problems": { + "id": "air-interface-current-problems", + "uml-id": "_UF8VcHmIEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "AirInterfaceCurrentProblems" + }, + "air-interface-current-performance": { + "id": "air-interface-current-performance", + "uml-id": "_CX-iIKS6EeWyu_jasKgNwA", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface at a particular moment." + ], + "uml-name": "AirInterfaceCurrentPerformance" + }, + "air-interface-historical-performances": { + "id": "air-interface-historical-performances", + "uml-id": "_fChNMHmHEeWRAfnL3fvovg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface for a pre-defined measurement interval." + ], + "uml-name": "AirInterfaceHistoricalPerformances" + }, + "type-of-equipment": { + "id": "type-of-equipment", + "uml-id": "_gK4jMJUBEeWIaZzoaYJ6_A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "This parameter indicates the equipment type. Instead of uploading the complete set of capabilities, capabilities of the same equipment type could be reused. Should be unique for a combination of modem, radio and their respective firmware." + ], + "uml-name": "typeOfEquipment", + "controlType": "text" + }, + "tx-frequency-min": { + "id": "tx-frequency-min", + "uml-id": "_90Xe0HfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the minimum transmit frequency tunable at the air interface." + ], + "uml-name": "txFrequencyMin", + "controlType": "number" + }, + "tx-frequency-max": { + "id": "tx-frequency-max", + "uml-id": "_-1ztsHfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the maximum transmit frequency tunable at the air interface." + ], + "uml-name": "txFrequencyMax", + "controlType": "number" + }, + "rx-frequency-min": { + "id": "rx-frequency-min", + "uml-id": "_BLqx0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the minimum receive frequency tunable at the air interface." + ], + "uml-name": "rxFrequencyMin", + "controlType": "number" + }, + "rx-frequency-max": { + "id": "rx-frequency-max", + "uml-id": "_CSBV4HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Value of the maximum receive frequency tunable at the air interface." + ], + "uml-name": "rxFrequencyMax", + "controlType": "number" + }, + "adaptive-modulation-is-avail": { + "id": "adaptive-modulation-is-avail", + "uml-id": "_ClmuUHffEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "In case the device is capable of adaptive modulation, this field shall contain a 'true'." + ], + "uml-name": "adaptiveModulationIsAvail", + "controlType": "checkbox" + }, + "mimo-is-avail": { + "id": "mimo-is-avail", + "uml-id": "_qXBrkH2eEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": true, + "description": [ + "In case the device is capable of MIMO, this field shall contain a 'true'." + ], + "uml-name": "mimoIsAvail", + "controlType": "checkbox" + }, + "mimo-channels": { + "id": "mimo-channels", + "uml-id": "_qysT4H2eEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": true, + "unit": "channels", + "description": [ + "Maximum number (n) of spatial multiplexing streams that can be conveyed by an n x n MIMO configuration." + ], + "uml-name": "mimoChannels", + "controlType": "number" + }, + "alic-is-avail": { + "id": "alic-is-avail", + "uml-id": "_a3HgMIL9EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of Adjacent Link Interference Cancelation (canceling of interference cause by transmitters located at the same site), this field shall contain a 'true'." + ], + "uml-name": "alicIsAvail", + "controlType": "checkbox" + }, + "atpc-is-avail": { + "id": "atpc-is-avail", + "uml-id": "_iRRtgHftEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of ATPC, this field shall contain a 'true'." + ], + "uml-name": "atpcIsAvail", + "controlType": "checkbox" + }, + "atpc-range": { + "id": "atpc-range", + "uml-id": "_ErwNYHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": true, + "unit": "dB", + "description": [ + "Extent of the ATPC range." + ], + "uml-name": "atpcRange", + "controlType": "number" + }, + "encryption-is-avail": { + "id": "encryption-is-avail", + "uml-id": "_4uPM8E58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "Shall be marked 'true', if Ethernet payload encryption is available." + ], + "uml-name": "encryptionIsAvail", + "controlType": "checkbox" + }, + "transmission-mode-list": { + "id": "transmission-mode-list", + "uml-id": "_nwbvcPXREeW9zIqh2WHHww", + "uml-type": "ownedAttribute", + "type": "_zG34sPXQEeW9zIqh2WHHww", + "order-number": 5, + "is-read-only": true, + "uml-name": "transmissionModeList" + }, + "maintenance-timer-range": { + "id": "maintenance-timer-range", + "uml-id": "_I1FYsMWZEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 14, + "is-read-only": true, + "unit": "s", + "description": [ + "Available time periods for maintenance configurations (e.g. the loop back of microwave header information) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360')." + ], + "uml-name": "maintenanceTimerRange", + "controlType": "text" + }, + "supported-alarms": { + "id": "supported-alarms", + "uml-id": "_ecCeb0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": true, + "description": [ + "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device." + ], + "uml-name": "supportedAlarms", + "controlType": "text" + }, + "supported-channel-plan-list": { + "id": "supported-channel-plan-list", + "uml-id": "_8gpNIHfcEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Unique name (e.g. ECC/REC/(01)04_Annex 5) of a document, which describes a frequency grid that can be adjusted at the air interface. Corresponding channel plans to be delivered by the hardware vendor and to be stored by the operator in an controller/application attached database." + ], + "uml-name": "supportedChannelPlan", + "controlType": "text" + }, + "air-interface-name": { + "id": "air-interface-name", + "uml-id": "_XMDggIL5EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "Operator specific microwave link ID (often used for coding area, type of element and sequential number)." + ], + "uml-name": "airInterfaceName", + "controlType": "text" + }, + "radio-signal-id": { + "id": "radio-signal-id", + "uml-id": "_QY9KoHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "description": [ + "The radioSignalId is transmitted on the air interface so the remote site of the link synchronizes on the correct transmitter. The local radio MUST NOT synchronize on a radio signal with a different radioSignalId. The link ID is neither an ID necessary to span the model nor an ID referencing external data. It is just some sort of name of the link transmitted so the correct remote site can be identified in an interference situation. The value zero might be used to make the microwave to disable the link ID check." + ], + "uml-name": "radioSignalID", + "controlType": "text" + }, + "tx-frequency": { + "id": "tx-frequency", + "uml-id": "_UNE8gHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Center frequency of the transmit channel. The values to be configured have to exactly match the values listed in the international agreement referenced in channelPlanID. In case of automated selection of the transmit frequency this field shall describe the lowest center frequency selectable." + ], + "uml-name": "txFrequency", + "controlType": "number" + }, + "rx-frequency": { + "id": "rx-frequency", + "uml-id": "_W7ayEHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Center frequency of the receive channel." + ], + "uml-name": "rxFrequency", + "controlType": "number" + }, + "tx-channel-bandwidth": { + "id": "tx-channel-bandwidth", + "uml-id": "_bhAdIHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ], + "uml-name": "txChannelBandwidth", + "controlType": "number" + }, + "rx-channel-bandwidth": { + "id": "rx-channel-bandwidth", + "uml-id": "_eKIbgHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": false, + "unit": "kHz", + "description": [ + "Bandwidth of the receive channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ], + "uml-name": "rxChannelBandwidth", + "controlType": "number" + }, + "polarization": { + "id": "polarization", + "uml-id": "_bVebEI99EeWFluv9KLLl5A", + "uml-type": "ownedAttribute", + "type": "_e85NsI99EeWFluv9KLLl5A", + "order-number": 7, + "is-read-only": false, + "description": [ + "Allows documenting the polarization of the air interface." + ], + "uml-name": "polarization", + "controlType": [ + "not-specified", + "horizontal", + "vertical" + ] + }, + "power-is-on": { + "id": "power-is-on", + "uml-id": "_p4eR8Hf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "Power ON. Activation of the entire radio in a split mount configuration shall be expressed as a 'true'." + ], + "uml-name": "powerIsOn", + "controlType": "checkbox" + }, + "transmitter-is-on": { + "id": "transmitter-is-on", + "uml-id": "_uYVvgHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": false, + "description": [ + "Activation of the transmitter inside the radio shall be expressed as a 'true'." + ], + "uml-name": "transmitterIsOn", + "controlType": "checkbox" + }, + "receiver-is-on": { + "id": "receiver-is-on", + "uml-id": "_q_XcwEgnEeathrAE0htMiA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": false, + "description": [ + "Maintenance Feature. Activation of the receiver inside the radio shall be expressed as a 'true'. Attribute shall also be used for RX main and RX diversity squelches in case of diversity configurations." + ], + "uml-name": "receiverIsOn", + "controlType": "checkbox" + }, + "tx-power": { + "id": "tx-power", + "uml-id": "_ZEXmIHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": false, + "unit": "dBm", + "description": [ + "Transmit power to be configured on the microwave link. Signed Byte is required. The actually operated transmit power might be lower depending on adaptive modulation and ATPC." + ], + "uml-name": "txPower", + "controlType": "number" + }, + "adaptive-modulation-is-on": { + "id": "adaptive-modulation-is-on", + "uml-id": "_0jhfYHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 12, + "is-read-only": false, + "description": [ + "Adaptive Modulation. Activation of adaptive modulation shall be expressed as a 'true'." + ], + "uml-name": "adaptiveModulationIsOn", + "controlType": "checkbox" + }, + "modulation-min": { + "id": "modulation-min", + "uml-id": "_dM_BUHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 13, + "is-read-only": false, + "unit": "symbols", + "description": [ + "Minimum modulation to be configured (in case adaptive modulation is not used, this value represents also the fixed modulation). The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ], + "uml-name": "modulationMin", + "controlType": "number" + }, + "modulation-max": { + "id": "modulation-max", + "uml-id": "_gAHQQHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 14, + "is-read-only": false, + "unit": "symbols", + "description": [ + "Maximum modulation to be configured. The value of this field is only relevant, if Adaptive Modulation has been activated. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ], + "uml-name": "modulationMax", + "controlType": "number" + }, + "xpic-is-on": { + "id": "xpic-is-on", + "uml-id": "_4hi0IHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 15, + "is-read-only": false, + "description": [ + "Activation of Cross Polarization Interference Cancelation shall be expressed as a 'true'. In case XPIC is not available for the current combination of channel bandwidth and modulation or the hardware in general, this parameter shall always be set to 'false'." + ], + "uml-name": "xpicIsOn", + "controlType": "checkbox" + }, + "mimo-is-on": { + "id": "mimo-is-on", + "uml-id": "_7t4fIH2dEeWaPP5xsIT8pQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 16, + "is-read-only": false, + "description": [ + "Activation of Multiple Input Multiple Output (MIMO) shall be expressed as a 'true'." + ], + "uml-name": "mimoIsOn", + "controlType": "checkbox" + }, + "alic-is-on": { + "id": "alic-is-on", + "uml-id": "_FmWHMHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 17, + "is-read-only": false, + "description": [ + "Activation of Adjacent Link Interference Cancelation (ALIC) shall be expressed as a 'true'." + ], + "uml-name": "alicIsOn", + "controlType": "checkbox" + }, + "atpc-is-on": { + "id": "atpc-is-on", + "uml-id": "_9Hz0oHf5EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 18, + "is-read-only": false, + "description": [ + "ATPC. Activation of Automated Transmit Power Control shall be expressed as a 'true'." + ], + "uml-name": "atpcIsOn", + "controlType": "checkbox" + }, + "atpc-thresh-upper": { + "id": "atpc-thresh-upper", + "uml-id": "_pR7yMHgAEeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 19, + "is-read-only": false, + "unit": "dBm", + "description": [ + "If the receive level is higher than the upper threshold value, the transmitter is notified to decrease transmit power." + ], + "uml-name": "atpcThreshUpper", + "controlType": "number" + }, + "atpc-thresh-lower": { + "id": "atpc-thresh-lower", + "uml-id": "_sIlPMHgAEeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 20, + "is-read-only": false, + "unit": "dBm", + "description": [ + "If the receive level is lower than the lower threshold value, the transmitter is notified to increase transmit power." + ], + "uml-name": "atpcThreshLower", + "controlType": "number" + }, + "auto-freq-select-is-on": { + "id": "auto-freq-select-is-on", + "uml-id": "_dG5VAIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 21, + "is-read-only": false, + "description": [ + "Activation of automatically selecting the transmit frequency in unlicensed bands shall be expressed as a 'true'." + ], + "uml-name": "autoFreqSelectIsOn", + "controlType": "checkbox" + }, + "auto-freq-select-range": { + "id": "auto-freq-select-range", + "uml-id": "_yH9XMIMCEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 22, + "is-read-only": false, + "unit": "channels", + "description": [ + "Number of transmit channels (starting at the center frequency defined in txFrequency and with channel bandwidth according to txChannelBandwidth) that define the range within the transmit frequency can automatically been chosen." + ], + "uml-name": "autoFreqSelectRange", + "controlType": "number" + }, + "modulation-is-on": { + "id": "modulation-is-on", + "uml-id": "_kxXzwIMGEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 23, + "is-read-only": false, + "description": [ + "Maintenance Feature. De-activation of the modulation of the carrier signal for fault management shall be expressed as a 'false'." + ], + "uml-name": "modulationIsOn", + "controlType": "checkbox" + }, + "encryption-is-on": { + "id": "encryption-is-on", + "uml-id": "_uI7bIE58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 11, + "is-read-only": false, + "description": [ + "Activates encryption of the Ethernet payload." + ], + "uml-name": "encryptionIsOn", + "controlType": "checkbox" + }, + "cryptographic-key": { + "id": "cryptographic-key", + "uml-id": "_psRpoE58EeaCk6G-lyG1OQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 12, + "is-read-only": false, + "description": [ + "Key for transforming plaintext into cipher text data." + ], + "uml-name": "cryptographicKey", + "controlType": "text" + }, + "loop-back-kind-on": { + "id": "loop-back-kind-on", + "uml-id": "_PyRvsHf6EeW-M8kopGJqEA", + "uml-type": "ownedAttribute", + "type": "_3CZ3UIsDEead4ersMrOjBQ", + "order-number": 26, + "is-read-only": false, + "description": [ + "Maintenance Feature. The currently configured type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site." + ], + "uml-name": "loopBackKindOn", + "controlType": [ + "none", + "if", + "rf" + ] + }, + "maintenance-timer": { + "id": "maintenance-timer", + "uml-id": "_7-oTwCd5EeaJA6AVLNrv_w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 27, + "is-read-only": false, + "unit": "s", + "description": [ + "Time of existence of any maintenance configuration (e.g. the loop back of microwave header information). Valid values are defined in AirInterface::AirInterfaceCapability::maintenanceTimerRange." + ], + "uml-name": "maintenanceTimer", + "controlType": "number" + }, + "problem-kind-severity-list": { + "id": "problem-kind-severity-list", + "uml-id": "_OMQH02z0Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "Severity of this type of alarm." + ], + "uml-name": "problemKindSeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "tx-frequency-cur": { + "id": "tx-frequency-cur", + "uml-id": "_YZq7gK4tEeWXs6m-9H3KvA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Center frequency of the currently operated transmit channel." + ], + "uml-name": "txFrequencyCur", + "controlType": "number" + }, + "rx-frequency-cur": { + "id": "rx-frequency-cur", + "uml-id": "_33IdUIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Center frequency of the currently operated receive channel." + ], + "uml-name": "rxFrequencyCur", + "controlType": "number" + }, + "tx-level-cur": { + "id": "tx-level-cur", + "uml-id": "_L3B5wHgIEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Current transmit level." + ], + "uml-name": "txLevelCur", + "controlType": "number" + }, + "rx-level-cur": { + "id": "rx-level-cur", + "uml-id": "_OHN9AHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Current receive level." + ], + "uml-name": "rxLevelCur", + "controlType": "number" + }, + "modulation-cur": { + "id": "modulation-cur", + "uml-id": "_RBMa0HizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "symbols", + "description": [ + "Currently operated modulation on transmit path. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme." + ], + "uml-name": "modulationCur", + "controlType": "number" + }, + "code-rate-cur": { + "id": "code-rate-cur", + "uml-id": "_UYyBsHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": true, + "unit": "%", + "description": [ + "Code rate of the currently operated coding scheme (Net bit rate ≤ Gross bit rate · code rate)." + ], + "uml-name": "codeRateCur", + "controlType": "number" + }, + "snir-cur": { + "id": "snir-cur", + "uml-id": "_B7G0AEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "dB", + "description": [ + "Currently measured signal to (noise+interference) ratio of the combined signals." + ], + "uml-name": "snirCur", + "controlType": "number" + }, + "xpd-cur": { + "id": "xpd-cur", + "uml-id": "_Z7NvgHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": true, + "unit": "dB", + "description": [ + "Currently measured cross polarization discrimination." + ], + "uml-name": "xpdCur", + "controlType": "number" + }, + "rf-temp-cur": { + "id": "rf-temp-cur", + "uml-id": "_d6wuQHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 9, + "is-read-only": true, + "unit": "Celsius", + "description": [ + "Current temperature (in degree Celsius) of the radio module inside the outdoor unit." + ], + "uml-name": "rfTempCur", + "controlType": "number" + }, + "last-status-change": { + "id": "last-status-change", + "uml-id": "_ecCetEaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": true, + "description": [ + "Time the Container entered its current operational status. _format:yyyyMMddhhmmss.s[Z|{+|-}HHMm]; yyyy='0000'..'9999' year; MM='01'..'12' month; dd='01'..'31' day; hh='00'..'23' hour; mm='00'..'59' minute; ss='00'..'59' second; s='.0'..'.9'tenth of second (set to '.0' if EMS or NE cannot support this granularity); Z='Z' indicates UTC (rather than local time); {+|-}='+' or '-' delta from UTC; HH='00'..'23' time zone difference in hours; Mm='00'..'59' time zone difference in minutes." + ], + "uml-name": "lastStatusChange" + }, + "radio-power-is-up": { + "id": "radio-power-is-up", + "uml-id": "_sFKXcHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 11, + "is-read-only": true, + "description": [ + "If the radio unit has power and is switched on, this shall be expressed as a 'true'." + ], + "uml-name": "radioPowerIsUp", + "controlType": "checkbox" + }, + "link-is-up": { + "id": "link-is-up", + "uml-id": "_5JBPUHizEeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 12, + "is-read-only": true, + "description": [ + "If connection is established to the remote site with the same linkID, this shall be expressed as a 'true'." + ], + "uml-name": "linkIsUp", + "controlType": "checkbox" + }, + "xpic-is-up": { + "id": "xpic-is-up", + "uml-id": "_ESRbsHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 13, + "is-read-only": true, + "description": [ + "If XPIC is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "xpicIsUp", + "controlType": "checkbox" + }, + "mimo-is-up": { + "id": "mimo-is-up", + "uml-id": "_DVaQwIL6EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 14, + "is-read-only": true, + "description": [ + "If MIMO is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "mimoIsUp", + "controlType": "checkbox" + }, + "alic-is-up": { + "id": "alic-is-up", + "uml-id": "_Hte-UHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 15, + "is-read-only": true, + "description": [ + "If Adjacent Link Interference Cancelation (ALIC) is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "alicIsUp", + "controlType": "checkbox" + }, + "atpc-is-up": { + "id": "atpc-is-up", + "uml-id": "_VimCgMjNEeWYRsWW_rqpgw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 16, + "is-read-only": true, + "description": [ + "If ATPC is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "atpcIsUp", + "controlType": "checkbox" + }, + "auto-freq-select-is-up": { + "id": "auto-freq-select-is-up", + "uml-id": "_-PXKsIL-EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 17, + "is-read-only": true, + "description": [ + "If automated frequency selection is currently actually working (not just configured), this shall be expressed as a 'true'." + ], + "uml-name": "autoFreqSelectIsUp", + "controlType": "checkbox" + }, + "loop-back-kind-up": { + "id": "loop-back-kind-up", + "uml-id": "_S9prAHi0EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "_3CZ3UIsDEead4ersMrOjBQ", + "order-number": 18, + "is-read-only": true, + "description": [ + "The currently active (not just configured) type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site." + ], + "uml-name": "loopBackKindUp", + "controlType": [ + "none", + "if", + "rf" + ] + }, + "local-end-point-id": { + "id": "local-end-point-id", + "uml-id": "_pEsgcFQHEeaCXY7nSBqs6w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 19, + "is-read-only": true, + "description": [ + "The value of the localEndPointId is a vendor specific identifier of the air interface, used by the node to discover a microwave radio link." + ], + "uml-name": "localEndPointId", + "controlType": "text" + }, + "remote-end-point-id": { + "id": "remote-end-point-id", + "uml-id": "_r3cU4FQHEeaCXY7nSBqs6w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 20, + "is-read-only": true, + "description": [ + "The value of the remoteEndPointId is a vendor specific identifier or the airinterface at the remote side, used to by the node to discover a microwave radio link." + ], + "uml-name": "remoteEndPointId", + "controlType": "text" + }, + "current-problem-list": { + "id": "current-problem-list", + "uml-id": "_ecCewEaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "__h1n4MXpEeWJ6KZuc0h_vw", + "order-number": 1, + "is-read-only": true, + "uml-name": "currentProblemList" + }, + "current-performance-data-list": { + "id": "current-performance-data-list", + "uml-id": "_ecCexkaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_pA5AQGz6Eeaf-__BRLM84g", + "order-number": 1, + "is-read-only": true, + "description": [ + "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too." + ], + "uml-name": "currentPerformanceDataList" + }, + "historical-performance-data-list": { + "id": "historical-performance-data-list", + "uml-id": "_ecCeykaqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_pTaToGz6Eeaf-__BRLM84g", + "order-number": 1, + "is-read-only": true, + "uml-name": "historicalPerformanceDataList" + }, + "co-channel-group": { + "id": "co-channel-group", + "uml-id": "_XBs2YJQrEeWOu_cDl8dd7w", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Required for configuring XPIC, MIMO and ALIC." + ], + "uml-name": "CoChannelGroup" + }, + "co-channel-group-id": { + "id": "co-channel-group-id", + "uml-id": "_pIjBgEy7EeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "coChannelGroupId" + }, + "air-interface-list": { + "id": "air-interface-list", + "uml-id": "_tIadUCJeEeaCUo1MUtSuEg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "List of air interfaces, which are part of the co-channel (XPIC, MIMO, ALIC) group." + ], + "uml-name": "_airInterfaceList" + }, + "sort-of-co-channel-group": { + "id": "sort-of-co-channel-group", + "uml-id": "_ZrjZcJRrEeWIaZzoaYJ6_A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 3, + "is-read-only": false, + "description": [ + "Type of group of air interfaces with the same transmit and receive frequency. The values shall be chosen from the following _list:'XPIC', 'MIMO', 'ALIC';" + ], + "uml-name": "sortOfCoChannelGroup", + "controlType": "text" + }, + "logical-termination-point": { + "id": "logical-termination-point", + "uml-id": "_8QgfIKwZEeaK38AermeaCw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 4, + "is-read-only": false, + "uml-name": "_logicalTerminationPoint" + }, + "mw-air-interface-hsb-end-point-pac": { + "id": "mw-air-interface-hsb-end-point-pac", + "uml-id": "_CXKgMJRbEeWMYJZn43K_Aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The EndPoint (EP) object class models the access to the FC function. Each EndPoint instance has a role (e.g., working, protection, protected, hub, spoke, leaf, root, etc.) with respect to the FC function. The association of the FC to LTPs is made via EndPoints (essentially the ports of the FC) where each EndPoint (EP) of the FC has a role in the context of the FC. The traffic forwarding between the associated End PointsEPs of the FC depends upon the type of FC and may be associated with FCSwitch object instances. In cases where there is protection conveys the protecting role of the access to the FC. The EP replaces the Protection Unit of a traditional protection model. It represents a protected (resilient/reliable) point or a protecting (unreliable working or protection) point." + ], + "uml-name": "MW_AirInterfaceHsbEndPoint_Pac" + }, + "role": { + "id": "role", + "uml-id": "_CXKgNpRbEeWMYJZn43K_Aw", + "uml-type": "ownedAttribute", + "type": "_01_dYJReEeWxIPEwZQ_gmw", + "order-number": 1, + "is-read-only": false, + "uml-name": "role", + "controlType": [ + "working", + "protection", + "protected" + ] + }, + "endpoint": { + "id": "endpoint", + "uml-id": "_dglVQLYgEeWOio-Gg6Q2sw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_b_lUAFYgEeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "is-key": 1, + "uml-name": "_endpoint" + }, + "mw-air-interface-hsb-fc-switch-pac": { + "id": "mw-air-interface-hsb-fc-switch-pac", + "uml-id": "_CXNjgJRbEeWMYJZn43K_Aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Represents and defines a protection switch structure encapsulated in the forwarding construct. Essentially performs the function of Protection Group. Associates to 2 or more Endpoints each playing the role of a Protection Unit. One or more protection EndPoints (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) Endpoints where either protection or working can feed one or more protected Endpoint. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1). May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state." + ], + "uml-name": "MW_AirInterfaceHsbFcSwitch_Pac" + }, + "prot-type": { + "id": "prot-type", + "uml-id": "_CXNjiJRbEeWMYJZn43K_Aw", + "uml-type": "ownedAttribute", + "type": "_DaB5IJRgEeWxIPEwZQ_gmw", + "order-number": 1, + "is-read-only": false, + "description": [ + "Indicates the protection scheme that is used for the ProtectionGroup." + ], + "uml-name": "protType", + "controlType": [ + "hsb" + ] + }, + "air-interface-hsb-configuration-is-faulty-severity": { + "id": "air-interface-hsb-configuration-is-faulty-severity", + "uml-id": "_80BlAJ2gEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "The level of severity of an airInterfaceHsbConfigurationIsFaulty alarm shall be chosen from an enumeration." + ], + "uml-name": "airInterfaceHsbConfigurationIsFaultySeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "air-interface-hsb-is-partly-down-severity": { + "id": "air-interface-hsb-is-partly-down-severity", + "uml-id": "_r382sJ2mEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 3, + "is-read-only": false, + "description": [ + "The level of severity for one link out of the HSB configuration being down shall be chosen from an enumeration." + ], + "uml-name": "airInterfaceHsbIsPartlyDownSeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "air-interface-hsb-is-down-severity": { + "id": "air-interface-hsb-is-down-severity", + "uml-id": "_sRGWgJ2mEeWSuvrh9KcclQ", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 4, + "is-read-only": false, + "description": [ + "The level of severity of the total HSB configuration being down shall be chosen from an enumeration." + ], + "uml-name": "airInterfaceHsbIsDownSeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "fcswitch": { + "id": "fcswitch", + "uml-id": "_FS83ILYhEeWOio-Gg6Q2sw", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_a97NQFYhEeOVGaP4lO41SQ", + "order-number": 5, + "is-read-only": false, + "is-key": 1, + "uml-name": "_fcswitch" + }, + "mw-air-interface-diversity-pac": { + "id": "mw-air-interface-diversity-pac", + "uml-id": "_WbgFcHgFEeWfutScSwFT9A", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MW_AirInterfaceDiversity_Pac" + }, + "air-interface-diversity-capability": { + "id": "air-interface-diversity-capability", + "uml-id": "_vxH2wIekEeWaZYk7gpuOtw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the capabilities in implementing different types of air interface diversity." + ], + "uml-name": "AirInterfaceDiversityCapability" + }, + "air-interface-diversity-configuration": { + "id": "air-interface-diversity-configuration", + "uml-id": "_43RTMIe1EeWnUdmvl3PBkw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "AirInterfaceDiversityConfiguration" + }, + "air-interface-diversity-status": { + "id": "air-interface-diversity-status", + "uml-id": "_EKZYcJOXEeWz-6sqLzUedw", + "uml-type": "ownedAttribute", + "type": "_DUJs8JOXEeWz-6sqLzUedw", + "order-number": 2, + "is-read-only": true, + "description": [ + "Status of the air interface bundle." + ], + "uml-name": "airInterfaceDiversityStatus", + "controlType": [ + "group-down", + "not-all-ai-active", + "all-ai-active" + ] + }, + "air-interface-diversity-current-problems": { + "id": "air-interface-diversity-current-problems", + "uml-id": "_CAvhEHvtEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "AirInterfaceDiversityCurrentProblems" + }, + "air-interface-diversity-current-performance": { + "id": "air-interface-diversity-current-performance", + "uml-id": "_GIsAQKjDEeWlgMiFXLmCIQ", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface diversity configuration at a particular moment." + ], + "uml-name": "AirInterfaceDiversityCurrentPerformance" + }, + "air-interface-diversity-historical-performances": { + "id": "air-interface-diversity-historical-performances", + "uml-id": "_8IIu8HvsEeWzooKF5kx0aw", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the air interface diversity configuration for a pre-defined measurement interval." + ], + "uml-name": "AirInterfaceDiversityHistoricalPerformances" + }, + "available-kinds-of-diversity": { + "id": "available-kinds-of-diversity", + "uml-id": "_luAGENyVEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "_pTliINyUEeW-SfXlFFFI0Q", + "order-number": 1, + "is-read-only": true, + "description": [ + "Available types of diversity to be listed." + ], + "uml-name": "availableKindsOfDiversity" + }, + "air-interface-diversity": { + "id": "air-interface-diversity", + "uml-id": "_hynTIHi_EeWfutScSwFT9A", + "uml-type": "ownedAttribute", + "type": "_pTliINyUEeW-SfXlFFFI0Q", + "order-number": 1, + "is-read-only": false, + "description": [ + "Type of air interface diversity configured at the link." + ], + "uml-name": "airInterfaceDiversity" + }, + "air-interface-ltp-list": { + "id": "air-interface-ltp-list", + "uml-id": "_xRMKgNyXEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_eEpDMFX4EeOVGaP4lO41SQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "_multiplicity:2-ThisAirInterfaceDiversity::AirInterfaceDiversityConfiguration::airInterfaceDiversity::diversityType::numberOfAirInterfacesMax" + ], + "uml-name": "_airInterfaceLtpList" + }, + "mw-pure-ethernet-structure-pac": { + "id": "mw-pure-ethernet-structure-pac", + "uml-id": "__OTQ0UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The pureEthernetStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting Ethernet traffic only." + ], + "uml-name": "MW_PureEthernetStructure_Pac" + }, + "pure-ethernet-structure-capability-list": { + "id": "pure-ethernet-structure-capability-list", + "uml-id": "__OTQ4EaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the logical structuring of the physical capacity provided by a pure Ethernet microwave device. Segmentation is not available. No fixed segment size. No TDM transport." + ], + "uml-name": "PureEthernetStructureCapability" + }, + "pure-ethernet-structure-configuration": { + "id": "pure-ethernet-structure-configuration", + "uml-id": "__OTQ8UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "PureEthernetStructureConfiguration" + }, + "pure-ethernet-structure-status": { + "id": "pure-ethernet-structure-status", + "uml-id": "__OTQ_UaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "PureEthernetStructureStatus" + }, + "pure-ethernet-structure-current-problems": { + "id": "pure-ethernet-structure-current-problems", + "uml-id": "__OTRCUaeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "PureEthernetStructureCurrentProblems" + }, + "pure-ethernet-structure-current-performance": { + "id": "pure-ethernet-structure-current-performance", + "uml-id": "__OTRD0aeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of an pure Ethernet microwave at a particular moment." + ], + "uml-name": "PureEthernetStructureCurrentPerformance" + }, + "pure-ethernet-structure-historical-performances": { + "id": "pure-ethernet-structure-historical-performances", + "uml-id": "__OTRE0aeEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of an pure Ethernet microwave for a pre-defined measurement interval." + ], + "uml-name": "PureEthernetStructureHistoricalPerformances" + }, + "structure-id": { + "id": "structure-id", + "uml-id": "_Bzxo5EagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Identifies the Structure for bundling and container." + ], + "uml-name": "structureId" + }, + "segment-status-list": { + "id": "segment-status-list", + "uml-id": "_BzxpAEagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_KwZVcMUCEeW3xsRKtpCLuA", + "order-number": 1, + "is-read-only": true, + "description": [ + "Status of each segment (all TDM and one Ethernet). Multiplicity = HybridMwStructure::StructureConfiguration::tdmReservedNumberOfSegments + 1" + ], + "uml-name": "segmentStatusList" + }, + "mw-hybrid-mw-structure-pac": { + "id": "mw-hybrid-mw-structure-pac", + "uml-id": "_Bzxo0UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "The HybridMwStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM and Ethernet traffic." + ], + "uml-name": "MW_HybridMwStructure_Pac" + }, + "hybrid-mw-structure-capability": { + "id": "hybrid-mw-structure-capability", + "uml-id": "_Bzxo4EagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Describes the logical structuring of the physical capacity provided by a hybrid microwave device (TDM + Ethernet). Segmentation is available. TDM transport is available." + ], + "uml-name": "HybridMwStructureCapability" + }, + "hybrid-mw-structure-configuration": { + "id": "hybrid-mw-structure-configuration", + "uml-id": "_Bzxo8UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HybridMwStructureConfiguration" + }, + "hybrid-mw-structure-status": { + "id": "hybrid-mw-structure-status", + "uml-id": "_Bzxo_UagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HybridMwStructureStatus" + }, + "hybrid-mw-structure-current-problems": { + "id": "hybrid-mw-structure-current-problems", + "uml-id": "_BzxpCUagEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HybridMwStructureCurrentProblems" + }, + "hybrid-mw-structure-current-performance": { + "id": "hybrid-mw-structure-current-performance", + "uml-id": "_BzxpD0agEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of a hybrid microwave at a particular moment." + ], + "uml-name": "HybridMwStructureCurrentPerformance" + }, + "hybrid-mw-structure-historical-performances": { + "id": "hybrid-mw-structure-historical-performances", + "uml-id": "_BzxpE0agEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the structure of a hybrid microwave for a pre-defined measurement interval." + ], + "uml-name": "HybridMwStructureHistoricalPerformances" + }, + "supported-tdm-structure-types-list": { + "id": "supported-tdm-structure-types-list", + "uml-id": "_tA-uQEduEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_jRAQsEdoEeax2rWez10Siw", + "order-number": 2, + "is-read-only": true, + "description": [ + "Lists the TDM frame types that are supported." + ], + "uml-name": "supportedTdmStructureTypesList" + }, + "structure-type": { + "id": "structure-type", + "uml-id": "_cduh4EdvEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_jRAQsEdoEeax2rWez10Siw", + "order-number": 1, + "is-read-only": false, + "description": [ + "TDM frame to be applied." + ], + "uml-name": "structureType" + }, + "number-of-tdm-segments-to-be-reserved": { + "id": "number-of-tdm-segments-to-be-reserved", + "uml-id": "_Bzxo9EagEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "description": [ + "Allows to configure the number of segments reserved for TDM frames of the type specified in HybridMwStructure::HybridMwStructureConfiguration::structureType" + ], + "uml-name": "numberOfTdmSegmentsToBeReserved", + "controlType": "number" + }, + "mw-ethernet-container-pac": { + "id": "mw-ethernet-container-pac", + "uml-id": "_4uEBgUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MW_EthernetContainer_Pac" + }, + "ethernet-container-capability": { + "id": "ethernet-container-capability", + "uml-id": "_4uEBmEafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetContainerCapability" + }, + "ethernet-container-configuration": { + "id": "ethernet-container-configuration", + "uml-id": "_4uEBwUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetContainerConfiguration" + }, + "ethernet-container-status": { + "id": "ethernet-container-status", + "uml-id": "_4uECAUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetContainerStatus" + }, + "ethernet-container-current-problems": { + "id": "ethernet-container-current-problems", + "uml-id": "_4uECDUafEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetContainerCurrentProblems" + }, + "ethernet-container-current-performance": { + "id": "ethernet-container-current-performance", + "uml-id": "_4uECE0afEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the Ethernet container at a particular moment." + ], + "uml-name": "EthernetContainerCurrentPerformance" + }, + "ethernet-container-historical-performances": { + "id": "ethernet-container-historical-performances", + "uml-id": "_4uECF0afEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the Ethernet container for a pre-defined measurement interval." + ], + "uml-name": "EthernetContainerHistoricalPerformances" + }, + "bundling-is-avail": { + "id": "bundling-is-avail", + "uml-id": "_IzCGMNyCEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "If it is possible to combine transport resources of several radio links to transport this container type, this attribute shall be set to '1'." + ], + "uml-name": "bundlingIsAvail", + "controlType": "checkbox" + }, + "packet-compression-is-avail": { + "id": "packet-compression-is-avail", + "uml-id": "_4uEBp0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "In case packet compression can be activated, but not configured to a certain type, packetCompressionAvail shall be set on 'true', but none of the compression level specific booleans." + ], + "uml-name": "packetCompressionIsAvail", + "controlType": "checkbox" + }, + "layer2-compression-is-avail": { + "id": "layer2-compression-is-avail", + "uml-id": "_4uEBqkafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": true, + "description": [ + "Packet compression on layer 2 available at the device." + ], + "uml-name": "layer2CompressionIsAvail", + "controlType": "checkbox" + }, + "vlan-compression-is-avail": { + "id": "vlan-compression-is-avail", + "uml-id": "_4uEBrUafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "Packet compression on VLAN layer available at the device." + ], + "uml-name": "vlanCompressionIsAvail", + "controlType": "checkbox" + }, + "q-in-q-compression-is-avail": { + "id": "q-in-q-compression-is-avail", + "uml-id": "_4uEBsEafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 5, + "is-read-only": true, + "description": [ + "Packet compression on layer of a second VLAN available at the device." + ], + "uml-name": "qInQCompressionIsAvail", + "controlType": "checkbox" + }, + "mpls-compression-is-avail": { + "id": "mpls-compression-is-avail", + "uml-id": "_4uEBs0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": true, + "description": [ + "Packet compression on mpls layer available at the device." + ], + "uml-name": "mplsCompressionIsAvail", + "controlType": "checkbox" + }, + "ipv4-compression-is-avail": { + "id": "ipv4-compression-is-avail", + "uml-id": "_4uEBtkafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": true, + "description": [ + "Packet compression on layer 3 for IPv4 available at the device." + ], + "uml-name": "ipv4CompressionIsAvail", + "controlType": "checkbox" + }, + "ipv6-compression-is-avail": { + "id": "ipv6-compression-is-avail", + "uml-id": "_4uEBuUafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": true, + "description": [ + "Packet compression on layer 3 for IPv6 available at the device." + ], + "uml-name": "ipv6CompressionIsAvail", + "controlType": "checkbox" + }, + "layer4-compression-is-avail": { + "id": "layer4-compression-is-avail", + "uml-id": "_4uEBvEafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": true, + "description": [ + "Packet compression on layer 4 (TCP and UDP header) available at the device." + ], + "uml-name": "layer4CompressionIsAvail", + "controlType": "checkbox" + }, + "container-id": { + "id": "container-id", + "uml-id": "_ecCeS0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "ContainterID in Netconf must be the same as TDM Flow ID so a connection can be made between the two items, which separately exist in the controller." + ], + "uml-name": "containerID", + "controlType": "text" + }, + "segments-id-list": { + "id": "segments-id-list", + "uml-id": "_4uEBy0afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "order-number": 2, + "is-read-only": false, + "description": [ + "Lists the segments used for transporting this Ethernet container. In case EthernetContainer::ContainerCapability::bundlingIsAvail==0, all TypeDefinitions::segmentIdType::structureId must be identical in the list." + ], + "uml-name": "segmentsIdList" + }, + "packet-compression-is-on": { + "id": "packet-compression-is-on", + "uml-id": "_4uEB1UafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": false, + "description": [ + "In case packet compression is activated, but no type is activated, it is assumed that the device chooses the optimum." + ], + "uml-name": "packetCompressionIsOn", + "controlType": "checkbox" + }, + "layer2-compression-is-on": { + "id": "layer2-compression-is-on", + "uml-id": "_4uEB2kafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": false, + "description": [ + "Packet compression on layer 2 configured at the device." + ], + "uml-name": "layer2CompressionIsOn", + "controlType": "checkbox" + }, + "vlan-compression-is-on": { + "id": "vlan-compression-is-on", + "uml-id": "_4uEB30afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 5, + "is-read-only": false, + "description": [ + "Packet compression on VLAN layer configured at the device." + ], + "uml-name": "vlanCompressionIsOn", + "controlType": "checkbox" + }, + "q-in-q-compression-is-on": { + "id": "q-in-q-compression-is-on", + "uml-id": "_4uEB5EafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 6, + "is-read-only": false, + "description": [ + "Packet compression on layer of a second VLAN configured at the device." + ], + "uml-name": "qInQCompressionIsOn", + "controlType": "checkbox" + }, + "mpls-compression-is-on": { + "id": "mpls-compression-is-on", + "uml-id": "_4uEB6UafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 7, + "is-read-only": false, + "description": [ + "Packet compression on MPLS layer configured at the device." + ], + "uml-name": "mplsCompressionIsOn", + "controlType": "checkbox" + }, + "ipv4-compression-is-on": { + "id": "ipv4-compression-is-on", + "uml-id": "_4uEB7kafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 8, + "is-read-only": false, + "description": [ + "Packet compression on layer 3 for IPv4 configured at the device." + ], + "uml-name": "ipv4CompressionIsOn", + "controlType": "checkbox" + }, + "ipv6-compression-is-on": { + "id": "ipv6-compression-is-on", + "uml-id": "_4uEB80afEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 9, + "is-read-only": false, + "description": [ + "Packet compression on layer 3 for IPv6 configured at the device." + ], + "uml-name": "ipv6CompressionIsOn", + "controlType": "checkbox" + }, + "layer4-compression-is-on": { + "id": "layer4-compression-is-on", + "uml-id": "_4uEB-EafEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": false, + "description": [ + "Packet compression on layer 4 (TCP and UDP header) configured at the device." + ], + "uml-name": "layer4CompressionIsOn", + "controlType": "checkbox" + }, + "mw-tdm-container-pac": { + "id": "mw-tdm-container-pac", + "uml-id": "_ecCeMUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MW_TdmContainer_Pac" + }, + "tdm-container-capability": { + "id": "tdm-container-capability", + "uml-id": "_ecCeSEaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Bundling is not available." + ], + "uml-name": "TdmContainerCapability" + }, + "tdm-container-configuration": { + "id": "tdm-container-configuration", + "uml-id": "_ecCecUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "TdmContainerConfiguration" + }, + "tdm-container-status": { + "id": "tdm-container-status", + "uml-id": "_ecCesUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "TdmContainerStatus" + }, + "tdm-container-current-problems": { + "id": "tdm-container-current-problems", + "uml-id": "_ecCevUaqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "TdmContainerCurrentProblems" + }, + "tdm-container-current-performance": { + "id": "tdm-container-current-performance", + "uml-id": "_ecCew0aqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the TDM container at a particular moment." + ], + "uml-name": "TdmContainerCurrentPerformance" + }, + "tdm-container-historical-performances": { + "id": "tdm-container-historical-performances", + "uml-id": "_ecCex0aqEeas2eqI3oKNtg", + "uml-type": "uml:Class", + "is-read-only": false, + "description": [ + "Aggregated performance information of the TDM container for a pre-defined measurement interval." + ], + "uml-name": "TdmContainerHistoricalPerformances" + }, + "supported-tdm-container-types-list": { + "id": "supported-tdm-container-types-list", + "uml-id": "_R5hG0EdwEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "_rgbigEdjEeax2rWez10Siw", + "order-number": 1, + "is-read-only": true, + "description": [ + "Lists the TDM containers that are supported." + ], + "uml-name": "supportedTdmContainerTypesList" + }, + "container-type": { + "id": "container-type", + "uml-id": "_be7AoMWkEeW3xsRKtpCLuA", + "uml-type": "uml:DataType", + "uml-name": "ContainerType" + }, + "segment-id": { + "id": "segment-id", + "uml-id": "_ecCee0aqEeas2eqI3oKNtg", + "uml-type": "ownedAttribute", + "type": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "order-number": 3, + "is-read-only": false, + "description": [ + "Multiplicity = 1; One segment per TDM container; Type of segment must match type of container;" + ], + "uml-name": "segmentID" + }, + "mw-current-problem": { + "id": "mw-current-problem", + "uml-id": "_LKRM4JNQEeWuAeXkr703BA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "MwCurrentProblem" + }, + "sequence-number": { + "id": "sequence-number", + "uml-id": "_YadH4CJbEeaHpPYk5sscIg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Unique sequence number of the current problem object." + ], + "uml-name": "sequenceNumber", + "controlType": "number" + }, + "time-stamp": { + "id": "time-stamp", + "uml-id": "_lB4EQJN1EeWuAeXkr703BA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_oGqi1lLNEeO75dO39GbF8Q", + "order-number": 2, + "is-read-only": true, + "description": [ + "Time and date of the problem. _format:yyyyMMddhhmmss.s[Z|{+|-}HHMm]; yyyy='0000'..'9999' year; MM='01'..'12' month; dd='01'..'31' day; hh='00'..'23' hour; mm='00'..'59' minute; ss='00'..'59' second; s='.0'..'.9'tenth of second (set to '.0' if EMS or NE cannot support this granularity); Z='Z' indicates UTC (rather than local time); {+|-}='+' or '-' delta from UTC; HH='00'..'23' time zone difference in hours; Mm='00'..'59' time zone difference in minutes." + ], + "uml-name": "timeStamp" + }, + "problem-severity": { + "id": "problem-severity", + "uml-id": "_qInZ8KT4EeapooeghKN-dA", + "uml-type": "ownedAttribute", + "type": "_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 3, + "is-read-only": true, + "description": [ + "Severity of the alarm." + ], + "uml-name": "problemSeverity", + "controlType": [ + "non-alarmed", + "warning", + "minor", + "major", + "critical" + ] + }, + "channel-plan-type": { + "id": "channel-plan-type", + "uml-id": "_oQf6IPXSEeW9zIqh2WHHww", + "uml-type": "uml:DataType", + "uml-name": "ChannelPlanType" + }, + "duplex-distance-is-variable": { + "id": "duplex-distance-is-variable", + "uml-id": "_OPxkQK42EeWxIavXll_b0A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "To be set on 'true', if the distance between transmitted and received frequency is variable." + ], + "uml-name": "duplexDistanceIsVariable", + "controlType": "checkbox" + }, + "duplex-distance": { + "id": "duplex-distance", + "uml-id": "_BEr_wIMEEeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Distance between transmitted and received frequency." + ], + "uml-name": "duplexDistance", + "controlType": "number" + }, + "auto-freq-select-is-avail": { + "id": "auto-freq-select-is-avail", + "uml-id": "_te6XMIL8EeWMcJAvkeTn2w", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 4, + "is-read-only": true, + "description": [ + "In case the microwave radio is capable of automatically selecting the transmit frequency in unlicensed bands, this field shall contain a 'true'." + ], + "uml-name": "autoFreqSelectIsAvail", + "controlType": "checkbox" + }, + "transmission-mode-type": { + "id": "transmission-mode-type", + "uml-id": "_zG34sPXQEeW9zIqh2WHHww", + "uml-type": "uml:DataType", + "uml-name": "TransmissionModeType" + }, + "transmission-mode-id": { + "id": "transmission-mode-id", + "uml-id": "_afdYoNumEeWHIeLurhMv0A", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Indentifies the transmissionMode for internal reference." + ], + "uml-name": "transmissionModeId" + }, + "channel-bandwidth": { + "id": "channel-bandwidth", + "uml-id": "_FteJEHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kHz", + "description": [ + "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;" + ], + "uml-name": "channelBandwidth", + "controlType": "number" + }, + "modulation-scheme": { + "id": "modulation-scheme", + "uml-id": "_G4H-UHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "symbols", + "description": [ + "Modulation scheme, which is base to the other characteristics described in the same transmissionModeType data type. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256')." + ], + "uml-name": "modulationScheme", + "controlType": "number" + }, + "code-rate": { + "id": "code-rate", + "uml-id": "_jE7-EHf4EeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "%", + "description": [ + "Code rate of the coding scheme in % (Net bit rate ≤ Gross bit rate · code rate)." + ], + "uml-name": "codeRate", + "controlType": "number" + }, + "tx-power-min": { + "id": "tx-power-min", + "uml-id": "_I3nJ0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the minimum transmit power the modem can operate in dBm." + ], + "uml-name": "txPowerMin", + "controlType": "number" + }, + "tx-power-max": { + "id": "tx-power-max", + "uml-id": "_KB7A0HfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the maximum transmit power the modem can operate in dBm." + ], + "uml-name": "txPowerMax", + "controlType": "number" + }, + "rx-threshold": { + "id": "rx-threshold", + "uml-id": "_LCr6QHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 7, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level required to decode the received signal with a Bit Error Rate of 1e-6 or less." + ], + "uml-name": "rxThreshold", + "controlType": "number" + }, + "am-upshift-level": { + "id": "am-upshift-level", + "uml-id": "_MGguwHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level that has to be exceeded to shift into a higher modulation scheme." + ], + "uml-name": "amUpshiftLevel", + "controlType": "number" + }, + "am-downshift-level": { + "id": "am-downshift-level", + "uml-id": "_NIvAwHfdEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 9, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Value of the receive level that has to be exceeded for not shifting into a lower modulation scheme." + ], + "uml-name": "amDownshiftLevel", + "controlType": "number" + }, + "xpic-is-avail": { + "id": "xpic-is-avail", + "uml-id": "_QHd9kHfvEeW-h9gN8LYm4Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 10, + "is-read-only": true, + "description": [ + "In case this air interface type is capable of XPIC, this field shall contain a 'true'. This information shall purely relate to capabilities of the equipment type, but not to the operational capability of a specific hardware composition on site. Means for example that this attribute might contain a 'true' statement, even if an additional cable would have been required to actually operate XPIC in a specific case." + ], + "uml-name": "xpicIsAvail", + "controlType": "checkbox" + }, + "air-interface-problem-severity-type": { + "id": "air-interface-problem-severity-type", + "uml-id": "_ZKdWgGnuEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "uml-name": "AirInterfaceProblemSeverityType" + }, + "problem-kind-name": { + "id": "problem-kind-name", + "uml-id": "_OMQH0Gz0Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "Name of the alarm according to Container::ContainerCapability::supportedAlarms" + ], + "uml-name": "problemKindName", + "controlType": "text" + }, + "air-interface-current-problem-type": { + "id": "air-interface-current-problem-type", + "uml-id": "_umuZUMXjEeW3xsRKtpCLuA", + "uml-type": "uml:DataType", + "uml-name": "AirInterfaceCurrentProblemType" + }, + "problem-name": { + "id": "problem-name", + "uml-id": "__h1n4cXpEeWJ6KZuc0h_vw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "Name of the alarm according to Container::ContainerCapability::supportedAlarms" + ], + "uml-name": "problemName", + "controlType": "text" + }, + "air-interface-performance-type": { + "id": "air-interface-performance-type", + "uml-id": "_OvFYwEQbEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the air interface." + ], + "uml-name": "AirInterfacePerformanceType" + }, + "es": { + "id": "es", + "uml-id": "_DbVzpUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of errored seconds." + ], + "uml-name": "es", + "controlType": "number" + }, + "ses": { + "id": "ses", + "uml-id": "_DbVzqUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of severely errored seconds." + ], + "uml-name": "ses", + "controlType": "number" + }, + "cses": { + "id": "cses", + "uml-id": "_DbVzrUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "s", + "description": [ + "Number of consecutive severely errored seconds." + ], + "uml-name": "cses", + "controlType": "number" + }, + "unavailability": { + "id": "unavailability", + "uml-id": "_DbVzsUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "s", + "description": [ + "Total time of unavailability in seconds." + ], + "uml-name": "unavailability", + "controlType": "number" + }, + "tx-level-min": { + "id": "tx-level-min", + "uml-id": "_DbVztUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Minimum transmit power. Signed integers are required." + ], + "uml-name": "txLevelMin", + "controlType": "number" + }, + "tx-level-max": { + "id": "tx-level-max", + "uml-id": "_DbVzuUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 6, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Maximum transmit power. Signed integers are required." + ], + "uml-name": "txLevelMax", + "controlType": "number" + }, + "tx-level-avg": { + "id": "tx-level-avg", + "uml-id": "_DbVzvUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 7, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Averaged transmit power. Signed integers are required." + ], + "uml-name": "txLevelAvg", + "controlType": "number" + }, + "rx-level-min": { + "id": "rx-level-min", + "uml-id": "_DbVzwUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 8, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Minimum receive level. Signed integers are required." + ], + "uml-name": "rxLevelMin", + "controlType": "number" + }, + "rx-level-max": { + "id": "rx-level-max", + "uml-id": "_DbVzxUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 9, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Maximum receive level. Signed integers are required." + ], + "uml-name": "rxLevelMax", + "controlType": "number" + }, + "rx-level-avg": { + "id": "rx-level-avg", + "uml-id": "_DbVzyUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 10, + "is-read-only": true, + "unit": "dBm", + "description": [ + "Averaged receive level. Signed integers are required." + ], + "uml-name": "rxLevelAvg", + "controlType": "number" + }, + "time2-states": { + "id": "time2-states", + "uml-id": "_DbVzzUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 11, + "is-read-only": true, + "unit": "s", + "description": [ + "Sum of all seconds the transmitter operated in e.g. BPSK." + ], + "uml-name": "time2States", + "controlType": "number" + }, + "time4-states-s": { + "id": "time4-states-s", + "uml-id": "_DbVz0kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 12, + "is-read-only": true, + "unit": "s", + "uml-name": "time4StatesS", + "controlType": "number" + }, + "time4-states": { + "id": "time4-states", + "uml-id": "_DbVz2EQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 13, + "is-read-only": true, + "unit": "s", + "uml-name": "time4States", + "controlType": "number" + }, + "time8-states": { + "id": "time8-states", + "uml-id": "_DbVz3UQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 14, + "is-read-only": true, + "unit": "s", + "uml-name": "time8States", + "controlType": "number" + }, + "time16-states-s": { + "id": "time16-states-s", + "uml-id": "_DbVz4kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 15, + "is-read-only": true, + "unit": "s", + "uml-name": "time16StatesS", + "controlType": "number" + }, + "time16-states": { + "id": "time16-states", + "uml-id": "_DbVz50QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 16, + "is-read-only": true, + "unit": "s", + "uml-name": "time16States", + "controlType": "number" + }, + "time32-states": { + "id": "time32-states", + "uml-id": "_DbVz7EQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 17, + "is-read-only": true, + "unit": "s", + "uml-name": "time32States", + "controlType": "number" + }, + "time64-states": { + "id": "time64-states", + "uml-id": "_DbVz8UQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 18, + "is-read-only": true, + "unit": "s", + "uml-name": "time64States", + "controlType": "number" + }, + "time128-states": { + "id": "time128-states", + "uml-id": "_DbVz9kQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 19, + "is-read-only": true, + "unit": "s", + "uml-name": "time128States", + "controlType": "number" + }, + "time256-states": { + "id": "time256-states", + "uml-id": "_DbVz-0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 20, + "is-read-only": true, + "unit": "s", + "uml-name": "time256States", + "controlType": "number" + }, + "time512-states": { + "id": "time512-states", + "uml-id": "_DbV0AEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 21, + "is-read-only": true, + "unit": "s", + "uml-name": "time512States", + "controlType": "number" + }, + "time512-states-l": { + "id": "time512-states-l", + "uml-id": "_DbV0BUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 22, + "is-read-only": true, + "unit": "s", + "uml-name": "time512StatesL", + "controlType": "number" + }, + "time1024-states": { + "id": "time1024-states", + "uml-id": "_DbV0CkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 23, + "is-read-only": true, + "unit": "s", + "uml-name": "time1024States", + "controlType": "number" + }, + "time1024-states-l": { + "id": "time1024-states-l", + "uml-id": "_DbV0D0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 24, + "is-read-only": true, + "unit": "s", + "uml-name": "time1024StatesL", + "controlType": "number" + }, + "time2048-states": { + "id": "time2048-states", + "uml-id": "_DbV0FEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 25, + "is-read-only": true, + "unit": "s", + "uml-name": "time2048States", + "controlType": "number" + }, + "time2048-states-l": { + "id": "time2048-states-l", + "uml-id": "_DbV0GUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 26, + "is-read-only": true, + "unit": "s", + "uml-name": "time2048StatesL", + "controlType": "number" + }, + "time4096-states": { + "id": "time4096-states", + "uml-id": "_DbV0HkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 27, + "is-read-only": true, + "unit": "s", + "uml-name": "time4096States", + "controlType": "number" + }, + "time4096-states-l": { + "id": "time4096-states-l", + "uml-id": "_DbV0I0QbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 28, + "is-read-only": true, + "unit": "s", + "uml-name": "time4096StatesL", + "controlType": "number" + }, + "time8192-states": { + "id": "time8192-states", + "uml-id": "_DbV0KEQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 29, + "is-read-only": true, + "unit": "s", + "uml-name": "time8192States", + "controlType": "number" + }, + "time8192-states-l": { + "id": "time8192-states-l", + "uml-id": "_DbV0LUQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 30, + "is-read-only": true, + "unit": "s", + "uml-name": "time8192StatesL", + "controlType": "number" + }, + "snir-min": { + "id": "snir-min", + "uml-id": "_nG-NsEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "dB", + "description": [ + "Minimum signal to (noise+interference) ratio of the combined signals." + ], + "uml-name": "snirMin", + "controlType": "number" + }, + "snir-max": { + "id": "snir-max", + "uml-id": "_n_OEUEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "dB", + "description": [ + "Maximum signal to (noise+interference) ratio of the combined signals." + ], + "uml-name": "snirMax", + "controlType": "number" + }, + "snir-avg": { + "id": "snir-avg", + "uml-id": "_oU3kMEzvEeaRytIQfQ43Wg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "dB", + "description": [ + "Average signal to (noise+interference) ratio of the combined signals." + ], + "uml-name": "snirAvg", + "controlType": "number" + }, + "xpd-min": { + "id": "xpd-min", + "uml-id": "_DbV0PkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 34, + "is-read-only": true, + "unit": "dB", + "description": [ + "Minimum cross polarization discrimination." + ], + "uml-name": "xpdMin", + "controlType": "number" + }, + "xpd-max": { + "id": "xpd-max", + "uml-id": "_DbV0QkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 35, + "is-read-only": true, + "unit": "dB", + "description": [ + "Maximum cross polarization discrimination." + ], + "uml-name": "xpdMax", + "controlType": "number" + }, + "xpd-avg": { + "id": "xpd-avg", + "uml-id": "_DbV0RkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 36, + "is-read-only": true, + "unit": "dB", + "description": [ + "Averaged cross polarization discrimination." + ], + "uml-name": "xpdAvg", + "controlType": "number" + }, + "rf-temp-min": { + "id": "rf-temp-min", + "uml-id": "_DbV0SkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 37, + "is-read-only": true, + "unit": "C", + "description": [ + "Lowest temperature (in degree Celsius) of the radio module inside the outdoor unit." + ], + "uml-name": "rfTempMin", + "controlType": "number" + }, + "rf-temp-max": { + "id": "rf-temp-max", + "uml-id": "_DbV0TkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 38, + "is-read-only": true, + "unit": "C", + "description": [ + "Highest temperature (in degree Celsius) of the radio module inside the outdoor unit." + ], + "uml-name": "rfTempMax", + "controlType": "number" + }, + "rf-temp-avg": { + "id": "rf-temp-avg", + "uml-id": "_DbV0UkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 39, + "is-read-only": true, + "unit": "C", + "description": [ + "Averaged temperature (in degree Celsius) of the radio module inside the outdoor unit." + ], + "uml-name": "rfTempAvg", + "controlType": "number" + }, + "defect-blocks-sum": { + "id": "defect-blocks-sum", + "uml-id": "_DbV0VkQbEea3g-FxAUaYRg", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 40, + "is-read-only": true, + "unit": "blocks", + "description": [ + "Total number of blocks that were defect after receiving and could not be corrected by the FEC." + ], + "uml-name": "defectBlocksSum", + "controlType": "number" + }, + "time-period": { + "id": "time-period", + "uml-id": "_Nyme4H1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "unit": "s", + "description": [ + "Total length of the measurement period in seconds." + ], + "uml-name": "timePeriod", + "controlType": "number" + }, + "air-interface-current-performance-type": { + "id": "air-interface-current-performance-type", + "uml-id": "_pQ_y4GoHEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ], + "uml-name": "AirInterfaceCurrentPerformanceType" + }, + "performance-data": { + "id": "performance-data", + "uml-id": "_i5STYGz7Eeaf-__BRLM84g", + "uml-type": "ownedAttribute", + "type": "_U9tW0EQeEea3g-FxAUaYRg", + "order-number": 1, + "is-read-only": true, + "uml-name": "performanceData" + }, + "air-interface-historical-performance-type": { + "id": "air-interface-historical-performance-type", + "uml-id": "_t18kwGoHEeaZwMagYjVCHQ", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ], + "uml-name": "AirInterfaceHistoricalPerformanceType" + }, + "diversity-type": { + "id": "diversity-type", + "uml-id": "_pTliINyUEeW-SfXlFFFI0Q", + "uml-type": "uml:DataType", + "uml-name": "DiversityType" + }, + "diversity-name": { + "id": "diversity-name", + "uml-id": "_uYhboNyUEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'spaceDiversity', 'frequencyDiversity'" + ], + "uml-name": "diversityName", + "controlType": "text" + }, + "number-of-air-interfaces-max": { + "id": "number-of-air-interfaces-max", + "uml-id": "_wKDDoNyUEeW-SfXlFFFI0Q", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "air interfaces", + "description": [ + "Maximum number of air interfaces that could be part of this kind of diversity." + ], + "uml-name": "numberOfAirInterfacesMax", + "controlType": "number" + }, + "air-interface-diversity-problem-severity-type": { + "id": "air-interface-diversity-problem-severity-type", + "uml-id": "_2kMRYGzzEeaf-__BRLM84g", + "uml-type": "uml:DataType", + "uml-name": "AirInterfaceDiversityProblemSeverityType" + }, + "air-interface-diversity-current-problem-type": { + "id": "air-interface-diversity-current-problem-type", + "uml-id": "_z1XWgMXlEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType", + "uml-name": "AirInterfaceDiversityCurrentProblemType" + }, + "air-interface-diversity-performance-type": { + "id": "air-interface-diversity-performance-type", + "uml-id": "_EH3QgEQdEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the air interface diversity group." + ], + "uml-name": "AirInterfaceDiversityPerformanceType" + }, + "air-interface-diversity-current-performance-type": { + "id": "air-interface-diversity-current-performance-type", + "uml-id": "_n4wTgGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ], + "uml-name": "AirInterfaceDiversityCurrentPerformanceType" + }, + "air-interface-diversity-historical-performance-type": { + "id": "air-interface-diversity-historical-performance-type", + "uml-id": "_pG0pIGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ], + "uml-name": "AirInterfaceDiversityHistoricalPerformanceType" + }, + "tdm-structure-type": { + "id": "tdm-structure-type", + "uml-id": "_jRAQsEdoEeax2rWez10Siw", + "uml-type": "uml:DataType", + "uml-name": "TdmStructureType" + }, + "tdm-structure-name": { + "id": "tdm-structure-name", + "uml-id": "_1bJF4EdoEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ], + "uml-name": "tdmStructureName", + "controlType": "text" + }, + "tdm-segment-size": { + "id": "tdm-segment-size", + "uml-id": "_hPq1oEdpEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kbit/s", + "description": [ + "Size of the TDM segment in kbit/s. Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;" + ], + "uml-name": "tdmSegmentSize", + "controlType": "number" + }, + "max-number-of-segments-reservable": { + "id": "max-number-of-segments-reservable", + "uml-id": "_EJnsgEdpEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "segments", + "description": [ + "Device specific maximum number of segments (not depending on current air interface configuration) that can be reserved for this type of segment on a single air interface." + ], + "uml-name": "maxNumberOfSegmentsReservable", + "controlType": "number" + }, + "structure-problem-severity-type": { + "id": "structure-problem-severity-type", + "uml-id": "_LPgp4Gz0Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "uml-name": "StructureProblemSeverityType" + }, + "structure-current-problem-type": { + "id": "structure-current-problem-type", + "uml-id": "_UC0gAMXnEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType", + "uml-name": "StructureCurrentProblemType" + }, + "structure-performance-type": { + "id": "structure-performance-type", + "uml-id": "_kzEicEQdEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the Structure." + ], + "uml-name": "StructurePerformanceType" + }, + "structure-current-performance-type": { + "id": "structure-current-performance-type", + "uml-id": "_o7jNQGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ], + "uml-name": "StructureCurrentPerformanceType" + }, + "structure-historical-performance-type": { + "id": "structure-historical-performance-type", + "uml-id": "_pNAJoGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ], + "uml-name": "StructureHistoricalPerformanceType" + }, + "container-name": { + "id": "container-name", + "uml-id": "_o0IuQMWkEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'ethernet','e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ], + "uml-name": "containerName", + "controlType": "text" + }, + "number-of-time-slots-required": { + "id": "number-of-time-slots-required", + "uml-id": "_sZ82MMXXEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "timeslots", + "description": [ + "Number of time slots required for transporting this type of container. Value must be calculated by the vendor after defining the timeSlotCapacity. For containers of fixed size: numberOfTimeSlotsRequired = required bandwidth of the container divided by timeSlotCapacity. For containers of variable size the minimum (most probably 1) is to be stated." + ], + "uml-name": "numberOfTimeSlotsRequired", + "controlType": "number" + }, + "tdm-time-slots-is-required": { + "id": "tdm-time-slots-is-required", + "uml-id": "_hIagINrWEeWcA7plcJPZ7A", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 3, + "is-read-only": true, + "description": [ + "Shall be set to '1', if this container type requires bandwidth (times slots) reserved for TDM transport." + ], + "uml-name": "tdmTimeSlotsIsRequired", + "controlType": "checkbox" + }, + "tdm-container-type": { + "id": "tdm-container-type", + "uml-id": "_rgbigEdjEeax2rWez10Siw", + "uml-type": "uml:DataType", + "uml-name": "TdmContainerType" + }, + "tdm-container-name": { + "id": "tdm-container-name", + "uml-id": "_rgbigkdjEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "description": [ + "Names to be chosen from the following list: 'e1','t1','j1','e3','t3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'" + ], + "uml-name": "tdmContainerName", + "controlType": "text" + }, + "tdm-container-size": { + "id": "tdm-container-size", + "uml-id": "_rgbihEdjEeax2rWez10Siw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "kbit/s", + "description": [ + "Capacity required for transporting this type of container (in kbit/s). Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;" + ], + "uml-name": "tdmContainerSize", + "controlType": "number" + }, + "segment-id-type": { + "id": "segment-id-type", + "uml-id": "_Nd1F4MKuEeWwLJhHQlOGSQ", + "uml-type": "uml:DataType", + "description": [ + "Identifies the segments, which are used to transport the container." + ], + "uml-name": "SegmentIDType" + }, + "structure-id-ref": { + "id": "structure-id-ref", + "uml-id": "_N4GKkMKvEeWwLJhHQlOGSQ", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_SU3Q4I30EeO38ZmbECnvbg", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "structureIdRef" + }, + "segment-id-ref": { + "id": "segment-id-ref", + "uml-id": "_nVubgMKvEeWwLJhHQlOGSQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": false, + "is-key": 2, + "description": [ + "Combinations of structureId and segmentId must be unique inside the device to assure that every resource is used just once." + ], + "uml-name": "segmentIdRef", + "controlType": "number" + }, + "segment-status-type": { + "id": "segment-status-type", + "uml-id": "_KwZVcMUCEeW3xsRKtpCLuA", + "uml-type": "uml:DataType", + "uml-name": "SegmentStatusType" + }, + "segment-status-type-id": { + "id": "segment-status-type-id", + "uml-id": "_7JBAYOLbEeWM2vUDE3Xqhw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "is-key": 1, + "uml-name": "segmentStatusTypeId", + "controlType": "number" + }, + "segment-is-reserved-for-tdm": { + "id": "segment-is-reserved-for-tdm", + "uml-id": "__1DMwMUCEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": true, + "description": [ + "The number of segments, which is configured by Structure::StructureConfiguration::tdmReservedNumberOfSegements, has to be reserved for TDM. Starting from the lowest index value, these segments have to be marked with a 'true' in segmentIsReservedForTdm." + ], + "uml-name": "segmentIsReservedForTdm", + "controlType": "checkbox" + }, + "operational-status": { + "id": "operational-status", + "uml-id": "_ZA94EMUCEeW3xsRKtpCLuA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-CoreModel/CoreModel.uml#_lNclkLEtEeSZUdYfPSdgew", + "order-number": 3, + "is-read-only": true, + "description": [ + "Current operational status of each segment." + ], + "uml-name": "operationalStatus" + }, + "obsolete-priority-class": { + "id": "obsolete-priority-class", + "uml-id": "_ebslwMnAEeWYRsWW_rqpgw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 4, + "is-read-only": true, + "description": [ + "PriorityClass as inherited from the associated Container::ContainerConfiguration::priorityClass. In case the device is capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, priorityClass shall be considered, while calculating the dropOrderRank." + ], + "uml-name": "obsoletePriorityClass", + "controlType": "number" + }, + "obsolete-drop-order-rank": { + "id": "obsolete-drop-order-rank", + "uml-id": "_DbJpMMnDEeWYRsWW_rqpgw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 5, + "is-read-only": true, + "description": [ + "In case the device is NOT capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, dropOrderRank is number of segments minus sequence number of the segment. In case the device is capable of adapting the sequence, dropOrderRank has to be calculated by the device in dependency to the assigned priorityClass. _unique: within Structure::StructureStatus::segmentStatusList" + ], + "uml-name": "obsoleteDropOrderRank", + "controlType": "number" + }, + "container-problem-severity-type": { + "id": "container-problem-severity-type", + "uml-id": "_OMPgwGz0Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "uml-name": "ContainerProblemSeverityType" + }, + "container-current-problem-type": { + "id": "container-current-problem-type", + "uml-id": "__h1n4MXpEeWJ6KZuc0h_vw", + "uml-type": "uml:DataType", + "uml-name": "ContainerCurrentProblemType" + }, + "container-performance-type": { + "id": "container-performance-type", + "uml-id": "_U9tW0EQeEea3g-FxAUaYRg", + "uml-type": "uml:DataType", + "description": [ + "Consolidated performance information of the Container." + ], + "uml-name": "ContainerPerformanceType" + }, + "tx-ethernet-bytes-max-s": { + "id": "tx-ethernet-bytes-max-s", + "uml-id": "_MaHB8H1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": true, + "unit": "Bytes/s", + "description": [ + "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a second and keeps the highest value within the measurement period. Field to be left blank for all types of TDM containers." + ], + "uml-name": "txEthernetBytesMaxS", + "controlType": "number" + }, + "tx-ethernet-bytes-max-m": { + "id": "tx-ethernet-bytes-max-m", + "uml-id": "_M3NNoH1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 2, + "is-read-only": true, + "unit": "Bytes/min", + "description": [ + "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a minute and keeps the highest value with in the measurement period. Field to be left blank for all types of TDM containers." + ], + "uml-name": "txEthernetBytesMaxM", + "controlType": "number" + }, + "tx-ethernet-bytes-sum": { + "id": "tx-ethernet-bytes-sum", + "uml-id": "_NWtNEH1IEeWHjMaYlqnBcw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 3, + "is-read-only": true, + "unit": "Bytes", + "description": [ + "Total number of Bytes of Ethernet traffic (before header compression) transmitted (in direction out of the device) during the measurement period. Field to be left blank for all types of TDM containers." + ], + "uml-name": "txEthernetBytesSum", + "controlType": "number" + }, + "container-current-performance-type": { + "id": "container-current-performance-type", + "uml-id": "_pA5AQGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into current performance information by inheriting from OTN_CurrentData." + ], + "uml-name": "ContainerCurrentPerformanceType" + }, + "container-historical-performance-type": { + "id": "container-historical-performance-type", + "uml-id": "_pTaToGz6Eeaf-__BRLM84g", + "uml-type": "uml:DataType", + "description": [ + "Turns performance information into historical performance information by inheriting from OTN_HistoryData." + ], + "uml-name": "ContainerHistoricalPerformanceType" + }, + "3-cz3-u-is-d-eead4-ers-mr-oj-bq": { + "id": "3-cz3-u-is-d-eead4-ers-mr-oj-bq", + "uml-id": "_3CZ3UIsDEead4ersMrOjBQ", + "enum": [ + "NON", + "IF", + "RF" + ], + "is-read-only": false, + "uml-name": "_3CZ3UIsDEead4ersMrOjBQ" + }, + "e-iml0-jh1-ee-w-udbnmm-ni-taa": { + "id": "e-iml0-jh1-ee-w-udbnmm-ni-taa", + "uml-id": "_eIml0JH1EeWUdbnmmNiTAA", + "enum": [ + "NON_ALARMED", + "WARNING", + "MINOR", + "MAJOR", + "CRITICAL" + ], + "is-read-only": false, + "description": [ + "According to ITU-T M.3160" + ], + "uml-name": "_eIml0JH1EeWUdbnmmNiTAA" + }, + "e85-ns-i99-ee-w-fluv9-kl-ll5-a": { + "id": "e85-ns-i99-ee-w-fluv9-kl-ll5-a", + "uml-id": "_e85NsI99EeWFluv9KLLl5A", + "enum": [ + "NOT_SPECIFIED", + "HORIZONTAL", + "VERTICAL" + ], + "is-read-only": false, + "uml-name": "_e85NsI99EeWFluv9KLLl5A" + }, + "da-b5-ij-rg-ee-wx-ip-ew-zq-gmw": { + "id": "da-b5-ij-rg-ee-wx-ip-ew-zq-gmw", + "uml-id": "_DaB5IJRgEeWxIPEwZQ_gmw", + "enum": [ + "HSB" + ], + "is-read-only": false, + "uml-name": "_DaB5IJRgEeWxIPEwZQ_gmw" + }, + "01-d-yj-re-ee-wx-ip-ew-zq-gmw": { + "id": "01-d-yj-re-ee-wx-ip-ew-zq-gmw", + "uml-id": "_01_dYJReEeWxIPEwZQ_gmw", + "enum": [ + "WORKING", + "PROTECTION", + "PROTECTED" + ], + "is-read-only": false, + "uml-name": "_01_dYJReEeWxIPEwZQ_gmw" + }, + "du-js8-jox-ee-wz-6-sq-lz-uedw": { + "id": "du-js8-jox-ee-wz-6-sq-lz-uedw", + "uml-id": "_DUJs8JOXEeWz-6sqLzUedw", + "enum": [ + "GROUP_DOWN", + "NOT_ALL_AI_ACTIVE", + "ALL_AI_ACTIVE" + ], + "is-read-only": false, + "uml-name": "_DUJs8JOXEeWz-6sqLzUedw" + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.yin.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.yin.json new file mode 100755 index 000000000..06013245b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model.yin.json @@ -0,0 +1,257 @@ +{
+ "module": {
+ "name": "microwave-model",
+ "microwave-model": {
+ "wire-interface-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "wirebased-interface-capability": {
+ "name": "wirebased-interface-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "wirebased-interface-configuration": {
+ "name": "wirebased-interface-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "wirebased-interface-status": {
+ "name": "wirebased-interface-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "wirebased-interface-current-problems": {
+ "name": "wirebased-interface-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "wirebased-interface-current-performance": {
+ "name": "wirebased-interface-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "wirebased-interface-historical-performances": {
+ "name": "wirebased-interface-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ },
+ "mw-air-interface-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "air-interface-capability": {
+ "name": "air-interface-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "air-interface-configuration": {
+ "name": "air-interface-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "air-interface-status": {
+ "name": "air-interface-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "air-interface-current-problems": {
+ "name": "air-interface-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "air-interface-current-performance": {
+ "name": "air-interface-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "air-interface-historical-performances": {
+ "name": "air-interface-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ },
+ "co-channel-group": {
+ "type": "list",
+ "key": "co-channel-group-id"
+ },
+ "mw-air-interface-hsb-end-point-pac": {
+ "type": "list",
+ "key": "endpoint"
+ },
+ "mw-air-interface-hsb-fc-switch-pac": {
+ "type": "list",
+ "key": "fcswitch"
+ },
+ "mw-air-interface-diversity-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "air-interface-diversity-capability": {
+ "name": "air-interface-diversity-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "air-interface-diversity-configuration": {
+ "name": "air-interface-diversity-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "air-interface-diversity-status": {
+ "name": "air-interface-diversity-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "air-interface-diversity-current-problems": {
+ "name": "air-interface-diversity-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "air-interface-diversity-current-performance": {
+ "name": "air-interface-diversity-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "air-interface-diversity-historical-performances": {
+ "name": "air-interface-diversity-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ },
+ "mw-pure-ethernet-structure-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "pure-ethernet-structure-capability": {
+ "name": "pure-ethernet-structure-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "pure-ethernet-structure-configuration": {
+ "name": "pure-ethernet-structure-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "pure-ethernet-structure-status": {
+ "name": "pure-ethernet-structure-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "pure-ethernet-structure-current-problems": {
+ "name": "pure-ethernet-structure-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "pure-ethernet-structure-current-performance": {
+ "name": "pure-ethernet-structure-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "pure-ethernet-structure-historical-performances": {
+ "name": "pure-ethernet-structure-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ },
+ "mw-hybrid-mw-structure-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "hybrid-mw-structure-capability": {
+ "name": "hybrid-mw-structure-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "hybrid-mw-structure-configuration": {
+ "name": "hybrid-mw-structure-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "hybrid-mw-structure-status": {
+ "name": "hybrid-mw-structure-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "hybrid-mw-structure-current-problems": {
+ "name": "hybrid-mw-structure-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "hybrid-mw-structure-current-performance": {
+ "name": "hybrid-mw-structure-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "hybrid-mw-structure-historical-performances": {
+ "name": "hybrid-mw-structure-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ },
+ "mw-ethernet-container-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "ethernet-container-capability": {
+ "name": "ethernet-container-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "ethernet-container-configuration": {
+ "name": "ethernet-container-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "ethernet-container-status": {
+ "name": "ethernet-container-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "ethernet-container-current-problems": {
+ "name": "ethernet-container-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "ethernet-container-current-performance": {
+ "name": "ethernet-container-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "ethernet-container-historical-performances": {
+ "name": "ethernet-container-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ },
+ "mw-tdm-container-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "tdm-container-capability": {
+ "name": "tdm-container-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "tdm-container-configuration": {
+ "name": "tdm-container-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "tdm-container-status": {
+ "name": "tdm-container-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "tdm-container-current-problems": {
+ "name": "tdm-container-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "tdm-container-current-performance": {
+ "name": "tdm-container-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "tdm-container-historical-performances": {
+ "name": "tdm-container-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model@2018-10-10.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model@2018-10-10.schema-information.json new file mode 100644 index 000000000..16f966e3d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/microwave-model@2018-10-10.schema-information.json @@ -0,0 +1,3548 @@ +{ "schama-information": { + +"microwave-model": { +"id": "microwave-model", +"is-read-only": false, +"description": ["This module contains a collection of YANG definitions for managing wireless networks. This model is for vendor agnostic management of wireless network elements."] +}, +"rf-to-remote": { +"id": "rf-to-remote", +"is-read-only": false, +"description": ["Returning the header information of the remote site back to the remote site on the radio interface between both outdoor units."] +}, +"rf-to-local": { +"id": "rf-to-local", +"is-read-only": false, +"description": ["Returning the header information of the local site back to the local site on the radio interface between both outdoor units."] +}, +"if-to-remote": { +"id": "if-to-remote", +"is-read-only": false, +"description": ["Returning the header information of the remote site back to the remote site on the intermediate frequency interface between local indoor unit and outdoor unit."] +}, +"if-to-local": { +"id": "if-to-local", +"is-read-only": false, +"description": ["Returning the header information of the local site back to the local site on the intermediate frequency interface between local indoor unit and outdoor unit."] +}, +"none": { +"id": "none", +"is-read-only": false, +"description": ["none"] +}, +"if": { +"id": "if", +"is-read-only": false, +"description": ["Intermediate Frequency on the interface between indoor and outdoor unit."] +}, +"rf": { +"id": "rf", +"is-read-only": false, +"description": ["Radio Frequency on the interface between outdoor unit and outdoor unit at the remote site."] +}, +"loop-back-type": { +"id": "loop-back-type", +"is-read-only": false, +"description": ["none"] +}, +"non-alarmed": { +"id": "non-alarmed", +"is-read-only": false, +"description": ["none"] +}, +"warning": { +"id": "warning", +"is-read-only": false, +"description": ["none"] +}, +"minor": { +"id": "minor", +"is-read-only": false, +"description": ["none"] +}, +"major": { +"id": "major", +"is-read-only": false, +"description": ["none"] +}, +"critical": { +"id": "critical", +"is-read-only": false, +"description": ["none"] +}, +"severity-type": { +"id": "severity-type", +"is-read-only": false, +"description": ["According to ITU-T M.3160"] +}, +"supported-channel-plan": { +"id": "supported-channel-plan", +"is-read-only": false, +"description": ["Unique name (e.g. ECC/REC/(01)04_Annex 5) of a document, which describes a frequency grid that can be adjusted at the air interface. Corresponding channel plans to be delivered by the hardware vendor and to be stored by the operator in an controller/application attached database."] +}, +"duplex-distance-is-variable": { +"id": "duplex-distance-is-variable", +"is-read-only": false, +"description": ["To be set on 'true', if the distance between transmitted and received frequency is variable."] +}, +"duplex-distance-list": { +"id": "duplex-distance-list", +"is-read-only": false, +"description": ["Distance between transmitted and received frequency. To be filled with single value, in case duplex distance is not variable. To be filled with all configurable values, in case duplex distance is variable."] +}, +"duplex-distance": { +"id": "duplex-distance", +"is-read-only": false, +"description": ["Distance between transmitted and received frequency."] +}, +"auto-freq-select-is-avail": { +"id": "auto-freq-select-is-avail", +"is-read-only": false, +"description": ["In case the microwave radio is capable of automatically selecting the transmit frequency in unlicensed bands, this field shall contain a 'true'."] +}, +"transmission-mode-list": { +"id": "transmission-mode-list", +"is-read-only": false, +"description": ["none"] +}, +"channel-plan-type-g": { +"id": "channel-plan-type-g", +"is-read-only": false, +"description": ["none"] +}, +"transmission-mode-id": { +"id": "transmission-mode-id", +"is-read-only": false, +"description": ["Indentifies the transmissionMode for internal reference."] +}, +"transmission-mode-name": { +"id": "transmission-mode-name", +"is-read-only": false, +"description": ["Name of the transmission mode. BBBB-m*-i*/t*-r*. B=four digits of channel bandwidth in MHz. m*=required number of digits for modulation name. (i*/t*=code rate.) i*=required number of digits for number of information bits. t*=required number of digits for total bits. r*=required number of digits for rate reduction factor. Example: 028-4QAM-188/204-1"] +}, +"channel-bandwidth": { +"id": "channel-bandwidth", +"is-read-only": false, +"description": ["Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;"] +}, +"modulation-scheme": { +"id": "modulation-scheme", +"is-read-only": false, +"description": ["Modulation scheme, which is base to the other characteristics described in the same transmissionModeType data type. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256')."] +}, +"code-rate": { +"id": "code-rate", +"is-read-only": false, +"description": ["Code rate of the coding scheme in % (Net bit rate ≤ Gross bit rate · code rate)."] +}, +"symbol-rate-reduction-factor": { +"id": "symbol-rate-reduction-factor", +"is-read-only": false, +"description": ["Reduction factor for the symbol rate. Example: value would be 4 for 1/4BPSK."] +}, +"tx-power-min": { +"id": "tx-power-min", +"is-read-only": false, +"description": ["Value of the minimum transmit power the modem can operate in dBm."] +}, +"tx-power-max": { +"id": "tx-power-max", +"is-read-only": false, +"description": ["Value of the maximum transmit power the modem can operate in dBm."] +}, +"rx-threshold": { +"id": "rx-threshold", +"is-read-only": false, +"description": ["Value of the receive level required to decode the received signal with a Bit Error Rate of 1e-6 or less."] +}, +"am-upshift-level": { +"id": "am-upshift-level", +"is-read-only": false, +"description": ["Value of the receive level that has to be exceeded to shift into a higher modulation scheme."] +}, +"am-downshift-level": { +"id": "am-downshift-level", +"is-read-only": false, +"description": ["Value of the receive level that has to be exceeded for not shifting into a lower modulation scheme."] +}, +"xpic-is-avail": { +"id": "xpic-is-avail", +"is-read-only": false, +"description": ["In case this air interface type is capable of XPIC, this field shall contain a 'true'. This information shall purely relate to capabilities of the equipment type, but not to the operational capability of a specific hardware composition on site. Means for example that this attribute might contain a 'true' statement, even if an additional cable would have been required to actually operate XPIC in a specific case."] +}, +"transmission-mode-type-g": { +"id": "transmission-mode-type-g", +"is-read-only": false, +"description": ["none"] +}, +"not-specified": { +"id": "not-specified", +"is-read-only": false, +"description": ["none"] +}, +"horizontal": { +"id": "horizontal", +"is-read-only": false, +"description": ["none"] +}, +"vertical": { +"id": "vertical", +"is-read-only": false, +"description": ["none"] +}, +"polarization-type": { +"id": "polarization-type", +"is-read-only": false, +"description": ["none"] +}, +"es": { +"id": "es", +"is-read-only": false, +"description": ["Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::es ."] +}, +"ses": { +"id": "ses", +"is-read-only": false, +"description": ["Severely Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::ses ."] +}, +"cses": { +"id": "cses", +"is-read-only": false, +"description": ["Consecutive Severely Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::cses ."] +}, +"not-specified": { +"id": "not-specified", +"is-read-only": false, +"description": ["none"] +}, +"g826-type": { +"id": "g826-type", +"is-read-only": false, +"description": ["none"] +}, +"g826-value-kind": { +"id": "g826-value-kind", +"is-read-only": false, +"description": ["Kind of performance value that shall be equipped with a threshold alarm."] +}, +"granularity-period": { +"id": "granularity-period", +"is-read-only": false, +"description": ["Period of the performance data collection."] +}, +"alarm-raising-threshold": { +"id": "alarm-raising-threshold", +"is-read-only": false, +"description": ["Number of events required for raising the threshold cross alarm."] +}, +"alarm-clearing-threshold": { +"id": "alarm-clearing-threshold", +"is-read-only": false, +"description": ["Number of events required for clearing the threshold cross alarm."] +}, +"threshold-cross-alarm-type-g": { +"id": "threshold-cross-alarm-type-g", +"is-read-only": false, +"description": ["Allows defining a threshold cross alarm."] +}, +"problem-kind-name": { +"id": "problem-kind-name", +"is-read-only": false, +"description": ["Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms"] +}, +"problem-kind-severity": { +"id": "problem-kind-severity", +"is-read-only": false, +"description": ["Severity of this type of alarm."] +}, +"air-interface-problem-severity-type-g": { +"id": "air-interface-problem-severity-type-g", +"is-read-only": false, +"description": ["none"] +}, +"problem-name": { +"id": "problem-name", +"is-read-only": false, +"description": ["Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms"] +}, +"air-interface-current-problem-type-g": { +"id": "air-interface-current-problem-type-g", +"is-read-only": false, +"description": ["none"] +}, +"transmission-mode": { +"id": "transmission-mode", +"is-read-only": false, +"description": ["Operated transmission mode."] +}, +"time": { +"id": "time", +"is-read-only": false, +"description": ["Sum of all seconds the transmitter operated the transmission mode."] +}, +"time-x-states-type-g": { +"id": "time-x-states-type-g", +"is-read-only": false, +"description": ["none"] +}, +"es": { +"id": "es", +"is-read-only": false, +"description": ["Number of errored seconds."] +}, +"ses": { +"id": "ses", +"is-read-only": false, +"description": ["Number of severely errored seconds."] +}, +"cses": { +"id": "cses", +"is-read-only": false, +"description": ["Number of consecutive severely errored seconds."] +}, +"unavailability": { +"id": "unavailability", +"is-read-only": false, +"description": ["Total time of unavailability in seconds."] +}, +"tx-level-min": { +"id": "tx-level-min", +"is-read-only": false, +"description": ["Minimum transmit power. Signed integers are required."] +}, +"tx-level-max": { +"id": "tx-level-max", +"is-read-only": false, +"description": ["Maximum transmit power. Signed integers are required."] +}, +"tx-level-avg": { +"id": "tx-level-avg", +"is-read-only": false, +"description": ["Averaged transmit power. Signed integers are required."] +}, +"rx-level-min": { +"id": "rx-level-min", +"is-read-only": false, +"description": ["Minimum receive level. Signed integers are required."] +}, +"rx-level-max": { +"id": "rx-level-max", +"is-read-only": false, +"description": ["Maximum receive level. Signed integers are required."] +}, +"rx-level-avg": { +"id": "rx-level-avg", +"is-read-only": false, +"description": ["Averaged receive level. Signed integers are required."] +}, +"time-x-states-list": { +"id": "time-x-states-list", +"is-read-only": false, +"description": ["Time period the transmitter operated in the respective transmission mode."] +}, +"time2-states": { +"id": "time2-states", +"is-read-only": false, +"description": ["Sum of all seconds the transmitter operated in e.g. BPSK."] +}, +"time4-states-s": { +"id": "time4-states-s", +"is-read-only": false, +"description": ["none"] +}, +"time4-states": { +"id": "time4-states", +"is-read-only": false, +"description": ["none"] +}, +"time8-states": { +"id": "time8-states", +"is-read-only": false, +"description": ["none"] +}, +"time16-states-s": { +"id": "time16-states-s", +"is-read-only": false, +"description": ["none"] +}, +"time16-states": { +"id": "time16-states", +"is-read-only": false, +"description": ["none"] +}, +"time32-states": { +"id": "time32-states", +"is-read-only": false, +"description": ["none"] +}, +"time64-states": { +"id": "time64-states", +"is-read-only": false, +"description": ["none"] +}, +"time128-states": { +"id": "time128-states", +"is-read-only": false, +"description": ["none"] +}, +"time256-states": { +"id": "time256-states", +"is-read-only": false, +"description": ["none"] +}, +"time512-states": { +"id": "time512-states", +"is-read-only": false, +"description": ["none"] +}, +"time512-states-l": { +"id": "time512-states-l", +"is-read-only": false, +"description": ["none"] +}, +"time1024-states": { +"id": "time1024-states", +"is-read-only": false, +"description": ["none"] +}, +"time1024-states-l": { +"id": "time1024-states-l", +"is-read-only": false, +"description": ["none"] +}, +"time2048-states": { +"id": "time2048-states", +"is-read-only": false, +"description": ["none"] +}, +"time2048-states-l": { +"id": "time2048-states-l", +"is-read-only": false, +"description": ["none"] +}, +"time4096-states": { +"id": "time4096-states", +"is-read-only": false, +"description": ["none"] +}, +"time4096-states-l": { +"id": "time4096-states-l", +"is-read-only": false, +"description": ["none"] +}, +"time8192-states": { +"id": "time8192-states", +"is-read-only": false, +"description": ["none"] +}, +"time8192-states-l": { +"id": "time8192-states-l", +"is-read-only": false, +"description": ["none"] +}, +"snir-min": { +"id": "snir-min", +"is-read-only": false, +"description": ["Minimum signal to (noise+interference) ratio."] +}, +"snir-max": { +"id": "snir-max", +"is-read-only": false, +"description": ["Maximum signal to (noise+interference) ratio."] +}, +"snir-avg": { +"id": "snir-avg", +"is-read-only": false, +"description": ["Averaged signal to (noise+interference) ratio."] +}, +"xpd-min": { +"id": "xpd-min", +"is-read-only": false, +"description": ["Minimum cross polarization discrimination."] +}, +"xpd-max": { +"id": "xpd-max", +"is-read-only": false, +"description": ["Maximum cross polarization discrimination."] +}, +"xpd-avg": { +"id": "xpd-avg", +"is-read-only": false, +"description": ["Averaged cross polarization discrimination."] +}, +"rf-temp-min": { +"id": "rf-temp-min", +"is-read-only": false, +"description": ["Lowest temperature (in degree Celsius) of the radio module inside the outdoor unit."] +}, +"rf-temp-max": { +"id": "rf-temp-max", +"is-read-only": false, +"description": ["Highest temperature (in degree Celsius) of the radio module inside the outdoor unit."] +}, +"rf-temp-avg": { +"id": "rf-temp-avg", +"is-read-only": false, +"description": ["Averaged temperature (in degree Celsius) of the radio module inside the outdoor unit."] +}, +"defect-blocks-sum": { +"id": "defect-blocks-sum", +"is-read-only": false, +"description": ["Total number of blocks that were defect after receiving and could not be corrected by the FEC."] +}, +"time-period": { +"id": "time-period", +"is-read-only": false, +"description": ["Total length of the measurement period."] +}, +"air-interface-performance-type-g": { +"id": "air-interface-performance-type-g", +"is-read-only": false, +"description": ["Consolidated performance information of the air interface."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-current-performance-type-g": { +"id": "air-interface-current-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into current performance information by inheriting from OTN_CurrentData."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-historical-performance-type-g": { +"id": "air-interface-historical-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into historical performance information by inheriting from OTN_HistoryData."] +}, +"hsb": { +"id": "hsb", +"is-read-only": false, +"description": ["none"] +}, +"protection-type": { +"id": "protection-type", +"is-read-only": false, +"description": ["none"] +}, +"working": { +"id": "working", +"is-read-only": false, +"description": ["none"] +}, +"protection": { +"id": "protection", +"is-read-only": false, +"description": ["none"] +}, +"protected": { +"id": "protected", +"is-read-only": false, +"description": ["none"] +}, +"role-type": { +"id": "role-type", +"is-read-only": false, +"description": ["none"] +}, +"diversity-name": { +"id": "diversity-name", +"is-read-only": false, +"description": ["Names to be chosen from the following list: 'spaceDiversity', 'frequencyDiversity'"] +}, +"number-of-air-interfaces-max": { +"id": "number-of-air-interfaces-max", +"is-read-only": false, +"description": ["Maximum number of air interfaces that could be part of this kind of diversity."] +}, +"diversity-type-g": { +"id": "diversity-type-g", +"is-read-only": false, +"description": ["none"] +}, +"group-down": { +"id": "group-down", +"is-read-only": false, +"description": ["All air interfaces that are members of the diversity configuration are down."] +}, +"not-all-ai-active": { +"id": "not-all-ai-active", +"is-read-only": false, +"description": ["At least one, but not all of the air interfaces that are part of the diversity configuration is not working."] +}, +"all-ai-active": { +"id": "all-ai-active", +"is-read-only": false, +"description": ["All air interfaces that are part of the diversity configuration are working."] +}, +"air-interface-diversity-status-type": { +"id": "air-interface-diversity-status-type", +"is-read-only": false, +"description": ["none"] +}, +"problem-kind-name": { +"id": "problem-kind-name", +"is-read-only": false, +"description": ["Name of the alarm according to AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms"] +}, +"problem-kind-severity": { +"id": "problem-kind-severity", +"is-read-only": false, +"description": ["Severity of this type of alarm."] +}, +"air-interface-diversity-problem-severity-type-g": { +"id": "air-interface-diversity-problem-severity-type-g", +"is-read-only": false, +"description": ["none"] +}, +"problem-name": { +"id": "problem-name", +"is-read-only": false, +"description": ["Name of the alarm according to AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms"] +}, +"air-interface-diversity-current-problem-type-g": { +"id": "air-interface-diversity-current-problem-type-g", +"is-read-only": false, +"description": ["none"] +}, +"snir-min": { +"id": "snir-min", +"is-read-only": false, +"description": ["Minimum signal to (noise+interference) ratio of the combined signals."] +}, +"snir-max": { +"id": "snir-max", +"is-read-only": false, +"description": ["Maximum signal to (noise+interference) ratio of the combined signals."] +}, +"snir-avg": { +"id": "snir-avg", +"is-read-only": false, +"description": ["Average signal to (noise+interference) ratio of the combined signals."] +}, +"air-interface-diversity-performance-type-g": { +"id": "air-interface-diversity-performance-type-g", +"is-read-only": false, +"description": ["Consolidated performance information of the air interface diversity group."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-current-performance-type-g": { +"id": "air-interface-diversity-current-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into current performance information by inheriting from OTN_CurrentData."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-historical-performance-type-g": { +"id": "air-interface-diversity-historical-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into historical performance information by inheriting from OTN_HistoryData."] +}, +"tdm-structure-name": { +"id": "tdm-structure-name", +"is-read-only": false, +"description": ["Names to be chosen from the following list: 'e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'"] +}, +"tdm-segment-size": { +"id": "tdm-segment-size", +"is-read-only": false, +"description": ["Size of the TDM segment in kbit/s. Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;"] +}, +"max-number-of-segments-reservable": { +"id": "max-number-of-segments-reservable", +"is-read-only": false, +"description": ["Device specific maximum number of segments (not depending on current air interface configuration) that can be reserved for this type of segment on a single air interface."] +}, +"tdm-structure-type-g": { +"id": "tdm-structure-type-g", +"is-read-only": false, +"description": ["none"] +}, +"problem-kind-name": { +"id": "problem-kind-name", +"is-read-only": false, +"description": ["Name of the alarm according to Structure::StructureCapability::supportedAlarms"] +}, +"problem-kind-severity": { +"id": "problem-kind-severity", +"is-read-only": false, +"description": ["Severity of this type of alarm."] +}, +"structure-problem-severity-type-g": { +"id": "structure-problem-severity-type-g", +"is-read-only": false, +"description": ["none"] +}, +"problem-name": { +"id": "problem-name", +"is-read-only": false, +"description": ["Name of the alarm according to Structure::StructureCapability::supportedAlarms"] +}, +"structure-current-problem-type-g": { +"id": "structure-current-problem-type-g", +"is-read-only": false, +"description": ["none"] +}, +"time-period": { +"id": "time-period", +"is-read-only": false, +"description": ["Total length of the measurement period in seconds."] +}, +"es": { +"id": "es", +"is-read-only": false, +"description": ["Number of errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals."] +}, +"ses": { +"id": "ses", +"is-read-only": false, +"description": ["Number of severely errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals."] +}, +"cses": { +"id": "cses", +"is-read-only": false, +"description": ["Number of consecutive severely errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals."] +}, +"unavailability": { +"id": "unavailability", +"is-read-only": false, +"description": ["Total time of unavailability in seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals."] +}, +"rx-level-min": { +"id": "rx-level-min", +"is-read-only": false, +"description": ["Minimum receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value."] +}, +"rx-level-max": { +"id": "rx-level-max", +"is-read-only": false, +"description": ["Maximum receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value."] +}, +"rx-level-avg": { +"id": "rx-level-avg", +"is-read-only": false, +"description": ["Averaged receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value."] +}, +"structure-performance-type-g": { +"id": "structure-performance-type-g", +"is-read-only": false, +"description": ["Consolidated performance information of the Structure."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"structure-current-performance-type-g": { +"id": "structure-current-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into current performance information by inheriting from OTN_CurrentData."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"structure-historical-performance-type-g": { +"id": "structure-historical-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into historical performance information by inheriting from OTN_HistoryData."] +}, +"container-name": { +"id": "container-name", +"is-read-only": false, +"description": ["Names to be chosen from the following list: 'ethernet','e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'"] +}, +"number-of-time-slots-required": { +"id": "number-of-time-slots-required", +"is-read-only": false, +"description": ["Number of time slots required for transporting this type of container. Value must be calculated by the vendor after defining the timeSlotCapacity. For containers of fixed size: numberOfTimeSlotsRequired = required bandwidth of the container divided by timeSlotCapacity. For containers of variable size the minimum (most probably 1) is to be stated."] +}, +"tdm-time-slots-is-required": { +"id": "tdm-time-slots-is-required", +"is-read-only": false, +"description": ["Shall be set to '1', if this container type requires bandwidth (times slots) reserved for TDM transport."] +}, +"bundling-is-avail": { +"id": "bundling-is-avail", +"is-read-only": false, +"description": ["If it is possible to combine transport resources of several radio links to transport this container type, this attribute shall be set to '1'."] +}, +"container-type-g": { +"id": "container-type-g", +"is-read-only": false, +"description": ["none"] +}, +"tdm-container-name": { +"id": "tdm-container-name", +"is-read-only": false, +"description": ["Names to be chosen from the following list: 'e1','t1','j1','e3','t3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'"] +}, +"tdm-container-size": { +"id": "tdm-container-size", +"is-read-only": false, +"description": ["Capacity required for transporting this type of container (in kbit/s). Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;"] +}, +"tdm-container-type-g": { +"id": "tdm-container-type-g", +"is-read-only": false, +"description": ["none"] +}, +"structure-id-ref": { +"id": "structure-id-ref", +"is-read-only": false, +"description": ["none"] +}, +"segment-id-ref": { +"id": "segment-id-ref", +"is-read-only": false, +"description": ["Combinations of structureId and segmentId must be unique inside the device to assure that every resource is used just once."] +}, +"segment-id-type-g": { +"id": "segment-id-type-g", +"is-read-only": false, +"description": ["Identifies the segments, which are used to transport the container."] +}, +"segment-status-type-id": { +"id": "segment-status-type-id", +"is-read-only": false, +"description": ["none"] +}, +"segment-is-reserved-for-tdm": { +"id": "segment-is-reserved-for-tdm", +"is-read-only": false, +"description": ["The number of segments, which is configured by Structure::StructureConfiguration::tdmReservedNumberOfSegements, has to be reserved for TDM. Starting from the lowest index value, these segments have to be marked with a 'true' in segmentIsReservedForTdm."] +}, +"operational-status": { +"id": "operational-status", +"is-read-only": false, +"description": ["Current operational status of each segment."] +}, +"obsolete-priority-class": { +"id": "obsolete-priority-class", +"is-read-only": false, +"description": ["PriorityClass as inherited from the associated Container::ContainerConfiguration::priorityClass. In case the device is capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, priorityClass shall be considered, while calculating the dropOrderRank."] +}, +"obsolete-drop-order-rank": { +"id": "obsolete-drop-order-rank", +"is-read-only": false, +"description": ["In case the device is NOT capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, dropOrderRank is number of segments minus sequence number of the segment. In case the device is capable of adapting the sequence, dropOrderRank has to be calculated by the device in dependency to the assigned priorityClass. _unique: within Structure::StructureStatus::segmentStatusList"] +}, +"segment-status-type-g": { +"id": "segment-status-type-g", +"is-read-only": false, +"description": ["none"] +}, +"problem-kind-name": { +"id": "problem-kind-name", +"is-read-only": false, +"description": ["Name of the alarm according to Container::ContainerCapability::supportedAlarms"] +}, +"problem-kind-severity": { +"id": "problem-kind-severity", +"is-read-only": false, +"description": ["Severity of this type of alarm."] +}, +"container-problem-severity-type-g": { +"id": "container-problem-severity-type-g", +"is-read-only": false, +"description": ["none"] +}, +"problem-name": { +"id": "problem-name", +"is-read-only": false, +"description": ["Name of the alarm according to Container::ContainerCapability::supportedAlarms"] +}, +"container-current-problem-type-g": { +"id": "container-current-problem-type-g", +"is-read-only": false, +"description": ["none"] +}, +"tx-ethernet-bytes-max-s": { +"id": "tx-ethernet-bytes-max-s", +"is-read-only": false, +"description": ["Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a second and keeps the highest value within the measurement period. Field to be left blank for all types of TDM containers."] +}, +"tx-ethernet-bytes-max-m": { +"id": "tx-ethernet-bytes-max-m", +"is-read-only": false, +"description": ["Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a minute and keeps the highest value with in the measurement period. Field to be left blank for all types of TDM containers."] +}, +"tx-ethernet-bytes-sum": { +"id": "tx-ethernet-bytes-sum", +"is-read-only": false, +"description": ["Total number of Bytes of Ethernet traffic (before header compression) transmitted (in direction out of the device) during the measurement period. Field to be left blank for all types of TDM containers."] +}, +"time-period": { +"id": "time-period", +"is-read-only": false, +"description": ["Total length of the measurement period in seconds."] +}, +"container-performance-type-g": { +"id": "container-performance-type-g", +"is-read-only": false, +"description": ["Consolidated performance information of the Container."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"container-current-performance-type-g": { +"id": "container-current-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into current performance information by inheriting from OTN_CurrentData."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"container-historical-performance-type-g": { +"id": "container-historical-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into historical performance information by inheriting from OTN_HistoryData."] +}, +"gbic": { +"id": "gbic", +"is-read-only": false, +"description": ["none"] +}, +"soldered-connector": { +"id": "soldered-connector", +"is-read-only": false, +"description": ["none"] +}, +"sfp-sfp-plus-sfp28": { +"id": "sfp-sfp-plus-sfp28", +"is-read-only": false, +"description": ["none"] +}, +"xbi-300-pin": { +"id": "xbi-300-pin", +"is-read-only": false, +"description": ["none"] +}, +"xenpak": { +"id": "xenpak", +"is-read-only": false, +"description": ["none"] +}, +"xfp": { +"id": "xfp", +"is-read-only": false, +"description": ["none"] +}, +"xfp-e": { +"id": "xfp-e", +"is-read-only": false, +"description": ["none"] +}, +"xpak": { +"id": "xpak", +"is-read-only": false, +"description": ["none"] +}, +"x2": { +"id": "x2", +"is-read-only": false, +"description": ["none"] +}, +"dwdm-sfp-sfp-plus": { +"id": "dwdm-sfp-sfp-plus", +"is-read-only": false, +"description": ["none"] +}, +"qsfp": { +"id": "qsfp", +"is-read-only": false, +"description": ["none"] +}, +"qsfp-plus": { +"id": "qsfp-plus", +"is-read-only": false, +"description": ["none"] +}, +"cxp": { +"id": "cxp", +"is-read-only": false, +"description": ["none"] +}, +"shielded-mini-multilane-hd-4-x": { +"id": "shielded-mini-multilane-hd-4-x", +"is-read-only": false, +"description": ["none"] +}, +"shielded-mini-multilane-hd-8-x": { +"id": "shielded-mini-multilane-hd-8-x", +"is-read-only": false, +"description": ["none"] +}, +"qsfp28": { +"id": "qsfp28", +"is-read-only": false, +"description": ["none"] +}, +"cxp2": { +"id": "cxp2", +"is-read-only": false, +"description": ["none"] +}, +"cdfp-style1-style2": { +"id": "cdfp-style1-style2", +"is-read-only": false, +"description": ["none"] +}, +"shielded-mini-multilane-hd-4-x-fan-out": { +"id": "shielded-mini-multilane-hd-4-x-fan-out", +"is-read-only": false, +"description": ["none"] +}, +"shielded-mini-multilane-hd-8-x-fan-out": { +"id": "shielded-mini-multilane-hd-8-x-fan-out", +"is-read-only": false, +"description": ["none"] +}, +"cdfp-style3": { +"id": "cdfp-style3", +"is-read-only": false, +"description": ["none"] +}, +"qsfp-micro": { +"id": "qsfp-micro", +"is-read-only": false, +"description": ["none"] +}, +"qsfp-dd": { +"id": "qsfp-dd", +"is-read-only": false, +"description": ["none"] +}, +"qsfp-plus-rate-select-v1": { +"id": "qsfp-plus-rate-select-v1", +"is-read-only": false, +"description": ["none"] +}, +"qsfp-plus-rate-select-v2": { +"id": "qsfp-plus-rate-select-v2", +"is-read-only": false, +"description": ["none"] +}, +"not-yet-defined": { +"id": "not-yet-defined", +"is-read-only": false, +"description": ["none"] +}, +"mii-kind-type": { +"id": "mii-kind-type", +"is-read-only": false, +"description": ["none"] +}, +"sc": { +"id": "sc", +"is-read-only": false, +"description": ["Subscriber Connector"] +}, +"fibre-channel-style-1": { +"id": "fibre-channel-style-1", +"is-read-only": false, +"description": ["Copper connector"] +}, +"fibre-channel-style-2": { +"id": "fibre-channel-style-2", +"is-read-only": false, +"description": ["Copper connector"] +}, +"bnc-tnc": { +"id": "bnc-tnc", +"is-read-only": false, +"description": ["Bayonet/Threaded Neill-Concelman"] +}, +"fc": { +"id": "fc", +"is-read-only": false, +"description": ["Fibre Channel coax headers"] +}, +"fiber-jack": { +"id": "fiber-jack", +"is-read-only": false, +"description": ["none"] +}, +"lc": { +"id": "lc", +"is-read-only": false, +"description": ["Lucent Connector"] +}, +"mt-rj": { +"id": "mt-rj", +"is-read-only": false, +"description": ["Mechanical Transfer - Registered Jack"] +}, +"mu": { +"id": "mu", +"is-read-only": false, +"description": ["Multiple Optical"] +}, +"sg": { +"id": "sg", +"is-read-only": false, +"description": ["none"] +}, +"optical-pigtail": { +"id": "optical-pigtail", +"is-read-only": false, +"description": ["none"] +}, +"mpo1-x12": { +"id": "mpo1-x12", +"is-read-only": false, +"description": ["Multifiber Parallel Optic"] +}, +"mpo2-x16": { +"id": "mpo2-x16", +"is-read-only": false, +"description": ["Multifiber Parallel Optic"] +}, +"hssdc-ii": { +"id": "hssdc-ii", +"is-read-only": false, +"description": ["High Speed Serial Data Connector"] +}, +"copper-pigtail": { +"id": "copper-pigtail", +"is-read-only": false, +"description": ["none"] +}, +"rj45": { +"id": "rj45", +"is-read-only": false, +"description": ["8P8C, according to Clause 3 and Figures 1 through 5 of IEC 60603-7"] +}, +"no-seperable-connector": { +"id": "no-seperable-connector", +"is-read-only": false, +"description": ["none"] +}, +"mxc2-x16": { +"id": "mxc2-x16", +"is-read-only": false, +"description": ["none"] +}, +"st": { +"id": "st", +"is-read-only": false, +"description": ["according to IEC 60874-10:1992, also often called BFOC/2.5"] +}, +"not-yet-defined": { +"id": "not-yet-defined", +"is-read-only": false, +"description": ["none"] +}, +"mdi-kind-type": { +"id": "mdi-kind-type", +"is-read-only": false, +"description": ["none"] +}, +"tp-cat3": { +"id": "tp-cat3", +"is-read-only": false, +"description": ["none"] +}, +"tp-cat5": { +"id": "tp-cat5", +"is-read-only": false, +"description": ["none"] +}, +"tp-cat6": { +"id": "tp-cat6", +"is-read-only": false, +"description": ["none"] +}, +"tp-cat8": { +"id": "tp-cat8", +"is-read-only": false, +"description": ["none"] +}, +"single-mode": { +"id": "single-mode", +"is-read-only": false, +"description": ["none"] +}, +"multi-mode": { +"id": "multi-mode", +"is-read-only": false, +"description": ["none"] +}, +"not-yet-defined": { +"id": "not-yet-defined", +"is-read-only": false, +"description": ["none"] +}, +"medium-kind-type": { +"id": "medium-kind-type", +"is-read-only": false, +"description": ["none"] +}, +"10-base5": { +"id": "10-base5", +"is-read-only": false, +"description": ["Thick coax Medium Attachment Unit (MAU) as specified in 802.3 Clause 8"] +}, +"foirl": { +"id": "foirl", +"is-read-only": false, +"description": ["FOIRL Medium Attachment Unit (MAU) as specified in 802.3 Clause 9.9"] +}, +"10-base2": { +"id": "10-base2", +"is-read-only": false, +"description": ["Thin coax Medium Attachment Unit (MAU) as specified in 802.3 Clause 10"] +}, +"10-broad36": { +"id": "10-broad36", +"is-read-only": false, +"description": ["Broadband DTE Medium Attachment Unit (MAU) as specified in 802.3 Clause 11"] +}, +"10-base-t": { +"id": "10-base-t", +"is-read-only": false, +"description": ["Twisted-pair cabling Medium Attachment Unit (MAU) as specified in 802.3 Clause 14. Only to be applied when duplex mode unknown"] +}, +"10-base-thd": { +"id": "10-base-thd", +"is-read-only": false, +"description": ["Twisted-pair cabling Medium Attachment Unit (MAU) as specified in 802.3 Clause 14 in half duplex mode"] +}, +"10-base-tfd": { +"id": "10-base-tfd", +"is-read-only": false, +"description": ["Twisted-pair cabling Medium Attachment Unit (MAU) as specified in 802.3 Clause 14 in full duplex mode"] +}, +"10-base-fp": { +"id": "10-base-fp", +"is-read-only": false, +"description": ["Passive fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 16"] +}, +"10-base-fb": { +"id": "10-base-fb", +"is-read-only": false, +"description": ["Synchronous fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 17"] +}, +"10-base-fl": { +"id": "10-base-fl", +"is-read-only": false, +"description": ["Asynchronous fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 18. Only to be applied when duplex mode unknown"] +}, +"10-base-flhd": { +"id": "10-base-flhd", +"is-read-only": false, +"description": ["Asynchronous fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 18 in half duplex mode"] +}, +"10-base-flfd": { +"id": "10-base-flfd", +"is-read-only": false, +"description": ["Asynchronous fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 18 in full duplex mode"] +}, +"100-base-t4": { +"id": "100-base-t4", +"is-read-only": false, +"description": ["Four-pair Category 3 twisted-pair cabling as specified in 802.3 Clause 23"] +}, +"100-base-tx": { +"id": "100-base-tx", +"is-read-only": false, +"description": ["Two-pair Category 5 twisted-pair cabling as specified in 802.3 Clause 25. Only to be applied when duplex mode unknown"] +}, +"100-base-txhd": { +"id": "100-base-txhd", +"is-read-only": false, +"description": ["Two-pair Category 5 twisted-pair cabling as specified in 802.3 Clause 25 in half duplex mode"] +}, +"100-base-txfd": { +"id": "100-base-txfd", +"is-read-only": false, +"description": ["Two-pair Category 5 twisted-pair cabling as specified in 802.3 Clause 25 in full duplex mode"] +}, +"100-base-bx10-d": { +"id": "100-base-bx10-d", +"is-read-only": false, +"description": ["One single-mode fiber Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 58"] +}, +"100-base-bx10-u": { +"id": "100-base-bx10-u", +"is-read-only": false, +"description": ["One single-mode fiber Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 58"] +}, +"100-base-fx": { +"id": "100-base-fx", +"is-read-only": false, +"description": ["X fiber over Physical Medium Dependent (PMD) as specified in 802.3 Clause 26. Only to be applied when duplex mode unknown"] +}, +"100-base-fxhd": { +"id": "100-base-fxhd", +"is-read-only": false, +"description": ["X fiber over Physical Medium Dependent (PMD) as specified in 802.3 Clause 26 in half duplex mode"] +}, +"100-base-fxfd": { +"id": "100-base-fxfd", +"is-read-only": false, +"description": ["X fiber over Physical Medium Dependent (PMD) as specified in 802.3 Clause 26 in full duplex mode"] +}, +"100-base-lx10": { +"id": "100-base-lx10", +"is-read-only": false, +"description": ["Two fiber Physical layer entity (PHY) as specified in 802.3 Clause 58"] +}, +"100-base-t2": { +"id": "100-base-t2", +"is-read-only": false, +"description": ["Two-pair Category 3 twisted-pair cabling as specified in 802.3 Clause 32. Only to be applied when duplex mode unknown"] +}, +"100-base-t2-hd": { +"id": "100-base-t2-hd", +"is-read-only": false, +"description": ["Two-pair Category 3 twisted-pair cabling as specified in 802.3 Clause 32 in half duplex mode"] +}, +"100-base-t2-fd": { +"id": "100-base-t2-fd", +"is-read-only": false, +"description": ["Two-pair Category 3 twisted-pair cabling as specified in 802.3 Clause 32 in full duplex mode"] +}, +"1000-base-x": { +"id": "1000-base-x", +"is-read-only": false, +"description": ["X as specified in 802.3 Clause 36 over undefined Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD and duplex mode unknown"] +}, +"1000-base-bx10-d": { +"id": "1000-base-bx10-d", +"is-read-only": false, +"description": ["One single-mode fiber Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 59"] +}, +"1000-base-bx10-u": { +"id": "1000-base-bx10-u", +"is-read-only": false, +"description": ["One single-mode fiber Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 59"] +}, +"1000-base-xhd": { +"id": "1000-base-xhd", +"is-read-only": false, +"description": ["X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) as specified in 802.3 Clause 36 over undefined Physical Medium Dependent (PMD) in half duplex mode. Not to be configured and only to be returned when underlying PMD unknown"] +}, +"1000-base-xfd": { +"id": "1000-base-xfd", +"is-read-only": false, +"description": ["X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) as specified in 802.3 Clause 36 over undefined Physical Medium Dependent (PMD) in full duplex mode. Not to be configured and only to be returned when underlying PMD unknown"] +}, +"1000-base-lx": { +"id": "1000-base-lx", +"is-read-only": false, +"description": ["X fiber over long-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38. Only to be applied when duplex mode unknown"] +}, +"1000-base-lxhd": { +"id": "1000-base-lxhd", +"is-read-only": false, +"description": ["X fiber over long-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38 in half duplex mode"] +}, +"1000-base-lxfd": { +"id": "1000-base-lxfd", +"is-read-only": false, +"description": ["X fiber over long-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38 in full duplex mode"] +}, +"1000-base-lx10": { +"id": "1000-base-lx10", +"is-read-only": false, +"description": ["Two fiber 10km Physical layer entity (PHY) as specified in 802.3 Clause 59"] +}, +"1000-base-sx": { +"id": "1000-base-sx", +"is-read-only": false, +"description": ["X fiber over short-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38. Only to be applied when duplex mode unknown"] +}, +"1000-base-sxhd": { +"id": "1000-base-sxhd", +"is-read-only": false, +"description": ["X fiber over short-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38 in half duplex mode"] +}, +"1000-base-sxfd": { +"id": "1000-base-sxfd", +"is-read-only": false, +"description": ["X fiber over short-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38 in full duplex mode"] +}, +"1000-base-cx": { +"id": "1000-base-cx", +"is-read-only": false, +"description": ["X copper over 150-Ohm balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 39. Only to be applied when duplex mode unknown"] +}, +"1000-base-cxhd": { +"id": "1000-base-cxhd", +"is-read-only": false, +"description": ["X copper over 150-Ohm balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 39 in half duplex mode"] +}, +"1000-base-cxfd": { +"id": "1000-base-cxfd", +"is-read-only": false, +"description": ["X copper over 150-Ohm balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 39 in full duplex mode"] +}, +"1000-base-kx": { +"id": "1000-base-kx", +"is-read-only": false, +"description": ["X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 70"] +}, +"1000-base-t": { +"id": "1000-base-t", +"is-read-only": false, +"description": ["Four-pair Category 5 twisted-pair cabling Physical layer entity (PHY) as specified in 802.3 Clause 40. Only to be applied when duplex mode unknown"] +}, +"1000-base-thd": { +"id": "1000-base-thd", +"is-read-only": false, +"description": ["Four-pair Category 5 twisted-pair cabling Physical layer entity (PHY) as specified in 802.3 Clause 40 in half duplex mode"] +}, +"1000-base-tfd": { +"id": "1000-base-tfd", +"is-read-only": false, +"description": ["Four-pair Category 5 twisted-pair cabling Physical layer entity (PHY) as specified in 802.3 Clause 40 in full duplex mode"] +}, +"10-gbase-x": { +"id": "10-gbase-x", +"is-read-only": false, +"description": ["X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) as specified in 802.3 Clause 48 over undefined Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD unknown"] +}, +"10-gbase-lx4": { +"id": "10-gbase-lx4", +"is-read-only": false, +"description": ["X fiber over 4 lane 1310nm optics as specified in 802.3 Clause 53"] +}, +"10-gbase-cx4": { +"id": "10-gbase-cx4", +"is-read-only": false, +"description": ["X copper over 8 pair 100-Ohm balanced cable as specified in 802.3 Clause 54"] +}, +"10-gbase-kx4": { +"id": "10-gbase-kx4", +"is-read-only": false, +"description": ["X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 71"] +}, +"10-gbase-r": { +"id": "10-gbase-r", +"is-read-only": false, +"description": ["R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) as specified in 802.3 Clause 49 over undefined Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD unknown"] +}, +"10-gbase-er": { +"id": "10-gbase-er", +"is-read-only": false, +"description": ["R fiber over 1550nm optics as specified in 802.3 Clause 52"] +}, +"10-gbase-lr": { +"id": "10-gbase-lr", +"is-read-only": false, +"description": ["R fiber over 1310nm optics as specified in 802.3 Clause 52"] +}, +"10-gbase-sr": { +"id": "10-gbase-sr", +"is-read-only": false, +"description": ["R fiber over 850nm optics as specified in 802.3 Clause 52"] +}, +"10-gbase-lrm": { +"id": "10-gbase-lrm", +"is-read-only": false, +"description": ["R fiber over 1310 nm optics as specified in 802.3 Clause 68"] +}, +"10-gbase-kr": { +"id": "10-gbase-kr", +"is-read-only": false, +"description": ["R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 72"] +}, +"10-gbase-t": { +"id": "10-gbase-t", +"is-read-only": false, +"description": ["Four-pair twisted-pair balanced copper cabling Physical layer entity (PHY) as specified in 802.3 Clause 55"] +}, +"10-gbase-pr-d1": { +"id": "10-gbase-pr-d1", +"is-read-only": false, +"description": ["One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 75"] +}, +"10-gbase-pr-d2": { +"id": "10-gbase-pr-d2", +"is-read-only": false, +"description": ["One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 75"] +}, +"10-gbase-pr-d3": { +"id": "10-gbase-pr-d3", +"is-read-only": false, +"description": ["One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 75"] +}, +"10-gbase-pr-d4": { +"id": "10-gbase-pr-d4", +"is-read-only": false, +"description": ["One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 75"] +}, +"10-gbase-pr-u1": { +"id": "10-gbase-pr-u1", +"is-read-only": false, +"description": ["One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 75"] +}, +"10-gbase-pr-u2": { +"id": "10-gbase-pr-u2", +"is-read-only": false, +"description": ["One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 75"] +}, +"10-gbase-pr-u3": { +"id": "10-gbase-pr-u3", +"is-read-only": false, +"description": ["One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 75"] +}, +"10-gbase-pr-u4": { +"id": "10-gbase-pr-u4", +"is-read-only": false, +"description": ["One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 75"] +}, +"40-gbase-r": { +"id": "40-gbase-r", +"is-read-only": false, +"description": ["Multi-lane PCS as specified in 802.3 Clause 82 over undefined Physical Medium Attachment (PMA) and Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD unknown"] +}, +"40-gbase-kr4": { +"id": "40-gbase-kr4", +"is-read-only": false, +"description": ["40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 84"] +}, +"40-gbase-cr4": { +"id": "40-gbase-cr4", +"is-read-only": false, +"description": ["40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 lane shielded copper balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 85"] +}, +"40-gbase-sr4": { +"id": "40-gbase-sr4", +"is-read-only": false, +"description": ["40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 lane multimode fiber Physical Medium Dependent (PMD) as specified in 802.3 Clause 86"] +}, +"4-x10-gbase-sr": { +"id": "4-x10-gbase-sr", +"is-read-only": false, +"description": ["4 times 10GBASE-S compatible to 802.3 Clause 52 over 4 lane multimode fiber"] +}, +"40-gbase-lr4": { +"id": "40-gbase-lr4", +"is-read-only": false, +"description": ["40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 WDM lane single mode fiber Physical Medium Dependent (PMD), with long reach, as specified in 802.3 Clause 87"] +}, +"40-gbase-er4": { +"id": "40-gbase-er4", +"is-read-only": false, +"description": ["40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 WDM lane single mode fiber Physical Medium Dependent (PMD), with extended reach, as specified in 802.3 Clause 87"] +}, +"40-gbase-fr": { +"id": "40-gbase-fr", +"is-read-only": false, +"description": ["40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over single mode fiber Physical Medium Dependent (PMD) as specified in 802.3 Clause 89"] +}, +"100-gbase-r": { +"id": "100-gbase-r", +"is-read-only": false, +"description": ["Multi-lane PCS as specified in 802.3 Clause 82 over undefined 100GBASE-R or 100GBASE-P Physical Medium Attachment (PMA) and Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD unknown"] +}, +"100-gbase-cr4": { +"id": "100-gbase-cr4", +"is-read-only": false, +"description": ["100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 lane shielded copper balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 92"] +}, +"100-gbase-kr4": { +"id": "100-gbase-kr4", +"is-read-only": false, +"description": ["100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 93"] +}, +"100-gbase-kp4": { +"id": "100-gbase-kp4", +"is-read-only": false, +"description": ["100GBASE-P Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 94"] +}, +"100-gbase-cr10": { +"id": "100-gbase-cr10", +"is-read-only": false, +"description": ["100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 10 lane shielded copper balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 85"] +}, +"100-gbase-sr4": { +"id": "100-gbase-sr4", +"is-read-only": false, +"description": ["100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 lane multimode fiber Physical Medium Dependent (PMD) as specified in 802.3 Clause 95"] +}, +"100-gbase-sr10": { +"id": "100-gbase-sr10", +"is-read-only": false, +"description": ["100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 10 lane multimode fiber Physical Medium Dependent (PMD) as specified in 802.3 Clause 86"] +}, +"2-x40-gbase-sr": { +"id": "2-x40-gbase-sr", +"is-read-only": false, +"description": ["2 times 40GBASE-S compatible to 802.3 Clause 86 over 10 lane multimode fiber"] +}, +"10-x10-gbase-sr": { +"id": "10-x10-gbase-sr", +"is-read-only": false, +"description": ["10 times 10GBASE-S compatible to 802.3 Clause 52 over 10 lane multimode fiber"] +}, +"12-x10-gbase-sr": { +"id": "12-x10-gbase-sr", +"is-read-only": false, +"description": ["12 times 10GBASE-S compatible to 802.3 Clause 52 over 12 lane multimode fiber"] +}, +"100-gbase-lr4": { +"id": "100-gbase-lr4", +"is-read-only": false, +"description": ["100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 WDM lane single mode fiber Physical Medium Dependent (PMD), with long reach, as specified in 802.3 Clause 88"] +}, +"100-gbase-er4": { +"id": "100-gbase-er4", +"is-read-only": false, +"description": ["100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 WDM lane single mode fiber Physical Medium Dependent (PMD), with extended reach, as specified in 802.3 Clause 88"] +}, +"not-yet-defined": { +"id": "not-yet-defined", +"is-read-only": false, +"description": ["none"] +}, +"pmd-name-type": { +"id": "pmd-name-type", +"is-read-only": false, +"description": ["none"] +}, +"signal-ordering-kind-name": { +"id": "signal-ordering-kind-name", +"is-read-only": false, +"description": ["To be filled according to TR-541. Must be unique for referencing during configuration of the interface."] +}, +"signal-list": { +"id": "signal-list", +"is-read-only": false, +"description": ["Desciption of the signals on the Media Dependent Interface (MDI), might be e.g. 'TX+' in case of e.g. 10BASE-T, might be e.g. '1,295.56 nm' in case of e.g. 100GBASE-LR4"] +}, +"signal-ordering-type-g": { +"id": "signal-ordering-type-g", +"is-read-only": false, +"description": ["none"] +}, +"mau-id": { +"id": "mau-id", +"is-read-only": false, +"description": ["802.3 according to 30.5.1.1.1 aMAUID Unique identifier of the Medium Attachment Unit (MAU) instance within the data about the device"] +}, +"mii-kind": { +"id": "mii-kind", +"is-read-only": false, +"description": ["SFF8472_SFF8636 Kind of Medium Independent Interface (MII) provided by this Medium Attachment Unit (MAU) (e.g. SFP, moldered port)"] +}, +"mdi-kind": { +"id": "mdi-kind", +"is-read-only": false, +"description": ["Kind of Medium Dependent Interface (MDI) provided by this Medium Attachment Unit (MAU)"] +}, +"required-medium-kind": { +"id": "required-medium-kind", +"is-read-only": false, +"description": ["Kind of medium required for operating this Medium Attachment Unit (MAU), more like an information field"] +}, +"wavelength-min": { +"id": "wavelength-min", +"is-read-only": false, +"description": ["SFF-8690 Minimum laser wavelength in pico meter, -1 = not applicable, 0 = not known, wavelengthMax = wavelength cannot be configured; multiplicity=0..3 for 10GBASE-LX4 according to 802.3 53.5"] +}, +"wavelength-max": { +"id": "wavelength-max", +"is-read-only": false, +"description": ["Maximum laser wavelength in pico meter, -1 = not applicable, 0 = not known, wavelengthMin = wavelength cannot be configured; multiplicity=0..3 for 10GBASE-LX4 according to 802.3 53.5 SFF-8690"] +}, +"wavelength-grid-min": { +"id": "wavelength-grid-min", +"is-read-only": false, +"description": ["Minimum grid spacing supported by the transceiver, -1 = not applicable, 0 = not known SFF-8690"] +}, +"link-length-max": { +"id": "link-length-max", +"is-read-only": false, +"description": ["Indicates the maximum link length that is supported by the transceiver on the medium, which is specified in the standard referenced in TypeDefinitions::phyType::phyKind."] +}, +"vendor-name": { +"id": "vendor-name", +"is-read-only": false, +"description": ["Name of the vendor of the transceiver Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::ManufacturerProperties::manufacturerName"] +}, +"vendor-oui": { +"id": "vendor-oui", +"is-read-only": false, +"description": ["Describes the IEEE Company identifier of the vendor of the transceiver (1st part of 802.3 ResourceTypeID) 802.3 22.2.4.3.1 PHY Identifier; also referenced in 45.2.1.13 PMA/PMD package identifier Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::ManufacturerProperties::manufacturerIdentifier"] +}, +"part-number": { +"id": "part-number", +"is-read-only": false, +"description": ["802.3 22.2.4.3.1 PHY Identifier; also referenced in 45.2.1.13 PMA/PMD package identifier as six bit model number Uniquely identifies the transceiver in the vendor's product lists Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::EquipmentType::partTypeIdentifier"] +}, +"revision-number": { +"id": "revision-number", +"is-read-only": false, +"description": ["Identifies the revision number of the transceiver (3rd part of 802.3 ResourceTypeID) 802.3 22.2.4.3.1 PHY Identifier; also referenced in 45.2.1.13 PMA/PMD package identifier as four-bit revision number Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::EquipmentType::version"] +}, +"serial-number": { +"id": "serial-number", +"is-read-only": false, +"description": ["Vendor's serial number for the transceiver. 0 = not applicable Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::EquipmentInstance::serialNumber"] +}, +"date-code": { +"id": "date-code", +"is-read-only": false, +"description": ["Vendor's date code for the transceiver Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::EquipmentInstance::manufactureDate"] +}, +"pmd-list": { +"id": "pmd-list", +"is-read-only": false, +"description": ["List of Physical Medium Dependent (PMD) that can be operated *** In case ordering of the signals depends on the PMD, pmdList has to be put into the datatype for the signal ordering ***"] +}, +"signal-ordering-list": { +"id": "signal-ordering-list", +"is-read-only": false, +"description": ["Describes the different (e.g. MDI, MDI-X) ways of ordering the signals on the physical medium"] +}, +"auto-signal-ordering-is-avail": { +"id": "auto-signal-ordering-is-avail", +"is-read-only": false, +"description": ["1 = there is a mechanism for automatically crossing over tx and rx implemented"] +}, +"short-reach-mode-is-avail": { +"id": "short-reach-mode-is-avail", +"is-read-only": false, +"description": ["1 = Indicates that Short Reach Mode for 10GBASE-T according to 802.3 45.2.1.64 is available"] +}, +"eee-is-avail": { +"id": "eee-is-avail", +"is-read-only": false, +"description": ["1 = Indicates that Energy-Efficient Ethernet (EEE) is available at the device."] +}, +"unidirectional-operation-is-avail": { +"id": "unidirectional-operation-is-avail", +"is-read-only": false, +"description": ["1 = Medium Attachment Unit (MAU) able to transmit from Media Independent Interface (MII) regardless of whether the MAU has determined that a valid link has been established, 0 = MAU able to transmit from MII only when the MAU has determined that a valid link has been established 802.3"] +}, +"supported-alarms": { +"id": "supported-alarms", +"is-read-only": false, +"description": ["MW IM Available alarms to be listed. Mandatory:'txFault', 'rxLos', 'tempHigh', 'tempLow', 'rxLevelHigh', 'rxLevelLow'. Optional:'vccHigh', 'vccLow', 'txBiasHigh', 'txBiasLow', 'txPowerHigh', 'txPowerLow', 'laserTempHigh', 'laserTempLow', 'tecCurrentHigh', 'tecCurrentLow'. Further alarms might be added by the device. Names are to be separated by commas."] +}, +"mau-type-g": { +"id": "mau-type-g", +"is-read-only": false, +"description": ["none"] +}, +"problem-kind-name": { +"id": "problem-kind-name", +"is-read-only": false, +"description": ["Name of the alarm according to WireInterface::WireInterfaceCapability::supportedAlarms"] +}, +"problem-kind-severity": { +"id": "problem-kind-severity", +"is-read-only": false, +"description": ["Severity of this type of alarm."] +}, +"wire-interface-problem-severity-type-g": { +"id": "wire-interface-problem-severity-type-g", +"is-read-only": false, +"description": ["none"] +}, +"problem-name": { +"id": "problem-name", +"is-read-only": false, +"description": ["Name of the alarm according to WireInterface::WireInterfaceCapability::supportedAlarms"] +}, +"wire-interface-current-problem-type-g": { +"id": "wire-interface-current-problem-type-g", +"is-read-only": false, +"description": ["none"] +}, +"es": { +"id": "es", +"is-read-only": false, +"description": ["802.3 30.8.1.1.13 aLineESs Number of errored seconds"] +}, +"ses": { +"id": "ses", +"is-read-only": false, +"description": ["802.3 30.8.1.1.12 aLineSESs Number of severely errored seconds"] +}, +"symbol-error-during-carrier": { +"id": "symbol-error-during-carrier", +"is-read-only": false, +"description": ["802.3 according to 30.3.2.1.5 aSymbolErrorDuringCarrier Number of times when valid carrier was present and an invalid data symbol occured."] +}, +"low-power-idle-transmitter-ms": { +"id": "low-power-idle-transmitter-ms", +"is-read-only": false, +"description": ["802.3 similar to 30.3.2.1.8 aTransmitLPIMicroseconds Number of milliseconds (original counter expresses microseconds), during which the transmitter was in power save mode"] +}, +"low-power-idle-receiver-ms": { +"id": "low-power-idle-receiver-ms", +"is-read-only": false, +"description": ["802.3 similar to 30.3.2.1.9 aReceiveLPIMicroseconds Number of milliseconds (original counter expresses microseconds), during which the receiver was in power save mode"] +}, +"wire-interface-performance-type-g": { +"id": "wire-interface-performance-type-g", +"is-read-only": false, +"description": ["none"] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"wire-interface-current-performance-type-g": { +"id": "wire-interface-current-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into current performance information by inheriting from OTN_CurrentData."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"wire-interface-historical-performance-type-g": { +"id": "wire-interface-historical-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into historical performance information by inheriting from OTN_HistoryData."] +}, +"layer-protocol": { +"id": "layer-protocol", +"is-read-only": false, +"description": ["CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"] +}, +"air-interface-capability": { +"id": "air-interface-capability", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-configuration": { +"id": "air-interface-configuration", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-status": { +"id": "air-interface-status", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-current-problems": { +"id": "air-interface-current-problems", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-current-performance": { +"id": "air-interface-current-performance", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-historical-performances": { +"id": "air-interface-historical-performances", +"is-read-only": false, +"description": ["none"] +}, +"mw-air-interface-pac": { +"id": "mw-air-interface-pac", +"is-read-only": false, +"description": ["none"] +}, +"type-of-equipment": { +"id": "type-of-equipment", +"is-read-only": false, +"description": ["This parameter indicates the equipment type. Instead of uploading the complete set of capabilities, capabilities of the same equipment type could be reused. Should be unique for a combination of modem, radio and their respective firmware."] +}, +"tx-frequency-min": { +"id": "tx-frequency-min", +"is-read-only": false, +"description": ["Value of the minimum transmit frequency tunable at the air interface."] +}, +"tx-frequency-max": { +"id": "tx-frequency-max", +"is-read-only": false, +"description": ["Value of the maximum transmit frequency tunable at the air interface."] +}, +"rx-frequency-min": { +"id": "rx-frequency-min", +"is-read-only": false, +"description": ["Value of the minimum receive frequency tunable at the air interface."] +}, +"rx-frequency-max": { +"id": "rx-frequency-max", +"is-read-only": false, +"description": ["Value of the maximum receive frequency tunable at the air interface."] +}, +"adaptive-modulation-is-avail": { +"id": "adaptive-modulation-is-avail", +"is-read-only": false, +"description": ["In case the device is capable of adaptive modulation, this field shall contain a 'true'."] +}, +"mimo-is-avail": { +"id": "mimo-is-avail", +"is-read-only": false, +"description": ["In case the device is capable of MIMO, this field shall contain a 'true'."] +}, +"mimo-channels": { +"id": "mimo-channels", +"is-read-only": false, +"description": ["Maximum number (n) of spatial multiplexing streams that can be conveyed by an n x n MIMO configuration."] +}, +"alic-is-avail": { +"id": "alic-is-avail", +"is-read-only": false, +"description": ["In case the microwave radio is capable of Adjacent Link Interference Cancelation (canceling of interference cause by transmitters located at the same site), this field shall contain a 'true'."] +}, +"atpc-is-avail": { +"id": "atpc-is-avail", +"is-read-only": false, +"description": ["In case the microwave radio is capable of ATPC, this field shall contain a 'true'."] +}, +"atpc-range": { +"id": "atpc-range", +"is-read-only": false, +"description": ["Extent of the ATPC range. This value represents a device specific maximum value. The actual range of the ATPC at a specific link might be limited by the difference between configured transmit power (AirInterface::AirInterfaceConfiguration::txPower) and minimum transmit power of the device (TypeDefinitions::TransmissionModeType::txPowerMin)."] +}, +"encryption-is-avail": { +"id": "encryption-is-avail", +"is-read-only": false, +"description": ["Shall be marked 'true', if payload encryption is available."] +}, +"supported-loop-back-kind-list": { +"id": "supported-loop-back-kind-list", +"is-read-only": false, +"description": ["List of supported kinds of looping back of header information to the remote site."] +}, +"maintenance-timer-range": { +"id": "maintenance-timer-range", +"is-read-only": false, +"description": ["Available time periods for maintenance configurations (e.g. the loop back of microwave header information) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360')."] +}, +"supported-alarm-list": { +"id": "supported-alarm-list", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'signalIsLost','rslIsExceeded','signalIDMismatching','temperatureIsExceeded','modemIsFaulty','radioIsFaulty' and 'modulationIsDownShifted'. Further alarms might be added by the vendor."] +}, +"supported-alarms": { +"id": "supported-alarms", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'signalIsLost','rslIsExceeded','temperatureIsExceeded','modemIsFaulty','radioIsFaulty' and 'modulationIsDownShifted'. Further alarms might be added by the device. Names are to be separated by commas."] +}, +"supported-channel-plan-list": { +"id": "supported-channel-plan-list", +"is-read-only": false, +"description": ["List of channel spacing that are supported by the device."] +}, +"air-interface-capability-g": { +"id": "air-interface-capability-g", +"is-read-only": false, +"description": ["Describes the 'analog' capabilities of modem and transmitter of the microwave device. Value ranges of attributes are not independently (e.g. min. and max. transmit power depends on modulation). Legal combinations of values are expressed in transmissionModeTypes."] +}, +"air-interface-name": { +"id": "air-interface-name", +"is-read-only": false, +"description": ["Operator specific microwave link ID (often used for coding area, type of element and sequential number)."] +}, +"remote-air-interface-name": { +"id": "remote-air-interface-name", +"is-read-only": false, +"description": ["Name of the air interface, which belongs to the same link, at the remote site."] +}, +"expected-signal-id": { +"id": "expected-signal-id", +"is-read-only": false, +"description": ["If set on '0', the receiver ignores the signal ID of the received signal. If set on any other value, the receiver exclusively synchronizes on signals with the same signal ID."] +}, +"transmitted-signal-id": { +"id": "transmitted-signal-id", +"is-read-only": false, +"description": ["Transmitted radio signal ID for synchronizing the receiver."] +}, +"radio-signal-id": { +"id": "radio-signal-id", +"is-read-only": false, +"description": ["The radioSignalId is transmitted on the air interface so the remote site of the link synchronizes on the correct transmitter. The local radio MUST NOT synchronize on a radio signal with a different radioSignalId. The link ID is neither an ID necessary to span the model nor an ID referencing external data. It is just some sort of name of the link transmitted so the correct remote site can be identified in an interference situation. The value zero might be used to make the microwave to disable the link ID check."] +}, +"tx-frequency": { +"id": "tx-frequency", +"is-read-only": false, +"description": ["Center frequency of the transmit channel. The values to be configured have to exactly match the values listed in the international agreement referenced in channelPlanID. In case of automated selection of the transmit frequency this field shall describe the lowest center frequency selectable."] +}, +"rx-frequency": { +"id": "rx-frequency", +"is-read-only": false, +"description": ["Center frequency of the receive channel."] +}, +"transmission-mode-min": { +"id": "transmission-mode-min", +"is-read-only": false, +"description": ["Minimum transmission mode to be configured (in case adaptive modulation is not used, this value represents also the fixed transmission mode)."] +}, +"transmission-mode-max": { +"id": "transmission-mode-max", +"is-read-only": false, +"description": ["Maximum transmission mode to be configured."] +}, +"tx-channel-bandwidth": { +"id": "tx-channel-bandwidth", +"is-read-only": false, +"description": ["Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;"] +}, +"rx-channel-bandwidth": { +"id": "rx-channel-bandwidth", +"is-read-only": false, +"description": ["Bandwidth of the receive channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;"] +}, +"polarization": { +"id": "polarization", +"is-read-only": false, +"description": ["Allows documenting the polarization of the air interface."] +}, +"power-is-on": { +"id": "power-is-on", +"is-read-only": false, +"description": ["Power ON. Activation of the entire radio in a split mount configuration shall be expressed as a 'true'."] +}, +"transmitter-is-on": { +"id": "transmitter-is-on", +"is-read-only": false, +"description": ["Activation of the transmitter inside the radio shall be expressed as a 'true'."] +}, +"receiver-is-on": { +"id": "receiver-is-on", +"is-read-only": false, +"description": ["Maintenance Feature. Activation of the receiver inside the radio shall be expressed as a 'true'. Attribute shall also be used for RX main and RX diversity squelches in case of diversity configurations."] +}, +"tx-power": { +"id": "tx-power", +"is-read-only": false, +"description": ["Transmit power to be configured on the microwave link. Signed Byte is required. The actually operated transmit power might be lower depending on adaptive modulation and ATPC."] +}, +"adaptive-modulation-is-on": { +"id": "adaptive-modulation-is-on", +"is-read-only": false, +"description": ["Adaptive Modulation. Activation of adaptive modulation shall be expressed as a 'true'."] +}, +"modulation-min": { +"id": "modulation-min", +"is-read-only": false, +"description": ["Minimum modulation to be configured (in case adaptive modulation is not used, this value represents also the fixed modulation). The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme."] +}, +"modulation-max": { +"id": "modulation-max", +"is-read-only": false, +"description": ["Maximum modulation to be configured. The value of this field is only relevant, if Adaptive Modulation has been activated. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme."] +}, +"xpic-is-on": { +"id": "xpic-is-on", +"is-read-only": false, +"description": ["Activation of Cross Polarization Interference Cancelation shall be expressed as a 'true'. In case XPIC is not available for the current combination of channel bandwidth and modulation or the hardware in general, this parameter shall always be set to 'false'."] +}, +"mimo-is-on": { +"id": "mimo-is-on", +"is-read-only": false, +"description": ["Activation of Multiple Input Multiple Output (MIMO) shall be expressed as a 'true'."] +}, +"alic-is-on": { +"id": "alic-is-on", +"is-read-only": false, +"description": ["Activation of Adjacent Link Interference Cancelation (ALIC) shall be expressed as a 'true'."] +}, +"atpc-is-on": { +"id": "atpc-is-on", +"is-read-only": false, +"description": ["ATPC. Activation of Automated Transmit Power Control shall be expressed as a 'true'."] +}, +"atpc-thresh-upper": { +"id": "atpc-thresh-upper", +"is-read-only": false, +"description": ["If the receive level is higher than the upper threshold value, the transmitter is notified to decrease transmit power."] +}, +"atpc-thresh-lower": { +"id": "atpc-thresh-lower", +"is-read-only": false, +"description": ["If the receive level is lower than the lower threshold value, the transmitter is notified to increase transmit power."] +}, +"atpc-tx-power-min": { +"id": "atpc-tx-power-min", +"is-read-only": false, +"description": ["Transmit power, which is not to be undercut, while operating ATPC."] +}, +"auto-freq-select-is-on": { +"id": "auto-freq-select-is-on", +"is-read-only": false, +"description": ["Activation of automatically selecting the transmit frequency in unlicensed bands shall be expressed as a 'true'."] +}, +"auto-freq-select-range": { +"id": "auto-freq-select-range", +"is-read-only": false, +"description": ["Number of transmit channels (starting at the center frequency defined in txFrequency and with channel bandwidth according to txChannelBandwidth) that define the range within the transmit frequency can automatically been chosen."] +}, +"modulation-is-on": { +"id": "modulation-is-on", +"is-read-only": false, +"description": ["Maintenance Feature. De-activation of the modulation of the carrier signal for fault management shall be expressed as a 'false'."] +}, +"encryption-is-on": { +"id": "encryption-is-on", +"is-read-only": false, +"description": ["Activates encryption of the payload."] +}, +"cryptographic-key": { +"id": "cryptographic-key", +"is-read-only": false, +"description": ["Key for transforming plaintext into ciphertext data."] +}, +"performance-monitoring-collection-is-on": { +"id": "performance-monitoring-collection-is-on", +"is-read-only": false, +"description": ["Enables measurement, collection, storage and access to performance data."] +}, +"threshold-cross-alarm-list": { +"id": "threshold-cross-alarm-list", +"is-read-only": false, +"description": ["List of threshold cross alarms to be configured."] +}, +"loop-back-kind-on": { +"id": "loop-back-kind-on", +"is-read-only": false, +"description": ["Maintenance Feature. The currently configured type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site."] +}, +"maintenance-timer": { +"id": "maintenance-timer", +"is-read-only": false, +"description": ["Time of existence of any maintenance configuration (e.g. the loop back of microwave header information). Valid values are defined in AirInterface::AirInterfaceCapability::maintenanceTimerRange."] +}, +"problem-kind-severity-list": { +"id": "problem-kind-severity-list", +"is-read-only": false, +"description": ["Severity of the problem to be configured."] +}, +"air-interface-configuration-g": { +"id": "air-interface-configuration-g", +"is-read-only": false, +"description": ["Configuration of the radio link."] +}, +"tx-frequency-cur": { +"id": "tx-frequency-cur", +"is-read-only": false, +"description": ["Center frequency of the currently operated transmit channel."] +}, +"rx-frequency-cur": { +"id": "rx-frequency-cur", +"is-read-only": false, +"description": ["Center frequency of the currently operated receive channel."] +}, +"tx-level-cur": { +"id": "tx-level-cur", +"is-read-only": false, +"description": ["Current transmit level."] +}, +"rx-level-cur": { +"id": "rx-level-cur", +"is-read-only": false, +"description": ["Current receive level."] +}, +"transmission-mode-cur": { +"id": "transmission-mode-cur", +"is-read-only": false, +"description": ["Currently operated transmission mode according to definitions in Capabilities."] +}, +"modulation-cur": { +"id": "modulation-cur", +"is-read-only": false, +"description": ["Currently operated modulation on transmit path. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme."] +}, +"code-rate-cur": { +"id": "code-rate-cur", +"is-read-only": false, +"description": ["Code rate of the currently operated coding scheme (Net bit rate ? Gross bit rate ? code rate)."] +}, +"received-signal-id": { +"id": "received-signal-id", +"is-read-only": false, +"description": ["ID of the signal, which the receiver is currently synchronized on."] +}, +"snir-cur": { +"id": "snir-cur", +"is-read-only": false, +"description": ["Currently measured signal to (noise+interference) ratio."] +}, +"xpd-cur": { +"id": "xpd-cur", +"is-read-only": false, +"description": ["Currently measured cross polarization discrimination."] +}, +"rf-temp-cur": { +"id": "rf-temp-cur", +"is-read-only": false, +"description": ["Current temperature (in degree Celsius) of the radio module inside the outdoor unit."] +}, +"last-status-change": { +"id": "last-status-change", +"is-read-only": false, +"description": ["Time the Air Interface entered its current operational status."] +}, +"radio-power-is-up": { +"id": "radio-power-is-up", +"is-read-only": false, +"description": ["If the radio unit has power and is switched on, this shall be expressed as a 'true'."] +}, +"link-is-up": { +"id": "link-is-up", +"is-read-only": false, +"description": ["If connection is established to the remote site with the same linkID, this shall be expressed as a 'true'."] +}, +"xpic-is-up": { +"id": "xpic-is-up", +"is-read-only": false, +"description": ["If XPIC is currently actually working (not just configured), this shall be expressed as a 'true'."] +}, +"mimo-is-up": { +"id": "mimo-is-up", +"is-read-only": false, +"description": ["If MIMO is currently actually working (not just configured), this shall be expressed as a 'true'."] +}, +"alic-is-up": { +"id": "alic-is-up", +"is-read-only": false, +"description": ["If Adjacent Link Interference Cancelation (ALIC) is currently actually working (not just configured), this shall be expressed as a 'true'."] +}, +"atpc-is-up": { +"id": "atpc-is-up", +"is-read-only": false, +"description": ["If ATPC is currently actually working (not just configured), this shall be expressed as a 'true'."] +}, +"auto-freq-select-is-up": { +"id": "auto-freq-select-is-up", +"is-read-only": false, +"description": ["If automated frequency selection is currently actually working (not just configured), this shall be expressed as a 'true'."] +}, +"loop-back-kind-up": { +"id": "loop-back-kind-up", +"is-read-only": false, +"description": ["The currently active (not just configured) type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site."] +}, +"local-end-point-id": { +"id": "local-end-point-id", +"is-read-only": false, +"description": ["The value of the localEndPointId is a vendor specific identifier of the air interface, used by the node to discover a microwave radio link."] +}, +"remote-end-point-id": { +"id": "remote-end-point-id", +"is-read-only": false, +"description": ["The value of the remoteEndPointId is a vendor specific identifier or the airinterface at the remote side, used to by the node to discover a microwave radio link."] +}, +"air-interface-status-g": { +"id": "air-interface-status-g", +"is-read-only": false, +"description": ["Measurements of current values on the air interface and operational status of the device."] +}, +"current-problem-list": { +"id": "current-problem-list", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-current-problems-g": { +"id": "air-interface-current-problems-g", +"is-read-only": false, +"description": ["none"] +}, +"current-performance-data-list": { +"id": "current-performance-data-list", +"is-read-only": false, +"description": ["At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."] +}, +"air-interface-current-performance-g": { +"id": "air-interface-current-performance-g", +"is-read-only": false, +"description": ["Aggregated performance information of the air interface at a particular moment."] +}, +"historical-performance-data-list": { +"id": "historical-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-historical-performances-g": { +"id": "air-interface-historical-performances-g", +"is-read-only": false, +"description": ["Aggregated performance information of the air interface for a pre-defined measurement interval."] +}, +"co-channel-group": { +"id": "co-channel-group", +"is-read-only": false, +"description": ["none"] +}, +"co-channel-group-id": { +"id": "co-channel-group-id", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-list": { +"id": "air-interface-list", +"is-read-only": false, +"description": ["List of air interfaces, which are part of the co-channel (XPIC, MIMO, ALIC) group."] +}, +"sort-of-co-channel-group": { +"id": "sort-of-co-channel-group", +"is-read-only": false, +"description": ["Type of group of air interfaces with the same transmit and receive frequency. The values shall be chosen from the following _list:'XPIC', 'MIMO', 'ALIC';"] +}, +"logical-termination-point": { +"id": "logical-termination-point", +"is-read-only": false, +"description": ["none"] +}, +"co-channel-group-g": { +"id": "co-channel-group-g", +"is-read-only": false, +"description": ["Required for configuring XPIC, MIMO and ALIC."] +}, +"role": { +"id": "role", +"is-read-only": false, +"description": ["none"] +}, +"endpoint": { +"id": "endpoint", +"is-read-only": false, +"description": ["none"] +}, +"mw-air-interface-hsb-end-point-pac": { +"id": "mw-air-interface-hsb-end-point-pac", +"is-read-only": false, +"description": ["The EndPoint (EP) object class models the access to the FC function. Each EndPoint instance has a role (e.g., working, protection, protected, hub, spoke, leaf, root, etc.) with respect to the FC function. The association of the FC to LTPs is made via EndPoints (essentially the ports of the FC) where each EndPoint (EP) of the FC has a role in the context of the FC. The traffic forwarding between the associated End PointsEPs of the FC depends upon the type of FC and may be associated with FCSwitch object instances. In cases where there is protection conveys the protecting role of the access to the FC. The EP replaces the Protection Unit of a traditional protection model. It represents a protected (resilient/reliable) point or a protecting (unreliable working or protection) point."] +}, +"prot-type": { +"id": "prot-type", +"is-read-only": false, +"description": ["Indicates the protection scheme that is used for the ProtectionGroup."] +}, +"air-interface-hsb-configuration-is-faulty-severity": { +"id": "air-interface-hsb-configuration-is-faulty-severity", +"is-read-only": false, +"description": ["The level of severity of an airInterfaceHsbConfigurationIsFaulty alarm shall be chosen from an enumeration."] +}, +"air-interface-hsb-is-partly-down-severity": { +"id": "air-interface-hsb-is-partly-down-severity", +"is-read-only": false, +"description": ["The level of severity for one link out of the HSB configuration being down shall be chosen from an enumeration."] +}, +"air-interface-hsb-is-down-severity": { +"id": "air-interface-hsb-is-down-severity", +"is-read-only": false, +"description": ["The level of severity of the total HSB configuration being down shall be chosen from an enumeration."] +}, +"fcswitch": { +"id": "fcswitch", +"is-read-only": false, +"description": ["none"] +}, +"mw-air-interface-hsb-fc-switch-pac": { +"id": "mw-air-interface-hsb-fc-switch-pac", +"is-read-only": false, +"description": ["Represents and defines a protection switch structure encapsulated in the forwarding construct. Essentially performs the function of Protection Group. Associates to 2 or more Endpoints each playing the role of a Protection Unit. One or more protection EndPoints (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) Endpoints where either protection or working can feed one or more protected Endpoint. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1). May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state."] +}, +"layer-protocol": { +"id": "layer-protocol", +"is-read-only": false, +"description": ["CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"] +}, +"air-interface-diversity-capability": { +"id": "air-interface-diversity-capability", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-configuration": { +"id": "air-interface-diversity-configuration", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-status": { +"id": "air-interface-diversity-status", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-current-problems": { +"id": "air-interface-diversity-current-problems", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-current-performance": { +"id": "air-interface-diversity-current-performance", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-historical-performances": { +"id": "air-interface-diversity-historical-performances", +"is-read-only": false, +"description": ["none"] +}, +"mw-air-interface-diversity-pac": { +"id": "mw-air-interface-diversity-pac", +"is-read-only": false, +"description": ["none"] +}, +"available-kinds-of-diversity": { +"id": "available-kinds-of-diversity", +"is-read-only": false, +"description": ["Available types of diversity to be listed."] +}, +"supported-alarm-list": { +"id": "supported-alarm-list", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'airInterfaceDiversityConfigurationIsPartlyDown' (at least one air interface is down, but not all of them) and 'airInterfaceDiversityConfigurationIsDown' (all air interfaces are down). Further alarms might be added by the vendor."] +}, +"supported-alarms": { +"id": "supported-alarms", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'airInterfaceDiversityConfigurationIsPartlyDown' (at least one air interface is down, but not all of them) and 'airInterfaceDiversityConfigurationIsDown' (all air interfaces are down). Further alarms might be added by the device. Names are to be separated by commas."] +}, +"air-interface-diversity-capability-g": { +"id": "air-interface-diversity-capability-g", +"is-read-only": false, +"description": ["Describes the capabilities in implementing different types of air interface diversity."] +}, +"air-interface-diversity": { +"id": "air-interface-diversity", +"is-read-only": false, +"description": ["Type of air interface diversity configured at the link."] +}, +"air-interface-ltp-list": { +"id": "air-interface-ltp-list", +"is-read-only": false, +"description": ["_multiplicity:2-ThisAirInterfaceDiversity::AirInterfaceDiversityConfiguration::airInterfaceDiversity::diversityType::numberOfAirInterfacesMax"] +}, +"performance-monitoring-collection-is-on": { +"id": "performance-monitoring-collection-is-on", +"is-read-only": false, +"description": ["Enables measurement, collection, storage and access to performance data."] +}, +"threshold-cross-alarm-list": { +"id": "threshold-cross-alarm-list", +"is-read-only": false, +"description": ["List of threshold cross alarms to be configured."] +}, +"problem-kind-severity-list": { +"id": "problem-kind-severity-list", +"is-read-only": false, +"description": ["Severity of the problem to be configured."] +}, +"air-interface-diversity-configuration-g": { +"id": "air-interface-diversity-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"snir-cur": { +"id": "snir-cur", +"is-read-only": false, +"description": ["Currently measured signal to (noise+interference) ratio of the combined signals."] +}, +"air-interface-diversity-status": { +"id": "air-interface-diversity-status", +"is-read-only": false, +"description": ["Status of the air interface bundle."] +}, +"last-status-change": { +"id": "last-status-change", +"is-read-only": false, +"description": ["Time the Diversity Group entered its current operational status."] +}, +"air-interface-diversity-status-g": { +"id": "air-interface-diversity-status-g", +"is-read-only": false, +"description": ["none"] +}, +"current-problem-list": { +"id": "current-problem-list", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-current-problems-g": { +"id": "air-interface-diversity-current-problems-g", +"is-read-only": false, +"description": ["none"] +}, +"current-performance-data-list": { +"id": "current-performance-data-list", +"is-read-only": false, +"description": ["At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."] +}, +"air-interface-diversity-current-performance-g": { +"id": "air-interface-diversity-current-performance-g", +"is-read-only": false, +"description": ["Aggregated performance information of the air interface diversity configuration at a particular moment."] +}, +"historical-performance-data-list": { +"id": "historical-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"air-interface-diversity-historical-performances-g": { +"id": "air-interface-diversity-historical-performances-g", +"is-read-only": false, +"description": ["Aggregated performance information of the air interface diversity configuration for a pre-defined measurement interval."] +}, +"layer-protocol": { +"id": "layer-protocol", +"is-read-only": false, +"description": ["CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"] +}, +"pure-ethernet-structure-capability": { +"id": "pure-ethernet-structure-capability", +"is-read-only": false, +"description": ["none"] +}, +"pure-ethernet-structure-configuration": { +"id": "pure-ethernet-structure-configuration", +"is-read-only": false, +"description": ["none"] +}, +"pure-ethernet-structure-status": { +"id": "pure-ethernet-structure-status", +"is-read-only": false, +"description": ["none"] +}, +"pure-ethernet-structure-current-problems": { +"id": "pure-ethernet-structure-current-problems", +"is-read-only": false, +"description": ["none"] +}, +"pure-ethernet-structure-current-performance": { +"id": "pure-ethernet-structure-current-performance", +"is-read-only": false, +"description": ["none"] +}, +"pure-ethernet-structure-historical-performances": { +"id": "pure-ethernet-structure-historical-performances", +"is-read-only": false, +"description": ["none"] +}, +"mw-pure-ethernet-structure-pac": { +"id": "mw-pure-ethernet-structure-pac", +"is-read-only": false, +"description": ["The pureEthernetStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting Ethernet traffic only."] +}, +"structure-id": { +"id": "structure-id", +"is-read-only": false, +"description": ["Identifies the Structure for bundling and container."] +}, +"supported-alarm-list": { +"id": "supported-alarm-list", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the vendor."] +}, +"supported-alarms": { +"id": "supported-alarms", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the device."] +}, +"pure-ethernet-structure-capability-g": { +"id": "pure-ethernet-structure-capability-g", +"is-read-only": false, +"description": ["Describes the logical structuring of the physical capacity provided by a pure Ethernet microwave device. Segmentation is not available. No fixed segment size. No TDM transport."] +}, +"performance-monitoring-collection-is-on": { +"id": "performance-monitoring-collection-is-on", +"is-read-only": false, +"description": ["Enables measurement, collection, storage and access to performance data."] +}, +"problem-kind-severity-list": { +"id": "problem-kind-severity-list", +"is-read-only": false, +"description": ["Severity of the type of problem to be configured."] +}, +"pure-ethernet-structure-configuration-g": { +"id": "pure-ethernet-structure-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"segment-status-list": { +"id": "segment-status-list", +"is-read-only": false, +"description": ["Status of the Ethernet transport segment. Always just one segment."] +}, +"last-status-change": { +"id": "last-status-change", +"is-read-only": false, +"description": ["Time and date of the last update of the status information."] +}, +"pure-ethernet-structure-status-g": { +"id": "pure-ethernet-structure-status-g", +"is-read-only": false, +"description": ["none"] +}, +"current-problem-list": { +"id": "current-problem-list", +"is-read-only": false, +"description": ["none"] +}, +"pure-ethernet-structure-current-problems-g": { +"id": "pure-ethernet-structure-current-problems-g", +"is-read-only": false, +"description": ["none"] +}, +"current-performance-data-list": { +"id": "current-performance-data-list", +"is-read-only": false, +"description": ["At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."] +}, +"pure-ethernet-structure-current-performance-g": { +"id": "pure-ethernet-structure-current-performance-g", +"is-read-only": false, +"description": ["Aggregated performance information of the structure of an pure Ethernet microwave at a particular moment."] +}, +"historical-performance-data-list": { +"id": "historical-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"pure-ethernet-structure-historical-performances-g": { +"id": "pure-ethernet-structure-historical-performances-g", +"is-read-only": false, +"description": ["Aggregated performance information of the structure of an pure Ethernet microwave for a pre-defined measurement interval."] +}, +"pure-ethernet": { +"id": "pure-ethernet", +"is-read-only": false, +"description": ["Feature 'pure-ethernet' is mandatory for device types transporting pure Ethernet."] +}, +"layer-protocol": { +"id": "layer-protocol", +"is-read-only": false, +"description": ["CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"] +}, +"hybrid-mw-structure-capability": { +"id": "hybrid-mw-structure-capability", +"is-read-only": false, +"description": ["none"] +}, +"hybrid-mw-structure-configuration": { +"id": "hybrid-mw-structure-configuration", +"is-read-only": false, +"description": ["none"] +}, +"hybrid-mw-structure-status": { +"id": "hybrid-mw-structure-status", +"is-read-only": false, +"description": ["none"] +}, +"hybrid-mw-structure-current-problems": { +"id": "hybrid-mw-structure-current-problems", +"is-read-only": false, +"description": ["none"] +}, +"hybrid-mw-structure-current-performance": { +"id": "hybrid-mw-structure-current-performance", +"is-read-only": false, +"description": ["none"] +}, +"hybrid-mw-structure-historical-performances": { +"id": "hybrid-mw-structure-historical-performances", +"is-read-only": false, +"description": ["none"] +}, +"mw-hybrid-mw-structure-pac": { +"id": "mw-hybrid-mw-structure-pac", +"is-read-only": false, +"description": ["The HybridMwStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM and Ethernet traffic."] +}, +"structure-id": { +"id": "structure-id", +"is-read-only": false, +"description": ["Identifies the Structure for bundling and container."] +}, +"supported-tdm-structure-types-list": { +"id": "supported-tdm-structure-types-list", +"is-read-only": false, +"description": ["Lists the TDM frame types that are supported."] +}, +"supported-alarm-list": { +"id": "supported-alarm-list", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the vendor."] +}, +"supported-alarms": { +"id": "supported-alarms", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the device."] +}, +"hybrid-mw-structure-capability-g": { +"id": "hybrid-mw-structure-capability-g", +"is-read-only": false, +"description": ["Describes the logical structuring of the physical capacity provided by a hybrid microwave device (TDM + Ethernet). Segmentation is available. TDM transport is available."] +}, +"structure-kind": { +"id": "structure-kind", +"is-read-only": false, +"description": ["TDM frame to be applied."] +}, +"structure-type": { +"id": "structure-type", +"is-read-only": false, +"description": ["TDM frame to be applied."] +}, +"number-of-tdm-segments-to-be-reserved": { +"id": "number-of-tdm-segments-to-be-reserved", +"is-read-only": false, +"description": ["Allows to configure the number of segments reserved for TDM frames of the type specified in HybridMwStructure::HybridMwStructureConfiguration::structureType"] +}, +"performance-monitoring-collection-is-on": { +"id": "performance-monitoring-collection-is-on", +"is-read-only": false, +"description": ["Enables measurement, collection, storage and access to performance data."] +}, +"problem-kind-severity-list": { +"id": "problem-kind-severity-list", +"is-read-only": false, +"description": ["Severity of the type of problem to be configured."] +}, +"hybrid-mw-structure-configuration-g": { +"id": "hybrid-mw-structure-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"segment-status-list": { +"id": "segment-status-list", +"is-read-only": false, +"description": ["Status of each segment (all TDM and one Ethernet). Multiplicity = HybridMwStructure::StructureConfiguration::tdmReservedNumberOfSegments + 1"] +}, +"last-status-change": { +"id": "last-status-change", +"is-read-only": false, +"description": ["Time and date of the last update of the status information."] +}, +"hybrid-mw-structure-status-g": { +"id": "hybrid-mw-structure-status-g", +"is-read-only": false, +"description": ["none"] +}, +"current-problem-list": { +"id": "current-problem-list", +"is-read-only": false, +"description": ["none"] +}, +"hybrid-mw-structure-current-problems-g": { +"id": "hybrid-mw-structure-current-problems-g", +"is-read-only": false, +"description": ["none"] +}, +"current-performance-data-list": { +"id": "current-performance-data-list", +"is-read-only": false, +"description": ["At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."] +}, +"hybrid-mw-structure-current-performance-g": { +"id": "hybrid-mw-structure-current-performance-g", +"is-read-only": false, +"description": ["Aggregated performance information of the structure of a hybrid microwave at a particular moment."] +}, +"historical-performance-data-list": { +"id": "historical-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"hybrid-mw-structure-historical-performances-g": { +"id": "hybrid-mw-structure-historical-performances-g", +"is-read-only": false, +"description": ["Aggregated performance information of the structure of a hybrid microwave for a pre-defined measurement interval."] +}, +"hybrid-microwave": { +"id": "hybrid-microwave", +"is-read-only": false, +"description": ["Feature 'hybrid-microwave' is mandatory for device types transporting Ethernet + TDM."] +}, +"layer-protocol": { +"id": "layer-protocol", +"is-read-only": false, +"description": ["CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"] +}, +"ethernet-container-capability": { +"id": "ethernet-container-capability", +"is-read-only": false, +"description": ["none"] +}, +"ethernet-container-configuration": { +"id": "ethernet-container-configuration", +"is-read-only": false, +"description": ["none"] +}, +"ethernet-container-status": { +"id": "ethernet-container-status", +"is-read-only": false, +"description": ["none"] +}, +"ethernet-container-current-problems": { +"id": "ethernet-container-current-problems", +"is-read-only": false, +"description": ["none"] +}, +"ethernet-container-current-performance": { +"id": "ethernet-container-current-performance", +"is-read-only": false, +"description": ["none"] +}, +"ethernet-container-historical-performances": { +"id": "ethernet-container-historical-performances", +"is-read-only": false, +"description": ["none"] +}, +"mw-ethernet-container-pac": { +"id": "mw-ethernet-container-pac", +"is-read-only": false, +"description": ["none"] +}, +"bundling-is-avail": { +"id": "bundling-is-avail", +"is-read-only": false, +"description": ["This attribute has to be set on 'true', if the device allows combining resources from several air interfaces for transporting this Ethernet container."] +}, +"packet-compression-is-avail": { +"id": "packet-compression-is-avail", +"is-read-only": false, +"description": ["In case packet compression can be activated, but not configured to a certain type, packetCompressionAvail shall be set on 'true', but none of the compression level specific booleans."] +}, +"layer2-compression-is-avail": { +"id": "layer2-compression-is-avail", +"is-read-only": false, +"description": ["Packet compression on layer 2 available at the device."] +}, +"vlan-compression-is-avail": { +"id": "vlan-compression-is-avail", +"is-read-only": false, +"description": ["Packet compression on VLAN layer available at the device."] +}, +"q-in-q-compression-is-avail": { +"id": "q-in-q-compression-is-avail", +"is-read-only": false, +"description": ["Packet compression on layer of a second VLAN available at the device."] +}, +"mpls-compression-is-avail": { +"id": "mpls-compression-is-avail", +"is-read-only": false, +"description": ["Packet compression on mpls layer available at the device."] +}, +"ipv4-compression-is-avail": { +"id": "ipv4-compression-is-avail", +"is-read-only": false, +"description": ["Packet compression on layer 3 for IPv4 available at the device."] +}, +"ipv6-compression-is-avail": { +"id": "ipv6-compression-is-avail", +"is-read-only": false, +"description": ["Packet compression on layer 3 for IPv6 available at the device."] +}, +"layer4-compression-is-avail": { +"id": "layer4-compression-is-avail", +"is-read-only": false, +"description": ["Packet compression on layer 4 (TCP and UDP header) available at the device."] +}, +"encryption-is-avail": { +"id": "encryption-is-avail", +"is-read-only": false, +"description": ["Shall be marked 'true', if Ethernet payload encryption is available."] +}, +"supported-alarm-list": { +"id": "supported-alarm-list", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the vendor."] +}, +"supported-alarms": { +"id": "supported-alarms", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device."] +}, +"ethernet-container-capability-g": { +"id": "ethernet-container-capability-g", +"is-read-only": false, +"description": ["none"] +}, +"container-id": { +"id": "container-id", +"is-read-only": false, +"description": ["ContainterID in Netconf must be the same as EthernetPortID in OpenFlow so a connection can be made between the two items, which separately exist in the controller."] +}, +"segments-id-list": { +"id": "segments-id-list", +"is-read-only": false, +"description": ["Lists the segments used for transporting this Ethernet container. In case EthernetContainer::ContainerCapability::bundlingIsAvail==0, all TypeDefinitions::segmentIdType::structureId must be identical in the list."] +}, +"packet-compression-is-on": { +"id": "packet-compression-is-on", +"is-read-only": false, +"description": ["In case packet compression is activated, but no type is activated, it is assumed that the device chooses the optimum."] +}, +"layer2-compression-is-on": { +"id": "layer2-compression-is-on", +"is-read-only": false, +"description": ["Packet compression on layer 2 configured at the device."] +}, +"vlan-compression-is-on": { +"id": "vlan-compression-is-on", +"is-read-only": false, +"description": ["Packet compression on VLAN layer configured at the device."] +}, +"q-in-q-compression-is-on": { +"id": "q-in-q-compression-is-on", +"is-read-only": false, +"description": ["Packet compression on layer of a second VLAN configured at the device."] +}, +"mpls-compression-is-on": { +"id": "mpls-compression-is-on", +"is-read-only": false, +"description": ["Packet compression on MPLS layer configured at the device."] +}, +"ipv4-compression-is-on": { +"id": "ipv4-compression-is-on", +"is-read-only": false, +"description": ["Packet compression on layer 3 for IPv4 configured at the device."] +}, +"ipv6-compression-is-on": { +"id": "ipv6-compression-is-on", +"is-read-only": false, +"description": ["Packet compression on layer 3 for IPv6 configured at the device."] +}, +"layer4-compression-is-on": { +"id": "layer4-compression-is-on", +"is-read-only": false, +"description": ["Packet compression on layer 4 (TCP and UDP header) configured at the device."] +}, +"encryption-is-on": { +"id": "encryption-is-on", +"is-read-only": false, +"description": ["Activates encryption of the Ethernet payload."] +}, +"cryptographic-key": { +"id": "cryptographic-key", +"is-read-only": false, +"description": ["Key for transforming plaintext into cipher text data."] +}, +"performance-monitoring-collection-is-on": { +"id": "performance-monitoring-collection-is-on", +"is-read-only": false, +"description": ["Enables measurement, collection, storage and access to performance data."] +}, +"problem-kind-severity-list": { +"id": "problem-kind-severity-list", +"is-read-only": false, +"description": ["Severity of the problem to be configured."] +}, +"ethernet-container-configuration-g": { +"id": "ethernet-container-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"last-status-change": { +"id": "last-status-change", +"is-read-only": false, +"description": ["Time the Container entered its current operational status."] +}, +"ethernet-container-status-g": { +"id": "ethernet-container-status-g", +"is-read-only": false, +"description": ["none"] +}, +"current-problem-list": { +"id": "current-problem-list", +"is-read-only": false, +"description": ["none"] +}, +"ethernet-container-current-problems-g": { +"id": "ethernet-container-current-problems-g", +"is-read-only": false, +"description": ["none"] +}, +"current-performance-data-list": { +"id": "current-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"ethernet-container-current-performance-g": { +"id": "ethernet-container-current-performance-g", +"is-read-only": false, +"description": ["Aggregated performance information of the Ethernet container at a particular moment."] +}, +"historical-performance-data-list": { +"id": "historical-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"ethernet-container-historical-performances-g": { +"id": "ethernet-container-historical-performances-g", +"is-read-only": false, +"description": ["Aggregated performance information of the Ethernet container for a pre-defined measurement interval."] +}, +"layer-protocol": { +"id": "layer-protocol", +"is-read-only": false, +"description": ["CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"] +}, +"tdm-container-capability": { +"id": "tdm-container-capability", +"is-read-only": false, +"description": ["none"] +}, +"tdm-container-configuration": { +"id": "tdm-container-configuration", +"is-read-only": false, +"description": ["none"] +}, +"tdm-container-status": { +"id": "tdm-container-status", +"is-read-only": false, +"description": ["none"] +}, +"tdm-container-current-problems": { +"id": "tdm-container-current-problems", +"is-read-only": false, +"description": ["none"] +}, +"tdm-container-current-performance": { +"id": "tdm-container-current-performance", +"is-read-only": false, +"description": ["none"] +}, +"tdm-container-historical-performances": { +"id": "tdm-container-historical-performances", +"is-read-only": false, +"description": ["none"] +}, +"mw-tdm-container-pac": { +"id": "mw-tdm-container-pac", +"is-read-only": false, +"description": ["The TdmContainer_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM traffic."] +}, +"supported-tdm-container-types-list": { +"id": "supported-tdm-container-types-list", +"is-read-only": false, +"description": ["Lists the TDM containers that are supported."] +}, +"supported-alarm-list": { +"id": "supported-alarm-list", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the vendor."] +}, +"supported-alarms": { +"id": "supported-alarms", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device."] +}, +"tdm-container-capability-g": { +"id": "tdm-container-capability-g", +"is-read-only": false, +"description": ["Bundling is not available."] +}, +"container-id": { +"id": "container-id", +"is-read-only": false, +"description": ["ContainterID in Netconf must be the same as TDM Flow ID so a connection can be made between the two items, which separately exist in the controller."] +}, +"container-type": { +"id": "container-type", +"is-read-only": false, +"description": ["Type of TDM container."] +}, +"segment-id": { +"id": "segment-id", +"is-read-only": false, +"description": ["Multiplicity = 1; One segment per TDM container; Type of segment must match type of container;"] +}, +"performance-monitoring-collection-is-on": { +"id": "performance-monitoring-collection-is-on", +"is-read-only": false, +"description": ["Enables measurement, collection, storage and access to performance data."] +}, +"problem-kind-severity-list": { +"id": "problem-kind-severity-list", +"is-read-only": false, +"description": ["Severity of the problem to be configured."] +}, +"tdm-container-configuration-g": { +"id": "tdm-container-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"last-status-change": { +"id": "last-status-change", +"is-read-only": false, +"description": ["Time the Container entered its current operational status."] +}, +"tdm-container-status-g": { +"id": "tdm-container-status-g", +"is-read-only": false, +"description": ["none"] +}, +"current-problem-list": { +"id": "current-problem-list", +"is-read-only": false, +"description": ["none"] +}, +"tdm-container-current-problems-g": { +"id": "tdm-container-current-problems-g", +"is-read-only": false, +"description": ["none"] +}, +"current-performance-data-list": { +"id": "current-performance-data-list", +"is-read-only": false, +"description": ["At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."] +}, +"tdm-container-current-performance-g": { +"id": "tdm-container-current-performance-g", +"is-read-only": false, +"description": ["Aggregated performance information of the TDM container at a particular moment."] +}, +"historical-performance-data-list": { +"id": "historical-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"tdm-container-historical-performances-g": { +"id": "tdm-container-historical-performances-g", +"is-read-only": false, +"description": ["Aggregated performance information of the TDM container for a pre-defined measurement interval."] +}, +"layer-protocol": { +"id": "layer-protocol", +"is-read-only": false, +"description": ["CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"] +}, +"wirebased-interface-capability": { +"id": "wirebased-interface-capability", +"is-read-only": false, +"description": ["none"] +}, +"wirebased-interface-configuration": { +"id": "wirebased-interface-configuration", +"is-read-only": false, +"description": ["none"] +}, +"wirebased-interface-status": { +"id": "wirebased-interface-status", +"is-read-only": false, +"description": ["none"] +}, +"wirebased-interface-current-problems": { +"id": "wirebased-interface-current-problems", +"is-read-only": false, +"description": ["none"] +}, +"wirebased-interface-current-performance": { +"id": "wirebased-interface-current-performance", +"is-read-only": false, +"description": ["none"] +}, +"wirebased-interface-historical-performances": { +"id": "wirebased-interface-historical-performances", +"is-read-only": false, +"description": ["none"] +}, +"wire-interface-pac": { +"id": "wire-interface-pac", +"is-read-only": false, +"description": ["none"] +}, +"available-mau-list": { +"id": "available-mau-list", +"is-read-only": false, +"description": ["List of Medium Attachment Units (MAUs) that are available for being selected. If rate and service configuration (e.g. SFF-8079) are not supported, the MAU determined by hardware shall be described."] +}, +"auto-pmd-negotiation-is-avail": { +"id": "auto-pmd-negotiation-is-avail", +"is-read-only": false, +"description": ["Parameter 1 = Indicates that device is supporting Auto-negotiation"] +}, +"auto-pmd-negotiation-max-is-avail": { +"id": "auto-pmd-negotiation-max-is-avail", +"is-read-only": false, +"description": ["1 = Indicates that device is supporting definition of the maximum speed/Medium Attached Unit (MAU) automatically chosen when (autoNegotiationIsOn=1)"] +}, +"supported-loop-back-kind-list": { +"id": "supported-loop-back-kind-list", +"is-read-only": false, +"description": ["List of supported kinds of looping back of header information to the remote site. 802.3 45.2.1.12.1 PMA remote loopback ability"] +}, +"maintenance-timer-range": { +"id": "maintenance-timer-range", +"is-read-only": false, +"description": ["MW IM Available time periods for maintenance configurations (e.g. the loop back) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360')."] +}, +"supported-alarm-list": { +"id": "supported-alarm-list", +"is-read-only": false, +"description": ["Available alarms to be listed. Mandatory:'txFault', 'rxLos', 'tempHigh', 'tempLow', 'rxLevelHigh', 'rxLevelLow'. Optional:'vccHigh', 'vccLow', 'txBiasHigh', 'txBiasLow', 'txPowerHigh', 'txPowerLow', 'laserTempHigh', 'laserTempLow', 'tecCurrentHigh', 'tecCurrentLow'. Further alarms might be added by the device. Names are to be separated by commas."] +}, +"wire-interface-capability-g": { +"id": "wire-interface-capability-g", +"is-read-only": false, +"description": ["none"] +}, +"wire-interface-name": { +"id": "wire-interface-name", +"is-read-only": false, +"description": ["Text field for the wire interface being named by the operator. Ideally used for entering unique numbers or names for unambiguously identifying the connection within the network Parameter"] +}, +"remote-wire-interface-name": { +"id": "remote-wire-interface-name", +"is-read-only": false, +"description": ["Learning from MW IM Text field for defining the wire interface this one is connected with. Ideally used for entering unique numbers or names for unambiguously identifying the connection within the network"] +}, +"interface-is-on": { +"id": "interface-is-on", +"is-read-only": false, +"description": ["1 = Activation of the interface (it gets powered and can be managed even if the transceiver is not yet transmitting or receiving). In case there is no Medium Attachment Unit (MAU) (e.g. no SFP in the cage) SETting (interfaceIsOn=1) must be ignored and GETing must return (interfaceIsOn=0) 802.3 according 30.3.2.2.1 acPhyAdminControl"] +}, +"transceiver-is-on-list": { +"id": "transceiver-is-on-list", +"is-read-only": false, +"description": ["802.3 22.?.? and additionally 802.3 45.2.1.8 PMD transmit disable register (Register 1.9) 1 = Activation of the transmitter and receiver (e.g. laser) of the PHY; transceiverIsOnList[0]:total interface; transceiverIsOnList[1..10] different lanes of a multilane Medium Attachment Unit (MAU)"] +}, +"auto-pmd-negotiation-is-on": { +"id": "auto-pmd-negotiation-is-on", +"is-read-only": false, +"description": ["Parameter 1 = Auto-negotiation is switched on"] +}, +"fixed-pmd": { +"id": "fixed-pmd", +"is-read-only": false, +"description": ["If (autoPmdNegotiationIsOn=0) configuration of the concrete kind of Physical Medium Dependent (PMD). If (autoNegotiationIsOn=1) value of this field becomes irrelevant"] +}, +"auto-pmd-negotiation-max": { +"id": "auto-pmd-negotiation-max", +"is-read-only": false, +"description": ["Parameter If (autoNegotiationIsOn=1) AND (autoNegotiationMauMaxIsAvail=1) configuration of the maximum speed/Physical Medium Dependent (PMD), which is automatically chosen by Auto-negotiation"] +}, +"auto-signal-ordering-is-on": { +"id": "auto-signal-ordering-is-on", +"is-read-only": false, +"description": ["1 = e.g. auto-MDI-X is switched on"] +}, +"fixed-signal-ordering": { +"id": "fixed-signal-ordering", +"is-read-only": false, +"description": ["If (autoSignalOrderingIsOn=0) configuration of the concrete kind of signal ordering on the media (e.g. MDI, or MDI-X). If (autoSignalOrderingIsOn=1) value of this field becomes irrelevant"] +}, +"short-reach-mode-is-on": { +"id": "short-reach-mode-is-on", +"is-read-only": false, +"description": ["Activation of the Short Reach Mode for 10GBASE-T according to 802.3 45.2.1.64"] +}, +"unidirectional-operation-is-on": { +"id": "unidirectional-operation-is-on", +"is-read-only": false, +"description": ["If (autoNegotiationIsOn=1) OR manualDuplexSelection=0 (=half duplex), this bit is ignored. When autoNegotiationIsOn=0 AND manualDuplexSelection=1 (=full duplex): 1 = Enable transmit from media independent interface regardless of whether the PHY has determined that a valid link has been established, 0 = Enable transmit from media independent interface only when the PHY has determined that a valid link has been established 802.3 Parameter"] +}, +"wavelength-list": { +"id": "wavelength-list", +"is-read-only": false, +"description": ["Wavelength of the signal of laser in pico meter; multiplicity=0..3 for 10GBASE-LX4 according to 802.3 53.5 SFF-8690"] +}, +"temperature-high-threshold": { +"id": "temperature-high-threshold", +"is-read-only": false, +"description": ["Threshold for alarming high temperature values. Will move to somewhere in the Physical Segment of the Core IM"] +}, +"temperature-low-threshold": { +"id": "temperature-low-threshold", +"is-read-only": false, +"description": ["Threshold for alarming low temperature values. Will move to somewhere in the Physical Segment of the Core IM"] +}, +"rxlevel-high-threshold": { +"id": "rxlevel-high-threshold", +"is-read-only": false, +"description": ["Threshold for alarming high RX levels."] +}, +"rxlevel-low-threshold": { +"id": "rxlevel-low-threshold", +"is-read-only": false, +"description": ["Threshold for alarming low RX levels."] +}, +"loop-back-kind-on": { +"id": "loop-back-kind-on", +"is-read-only": false, +"description": ["Parameter 802.3 according 22.2.4.1.2 Loopback Maintenance Feature. The currently configured type of looping back of the wire interface header shall be expressed here. The received header is returned to the remote site. Activation of local loopback mode on physical layer"] +}, +"isolation-is-on": { +"id": "isolation-is-on", +"is-read-only": false, +"description": ["1 = Activation of the separation of the PHY from higher network layers 802.3"] +}, +"restart-pmd-negotiation-is-on": { +"id": "restart-pmd-negotiation-is-on", +"is-read-only": false, +"description": ["Restarts the auto negotiation process 802.3"] +}, +"reset-mau-is-on": { +"id": "reset-mau-is-on", +"is-read-only": false, +"description": ["802.3 Resets the entire Medium Access Unit (MAU)"] +}, +"maintenance-timer": { +"id": "maintenance-timer", +"is-read-only": false, +"description": ["Parameter and MW IM Time of existence of any maintenance configuration (e.g. the loop back). Valid values are defined in WireInterface::WireInterfaceCapability::maintenanceTimerRange"] +}, +"problem-kind-severity-list": { +"id": "problem-kind-severity-list", +"is-read-only": false, +"description": ["Severity of the problem to be configured."] +}, +"wire-interface-configuration-g": { +"id": "wire-interface-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"interface-is-up": { +"id": "interface-is-up", +"is-read-only": false, +"description": ["802.3 according 30.3.2.1.7 aPhyAdminState 1 = A Physical layer entity (PHY) exists (including Medium Attachment Unit (e.g. SFP) ) and it is powered and can be managed"] +}, +"receive-signal-is-detected": { +"id": "receive-signal-is-detected", +"is-read-only": false, +"description": ["802.3 45.2.1.9 PMD receive signal detect 1 = Receiver (e.g. laser) detects signal; receiveSignalIsDetected[0]:total interface; receiveSignalIsDetected[1..10] different lanes of a multilane Medium Attachment Unit (MAU)"] +}, +"pmd-is-up": { +"id": "pmd-is-up", +"is-read-only": false, +"description": ["Inverse of 802.3 45.2.1.2.3 Fault (1.1.7) If (interfaceIsUp=1) BUT 0 = there is a fault in either transmit or receive path"] +}, +"pmd-cur": { +"id": "pmd-cur", +"is-read-only": false, +"description": ["Indicates the kind of Physical Medium Dependent (PMD) currently operated at this interface"] +}, +"signal-ordering-kind-cur": { +"id": "signal-ordering-kind-cur", +"is-read-only": false, +"description": ["Reference on a SignalOrderingType for expressing the currently active way of ordering the signals on the physical medium. Must contain a value as defined in TypeDefinitions::SignalOrderingType::signalOrderingKindName"] +}, +"eee-is-up": { +"id": "eee-is-up", +"is-read-only": false, +"description": ["1 = Energy Efficient Ethernet is supported at both ends of the link and it is activated"] +}, +"link-is-up": { +"id": "link-is-up", +"is-read-only": false, +"description": ["Parameter 1 = (transceiverIsUp=1) AND communication is established to the remote site"] +}, +"link-is-idle": { +"id": "link-is-idle", +"is-read-only": false, +"description": ["1 = (linkIsUp=1) AND (eeeIsAvail=1) AND (eeeIsOn=1) AND link is currently in idle mode. If Energy Efficient Ethernet is not supported or switched off, this attribute must be 0."] +}, +"tx-level-cur": { +"id": "tx-level-cur", +"is-read-only": false, +"description": ["Current transmit power"] +}, +"rx-level-cur": { +"id": "rx-level-cur", +"is-read-only": false, +"description": ["Current receive power; Also used for receive signal power measured at the Medium Dependent Interface (MDI) of 10GBASE-T during training as described in 802.3 55.4.3.1"] +}, +"temp-cur": { +"id": "temp-cur", +"is-read-only": false, +"description": ["Current temperature (in degree Celsius) inside the transceiver To be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::DynamicDetails::PhysicalProperties"] +}, +"loop-back-kind-up": { +"id": "loop-back-kind-up", +"is-read-only": false, +"description": ["Paramter and MW IM The currently active (not just configured) type of looping back of the wire interface header shall be expressed here. The received header is returned to the remote site."] +}, +"wire-interface-status-g": { +"id": "wire-interface-status-g", +"is-read-only": false, +"description": ["none"] +}, +"current-problem-list": { +"id": "current-problem-list", +"is-read-only": false, +"description": ["none"] +}, +"wire-interface-current-problems-g": { +"id": "wire-interface-current-problems-g", +"is-read-only": false, +"description": ["none"] +}, +"current-performance-data-list": { +"id": "current-performance-data-list", +"is-read-only": false, +"description": ["At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."] +}, +"wire-interface-current-performance-g": { +"id": "wire-interface-current-performance-g", +"is-read-only": false, +"description": ["Aggregated performance information of the air interface at a particular moment."] +}, +"historical-performance-data-list": { +"id": "historical-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"wire-interface-historical-performances-g": { +"id": "wire-interface-historical-performances-g", +"is-read-only": false, +"description": ["Aggregated performance information of the air interface for a pre-defined measurement interval."] +}, +"sequence-number": { +"id": "sequence-number", +"is-read-only": false, +"description": ["Unique sequence number of the current problem object."] +}, +"time-stamp": { +"id": "time-stamp", +"is-read-only": false, +"description": ["Time and date of the problem."] +}, +"problem-severity": { +"id": "problem-severity", +"is-read-only": false, +"description": ["Severity of the alarm."] +}, +"mw-current-problem-g": { +"id": "mw-current-problem-g", +"is-read-only": false, +"description": ["none"] +}, +"object-creation-notification": { +"id": "object-creation-notification", +"is-read-only": false, +"description": ["none"] +}, +"counter": { +"id": "counter", +"is-read-only": false, +"description": ["Counts object creation notifications."] +}, +"time-stamp": { +"id": "time-stamp", +"is-read-only": false, +"description": ["none"] +}, +"object-id-ref": { +"id": "object-id-ref", +"is-read-only": false, +"description": ["ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."] +}, +"object-type": { +"id": "object-type", +"is-read-only": false, +"description": ["Type of Object to be chosen from the following list of values: 'MW_AirInterface_Pac', 'MW_AirInterfaceDiversity_Pac', 'MW_Structure_Pac', 'MW_PureEthernetStructure_Pac', 'MW_HybridMwStructure_Pac', 'MW_Container_Pac', 'MW_EthernetContainer_Pac' or 'MW_TdmContainer_Pac'."] +}, +"object-creation-notification-g": { +"id": "object-creation-notification-g", +"is-read-only": false, +"description": ["To be sent when a new MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac has to be instancieted in the controller."] +}, +"object-deletion-notification": { +"id": "object-deletion-notification", +"is-read-only": false, +"description": ["none"] +}, +"counter": { +"id": "counter", +"is-read-only": false, +"description": ["Counts object deletion notifications."] +}, +"time-stamp": { +"id": "time-stamp", +"is-read-only": false, +"description": ["none"] +}, +"object-id-ref": { +"id": "object-id-ref", +"is-read-only": false, +"description": ["ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."] +}, +"object-deletion-notification-g": { +"id": "object-deletion-notification-g", +"is-read-only": false, +"description": ["To be sent when a new MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac instance has to be deleted in the controller."] +}, +"attribute-value-changed-notification": { +"id": "attribute-value-changed-notification", +"is-read-only": false, +"description": ["none"] +}, +"counter": { +"id": "counter", +"is-read-only": false, +"description": ["Counts attribute value changed notifications."] +}, +"time-stamp": { +"id": "time-stamp", +"is-read-only": false, +"description": ["none"] +}, +"object-id-ref": { +"id": "object-id-ref", +"is-read-only": false, +"description": ["ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."] +}, +"attribute-name": { +"id": "attribute-name", +"is-read-only": false, +"description": ["Name of the attribute that has been changed."] +}, +"new-value": { +"id": "new-value", +"is-read-only": false, +"description": ["Attribute value converted to a string (xml, json, ...)"] +}, +"attribute-value-changed-notification-g": { +"id": "attribute-value-changed-notification-g", +"is-read-only": false, +"description": ["To be sent when an attribute has changed and one or more controllers have to update their data."] +}, +"problem-notification": { +"id": "problem-notification", +"is-read-only": false, +"description": ["none"] +}, +"counter": { +"id": "counter", +"is-read-only": false, +"description": ["Counts problem notifications"] +}, +"time-stamp": { +"id": "time-stamp", +"is-read-only": false, +"description": ["none"] +}, +"object-id-ref": { +"id": "object-id-ref", +"is-read-only": false, +"description": ["ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."] +}, +"problem": { +"id": "problem", +"is-read-only": false, +"description": ["Name of the problem according to AirInterface::AirInterfaceCapability::supportedAlarms or AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms or Structure::StructureCapability::supportedAlarms or PureEthernetStructure::PureEthernetStructureCapability::supportedAlarms or HybridMwStructure::HybridMwStructureCapability::supportedAlarms or Container::ContainerCapability::supportedAlarms or EthernetContainer::EthernetContainerCapability::supportedAlarms or TdmContainer::TdmContainerCapability::supportedAlarms."] +}, +"severity": { +"id": "severity", +"is-read-only": false, +"description": ["Severity of the problem according to AirInterface::AirInterfaceConfiguration::problemSeverityList, AirInterfaceDiversity::AirInterfaceDiversityConfiguration::problemSeverityList, Structure::StructureConfiguration::problemSeverityList, PureEthernetStructure::PureEthernetStructureConfiguration::problemSeverityList, HybridMwStructure::HybridMwStructureConfiguration::problemSeverityList, Container::ContainerConfiguration::problemSeverityList, EthernetContainer::EthernetContainerConfiguration::problemSeverityList or TdmContainer::TdmContainerConfiguration::problemSeverityList"] +}, +"problem-notification-g": { +"id": "problem-notification-g", +"is-read-only": false, +"description": ["To be sent when a problem occurs at a MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.schema-information.json new file mode 100644 index 000000000..5d3014f9d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.schema-information.json @@ -0,0 +1,337 @@ +{ + "schema-information": { + "network-element-pac": { + "id": "network-element-pac", + "uml-id": "_RamCUPaMEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElement_Pac" + }, + "network-element": { + "id": "network-element", + "uml-id": "_5z06cPaNEeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_oGqnr1LNEeO75dO39GbF8Q", + "order-number": 1, + "is-read-only": false, + "uml-name": "_networkElement" + }, + "network-element-capability": { + "id": "network-element-capability", + "uml-id": "_1_TVYPaMEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElementCapability" + }, + "network-element-configuration": { + "id": "network-element-configuration", + "uml-id": "_Pu6HIPaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElementConfiguration" + }, + "network-element-status": { + "id": "network-element-status", + "uml-id": "_g5u0YPaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElementStatus" + }, + "network-element-current-problems": { + "id": "network-element-current-problems", + "uml-id": "_Pu6HIfaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "NetworkElementCurrentProblems" + }, + "supported-alarms": { + "id": "supported-alarms", + "uml-id": "_444DuBd_EeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "Available alarms to be listed. Names are to be separated by commas." + ], + "uml-name": "supportedAlarms", + "controlType": "text" + }, + "problem-type-severity": { + "id": "problem-type-severity", + "uml-id": "_rvDABPasEeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "../OnfModel-MicrowaveTransportNetwork/MicrowaveModel.uml#_eIml0JH1EeWUdbnmmNiTAA", + "order-number": 2, + "is-read-only": false, + "description": [ + "Severity of this type of alarm." + ], + "uml-name": "problemTypeSeverity" + }, + "trigger-refresh": { + "id": "trigger-refresh", + "uml-id": "_F6C-8Pm7EeaOH6heSczBpQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean", + "order-number": 2, + "is-read-only": false, + "description": [ + "A trigger to instuct the netconf server to refresh its internal database/cache. It is primary used for alarms status, but could used for anything else too. It is assumed that the refresh mechanismn takes somes time. In order to indictate the process to the controller a refreshStatus attribute is used." + ], + "uml-name": "triggerRefresh", + "controlType": "checkbox" + }, + "refresh-status": { + "id": "refresh-status", + "uml-id": "_w0x8wPm3EeaOH6heSczBpQ", + "uml-type": "ownedAttribute", + "type": "_7HZcEPm3EeaOH6heSczBpQ", + "order-number": 1, + "is-read-only": true, + "uml-name": "refreshStatus", + "controlType": [ + "done", + "processing" + ] + }, + "current-problem-list": { + "id": "current-problem-list", + "uml-id": "_444DwRd_EeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "_TBaooPasEeaW9u5N6usiTA", + "order-number": 1, + "is-read-only": true, + "uml-name": "currentProblemList" + }, + "equipment-pac": { + "id": "equipment-pac", + "uml-id": "_VtO8MPaMEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "Equipment_Pac" + }, + "equipment": { + "id": "equipment", + "uml-id": "_92PqMfaREeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_8SXNej-HEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "_equipment" + }, + "equipment-capability": { + "id": "equipment-capability", + "uml-id": "_g5u0YfaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EquipmentCapability" + }, + "equipment-configuration": { + "id": "equipment-configuration", + "uml-id": "_OGWN4PaNEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EquipmentConfiguration" + }, + "equipment-status": { + "id": "equipment-status", + "uml-id": "_gJH6APaREeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EquipmentStatus" + }, + "equipment-current-problems": { + "id": "equipment-current-problems", + "uml-id": "_kRHqIPaREeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EquipmentCurrentProblems" + }, + "holder-pac": { + "id": "holder-pac", + "uml-id": "_dECKoPaMEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "Holder_Pac" + }, + "holder": { + "id": "holder", + "uml-id": "_TNk0IfaSEeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_8SXNjj-HEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "_holder" + }, + "holder-capability": { + "id": "holder-capability", + "uml-id": "_gtTvsPaSEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HolderCapability" + }, + "holder-configuration": { + "id": "holder-configuration", + "uml-id": "_g8TN8PaSEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HolderConfiguration" + }, + "holder-status": { + "id": "holder-status", + "uml-id": "_hDSmwPaSEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HolderStatus" + }, + "holder-current-problems": { + "id": "holder-current-problems", + "uml-id": "_hJQE0PaSEeaW9u5N6usiTA", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "HolderCurrentProblems" + }, + "connector-pac": { + "id": "connector-pac", + "uml-id": "_444DsRd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "Connector_Pac" + }, + "connector": { + "id": "connector", + "uml-id": "_eDZ5QBeDEeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_8SXNcD-HEeaRI-H69PghuA", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "_connector" + }, + "connector-capability": { + "id": "connector-capability", + "uml-id": "_444Dtxd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "ConnectorCapability" + }, + "connector-configuration": { + "id": "connector-configuration", + "uml-id": "_444Duhd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "ConnectorConfiguration" + }, + "connector-status": { + "id": "connector-status", + "uml-id": "_444Dvxd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "ConnectorStatus" + }, + "connector-current-problems": { + "id": "connector-current-problems", + "uml-id": "_444DwBd_EeegALpYen9G6g", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "ConnectorCurrentProblems" + }, + "remote-end-point": { + "id": "remote-end-point", + "uml-id": "_RDCPsBeCEeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": false, + "description": [ + "A network wide identifier of the remote connector. The value is used for topology discovery. Please see also ConnectorStatus::localEndPoint." + ], + "uml-name": "remoteEndPoint", + "controlType": "text" + }, + "local-end-point": { + "id": "local-end-point", + "uml-id": "_NZGKABeBEeegALpYen9G6g", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "description": [ + "A network wide global identifier of the this connector, which can be used to discover the physical connectivitiy. The value should contain the network element name, because the network element software can assume that the network element name is unique in the network. The value should be formated: <connector:uuid>@<network-element-name> Please see also ConnectorConfiguration::remoteEndPoint" + ], + "uml-name": "localEndPoint", + "controlType": "text" + }, + "current-problem-type": { + "id": "current-problem-type", + "uml-id": "_TBaooPasEeaW9u5N6usiTA", + "uml-type": "uml:DataType", + "uml-name": "CurrentProblemType" + }, + "problem-name": { + "id": "problem-name", + "uml-id": "_0XQ-UvmyEeaOH6heSczBpQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": true, + "description": [ + "Name of the alarm according capability::supportedAlarms." + ], + "uml-name": "problemName", + "controlType": "text" + }, + "network-element-current-problem-type": { + "id": "network-element-current-problem-type", + "uml-id": "_0XQ-UPmyEeaOH6heSczBpQ", + "uml-type": "uml:DataType", + "uml-name": "NetworkElementCurrentProblemType" + }, + "object-reference": { + "id": "object-reference", + "uml-id": "_BW8g0PmzEeaOH6heSczBpQ", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 2, + "is-read-only": true, + "description": [ + "An explaining string of the related object class. This is necesseary, because the current problem list of the NetworkElement object class acts as a container for all alarms, where its object classes are not modeled." + ], + "uml-name": "objectReference", + "controlType": "text" + }, + "problem-severity-type": { + "id": "problem-severity-type", + "uml-id": "_rvDAAPasEeaW9u5N6usiTA", + "uml-type": "uml:DataType", + "uml-name": "ProblemSeverityType" + }, + "problem-type-name": { + "id": "problem-type-name", + "uml-id": "_rvDAAfasEeaW9u5N6usiTA", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "description": [ + "Name of the alarm according to Capability::supportedAlarms" + ], + "uml-name": "problemTypeName", + "controlType": "text" + }, + "7-h-zc-e-pm3-eea-oh6-he-scz-bp-q": { + "id": "7-h-zc-e-pm3-eea-oh6-he-scz-bp-q", + "uml-id": "_7HZcEPm3EeaOH6heSczBpQ", + "enum": [ + "DONE", + "PROCESSING" + ], + "is-read-only": false, + "uml-name": "_7HZcEPm3EeaOH6heSczBpQ" + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.yin.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.yin.json new file mode 100755 index 000000000..ae603d518 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-core-model-conditional-packages.yin.json @@ -0,0 +1,79 @@ +{
+ "module": {
+ "name": "onf-core-model-conditional-packages",
+ "onf-core-model-conditional-packages": {
+ "equipment-pac": {
+ "type": "list",
+ "key": "equipment",
+ "equipment-capability": {
+ "name": "equipment-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "equipment-configuration": {
+ "name": "equipment-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "equipment-status": {
+ "name": "equipment-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "equipment-current-problems": {
+ "name": "equipment-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ }
+ },
+ "holder-pac": {
+ "type": "list",
+ "key": "holder",
+ "holder-capability": {
+ "name": "holder-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "holder-configuration": {
+ "name": "holder-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "holder-status": {
+ "name": "holder-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "holder-current-problems": {
+ "name": "holder-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ }
+ },
+ "connector-pac": {
+ "type": "list",
+ "key": "connector",
+ "connector-capability": {
+ "name": "connector-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "connector-configuration": {
+ "name": "connector-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "connector-status": {
+ "name": "connector-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "connector-current-problems": {
+ "name": "connector-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ }
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.schema-information.json new file mode 100644 index 000000000..50a8d3bac --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.schema-information.json @@ -0,0 +1,76 @@ +{ + "schema-information": { + "ethernet-pac": { + "id": "ethernet-pac", + "uml-id": "_fytUABOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "Ethernet_Pac" + }, + "layer-protocol": { + "id": "layer-protocol", + "uml-id": "_D0ijgBOwEeeV4YL-goyoXw", + "uml-type": "ownedAttribute", + "type": "../OnfModel/CoreModel.uml#_gROecFYXEeOVGaP4lO41SQ", + "order-number": 1, + "is-read-only": false, + "is-key": 1, + "uml-name": "_layerProtocol" + }, + "ethernet-capability": { + "id": "ethernet-capability", + "uml-id": "_1ukHUBOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetCapability" + }, + "ethernet-configuration": { + "id": "ethernet-configuration", + "uml-id": "_mZ64kBOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetConfiguration" + }, + "ethernet-status": { + "id": "ethernet-status", + "uml-id": "_3WQd4BOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetStatus" + }, + "ethernet-current-problems": { + "id": "ethernet-current-problems", + "uml-id": "_-VkZYBOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetCurrentProblems" + }, + "ethernet-current-performance": { + "id": "ethernet-current-performance", + "uml-id": "_4nyXMBOvEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetCurrentPerformance" + }, + "ethernet-historical-performances": { + "id": "ethernet-historical-performances", + "uml-id": "_A2670BOwEeeV4YL-goyoXw", + "uml-type": "uml:Class", + "is-read-only": false, + "uml-name": "EthernetHistoricalPerformances" + }, + "vlan-id": { + "id": "vlan-id", + "uml-id": "_14axcBOwEeeV4YL-goyoXw", + "uml-type": "ownedAttribute", + "type": "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer", + "order-number": 1, + "is-read-only": false, + "description": [ + "value = 0: frames on ingress must be untagged, frames on egress get untagged; value = any other positive integer < 4096: frames on ingress must be tagged with this VLAN ID, frames on egress either already have or get this VLAN ID attached;" + ], + "uml-name": "vlanId", + "controlType": "number" + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.yin.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.yin.json new file mode 100755 index 000000000..67cedf4dc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ethernet-conditional-packages.yin.json @@ -0,0 +1,41 @@ +{
+ "module": {
+ "name": "onf-ethernet-conditional-packages",
+ "onf-ethernet-conditional-packages": {
+ "ethernet-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "ethernet-capability": {
+ "name": "ethernet-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "ethernet-configuration": {
+ "name": "ethernet-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "ethernet-status": {
+ "name": "ethernet-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "ethernet-current-problems": {
+ "name": "ethernet-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "ethernet-current-performance": {
+ "name": "ethernet-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "ethernet-historical-performances": {
+ "name": "ethernet-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ptp-dataset.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ptp-dataset.schema-information.json new file mode 100644 index 000000000..5c6e41a9d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/onf-ptp-dataset.schema-information.json @@ -0,0 +1,435 @@ +{ + "schema-information": { + "instance-number": { + "id": "instance-number", + "type": "uint16", + "order-number": 1, + "is-read-only": true, + "description": ["There is only one clock per device in the 4th PoC - value 1 should be used as instance-number."] + }, + "two-step-flag": { + "id": "two-step-flag", + "type": "boolean", + "order-number": 80, + "is-read-only": true, + "description": ["Indicates whether PTP clock is a two-step clock"] + }, + "clock-quality": { + "id": "clock-quality", + "type": "", + "order-number": 6, + "is-read-only": true, + "description": [""] + }, + "clock-class": { + "id": "clock-class", + "type": "", + "order-number": 7, + "is-read-only": true, + "description": ["Clock Class acc. to IEEE 1588-2008, 7.6.2.4 and ITU-T G.8275.1, 6.4"] + }, + "clock-accuracy": { + "id": "clock-accuracy", + "type": "", + "order-number": 8, + "is-read-only": true, + "description": ["Clock accuracy acc. to IEEE 1588-2008, 7.6.2.5 and ITU-T G.8275.1, 6.3.5"] + }, + "offset-scaled-log-variance": { + "id": "offset-scaled-log-variance", + "type": "", + "order-number": 9, + "is-read-only": true, + "description": ["Offset of scaled log variance acc. to IEEE 1588-2008, 7.6.3.5 and ITU-T G.8275.1, 6.3.5"] + }, + "priority1": { + "id": "priority1", + "type": "number", + "min": 0, + "max": 255, + "order-number": 10, + "is-read-only": true, + "description": ["Priority 1 acc. to IEEE 1588-2008, 7.6.2.2"] + }, + "priority2": { + "id": "priority2", + "type": "number", + "min": 0, + "max": 255, + "order-number": 11, + "is-read-only": false, + "description": ["Priority 2 acc. to IEEE 1588-2008, 7.6.2.3"] + }, + "domain-number": { + "id": "domain-number", + "type": "number", + "min": 24, + "max": 43, + "order-number": 12, + "is-read-only": false, + "description": ["PTP domain number acc. to IEEE 1588-2008, 7.1. See ptpDS.domainNumber."] + }, + "slave-only": { + "id": "slave-only", + "type": "boolean", + "order-number": 81, + "is-read-only": false, + "description": ["Indicates whether PTP clock may only operate as SC. See IEEE 1588-2008, 9.2."] + }, + "current-ds": { + "id": "current-ds", + "type": "", + "order-number": 14, + "is-read-only": true, + "description": [""] + }, + "steps-removed": { + "id": "steps-removed", + "type": "", + "order-number": 15, + "is-read-only": true, + "description": ["Number of communication paths traversed between local clock and GM"] + }, + "offset-from-master": { + "id": "offset-from-master", + "type": "", + "order-number": 16, + "is-read-only": true, + "unit": "ns*2^16", + "description": ["Time off-set from master"] + }, + "mean-path-delay": { + "id": "mean-path-delay", + "type": "", + "order-number": 17, + "is-read-only": true, + "unit": "ns*2^16", + "description": ["Mean propagation time between master and slave"] + }, + "parrent-ds": { + "id": "parrent-ds", + "type": "", + "order-number": 18, + "is-read-only": true, + "description": [""] + }, + "parent-port-identity": { + "id": "parent-port-identity", + "type": "", + "order-number": 19, + "is-read-only": true, + "description": [""] + }, + "parent-stats": { + "id": "parent-stats", + "type": "", + "order-number": 22, + "is-read-only": true, + "description": ["Indicates whether there are valid parent stats."] + }, + "observed-parent-offset-scaled-log-variance": { + "id": "observed-parent-offset-scaled-log-variance", + "type": "", + "order-number": 23, + "is-read-only": true, + "description": ["Estimate of parent's clock PTP variance as observed by slave clock acc. to IEEE 1588-2008, 7.6.4.4."] + }, + "observed-parent-clock-phase-change-rate": { + "id": "observed-parent-clock-phase-change-rate", + "type": "", + "order-number": 24, + "is-read-only": true, + "description": ["Estimate of parent's clock PTP phase change rate as observed by slave clock acc. to IEEE 1588-2008, 7.6.4.4."] + }, + "grandmaster-identity": { + "id": "grandmaster-identity", + "type": "", + "order-number": 25, + "is-read-only": true, + "description": ["Grandmaster clock ID acc. to IEEE 1588-2008, 7.6.2.1"] + }, + "grandmaster-clock-quality": { + "id": "grandmaster-clock-quality", + "type": "", + "order-number": 26, + "is-read-only": true, + "description": [""] + }, + "grandmaster-priority1": { + "id": "grandmaster-priority1", + "type": "", + "order-number": 30, + "is-read-only": true, + "description": ["Grandmaster's priority 1 acc. to IEEE 1588-2008, 7.6.2.2"] + }, + "grandmaster-priority2": { + "id": "grandmaster-priority2", + "type": "", + "order-number": 31, + "is-read-only": true, + "description": ["Grandmaster's priority 2 acc. to IEEE 1588-2008, 7.6.2.3"] + }, + "time-properties-ds": { + "id": "time-properties-ds", + "type": "", + "order-number": 32, + "is-read-only": true, + "description": [""] + }, + "current-utc-offset-valid": { + "id": "current-utc-offset-valid", + "type": "", + "order-number": 33, + "is-read-only": true, + "description": ["Indicates wheterh current UTC offset is correct."] + }, + "current-utc-offset": { + "id": "current-utc-offset", + "type": "", + "order-number": 34, + "is-read-only": true, + "description": ["Offset between TAI and UTC acc. to IEEE 1588-2008, 7.2.3"] + }, + "leap59": { + "id": "leap59", + "type": "", + "order-number": 35, + "is-read-only": true, + "description": ["Inidcates that last minute of current UTC day has 59 seconds."] + }, + "leap61": { + "id": "leap61", + "type": "", + "order-number": 36, + "is-read-only": true, + "description": ["Inidcates that last minute of current UTC day has 61 seconds."] + }, + "time-tracable": { + "id": "time-tracable", + "type": "", + "order-number": 37, + "is-read-only": true, + "description": ["Indicates that current UTC offset and timescale are traceable to a PRC"] + }, + "frequency-tracable": { + "id": "frequency-tracable", + "type": "", + "order-number": 38, + "is-read-only": true, + "description": ["Indicates that frequency determining timescale is traceable to a PRC"] + }, + "ptp-timescale": { + "id": "ptp-timescale", + "type": "", + "order-number": 39, + "is-read-only": true, + "description": ["Indicates thet timescale of grandmaster clock is PTP."] + }, + "time-source": { + "id": "time-source", + "type": "", + "order-number": 40, + "is-read-only": true, + "description": ["Time source used by grandmaster. See IEEE 1588-2008, 7.6.2.6."] + }, + "port-state": { + "id": "port-state", + "type": "", + "order-number": 45, + "is-read-only": true, + "description": ["State of this local port"] + }, + "log-min-delay-req-interval": { + "id": "log-min-delay-req-interval", + "type": "", + "order-number": 46, + "is-read-only": true, + "description": ["Minimum permitted mean time interval between successive Delay_Req messages"] + }, + "peer-mean-path-delay": { + "id": "peer-mean-path-delay", + "type": "", + "order-number": 47, + "is-read-only": true, + "unit": "ns*2^16", + "description": ["Not applicable with this profile"] + }, + "log-announce-interval": { + "id": "log-announce-interval", + "type": "", + "order-number": 48, + "is-read-only": true, + "description": ["Mean time interval between successive Announce messages"] + }, + "announce-receipt-timeout": { + "id": "announce-receipt-timeout", + "type": "", + "order-number": 49, + "is-read-only": true, + "description": ["Number of announce intervals w/o announce message before timeout acc. to IEEE 1588-2008, 7.7.3.1."] + }, + "log-sync-interval": { + "id": "log-sync-interval", + "type": "", + "order-number": 50, + "is-read-only": true, + "description": ["Mean SyncInterval for multicast messages"] + }, + "delay-mechanism": { + "id": "delay-mechanism", + "type": "string", + "controlType": "text", + "order-number": 51, + "is-read-only": true, + "description": ["Delay mechanism acc. to IEEE 1588-2008, 8.2.5.4.4."] + }, + "version-number": { + "id": "version-number", + "type": "", + "order-number": 53, + "is-read-only": true, + "description": ["PTP version used on this port"] + }, + "transparent-clock-default-ds": { + "id": "transparent-clock-default-ds", + "type": "", + "order-number": 54, + "is-read-only": true, + "description": [""] + }, + "number-ports": { + "id": "number-ports", + "type": "", + "order-number": -6, + "is-read-only": true, + "description": ["Number of ports of the device"] + }, + "primary-domain": { + "id": "primary-domain", + "type": "", + "order-number": 58, + "is-read-only": true, + "description": ["Domain number of primary syntonization domain acc. to IEEE 1588-2008, 10.1"] + }, + "transparent-clock-port-ds-list": { + "id": "transparent-clock-port-ds-list", + "type": "", + "order-number": 59, + "is-read-only": true, + "description": [""] + }, + "log-min-pdelay-req-interval": { + "id": "log-min-pdelay-req-interval", + "type": "", + "order-number": 63, + "is-read-only": true, + "description": ["Not applicable with this profile"] + }, + "faulty-flag": { + "id": "faulty-flag", + "type": "", + "order-number": 64, + "is-read-only": true, + "description": ["Indicates whether port is faulty."] + }, + "default-ds": { + "id": "default-ds", + "type": "", + "order-number": 68, + "is-read-only": true, + "description": [""] + }, + "local-priority": { + "id": "local-priority", + "type": "number", + "min": 1, + "max": 255, + "order-number": 69, + "is-read-only": true, + "description": ["See ITU-T G.8275.1, 6.3.2."] + }, + "max-steps-removed": { + "id": "max-steps-removed", + "type": "number", + "min": 1, + "max": 255, + "order-number": 70, + "is-read-only": true, + "description": ["See ITU-T G.8275.1, 6.3."] + }, + "port-ds-list": { + "id": "port-ds-list", + "type": "", + "order-number": 73, + "is-read-only": true, + "description": [""] + }, + "clock-identity": { + "id": "clock-identity", + "type": "", + "order-number": -10, + "is-read-only": true, + "description": ["ID of the local clock"] + }, + "port-number": { + "id": "port-number", + "type": "", + "order-number": 76, + "is-read-only": true, + "description": ["Port number of this port on the local clock"] + }, + "onf-ptp-dataset:master-only": { + "id": "onf-ptp-dataset:master-only", + "type": "boolean", + "order-number": 83, + "is-read-only": false, + "description": ["Indicates that port can only be a master."] + }, + "onf-ptp-dataset:local-priority": { + "id": "onf-ptp-dataset:local-priority", + "type": "number", + "min":1, + "max":255, + "order-number": -2, + "is-read-only": false, + "description": ["Local priority as used for Alternate BMCA. See ITU-T G.8275.1, 6.3.2."] + }, + "onf-ptp-dataset:designated-enabled": { + "id": "onf-ptp-dataset:designated-enabled", + "type": "boolean", + "order-number": 82, + "is-read-only": false, + "description": ["A PTP Port needs to be enabled by management acc. to IEEE 1588-2008, 9.2."] + }, + "onf-ptp-dataset:delay-asymmetry": { + "id": "onf-ptp-dataset:delay-asymmetry", + "type": "number", + "order-number": 80, + "is-read-only": true, + "description": ["Known path asymmetry in ns acc. to IEEE 1588-2008, 7.4.2."] + }, + "onf-ptp-dataset:logical-termination-point": { + "id": "onf-ptp-dataset:logical-termination-point ", + "type": "string", + "order-number": 81, + "is-read-only": true, + "description": [""] + }, + "onf-ptp-dataset:multicast-mac-address": { + "id": "onf-ptp-dataset:multicast-mac-address", + "type": "", + "order-number": -5, + "is-read-only": true, + "description": ["In 4th PoC the value is fixed."] + }, + "onf-ptp-dataset:max-steps-removed": { + "id": "onf-ptp-dataset:max-steps-removed", + "type": "number", + "min":1, + "max":255, + "order-number": 70, + "is-read-only": false, + "description": ["See ITU-T G.8275.1, 6.3."] + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/otn-odu-conditional-packages.yin.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/otn-odu-conditional-packages.yin.json new file mode 100644 index 000000000..3091cc0de --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/otn-odu-conditional-packages.yin.json @@ -0,0 +1,75 @@ +{
+ "module": {
+ "name": "otn-odu-conditional-packages",
+ "otn-odu-conditional-packages": {
+ "otn-odu-connection-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "otn-odu-connection-capability": {
+ "name": "otn-odu-connection-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "otn-odu-connection-configuration": {
+ "name": "otn-odu-connection-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "otn-odu-connection-status": {
+ "name": "otn-odu-connection-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "otn-odu-connection-current-problems": {
+ "name": "otn-odu-connection-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "otn-odu-connection-current-performance": {
+ "name": "otn-odu-connection-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "otn-odu-connection-historical-performances": {
+ "name": "otn-odu-connection-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ },
+ "otn-odu-termination-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "otn-odu-termination-capability": {
+ "name": "otn-odu-termination-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "otn-odu-termination-configuration": {
+ "name": "otn-odu-termination-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "otn-odu-termination-status": {
+ "name": "otn-odu-termination-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "otn-odu-termination-current-problems": {
+ "name": "otn-odu-termination-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "otn-odu-termination-current-performance": {
+ "name": "otn-odu-termination-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "otn-odu-termination-historical-performances": {
+ "name": "otn-odu-termination-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/photonic-media@2018-09-24.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/photonic-media@2018-09-24.schema-information.json new file mode 100644 index 000000000..381dd77dd --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/photonic-media@2018-09-24.schema-information.json @@ -0,0 +1,168 @@ +{ "schama-information": { + +"photonic-media": { +"id": "photonic-media", +"is-read-only": false, +"description": ["This module contains a collection of YANG definitions for managing Optical networks. This model is for vendor agnostic management of Optical Transport."] +}, +"non-alarmed": { +"id": "non-alarmed", +"is-read-only": false, +"description": ["none"] +}, +"warning": { +"id": "warning", +"is-read-only": false, +"description": ["none"] +}, +"minor": { +"id": "minor", +"is-read-only": false, +"description": ["none"] +}, +"major": { +"id": "major", +"is-read-only": false, +"description": ["none"] +}, +"critical": { +"id": "critical", +"is-read-only": false, +"description": ["none"] +}, +"severity-type": { +"id": "severity-type", +"is-read-only": false, +"description": ["According to ITU-T M.3160"] +}, +"fec-properties-pac": { +"id": "fec-properties-pac", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-performance-type-g": { +"id": "otsi-interface-performance-type-g", +"is-read-only": false, +"description": ["none"] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-current-performance-type-g": { +"id": "otsi-interface-current-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into current performance information by inheriting from TAPI OAM current data."] +}, +"performance-data": { +"id": "performance-data", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-historical-performance-type-g": { +"id": "otsi-interface-historical-performance-type-g", +"is-read-only": false, +"description": ["Turns performance information into historical performance information by inheriting from TAPI OAM History data."] +}, +"current-performance-data-list": { +"id": "current-performance-data-list", +"is-read-only": false, +"description": ["At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."] +}, +"otsi-interface-current-performance-g": { +"id": "otsi-interface-current-performance-g", +"is-read-only": false, +"description": ["Aggregated performance information of the air interface at a particular moment."] +}, +"historical-performance-data-list": { +"id": "historical-performance-data-list", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-historical-performances-g": { +"id": "otsi-interface-historical-performances-g", +"is-read-only": false, +"description": ["Aggregated performance information of the air interface for a pre-defined measurement interval."] +}, +"problem-name": { +"id": "problem-name", +"is-read-only": false, +"description": ["Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms"] +}, +"otsi-interface-current-problem-type-g": { +"id": "otsi-interface-current-problem-type-g", +"is-read-only": false, +"description": ["none"] +}, +"current-problem-list": { +"id": "current-problem-list", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-current-problems-g": { +"id": "otsi-interface-current-problems-g", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol": { +"id": "layer-protocol", +"is-read-only": false, +"description": ["CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"] +}, +"otsi-interface-capability": { +"id": "otsi-interface-capability", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-configuration": { +"id": "otsi-interface-configuration", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-status": { +"id": "otsi-interface-status", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-current-problems": { +"id": "otsi-interface-current-problems", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-current-performance": { +"id": "otsi-interface-current-performance", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-historical-performances": { +"id": "otsi-interface-historical-performances", +"is-read-only": false, +"description": ["none"] +}, +"otsi-interface-pac": { +"id": "otsi-interface-pac", +"is-read-only": false, +"description": ["none"] +}, +"sequence-number": { +"id": "sequence-number", +"is-read-only": false, +"description": ["Unique sequence number of the current problem object."] +}, +"time-stamp": { +"id": "time-stamp", +"is-read-only": false, +"description": ["Time and date of the problem."] +}, +"problem-severity": { +"id": "problem-severity", +"is-read-only": false, +"description": ["Severity of the alarm."] +}, +"otsi-current-problem-g": { +"id": "otsi-current-problem-g", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/photonic-media@2018-0924.yin.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/photonic-media@2018-0924.yin.json new file mode 100644 index 000000000..11bf0f11c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/photonic-media@2018-0924.yin.json @@ -0,0 +1,41 @@ +{
+ "module": {
+ "name": "photonic-media",
+ "photonic-media": {
+ "otsi-interface-pac": {
+ "type": "list",
+ "key": "layer-protocol",
+ "otsi-interface-capability": {
+ "name": "otsi-interface-capability",
+ "local-name": "capability",
+ "type": "container"
+ },
+ "otsi-interface-configuration": {
+ "name": "otsi-interface-configuration",
+ "local-name": "configuration",
+ "type": "container"
+ },
+ "otsi-interface-status": {
+ "name": "otsi-interface-status",
+ "local-name": "status",
+ "type": "container"
+ },
+ "otsi-interface-current-problems": {
+ "name": "otsi-interface-current-problems",
+ "local-name": "current-problems",
+ "type": "container"
+ },
+ "otsi-interface-current-performance": {
+ "name": "otsi-interface-current-performance",
+ "local-name": "current-performance",
+ "type": "container"
+ },
+ "otsi-interface-historical-performances": {
+ "name": "otsi-interface-historical-performances",
+ "local-name": "historical-performances",
+ "type": "container"
+ }
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/plannedNetworkElements.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/plannedNetworkElements.json new file mode 100644 index 000000000..576ca3a43 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/plannedNetworkElements.json @@ -0,0 +1,46 @@ +{"planned-network-elements":{ + +"ADVA-EthSwitch-1":{"id":"ADVA-EthSwitch-1","name":"ADVA-EthSwitch-1","siteRef":"Berlin-north-east","radioType":"FSP 150"}, +"ADVA-EthSwitch-2":{"id":"ADVA-EthSwitch-2","name":"ADVA-EthSwitch-2","siteRef":"Berlin-south","radioType":"FSP 150"}, +"ADVA-ROADM-A":{"id":"ADVA-ROADM-A","name":"ADVA-ROADM-A","siteRef":"Berlin-north-east","radioType":"FSP 3000R7"}, +"ADVA-ROADM-B":{"id":"ADVA-ROADM-B","name":"ADVA-ROADM-B","siteRef":"Berlin-south","radioType":"FSP 3000R7"}, +"ADVA-ROADM-C":{"id":"ADVA-ROADM-C","name":"ADVA-ROADM-C","siteRef":"Berlin-north-west","radioType":"FSP 3000R7"}, +"Nokia-eNodeB-1":{"id":"Nokia-eNodeB-1","name":"Nokia-eNodeB-1","siteRef":"Berlin-south-west","radioType":"Nokia-eNodeB-1"}, + +"ZTE-24":{"id":"ZTE-24","name":"ZTE-24","siteRef":"Bejing","radioType":"ZXMW NR8120A"}, +"ZTE-81":{"id":"ZTE-81","name":"ZTE-81","siteRef":"Tianjin","radioType":"ZXMW NR8120A"}, +"SIAE-S1":{"id":"SIAE-S1","name":"SIAE-S1","siteRef":"Milan","radioType":"AGS-20"}, +"SIAE-S2":{"id":"SIAE-S2","name":"SIAE-S2","siteRef":"Malpensa","radioType":"AGS-20"}, +"DragonWave-A1":{"id":"DragonWave-A1","name":"DragonWave-A1","siteRef":"Ottawa-Center","radioType":"Horizon Compact Plus"}, +"DragonWave-Z1":{"id":"DragonWave-Z1","name":"DragonWave-Z1","siteRef":"Ottawa-Airport","radioType":"Horizon Compact Plus"}, +"DragonWave-A2":{"id":"DragonWave-A2","name":"DragonWave-A2","siteRef":"Ottawa-Airport","radioType":"Horizon Compact Plus"}, +"DragonWave-Z2":{"id":"DragonWave-Z2","name":"DragonWave-Z2","siteRef":"Ottawa-south-west","radioType":"Horizon Compact Plus"}, +"DragonWave-A3":{"id":"DragonWave-A3","name":"DragonWave-A3","siteRef":"Ottawa-south-west","radioType":"Horizon Quantum"}, +"DragonWave-Z3":{"id":"DragonWave-Z3","name":"DragonWave-Z3","siteRef":"Ottawa-Center","radioType":"Horizon Quantum"}, +"Intracom-A":{"id":"Intracom-A","name":"Intracom-A","siteRef":"Peania ","radioType":"OSDR-13H13"}, +"Intracom-Z":{"id":"Intracom-Z","name":"Intracom-Z","siteRef":"Athens","radioType":"OSDR-13H13"}, +"DragonWave-A4":{"id":"DragonWave-A4","name":"DragonWave-A4","siteRef":"Middletown-north","radioType":"Horizon Quantum"}, +"DragonWave-Z4":{"id":"DragonWave-Z4","name":"DragonWave-Z4","siteRef":"Middletown-south-east","radioType":"Horizon Quantum"}, +"Nokia-61":{"id":"Nokia-61","name":"Nokia-61","siteRef":"Middletown-south-east","radioType":"Nokia 7.1"}, +"Nokia-62":{"id":"Nokia-62","name":"Nokia-62","siteRef":"Middletown-south-west","radioType":"Nokia 7.1"}, +"Ericsson-23":{"id":"Ericsson-23","name":"Ericsson-23","siteRef":"Middletown-south-west","radioType":"MINI-LINK 6352"}, +"Ericsson-24":{"id":"Ericsson-24","name":"Ericsson-24","siteRef":"Middletown-north","radioType":"MINI-LINK 6352"}, +"CommScope-DAS":{"id":"CommScope-DAS","name":"CommScope-DAS","siteRef":"owl-north","radioType":"Andrew "}, +"Ericsson-A1":{"id":"Ericsson-A1","name":"Ericsson-A1","siteRef":"owl-north","radioType":"MINI-LINK 6352"}, +"Ericsson-B1":{"id":"Ericsson-B1","name":"Ericsson-B1","siteRef":"owl-north-east","radioType":"MINI-LINK 6352"}, +"Ericsson-A2":{"id":"Ericsson-A2","name":"Ericsson-A2","siteRef":"owl-north-east","radioType":"MINI-LINK 6352"}, +"Ericsson-B2":{"id":"Ericsson-B2","name":"Ericsson-B2","siteRef":"owl-east","radioType":"MINI-LINK 6352"}, +"Ceragon-A1":{"id":"Ceragon-A1","name":"Ceragon-A1","siteRef":"Tel-Aviv","radioType":"Simulator"}, +"Ceragon-Z1":{"id":"Ceragon-Z1","name":"Ceragon-Z1","siteRef":"Tel-Aviv-north","radioType":"Simulator"}, +"Ceragon-A2":{"id":"Ceragon-A2","name":"Ceragon-A2","siteRef":"Bucharest-north","radioType":"Simulator"}, +"Ceragon-Z2":{"id":"Ceragon-Z2","name":"Ceragon-Z2","siteRef":"Politehnica-Bucharest","radioType":"Simulator"}, +"AltioStar-RRH-1":{"id":"AltioStar-RRH-1","name":"AltioStar-RRH-1","siteRef":"Petrol-Bedminster","radioType":"LTE-RRH-44380400"}, +"AltioStar-RRH-2":{"id":"AltioStar-RRH-2","name":"AltioStar-RRH-2","siteRef":"US78/US287","radioType":"LTE-RRH-44380400"}, +"WinLab-RRH-1":{"id":"WinLab-RRH-1","name":"WinLab-RRH-1","siteRef":"owl-south-east","radioType":"WhiteBox"}, +"WinLab-RRH-2":{"id":"WinLab-RRH-2","name":"WinLab-RRH-2","siteRef":"owl-south","radioType":"WhiteBox"}, +"WinLab-RRH-3":{"id":"WinLab-RRH-3","name":"WinLab-RRH-3","siteRef":"owl-south-west","radioType":"WhiteBox"}, +"WinLab-RRH-4":{"id":"WinLab-RRH-4","name":"WinLab-RRH-4","siteRef":"owl-west","radioType":"WhiteBox"}, +"WinLab-RRH-5":{"id":"WinLab-RRH-5","name":"WinLab-RRH-5","siteRef":"owl-north-west","radioType":"WhiteBox"}, +"WinLab-RRH-6":{"id":"WinLab-RRH-6","name":"WinLab-RRH-6","siteRef":"owl-north","radioType":"WhiteBox"} + +}}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/site-link.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/site-link.json new file mode 100644 index 000000000..c3e8110d9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/site-link.json @@ -0,0 +1,73 @@ +{ + "site-link": { +"OWL-DC-Prague-DC":{"id":"OWL-DC-Prague-DC","name":"OWL-DC-Prague-DC","siteA":"OWL-DC","siteZ":"Prague-DC","siteNameA":"OWL-DC","siteNameZ":"Prague-DC","length":"6616.552612","azimuthAZ":"48.118867","azimuthZA":"298.029587","type":"data-center-interconnect"}, +"OWL-DC-Berlin-DC":{"id":"OWL-DC-Berlin-DC","name":"OWL-DC-Berlin-DC","siteA":"OWL-DC","siteZ":"Berlin-DC","siteNameA":"OWL-DC","siteNameZ":"Berlin-DC","length":"6429.038709","azimuthAZ":"45.947698","azimuthZA":"296.078746","type":"data-center-interconnect"}, +"Berlin-DC-Berlin-north-east":{"id":"Berlin-DC-Berlin-north-east","name":"Berlin-DC-Berlin-north-east","siteA":"Berlin-DC","siteZ":"Berlin-north-east","siteNameA":"Berlin-DC","siteNameZ":"Berlin-north-east","length":"3.380233","azimuthAZ":"41.694092","azimuthZA":"221.720463","type":"control"}, +"Berlin-DC-Berlin-south":{"id":"Berlin-DC-Berlin-south","name":"Berlin-DC-Berlin-south","siteA":"Berlin-DC","siteZ":"Berlin-south","siteNameA":"Berlin-DC","siteNameZ":"Berlin-south","length":"4.643667","azimuthAZ":"179.964138","azimuthZA":"359.964172","type":"control"}, +"Berlin-DC-Berlin-north-west":{"id":"Berlin-DC-Berlin-north-west","name":"Berlin-DC-Berlin-north-west","siteA":"Berlin-DC","siteZ":"Berlin-north-west","siteNameA":"Berlin-DC","siteNameZ":"Berlin-north-west","length":"5.138948","azimuthAZ":"313.910582","azimuthZA":"133.867146","type":"control"}, +"Prague-DC-Bejing":{"id":"Prague-DC-Bejing","name":"Prague-DC-Bejing","siteA":"Prague-DC","siteZ":"Bejing","siteNameA":"Prague-DC","siteNameZ":"Bejing","length":"7447.977801","azimuthAZ":"54.538202","azimuthZA":"316.994495","type":"control"}, +"Prague-DC-Tianjin":{"id":"Prague-DC-Tianjin","name":"Prague-DC-Tianjin","siteA":"Prague-DC","siteZ":"Tianjin","siteNameA":"Prague-DC","siteNameZ":"Tianjin","length":"7555.330624","azimuthAZ":"54.770138","azimuthZA":"317.494792","type":"control"}, +"Prague-DC-Milan":{"id":"Prague-DC-Milan","name":"Prague-DC-Milan","siteA":"Prague-DC","siteZ":"Milan","siteNameA":"Prague-DC","siteNameZ":"Milan","length":"644.680616","azimuthAZ":"219.303918","azimuthZA":"35.422554","type":"control"}, +"Prague-DC-Malpensa":{"id":"Prague-DC-Malpensa","name":"Prague-DC-Malpensa","siteA":"Prague-DC","siteZ":"Malpensa","siteNameA":"Prague-DC","siteNameZ":"Malpensa","length":"652.094431","azimuthAZ":"222.787408","azimuthZA":"38.559020","type":"control"}, +"Prague-DC-Ottawa-Center":{"id":"Prague-DC-Ottawa-Center","name":"Prague-DC-Ottawa-Center","siteA":"Prague-DC","siteZ":"Ottawa-Center","siteNameA":"Prague-DC","siteNameZ":"Ottawa-Center","length":"6367.273928","azimuthAZ":"303.185800","azimuthZA":"49.712092","type":"control"}, +"Prague-DC-Ottawa-Airport":{"id":"Prague-DC-Ottawa-Airport","name":"Prague-DC-Ottawa-Airport","siteA":"Prague-DC","siteZ":"Ottawa-Airport","siteNameA":"Prague-DC","siteNameZ":"Ottawa-Airport","length":"6330.919511","azimuthAZ":"302.923958","azimuthZA":"49.965269","type":"control"}, +"Prague-DC-Ottawa-south-west":{"id":"Prague-DC-Ottawa-south-west","name":"Prague-DC-Ottawa-south-west","siteA":"Prague-DC","siteZ":"Ottawa-south-west","siteNameA":"Prague-DC","siteNameZ":"Ottawa-south-west","length":"6350.304846","azimuthAZ":"303.180200","azimuthZA":"49.829862","type":"control"}, +"Bejing-Tianjin":{"id":"Bejing-Tianjin","name":"Bejing-Tianjin","siteA":"Bejing","siteZ":"Tianjin","siteNameA":"Bejing","siteNameZ":"Tianjin","length":"109.963655","azimuthAZ":"149.549553","azimuthZA":"329.960966","type":"traffic"}, +"Berlin-north-east-Berlin-south":{"id":"Berlin-north-east-Berlin-south","name":"Berlin-north-east-Berlin-south","siteA":"Berlin-north-east","siteZ":"Berlin-south","siteNameA":"Berlin-north-east","siteNameZ":"Berlin-south","length":"7.511203","azimuthAZ":"197.420857","azimuthZA":"17.394527","type":"traffic"}, +"Berlin-south-Berlin-north-west":{"id":"Berlin-south-Berlin-north-west","name":"Berlin-south-Berlin-north-west","siteA":"Berlin-south","siteZ":"Berlin-north-west","siteNameA":"Berlin-south","siteNameZ":"Berlin-north-west","length":"9.005241","azimuthAZ":"335.704657","azimuthZA":"155.661200","type":"traffic"}, +"Berlin-north-west-Berlin-north-east":{"id":"Berlin-north-west-Berlin-north-east","name":"Berlin-north-west-Berlin-north-east","siteA":"Berlin-north-west","siteZ":"Berlin-north-east","siteNameA":"Berlin-north-west","siteNameZ":"Berlin-north-east","length":"6.040787","azimuthAZ":"99.870133","azimuthZA":"279.939953","type":"traffic"}, +"Ottawa-Airport-Ottawa-south-west":{"id":"Ottawa-Airport-Ottawa-south-west","name":"Ottawa-Airport-Ottawa-south-west","siteA":"Ottawa-Airport","siteZ":"Ottawa-south-west","siteNameA":"Ottawa-Airport","siteNameZ":"Ottawa-south-west","length":"30.774747","azimuthAZ":"280.991574","azimuthZA":"100.716701","type":"traffic"}, +"Ottawa-Center-Ottawa-Airport":{"id":"Ottawa-Center-Ottawa-Airport","name":"Ottawa-Center-Ottawa-Airport","siteA":"Ottawa-Center","siteZ":"Ottawa-Airport","siteNameA":"Ottawa-Center","siteNameZ":"Ottawa-Airport","length":"43.808751","azimuthAZ":"83.558464","azimuthZA":"263.953862","type":"traffic"}, +"Ottawa-south-west-Ottawa-Center":{"id":"Ottawa-south-west-Ottawa-Center","name":"Ottawa-south-west-Ottawa-Center","siteA":"Ottawa-south-west","siteZ":"Ottawa-Center","siteNameA":"Ottawa-south-west","siteNameZ":"Ottawa-Center","length":"16.977148","azimuthAZ":"231.597684","azimuthZA":"51.476879","type":"traffic"}, +"Milan-Malpensa":{"id":"Milan-Malpensa","name":"Milan-Malpensa","siteA":"Milan","siteZ":"Malpensa","siteNameA":"Milan","siteNameZ":"Malpensa","length":"40.038623","azimuthAZ":"296.489417","azimuthZA":"116.160408","type":"traffic"}, +"Berlin-south-Berlin-south-west":{"id":"Berlin-south-Berlin-south-west","name":"Berlin-south-Berlin-south-west","siteA":"Berlin-south","siteZ":"Berlin-south-west","siteNameA":"Berlin-south","siteNameZ":"Berlin-south-west","length":"2.224253","azimuthAZ":"270.013016","azimuthZA":"89.986984","type":"traffic"}, +"Athens-Peania":{"id":"Athens-Peania","name":"Athens-Peania","siteA":"Athens","siteZ":"Peania","siteNameA":"Athens","siteNameZ":"Peania","length":"15.888460","azimuthAZ":"110.077853","azimuthZA":"290.182549","type":"traffic"}, +"Prague-DC-Peania":{"id":"Prague-DC-Peania","name":"Prague-DC-Peania","siteA":"Prague-DC","siteZ":"Peania","siteNameA":"Prague-DC","siteNameZ":"Peania","length":"1544.391815","azimuthAZ":"147.341741","azimuthZA":"333.955286","type":"control"}, +"Prague-DC-Athens":{"id":"Prague-DC-Athens","name":"Prague-DC-Athens","siteA":"Prague-DC","siteZ":"Athens","siteNameA":"Prague-DC","siteNameZ":"Athens","length":"1532.957557","azimuthAZ":"147.756559","azimuthZA":"334.253368","type":"control"}, +"OWL-DC-AT&T-Labs":{"id":"OWL-DC-AT&T-Labs","name":"OWL-DC-AT&T-Labs","siteA":"OWL-DC","siteZ":"AT&T-Labs","siteNameA":"OWL-DC","siteNameZ":"AT&T-Labs","length":"27.561824","azimuthAZ":"106.456393","azimuthZA":"286.658844","type":"data-center-interconnect"}, +"Tel-Aviv-Tel-Aviv-north":{"id":"Tel-Aviv-Tel-Aviv-north","name":"Tel-Aviv-Tel-Aviv-north","siteA":"Tel-Aviv","siteZ":"Tel-Aviv-north","siteNameA":"Tel-Aviv","siteNameZ":"Tel-Aviv-north","length":"8.563466","azimuthAZ":"33.551029","azimuthZA":"213.577785","type":"traffic"}, +"Prague-DC-Tel-Aviv":{"id":"Prague-DC-Tel-Aviv","name":"Prague-DC-Tel-Aviv","siteA":"Prague-DC","siteZ":"Tel-Aviv","siteNameA":"Prague-DC","siteNameZ":"Tel-Aviv","length":"2612.860322","azimuthAZ":"132.178310","azimuthZA":"325.846592","type":"control"}, +"Prague-DC-Tel-Aviv-north":{"id":"Prague-DC-Tel-Aviv-north","name":"Prague-DC-Tel-Aviv-north","siteA":"Prague-DC","siteZ":"Tel-Aviv-north","siteNameA":"Prague-DC","siteNameZ":"Tel-Aviv-north","length":"2609.622822","azimuthAZ":"131.999388","azimuthZA":"325.709247","type":"control"}, +"Bucharest-north-Politehnica-Bucharest":{"id":"Bucharest-north-Politehnica-Bucharest","name":"Bucharest-north-Politehnica-Bucharest","siteA":"Bucharest-north","siteZ":"Politehnica-Bucharest","siteNameA":"Bucharest-north","siteNameZ":"Politehnica-Bucharest","length":"3.117085","azimuthAZ":"237.672480","azimuthZA":"57.649251","type":"traffic"}, +"Prague-DC-Bucharest-north":{"id":"Prague-DC-Bucharest-north","name":"Prague-DC-Bucharest-north","siteA":"Prague-DC","siteZ":"Bucharest-north","siteNameA":"Prague-DC","siteNameZ":"Bucharest-north","length":"1078.751804","azimuthAZ":"121.021694","azimuthZA":"309.618632","type":"control"}, +"Prague-DC-Politehnica-Bucharest":{"id":"Prague-DC-Politehnica-Bucharest","name":"Prague-DC-Politehnica-Bucharest","siteA":"Prague-DC","siteZ":"Politehnica-Bucharest","siteNameA":"Prague-DC","siteNameZ":"Politehnica-Bucharest","length":"1077.789821","azimuthAZ":"121.179995","azimuthZA":"309.751443","type":"control"}, +"AT&T-Labs-Middletown-north":{"id":"AT&T-Labs-Middletown-north","name":"AT&T-Labs-Middletown-north","siteA":"AT&T-Labs","siteZ":"Middletown-north","siteNameA":"AT&T-Labs","siteNameZ":"Middletown-north","length":"2.902164","azimuthAZ":"27.192037","azimuthZA":"207.202193","type":"control"}, +"AT&T-Labs-Middletown-south-east":{"id":"AT&T-Labs-Middletown-south-east","name":"AT&T-Labs-Middletown-south-east","siteA":"AT&T-Labs","siteZ":"Middletown-south-east","siteNameA":"AT&T-Labs","siteNameZ":"Middletown-south-east","length":"3.988925","azimuthAZ":"90.260555","azimuthZA":"270.291084","type":"control"}, +"AT&T-Labs-Middletown-south-west":{"id":"AT&T-Labs-Middletown-south-west","name":"AT&T-Labs-Middletown-south-west","siteA":"AT&T-Labs","siteZ":"Middletown-south-west","siteNameA":"AT&T-Labs","siteNameZ":"Middletown-south-west","length":".382001","azimuthAZ":"164.604183","azimuthZA":"344.604959","type":"control"}, +"Middletown-south-west-Middletown-north":{"id":"Middletown-south-west-Middletown-north","name":"Middletown-south-west-Middletown-north","siteA":"Middletown-south-west","siteZ":"Middletown-north","siteNameA":"Middletown-south-west","siteNameZ":"Middletown-north","length":"3.193888","azimuthAZ":"22.550318","azimuthZA":"202.559698","type":"traffic"}, +"Middletown-north-Middletown-south-east":{"id":"Middletown-north-Middletown-south-east","name":"Middletown-north-Middletown-south-east","siteA":"Middletown-north","siteZ":"Middletown-south-east","siteNameA":"Middletown-north","siteNameZ":"Middletown-south-east","length":"3.721223","azimuthAZ":"134.323008","azimuthZA":"314.343388","type":"traffic"}, +"Middletown-south-east-Middletown-south-west":{"id":"Middletown-south-east-Middletown-south-west","name":"Middletown-south-east-Middletown-south-west","siteA":"Middletown-south-east","siteZ":"Middletown-south-west","siteNameA":"Middletown-south-east","siteNameZ":"Middletown-south-west","length":"3.903206","azimuthAZ":"264.883660","azimuthZA":"84.853909","type":"traffic"}, +"OWL-DC-owl-north":{"id":"OWL-DC-owl-north","name":"OWL-DC-owl-north","siteA":"OWL-DC","siteZ":"owl-north","siteNameA":"OWL-DC","siteNameZ":"owl-north","length":"1.522605","azimuthAZ":"350.001998","azimuthZA":"169.999969","type":"control"}, +"OWL-DC-owl-north-east":{"id":"OWL-DC-owl-north-east","name":"OWL-DC-owl-north-east","siteA":"OWL-DC","siteZ":"owl-north-east","siteNameA":"OWL-DC","siteNameZ":"owl-north-east","length":"1.522567","azimuthAZ":"34.994401","azimuthZA":"215.001103","type":"control"}, +"OWL-DC-owl-east":{"id":"OWL-DC-owl-east","name":"OWL-DC-owl-east","siteA":"OWL-DC","siteZ":"owl-east","siteNameA":"OWL-DC","siteNameZ":"owl-east","length":"1.522583","azimuthAZ":"79.994074","azimuthZA":"260.005579","type":"control"}, +"owl-north-owl-north-east":{"id":"owl-north-owl-north-east","name":"owl-north-owl-north-east","siteA":"owl-north","siteZ":"owl-north-east","siteNameA":"owl-north","siteNameZ":"owl-north-east","length":"1.165150","azimuthAZ":"102.497861","azimuthZA":"282.506593","type":"traffic"}, +"owl-north-east-owl-east":{"id":"owl-north-east-owl-east","name":"owl-north-east-owl-east","siteA":"owl-north-east","siteZ":"owl-east","siteNameA":"owl-north-east","siteNameZ":"owl-east","length":"1.165321","azimuthAZ":"147.500226","azimuthZA":"327.505031","type":"traffic"}, +"OWL-DC-AT&T-Bedminster":{"id":"OWL-DC-AT&T-Bedminster","name":"OWL-DC-AT&T-Bedminster","siteA":"OWL-DC","siteZ":"AT&T-Bedminster","siteNameA":"OWL-DC","siteNameZ":"AT&T-Bedminster","length":"27.437179","azimuthAZ":"324.485016","azimuthZA":"144.362105","type":"data-center-interconnect"}, +"AT&T-Bedminster-Petrol-Bedminster":{"id":"AT&T-Bedminster-Petrol-Bedminster","name":"AT&T-Bedminster-Petrol-Bedminster","siteA":"AT&T-Bedminster","siteZ":"Petrol-Bedminster","siteNameA":"AT&T-Bedminster","siteNameZ":"Petrol-Bedminster","length":"1.819953","azimuthAZ":"312.782236","azimuthZA":"132.771911","type":"control"}, +"AT&T-Bedminster-US78/US287":{"id":"AT&T-Bedminster-US78/US287","name":"AT&T-Bedminster-US78/US287","siteA":"AT&T-Bedminster","siteZ":"US78/US287","siteNameA":"AT&T-Bedminster","siteNameZ":"US78/US287","length":"2.954947","azimuthAZ":"197.233564","azimuthZA":"17.226804","type":"control"}, +"San-Ramon-DC-sr-east":{"id":"San-Ramon-DC-sr-east","name":"San-Ramon-DC-sr-east","siteA":"San-Ramon-DC","siteZ":"sr-east","siteNameA":"San-Ramon-DC","siteNameZ":"sr-east","length":"1.580364","azimuthAZ":"80.363571","azimuthZA":"260.374428","type":"control"}, +"San-Ramon-DC-sr-west":{"id":"San-Ramon-DC-sr-west","name":"San-Ramon-DC-sr-west","siteA":"San-Ramon-DC","siteZ":"sr-west","siteNameA":"San-Ramon-DC","siteNameZ":"sr-west","length":"1.580413","azimuthAZ":"260.374731","azimuthZA":"80.363875","type":"control"}, +"San-Ramon-DC-sr-north":{"id":"San-Ramon-DC-sr-north","name":"San-Ramon-DC-sr-north","siteA":"San-Ramon-DC","siteZ":"sr-north","siteNameA":"San-Ramon-DC","siteNameZ":"sr-north","length":"1.524434","azimuthAZ":"349.619184","azimuthZA":"169.617269","type":"control"}, +"San-Ramon-DC-sr-north-east":{"id":"San-Ramon-DC-sr-north-east","name":"San-Ramon-DC-sr-north-east","siteA":"San-Ramon-DC","siteZ":"sr-north-east","siteNameA":"San-Ramon-DC","siteNameZ":"sr-north-east","length":"1.542411","azimuthAZ":"36.034000","azimuthZA":"216.040324","type":"control"}, +"San-Ramon-DC-sr-north-west":{"id":"San-Ramon-DC-sr-north-west","name":"San-Ramon-DC-sr-north-west","siteA":"San-Ramon-DC","siteZ":"sr-north-west","siteNameA":"San-Ramon-DC","siteNameZ":"sr-north-west","length":"1.562756","azimuthAZ":"303.980237","azimuthZA":"123.971206","type":"control"}, +"San-Ramon-DC-sr-south":{"id":"San-Ramon-DC-sr-south","name":"San-Ramon-DC-sr-south","siteA":"San-Ramon-DC","siteZ":"sr-south","siteNameA":"San-Ramon-DC","siteNameZ":"sr-south","length":"1.524443","azimuthAZ":"169.615417","azimuthZA":"349.617331","type":"control"}, +"San-Ramon-DC-sr-south-east":{"id":"San-Ramon-DC-sr-south-east","name":"San-Ramon-DC-sr-south-east","siteA":"San-Ramon-DC","siteZ":"sr-south-east","siteNameA":"San-Ramon-DC","siteNameZ":"sr-south-east","length":"1.562870","azimuthAZ":"123.968387","azimuthZA":"303.977417","type":"control"}, +"San-Ramon-DC-sr-south-west":{"id":"San-Ramon-DC-sr-south-west","name":"San-Ramon-DC-sr-south-west","siteA":"San-Ramon-DC","siteZ":"sr-south-west","siteNameA":"San-Ramon-DC","siteNameZ":"sr-south-west","length":"1.542492","azimuthAZ":"216.044457","azimuthZA":"36.038135","type":"control"}, +"OWL-DC-San-Ramon-DC":{"id":"OWL-DC-San-Ramon-DC","name":"OWL-DC-San-Ramon-DC","siteA":"OWL-DC","siteZ":"San-Ramon-DC","siteNameA":"OWL-DC","siteNameZ":"San-Ramon-DC","length":"4060.445351","azimuthAZ":"281.575258","azimuthZA":"70.526201","type":"data-center-interconnect"}, +"Telia-Lab-ADVA-R1":{"id":"Telia-Lab-ADVA-R1","name":"Telia-Lab-ADVA-R1","siteA":"Telia-Lab","siteZ":"ADVA-R1","siteNameA":"Telia-Lab","siteNameZ":"Telia-Lab","length":"90.381269","azimuthAZ":"249.241681","azimuthZA":"67.971555","type":"control"}, +"Telia-Lab-ADVA-R2":{"id":"Telia-Lab-ADVA-R2","name":"Telia-Lab-ADVA-R2","siteA":"Telia-Lab","siteZ":"ADVA-R2","siteNameA":"Telia-Lab","siteNameZ":"Telia-Lab","length":"56.942201","azimuthAZ":"305.498100","azimuthZA":"124.787029","type":"control"}, +"Telia-Lab-ADVA-R3":{"id":"Telia-Lab-ADVA-R3","name":"Telia-Lab-ADVA-R3","siteA":"Telia-Lab","siteZ":"ADVA-R3","siteNameA":"Telia-Lab","siteNameZ":"Telia-Lab","length":"49.939534","azimuthAZ":"257.937548","azimuthZA":"77.198580","type":"control"}, +"Telia-Lab-Coriant-R1":{"id":"Telia-Lab-Coriant-R1","name":"Telia-Lab-Coriant-R1","siteA":"Telia-Lab","siteZ":"Coriant-R1","siteNameA":"Telia-Lab","siteNameZ":"Telia-Lab","length":"59.605946","azimuthAZ":"82.969019","azimuthZA":"263.869082","type":"control"}, +"Telia-Lab-Coriant-R2":{"id":"Telia-Lab-Coriant-R2","name":"Telia-Lab-Coriant-R2","siteA":"Telia-Lab","siteZ":"Coriant-R2","siteNameA":"Telia-Lab","siteNameZ":"Telia-Lab","length":"32.655947","azimuthAZ":"354.958972","azimuthZA":"174.914963","type":"control"}, +"Telia-Lab-Coriant-R3":{"id":"Telia-Lab-Coriant-R3","name":"Telia-Lab-Coriant-R3","siteA":"Telia-Lab","siteZ":"Coriant-R3","siteNameA":"Telia-Lab","siteNameZ":"Telia-Lab","length":"11.365269","azimuthAZ":"198.597495","azimuthZA":"18.542652","type":"control"}, +"ADVA-R1-ADVA-R2":{"id":"ADVA-R1-ADVA-R2","name":"ADVA-R1-ADVA-R2","siteA":"ADVA-R1","siteZ":"ADVA-R2","siteNameA":"ADVA-R1","siteNameZ":"ADVA-R2","length":"75.455304","azimuthAZ":"29.104148","azimuthZA":"209.666223","type":"traffic"}, +"ADVA-R2-ADVA-R3":{"id":"ADVA-R2-ADVA-R3","name":"ADVA-R2-ADVA-R3","siteA":"ADVA-R2","siteZ":"ADVA-R3","siteNameA":"ADVA-R2","siteNameZ":"ADVA-R3","length":"43.571339","azimuthAZ":"182.550186","azimuthZA":"2.520807","type":"traffic"}, +"ADVA-R3-ADVA-R1":{"id":"ADVA-R3-ADVA-R1","name":"ADVA-R3-ADVA-R1","siteA":"ADVA-R3","siteZ":"ADVA-R1","siteNameA":"ADVA-R3","siteNameZ":"ADVA-R1","length":"41.704912","azimuthAZ":"238.072776","azimuthZA":"57.541137","type":"traffic"}, +"Coriant-R1-Coriant-R3":{"id":"Coriant-R1-Coriant-R3","name":"Coriant-R1-Coriant-R3","siteA":"Coriant-R1","siteZ":"Coriant-R3","siteNameA":"Coriant-R1","siteNameZ":"Coriant-R3","length":"65.330426","azimuthAZ":"254.844777","azimuthZA":"73.890302","type":"traffic"}, +"Coriant-R2-Coriant-R1":{"id":"Coriant-R2-Coriant-R1","name":"Coriant-R2-Coriant-R1","siteA":"Coriant-R2","siteZ":"Coriant-R1","siteNameA":"Coriant-R2","siteNameZ":"Coriant-R1","length":"66.963183","azimuthAZ":"112.092350","azimuthZA":"293.037795","type":"traffic"}, +"Coriant-R3-Coriant-R2":{"id":"Coriant-R3-Coriant-R2","name":"Coriant-R3-Coriant-R2","siteA":"Coriant-R3","siteZ":"Coriant-R2","siteNameA":"Coriant-R3","siteNameZ":"Coriant-R2","length":"43.308017","azimuthAZ":".944183","azimuthZA":"180.955123","type":"traffic"}, +"ADVA-R2-Coriant-R2":{"id":"ADVA-R2-Coriant-R2","name":"ADVA-R2-Coriant-R2","siteA":"ADVA-R2","siteZ":"Coriant-R2","siteNameA":"ADVA-R2","siteNameZ":"Coriant-R2","length":"43.492285","azimuthAZ":"89.993872","azimuthZA":"270.661932","type":"traffic"}, +"ADVA-R3-Coriant-R3":{"id":"ADVA-R3-Coriant-R3","name":"ADVA-R3-Coriant-R3","siteA":"ADVA-R3","siteZ":"Coriant-R3","siteNameA":"ADVA-R3","siteNameZ":"Coriant-R3","length":"45.213525","azimuthAZ":"89.686360","azimuthZA":"270.370141","type":"traffic"} + + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/site.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/site.json new file mode 100644 index 000000000..77f12e976 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/site.json @@ -0,0 +1,55 @@ +{ + "site": { +"Bejing":{"id":"Bejing","name":"Bejing","location":{"lat":39.979597,"lon":116.369298},"amsl-ground":55,"type":"physical-network-function","references":{"site-links":["Prague-DC-Bejing","Bejing-Tianjin"],"network-elements":["ZTE-24"]}}, +"Berlin-DC":{"id":"Berlin-DC","name":"Berlin-DC","location":{"lat":52.501305,"lon":13.366917},"amsl-ground":52,"type":"data-center","references":{"site-links":["OWL-DC-Berlin-DC","Berlin-DC-Berlin-north-east","Berlin-DC-Berlin-south","Berlin-DC-Berlin-north-west"],"network-elements":[]}}, +"Berlin-north-east":{"id":"Berlin-north-east","name":"Berlin-north-east","location":{"lat":52.524000,"lon":13.400152},"amsl-ground":60,"type":"physical-network-function","references":{"site-links":["Berlin-DC-Berlin-north-east","Berlin-north-east-Berlin-south","Berlin-north-west-Berlin-north-east"],"network-elements":["ADVA-EthSwitch-1","ADVA-ROADM-A"]}}, +"Berlin-north-west":{"id":"Berlin-north-west","name":"Berlin-north-west","location":{"lat":52.533346,"lon":13.312181},"amsl-ground":35,"type":"physical-network-function","references":{"site-links":["Berlin-DC-Berlin-north-west","Berlin-south-Berlin-north-west","Berlin-north-west-Berlin-north-east"],"network-elements":["ADVA-ROADM-C"]}}, +"Berlin-south":{"id":"Berlin-south","name":"Berlin-south","location":{"lat":52.459541,"lon":13.366960},"amsl-ground":35,"type":"physical-network-function","references":{"site-links":["Berlin-DC-Berlin-south","Berlin-north-east-Berlin-south","Berlin-south-Berlin-north-west","Berlin-south-Berlin-south-west"],"network-elements":["ADVA-EthSwitch-2","ADVA-ROADM-B"]}}, +"Berlin-south-west":{"id":"Berlin-south-west","name":"Berlin-south-west","location":{"lat":52.459541,"lon":13.334130},"amsl-ground":59,"type":"physical-network-function","references":{"site-links":["Berlin-south-Berlin-south-west"],"network-elements":["Nokia-eNodeB-1"]}}, +"Malpensa":{"id":"Malpensa","name":"Malpensa","location":{"lat":45.630000,"lon":8.723056},"amsl-ground":220,"type":"physical-network-function","references":{"site-links":["Prague-DC-Malpensa","Milan-Malpensa"],"network-elements":["SIAE-S2"]}}, +"Milan":{"id":"Milan","name":"Milan","location":{"lat":45.470312,"lon":9.183940},"amsl-ground":122,"type":"physical-network-function","references":{"site-links":["Prague-DC-Milan","Milan-Malpensa"],"network-elements":["SIAE-S1"]}}, +"Ottawa-Airport":{"id":"Ottawa-Airport","name":"Ottawa-Airport","location":{"lat":45.293149,"lon":-75.523889},"amsl-ground":113,"type":"physical-network-function","references":{"site-links":["Prague-DC-Ottawa-Airport","Ottawa-Airport-Ottawa-south-west","Ottawa-Center-Ottawa-Airport"],"network-elements":["DragonWave-Z1","DragonWave-A2"]}}, +"Ottawa-Center":{"id":"Ottawa-Center","name":"Ottawa-Center","location":{"lat":45.250298,"lon":-76.080431},"amsl-ground":87,"type":"physical-network-function","references":{"site-links":["Prague-DC-Ottawa-Center","Ottawa-Center-Ottawa-Airport","Ottawa-south-west-Ottawa-Center"],"network-elements":["DragonWave-A1","DragonWave-Z3"]}}, +"Ottawa-south-west":{"id":"Ottawa-south-west","name":"Ottawa-south-west","location":{"lat":45.345269,"lon":-75.910469},"amsl-ground":111,"type":"physical-network-function","references":{"site-links":["Prague-DC-Ottawa-south-west","Ottawa-Airport-Ottawa-south-west","Ottawa-south-west-Ottawa-Center"],"network-elements":["DragonWave-Z2","DragonWave-A3"]}}, +"OWL-DC":{"id":"OWL-DC","name":"OWL-DC","location":{"lat":40.468102,"lon":-74.447872},"amsl-ground":32,"type":"data-center","references":{"site-links":["OWL-DC-Prague-DC","OWL-DC-Berlin-DC","OWL-DC-AT&T-Labs","OWL-DC-owl-north","OWL-DC-owl-north-east","OWL-DC-owl-east","OWL-DC-AT&T-Bedminster","OWL-DC-San-Ramon-DC"],"network-elements":[]}}, +"owl-east":{"id":"owl-east","name":"owl-east","location":{"lat":40.470480,"lon":-74.430146},"amsl-ground":25,"type":"physical-network-function","references":{"site-links":["OWL-DC-owl-east","owl-north-east-owl-east"],"network-elements":["Ericsson-B2","Airspan-LTE-BS4"]}}, +"owl-west":{"id":"owl-west","name":"owl-west","location":{"lat":40.465724,"lon":-74.465599},"amsl-ground":37,"type":"physical-network-function","references":{"site-links":[],"network-elements":["Airspan-LTE-BS2"]}}, +"owl-north":{"id":"owl-north","name":"owl-north","location":{"lat":40.481588,"lon":-74.450998},"amsl-ground":37,"type":"physical-network-function","references":{"site-links":["OWL-DC-owl-north","owl-north-owl-north-east"],"network-elements":["Commscope-DAS-01","Ericsson-A1","NEC-WiMAX-BS3"]}}, +"owl-north-east":{"id":"owl-north-east","name":"owl-north-east","location":{"lat":40.479319,"lon":-74.437548},"amsl-ground":32,"type":"physical-network-function","references":{"site-links":["OWL-DC-owl-north-east","owl-north-owl-north-east","owl-north-east-owl-east"],"network-elements":["Ericsson-B1","Ericsson-A2","Airspan-LTE-BS3"]}}, +"owl-north-west":{"id":"owl-north-west","name":"owl-north-west","location":{"lat":40.475956,"lon":-74.462617},"amsl-ground":37,"type":"physical-network-function","references":{"site-links":[],"network-elements":["NEC-WiMAX-BS2"]}}, +"owl-south":{"id":"owl-south","name":"owl-south","location":{"lat":40.454616,"lon":-74.444747},"amsl-ground":2,"type":"physical-network-function","references":{"site-links":[],"network-elements":["Airspan-WiMAX-BS1"]}}, +"owl-south-east":{"id":"owl-south-east","name":"owl-south-east","location":{"lat":40.460248,"lon":-74.433127},"amsl-ground":28,"type":"physical-network-function","references":{"site-links":[],"network-elements":["NEC-WiMAX-BS1","Commscope-OneCell-01","Ericsson-LTE-Sim-05","Nokia-LTE-Sim-06","Samsung-LTE-Sim-07"]}}, +"owl-south-west":{"id":"owl-south-west","name":"owl-south-west","location":{"lat":40.456885,"lon":-74.458197},"amsl-ground":18,"type":"physical-network-function","references":{"site-links":[],"network-elements":["Airspan-LTE-BS1"]}}, +"Prague-DC":{"id":"Prague-DC","name":"Prague-DC","location":{"lat":50.082702,"lon":14.419391},"amsl-ground":192,"type":"data-center","references":{"site-links":["OWL-DC-Prague-DC","Prague-DC-Bejing","Prague-DC-Tianjin","Prague-DC-Milan","Prague-DC-Malpensa","Prague-DC-Ottawa-Center","Prague-DC-Ottawa-Airport","Prague-DC-Ottawa-south-west","Prague-DC-Peania","Prague-DC-Athens","Prague-DC-Tel-Aviv","Prague-DC-Tel-Aviv-north","Prague-DC-Bucharest-north","Prague-DC-Politehnica-Bucharest"],"network-elements":[]}}, +"Tianjin":{"id":"Tianjin","name":"Tianjin","location":{"lat":39.125229,"lon":117.015355},"amsl-ground":4,"type":"physical-network-function","references":{"site-links":["Prague-DC-Tianjin","Bejing-Tianjin"],"network-elements":["ZTE-81"]}}, +"Peania":{"id":"Peania","name":"Peania","location":{"lat":37.941722,"lon":23.873501},"amsl-ground":95,"type":"physical-network-function","references":{"site-links":["Athens-Peania","Prague-DC-Peania"],"network-elements":[]}}, +"Athens":{"id":"Athens","name":"Athens","location":{"lat":37.990900,"lon":23.703320},"amsl-ground":88,"type":"physical-network-function","references":{"site-links":["Athens-Peania","Prague-DC-Athens"],"network-elements":["Intracom-Z"]}}, +"AT&T-Labs":{"id":"AT&T-Labs","name":"AT&T-Labs","location":{"lat":40.397461,"lon":-74.135717},"amsl-ground":49,"type":"data-center","references":{"site-links":["OWL-DC-AT&T-Labs","AT&T-Labs-Middletown-north","AT&T-Labs-Middletown-south-east","AT&T-Labs-Middletown-south-west"],"network-elements":[]}}, +"Middletown-north":{"id":"Middletown-north","name":"Middletown-north","location":{"lat":40.420676,"lon":-74.120049},"amsl-ground":15,"type":"physical-network-function","references":{"site-links":["AT&T-Labs-Middletown-north","Middletown-south-west-Middletown-north","Middletown-north-Middletown-south-east"],"network-elements":["DragonWave-A4","Ericsson-24"]}}, +"Middletown-south-east":{"id":"Middletown-south-east","name":"Middletown-south-east","location":{"lat":40.397288,"lon":-74.088610},"amsl-ground":32,"type":"physical-network-function","references":{"site-links":["AT&T-Labs-Middletown-south-east","Middletown-north-Middletown-south-east","Middletown-south-east-Middletown-south-west"],"network-elements":["DragonWave-Z4","Nokia-61"]}}, +"Middletown-south-west":{"id":"Middletown-south-west","name":"Middletown-south-west","location":{"lat":40.394148,"lon":-74.134519},"amsl-ground":48,"type":"physical-network-function","references":{"site-links":["AT&T-Labs-Middletown-south-west","Middletown-south-west-Middletown-north","Middletown-south-east-Middletown-south-west"],"network-elements":["Nokia-62","Ericsson-23"]}}, +"Tel-Aviv":{"id":"Tel-Aviv","name":"Tel-Aviv","location":{"lat":32.111466,"lon":34.836747},"amsl-ground":23,"type":"physical-network-function","references":{"site-links":["Tel-Aviv-Tel-Aviv-north","Prague-DC-Tel-Aviv"],"network-elements":["Ceragon-A1"]}}, +"Tel-Aviv-north":{"id":"Tel-Aviv-north","name":"Tel-Aviv-north","location":{"lat":32.175641,"lon":34.887036},"amsl-ground":70,"type":"physical-network-function","references":{"site-links":["Tel-Aviv-Tel-Aviv-north","Prague-DC-Tel-Aviv-north"],"network-elements":["Ceragon-Z1"]}}, +"Bucharest-north":{"id":"Bucharest-north","name":"Bucharest-north","location":{"lat":44.448833,"lon":26.091029},"amsl-ground":97,"type":"physical-network-function","references":{"site-links":["Bucharest-north-Politehnica-Bucharest","Prague-DC-Bucharest-north"],"network-elements":["Ceragon-A2"]}}, +"Politehnica-Bucharest":{"id":"Politehnica-Bucharest","name":"Politehnica-Bucharest","location":{"lat":44.433837,"lon":26.057854},"amsl-ground":104,"type":"physical-network-function","references":{"site-links":["Bucharest-north-Politehnica-Bucharest","Prague-DC-Politehnica-Bucharest"],"network-elements":["Ceragon-Z2"]}}, +"AT&T-Bedminster":{"id":"AT&T-Bedminster","name":"AT&T-Bedminster","location":{"lat":40.668802,"lon":-74.636862},"amsl-ground":104,"type":"data-center","references":{"site-links":["OWL-DC-AT&T-Bedminster","AT&T-Bedminster-Petrol-Bedminster","AT&T-Bedminster-US78/US287"],"network-elements":[]}}, +"Petrol-Bedminster":{"id":"Petrol-Bedminster","name":"Petrol-Bedminster","location":{"lat":40.679919,"lon":-74.652703},"amsl-ground":104,"type":"physical-network-function","references":{"site-links":["AT&T-Bedminster-Petrol-Bedminster"],"network-elements":["AltioStar-RRH-1"]}}, +"US78/US287":{"id":"US78/US287","name":"US78/US287","location":{"lat":40.643419,"lon":-74.647239},"amsl-ground":104,"type":"physical-network-function","references":{"site-links":["AT&T-Bedminster-US78/US287"],"network-elements":["AltioStar-RRH-2"]}}, +"San-Ramon-DC":{"id":"San-Ramon-DC","name":"San-Ramon-DC","location":{"lat":37.766128,"lon":-121.963456},"amsl-ground":32,"type":"data-center","references":{"site-links":["San-Ramon-DC-sr-east","San-Ramon-DC-sr-west","San-Ramon-DC-sr-north","San-Ramon-DC-sr-north-east","San-Ramon-DC-sr-north-west","San-Ramon-DC-sr-south","San-Ramon-DC-sr-south-east","San-Ramon-DC-sr-south-west","OWL-DC-San-Ramon-DC"],"network-elements":[]}}, +"sr-east":{"id":"sr-east","name":"sr-east","location":{"lat":37.768506,"lon":-121.945729},"amsl-ground":25,"type":"physical-network-function","references":{"site-links":["San-Ramon-DC-sr-east"],"network-elements":[]}}, +"sr-west":{"id":"sr-west","name":"sr-west","location":{"lat":37.763750,"lon":-121.981183},"amsl-ground":37,"type":"physical-network-function","references":{"site-links":["San-Ramon-DC-sr-west"],"network-elements":[]}}, +"sr-north":{"id":"sr-north","name":"sr-north","location":{"lat":37.779614,"lon":-121.966582},"amsl-ground":37,"type":"physical-network-function","references":{"site-links":["San-Ramon-DC-sr-north"],"network-elements":[]}}, +"sr-north-east":{"id":"sr-north-east","name":"sr-north-east","location":{"lat":37.777345,"lon":-121.953132},"amsl-ground":32,"type":"physical-network-function","references":{"site-links":["San-Ramon-DC-sr-north-east"],"network-elements":[]}}, +"sr-north-west":{"id":"sr-north-west","name":"sr-north-west","location":{"lat":37.773982,"lon":-121.978201},"amsl-ground":37,"type":"physical-network-function","references":{"site-links":["San-Ramon-DC-sr-north-west"],"network-elements":[]}}, +"sr-south":{"id":"sr-south","name":"sr-south","location":{"lat":37.752642,"lon":-121.960330},"amsl-ground":2,"type":"physical-network-function","references":{"site-links":["San-Ramon-DC-sr-south"],"network-elements":[]}}, +"sr-south-east":{"id":"sr-south-east","name":"sr-south-east","location":{"lat":37.758274,"lon":-121.948711},"amsl-ground":28,"type":"physical-network-function","references":{"site-links":["San-Ramon-DC-sr-south-east"],"network-elements":[]}}, +"sr-south-west":{"id":"sr-south-west","name":"sr-south-west","location":{"lat":37.754911,"lon":-121.973780},"amsl-ground":18,"type":"physical-network-function","references":{"site-links":["San-Ramon-DC-sr-south-west"],"network-elements":[]}}, +"Telia-Lab":{"id":"Telia-Lab","name":"Telia-Lab","location":{"lat":59.357212,"lon":17.974854},"amsl-ground":18,"type":"data-center","references":{"site-links":["Telia-Lab-ADVA-R1","Telia-Lab-ADVA-R2","Telia-Lab-ADVA-R3","Telia-Lab-Coriant-R1","Telia-Lab-Coriant-R2","Telia-Lab-Coriant-R3"],"network-elements":[]}}, +"ADVA-R1":{"id":"ADVA-R1","name":"ADVA-R1","location":{"lat":59.060684,"lon":16.496340},"amsl-ground":18,"type":"physical-network-function","references":{"site-links":["Telia-Lab-ADVA-R1","ADVA-R1-ADVA-R2","ADVA-R3-ADVA-R1"],"network-elements":["ADVA-R1","Coriant-204"]}}, +"ADVA-R2":{"id":"ADVA-R2","name":"ADVA-R2","location":{"lat":59.652001,"lon":17.149636},"amsl-ground":18,"type":"physical-network-function","references":{"site-links":["Telia-Lab-ADVA-R2","ADVA-R1-ADVA-R2","ADVA-R2-ADVA-R3","ADVA-R2-Coriant-R2"],"network-elements":["ADVA-R2","Coriant-202"]}}, +"ADVA-R3":{"id":"ADVA-R3","name":"ADVA-R3","location":{"lat":59.260519,"lon":17.115525},"amsl-ground":18,"type":"physical-network-function","references":{"site-links":["Telia-Lab-ADVA-R3","ADVA-R2-ADVA-R3","ADVA-R3-ADVA-R1","ADVA-R3-Coriant-R3"],"network-elements":["ADVA-R3"]}}, +"Coriant-R1":{"id":"Coriant-R1","name":"Coriant-R1","location":{"lat":59.418652,"lon":19.020660},"amsl-ground":18,"type":"physical-network-function","references":{"site-links":["Telia-Lab-Coriant-R1","Coriant-R1-Coriant-R3","Coriant-R2-Coriant-R1"],"network-elements":["Coriant-R1","Coriant-201"]}}, +"Coriant-R2":{"id":"Coriant-R2","name":"Coriant-R2","location":{"lat":59.649762,"lon":17.923781},"amsl-ground":18,"type":"physical-network-function","references":{"site-links":["Telia-Lab-Coriant-R2","Coriant-R2-Coriant-R1","Coriant-R3-Coriant-R2","ADVA-R2-Coriant-R2"],"network-elements":["Coriant-R2"]}}, +"Coriant-R3":{"id":"Coriant-R3","name":"Coriant-R3","location":{"lat":59.260319,"lon":17.911079},"amsl-ground":18,"type":"physical-network-function","references":{"site-links":["Telia-Lab-Coriant-R3","Coriant-R1-Coriant-R3","Coriant-R3-Coriant-R2","ADVA-R3-Coriant-R3"],"network-elements":["Coriant-R3","Coriant-203"]}} + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-common@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-common@2018-08-31.schema-information.json new file mode 100644 index 000000000..759437a4f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-common@2018-08-31.schema-information.json @@ -0,0 +1,738 @@ +{ "schama-information": { + +"tapi-common": { +"id": "tapi-common", +"is-read-only": false, +"description": ["This module contains TAPI Common Model definitions. Source: TapiCommon.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"service-interface-point-uuid": { +"id": "service-interface-point-uuid", +"is-read-only": false, +"description": ["none"] +}, +"service-interface-point-ref-g": { +"id": "service-interface-point-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"administrative-state": { +"id": "administrative-state", +"is-read-only": false, +"description": ["none"] +}, +"operational-state": { +"id": "operational-state", +"is-read-only": false, +"description": ["none"] +}, +"lifecycle-state": { +"id": "lifecycle-state", +"is-read-only": false, +"description": ["none"] +}, +"admin-state-pac-g": { +"id": "admin-state-pac-g", +"is-read-only": false, +"description": ["Provides state attributes that are applicable to an entity that can be administered. Such an entity also has operational and lifecycle aspects."] +}, +"uuid": { +"id": "uuid", +"is-read-only": false, +"description": ["UUID: An identifier that is universally unique within an identifier space, where the identifier space is itself globally unique, and immutable. An UUID carries no semantics with respect to the purpose or state of the entity. UUID here uses string representation as defined in RFC 4122. The canonical representation uses lowercase characters. Pattern: [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12} Example of a UUID in string representation: f81d4fae-7dec-11d0-a765-00a0c91e6bf6"] +}, +"name": { +"id": "name", +"is-read-only": false, +"description": ["List of names. A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity."] +}, +"global-class-g": { +"id": "global-class-g", +"is-read-only": false, +"description": ["The TAPI GlobalComponent serves as the super class for all TAPI entities that can be directly retrieved by their ID. As such, these are first class entities and their ID is expected to be globally unique."] +}, +"lifecycle-state": { +"id": "lifecycle-state", +"is-read-only": false, +"description": ["none"] +}, +"lifecycle-state-pac-g": { +"id": "lifecycle-state-pac-g", +"is-read-only": false, +"description": ["Provides state attributes for an entity that has lifeccycle aspects only."] +}, +"local-id": { +"id": "local-id", +"is-read-only": false, +"description": ["none"] +}, +"name": { +"id": "name", +"is-read-only": false, +"description": ["List of names. A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity."] +}, +"local-class-g": { +"id": "local-class-g", +"is-read-only": false, +"description": ["The TAPI GlobalComponent serves as the super class for all TAPI entities that can be directly retrieved by their ID. As such, these are first class entities and their ID is expected to be globally unique."] +}, +"operational-state": { +"id": "operational-state", +"is-read-only": false, +"description": ["none"] +}, +"lifecycle-state": { +"id": "lifecycle-state", +"is-read-only": false, +"description": ["none"] +}, +"operational-state-pac-g": { +"id": "operational-state-pac-g", +"is-read-only": false, +"description": ["Provides state attributes that are applicable to an entity that reflects operational aspects. Such an entity is expected to also have lifecycle aspects."] +}, +"context": { +"id": "context", +"is-read-only": false, +"description": ["none"] +}, +"service-interface-point": { +"id": "service-interface-point", +"is-read-only": false, +"description": ["none"] +}, +"tapi-context-g": { +"id": "tapi-context-g", +"is-read-only": false, +"description": ["The Network Control Domain (NCD) object class represents the scope of control that a particular SDN controller has with respect to a particular network, (i.e., encompassing a designated set of interconnected (virtual) network elements)."] +}, +"resource-spec-g": { +"id": "resource-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"service-spec-g": { +"id": "service-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["Usage of layerProtocolName [>1] in the ServiceInterfacePoint should be considered experimental"] +}, +"supported-layer-protocol-qualifier": { +"id": "supported-layer-protocol-qualifier", +"is-read-only": false, +"description": ["none"] +}, +"service-interface-point-g": { +"id": "service-interface-point-g", +"is-read-only": false, +"description": ["The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers. The structure of LTP supports all transport protocols including circuit and packet forms."] +}, +"total-potential-capacity": { +"id": "total-potential-capacity", +"is-read-only": false, +"description": ["An optimistic view of the capacity of the TopologicalEntity assuming that any shared capacity is available to be taken."] +}, +"available-capacity": { +"id": "available-capacity", +"is-read-only": false, +"description": ["Capacity available to be assigned."] +}, +"capacity-pac-g": { +"id": "capacity-pac-g", +"is-read-only": false, +"description": ["The TopologicalEntity derives capacity from the underlying realization. A TopologicalEntity may be an abstraction and virtualization of a subset of the underlying capability offered in a view or may be directly reflecting the underlying realization. A TopologicalEntity may be directly used in the view or may be assigned to another view for use. The clients supported by a multi-layer TopologicalEntity may interact such that the resources used by one client may impact those available to another. This is derived from the LTP spec details. Represents the capacity available to user (client) along with client interaction and usage. A TopologicalEntity may reflect one or more client protocols and one or more members for each profile."] +}, +"termination-direction": { +"id": "termination-direction", +"is-read-only": false, +"description": ["The overall directionality of the LP. - A BIDIRECTIONAL LP will have some SINK and/or SOURCE flowss. - A SINK LP can only contain elements with SINK flows or CONTRA_DIRECTION_SOURCE flows - A SOURCE LP can only contain SOURCE flows or CONTRA_DIRECTION_SINK flows"] +}, +"termination-state": { +"id": "termination-state", +"is-read-only": false, +"description": ["Indicates whether the layer is terminated and if so how."] +}, +"termination-pac-g": { +"id": "termination-pac-g", +"is-read-only": false, +"description": ["Each transport layer is represented by a LayerProtocol (LP) instance. The LayerProtocol instances it can be used for controlling termination and monitoring functionality. It can also be used for controlling the adaptation (i.e. encapsulation and/or multiplexing of client signal), tandem connection monitoring, traffic conditioning and/or shaping functionality at an intermediate point along a connection. Where the client – server relationship is fixed 1:1 and immutable, the layers can be encapsulated in a single LTP instance. Where the is a n:1 relationship between client and server, the layers must be split over two separate instances of LTP."] +}, +"LAYER_PROTOCOL_QUALIFIER": { +"id": "LAYER_PROTOCOL_QUALIFIER", +"is-read-only": false, +"description": ["none"] +}, +"LOCKED": { +"id": "LOCKED", +"is-read-only": false, +"description": ["Users are administratively prohibited from making use of the resource."] +}, +"UNLOCKED": { +"id": "UNLOCKED", +"is-read-only": false, +"description": ["Users are allowed to use the resource"] +}, +"administrative-state": { +"id": "administrative-state", +"is-read-only": false, +"description": ["The possible values of the administrativeState."] +}, +"date-and-time": { +"id": "date-and-time", +"is-read-only": false, +"description": ["This primitive type defines the date and time according to the following structure: yyyyMMddhhmmss.s[Z|{+|-}HHMm] where: yyyy 0000..9999 year MM 01..12 month dd 01..31 day hh 00..23 hour mm 00..59 minute ss 00..59 second s .0...9 tenth of second (set to .0 if EMS or NE cannot support this granularity) Z Z indicates UTC (rather than local time) {+|-} + or - delta from UTC HH 00..23 time zone difference in hours Mm 00..59 time zone difference in minutes."] +}, +"MINIMIZE": { +"id": "MINIMIZE", +"is-read-only": false, +"description": ["none"] +}, +"MAXIMIZE": { +"id": "MAXIMIZE", +"is-read-only": false, +"description": ["none"] +}, +"ALLOW": { +"id": "ALLOW", +"is-read-only": false, +"description": ["none"] +}, +"DISALLOW": { +"id": "DISALLOW", +"is-read-only": false, +"description": ["none"] +}, +"DONT_CARE": { +"id": "DONT_CARE", +"is-read-only": false, +"description": ["none"] +}, +"directive-value": { +"id": "directive-value", +"is-read-only": false, +"description": ["none"] +}, +"BIDIRECTIONAL": { +"id": "BIDIRECTIONAL", +"is-read-only": false, +"description": ["The Fowarding entity supports both BIDIRECTIONAL flows at all Ports (i.e. all Ports have both an INPUT flow and an OUTPUT flow defined)"] +}, +"UNIDIRECTIONAL": { +"id": "UNIDIRECTIONAL", +"is-read-only": false, +"description": ["The Forwarding entity has Ports that are either INPUT or OUTPUT. It has no BIDIRECTIONAL Ports."] +}, +"UNDEFINED_OR_UNKNOWN": { +"id": "UNDEFINED_OR_UNKNOWN", +"is-read-only": false, +"description": ["Not a normal state. The system is unable to determine the correct value."] +}, +"forwarding-direction": { +"id": "forwarding-direction", +"is-read-only": false, +"description": ["The directionality of a Forwarding entity."] +}, +"ODU": { +"id": "ODU", +"is-read-only": false, +"description": ["Models the ODU layer as per ITU-T G.872"] +}, +"ETH": { +"id": "ETH", +"is-read-only": false, +"description": ["Models the ETH layer as per ITU-T G.8010"] +}, +"DSR": { +"id": "DSR", +"is-read-only": false, +"description": ["Models a Digital Signal of an unspecified rate. This value can be used when the intent is to respresent an generic digital layer signal without making any statement on its format or overhead (processing) capabilities."] +}, +"PHOTONIC_MEDIA": { +"id": "PHOTONIC_MEDIA", +"is-read-only": false, +"description": ["Models the OCH, OTSi, OTSiA, OTSiG, OMS, OTS and Media channels as per ITU-T G.872 (2017) version 4"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["Provides a controlled list of layer protocol names and indicates the naming authority. Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference. Layer protocol names include: - Layer 1 (L1): OTU, ODU - Layer 2 (L2): Carrier Grade Ethernet (ETY, ETH), MPLS-TP (MT)"] +}, +"PLANNED": { +"id": "PLANNED", +"is-read-only": false, +"description": ["The resource is planned but is not present in the network."] +}, +"POTENTIAL_AVAILABLE": { +"id": "POTENTIAL_AVAILABLE", +"is-read-only": false, +"description": ["The supporting resources are present in the network but are shared with other clients; or require further configuration before they can be used; or both. o When a potential resource is configured and allocated to a client it is moved to the installed state for that client. o If the potential resource has been consumed (e.g. allocated to another client) it is moved to the planned state for all other clients."] +}, +"POTENTIAL_BUSY": { +"id": "POTENTIAL_BUSY", +"is-read-only": false, +"description": ["The supporting resources are present in the network but are shared with other clients; or require further configuration before they can be used; or both. o When a potential resource is configured and allocated to a client it is moved to the installed state for that client. o If the potential resource has been consumed (e.g. allocated to another client) it is moved to the planned state for all other clients."] +}, +"INSTALLED": { +"id": "INSTALLED", +"is-read-only": false, +"description": ["The resource is present in the network and is capable of providing the service expected."] +}, +"PENDING_REMOVAL": { +"id": "PENDING_REMOVAL", +"is-read-only": false, +"description": ["The resource has been marked for removal"] +}, +"lifecycle-state": { +"id": "lifecycle-state", +"is-read-only": false, +"description": ["The possible values of the lifecycleState."] +}, +"value-name": { +"id": "value-name", +"is-read-only": false, +"description": ["The name of the value. The value need not have a name."] +}, +"value": { +"id": "value", +"is-read-only": false, +"description": ["The value"] +}, +"name-and-value-g": { +"id": "name-and-value-g", +"is-read-only": false, +"description": ["A scoped name-value pair"] +}, +"DISABLED": { +"id": "DISABLED", +"is-read-only": false, +"description": ["The resource is unable to meet the SLA of the user of the resource. If no (explicit) SLA is defined the resource is disabled if it is totally inoperable and unable to provide service to the user."] +}, +"ENABLED": { +"id": "ENABLED", +"is-read-only": false, +"description": ["The resource is partially or fully operable and available for use"] +}, +"operational-state": { +"id": "operational-state", +"is-read-only": false, +"description": ["The possible values of the operationalState."] +}, +"BIDIRECTIONAL": { +"id": "BIDIRECTIONAL", +"is-read-only": false, +"description": ["The Port has both an INPUT flow and an OUTPUT flow defined."] +}, +"INPUT": { +"id": "INPUT", +"is-read-only": false, +"description": ["The Port only has definition for a flow into the Forwarding entity (i.e. an ingress flow)."] +}, +"OUTPUT": { +"id": "OUTPUT", +"is-read-only": false, +"description": ["The Port only has definition for a flow out of the Forwarding entity (i.e. an egress flow)."] +}, +"UNIDENTIFIED_OR_UNKNOWN": { +"id": "UNIDENTIFIED_OR_UNKNOWN", +"is-read-only": false, +"description": ["Not a normal state. The system is unable to determine the correct value."] +}, +"port-direction": { +"id": "port-direction", +"is-read-only": false, +"description": ["The orientation of flow at the Port of a Forwarding entity"] +}, +"SYMMETRIC": { +"id": "SYMMETRIC", +"is-read-only": false, +"description": ["none"] +}, +"ROOT": { +"id": "ROOT", +"is-read-only": false, +"description": ["none"] +}, +"LEAF": { +"id": "LEAF", +"is-read-only": false, +"description": ["none"] +}, +"TRUNK": { +"id": "TRUNK", +"is-read-only": false, +"description": ["none"] +}, +"UNKNOWN": { +"id": "UNKNOWN", +"is-read-only": false, +"description": ["none"] +}, +"port-role": { +"id": "port-role", +"is-read-only": false, +"description": ["The role of an end in the context of the function of the forwarding entity that it bounds"] +}, +"BIDIRECTIONAL": { +"id": "BIDIRECTIONAL", +"is-read-only": false, +"description": ["A Termination with both SINK and SOURCE flows."] +}, +"SINK": { +"id": "SINK", +"is-read-only": false, +"description": ["The flow is up the layer stack from the server side to the client side. Considering an example of a Termination function within the termination entity, a SINK flow: - will arrive at at the base of the termination function (the server side) where it is essentially at an INPUT to the termination component - then will be decoded and deconstructed - then relevant parts of the flow will be sent out of the termination function (the client side) where it is essentially at an OUTPUT from the termination component A SINK termination is one that only supports a SINK flow. A SINK termiation can be bound to an OUTPUT Port of a Forwarding entity"] +}, +"SOURCE": { +"id": "SOURCE", +"is-read-only": false, +"description": ["The flow is down the layer stack from the server side to the client side. Considering an example of a Termination function within the termination entity, a SOURCE flow: - will arrive at at the top of the termination function (the client side) where it is essentially at an INPUT to the termination component - then will be assembled with various overheads etc and will be coded - then coded form of the assembly of flow will be sent out of the termination function (the server side) where it is essentially at an OUTPUT from the termination component A SOURCE termination is one that only supports a SOURCE flow. A SOURCE termiation can be bound to an INPUT Port of a Forwarding entity"] +}, +"UNDEFINED_OR_UNKNOWN": { +"id": "UNDEFINED_OR_UNKNOWN", +"is-read-only": false, +"description": ["Not a normal state. The system is unable to determine the correct value."] +}, +"termination-direction": { +"id": "termination-direction", +"is-read-only": false, +"description": ["The directionality of a termination entity"] +}, +"LP_CAN_NEVER_TERMINATE": { +"id": "LP_CAN_NEVER_TERMINATE", +"is-read-only": false, +"description": ["A non-flexible case that can never be terminated."] +}, +"LT_NOT_TERMINATED": { +"id": "LT_NOT_TERMINATED", +"is-read-only": false, +"description": ["A flexible termination that can terminate but is currently not terminated."] +}, +"TERMINATED_SERVER_TO_CLIENT_FLOW": { +"id": "TERMINATED_SERVER_TO_CLIENT_FLOW", +"is-read-only": false, +"description": ["A flexible termination that is currently terminated for server to client flow only."] +}, +"TERMINATED_CLIENT_TO_SERVER_FLOW": { +"id": "TERMINATED_CLIENT_TO_SERVER_FLOW", +"is-read-only": false, +"description": ["A flexible termination that is currently terminated for client to server flow only."] +}, +"TERMINATED_BIDIRECTIONAL": { +"id": "TERMINATED_BIDIRECTIONAL", +"is-read-only": false, +"description": ["A flexible termination that is currently terminated in both directions of flow."] +}, +"LT_PERMENANTLY_TERMINATED": { +"id": "LT_PERMENANTLY_TERMINATED", +"is-read-only": false, +"description": ["A non-flexible termination that is always terminated (in both directions of flow for a bidirectional case and in the one direction of flow for both unidirectional cases)."] +}, +"TERMINATION_STATE_UNKNOWN": { +"id": "TERMINATION_STATE_UNKNOWN", +"is-read-only": false, +"description": ["There TerminationState cannot be determined."] +}, +"termination-state": { +"id": "termination-state", +"is-read-only": false, +"description": ["Provides support for the range of behaviours and specific states that an LP can take with respect to termination of the signal. Indicates to what degree the LayerTermination is terminated."] +}, +"uuid": { +"id": "uuid", +"is-read-only": false, +"description": ["The univeral ID value where the mechanism for generation is defned by some authority not directly referenced in the structure. UUID here uses string representation as defined in RFC 4122. The canonical representation uses lowercase characters. Pattern: [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12} Example of a UUID in string representation: f81d4fae-7dec-11d0-a765-00a0c91e6bf6"] +}, +"total-size": { +"id": "total-size", +"is-read-only": false, +"description": ["Total capacity of the TopologicalEntity in MB/s. In case of bandwidthProfile, this is expected to same as the committedInformationRate."] +}, +"bandwidth-profile": { +"id": "bandwidth-profile", +"is-read-only": false, +"description": ["none"] +}, +"capacity-g": { +"id": "capacity-g", +"is-read-only": false, +"description": ["Information on capacity of a particular TopologicalEntity."] +}, +"bw-profile-type": { +"id": "bw-profile-type", +"is-read-only": false, +"description": ["none"] +}, +"committed-information-rate": { +"id": "committed-information-rate", +"is-read-only": false, +"description": ["none"] +}, +"committed-burst-size": { +"id": "committed-burst-size", +"is-read-only": false, +"description": ["none"] +}, +"peak-information-rate": { +"id": "peak-information-rate", +"is-read-only": false, +"description": ["none"] +}, +"peak-burst-size": { +"id": "peak-burst-size", +"is-read-only": false, +"description": ["none"] +}, +"color-aware": { +"id": "color-aware", +"is-read-only": false, +"description": ["none"] +}, +"coupling-flag": { +"id": "coupling-flag", +"is-read-only": false, +"description": ["none"] +}, +"bandwidth-profile-g": { +"id": "bandwidth-profile-g", +"is-read-only": false, +"description": ["none"] +}, +"value": { +"id": "value", +"is-read-only": false, +"description": ["none"] +}, +"unit": { +"id": "unit", +"is-read-only": false, +"description": ["none"] +}, +"capacity-value-g": { +"id": "capacity-value-g", +"is-read-only": false, +"description": ["The Capacity (Bandwidth) values that are applicable for digital layers."] +}, +"TB": { +"id": "TB", +"is-read-only": false, +"description": ["Indicates that the integer CapacityValue is in TeraBytes"] +}, +"TBPS": { +"id": "TBPS", +"is-read-only": false, +"description": ["Indicates that the integer CapacityValue is in Terabit-per-second"] +}, +"GB": { +"id": "GB", +"is-read-only": false, +"description": ["Indicates that the integer CapacityValue is in GigaBytes"] +}, +"GBPS": { +"id": "GBPS", +"is-read-only": false, +"description": ["Indicates that the integer CapacityValue is in Gigabit-per-second"] +}, +"MB": { +"id": "MB", +"is-read-only": false, +"description": ["Indicates that the integer CapacityValue is in MegaBytes"] +}, +"MBPS": { +"id": "MBPS", +"is-read-only": false, +"description": ["Indicates that the integer CapacityValue is in Megabit-per-second"] +}, +"KB": { +"id": "KB", +"is-read-only": false, +"description": ["Indicates that the integer CapacityValue is in KiloBytes"] +}, +"KBPS": { +"id": "KBPS", +"is-read-only": false, +"description": ["Indicates that the integer CapacityValue is in Kilobit-per-second"] +}, +"GHz": { +"id": "GHz", +"is-read-only": false, +"description": ["none"] +}, +"MHz": { +"id": "MHz", +"is-read-only": false, +"description": ["none"] +}, +"capacity-unit": { +"id": "capacity-unit", +"is-read-only": false, +"description": ["none"] +}, +"MEF_10.x": { +"id": "MEF_10.x", +"is-read-only": false, +"description": ["none"] +}, +"RFC_2697": { +"id": "RFC_2697", +"is-read-only": false, +"description": ["none"] +}, +"RFC_2698": { +"id": "RFC_2698", +"is-read-only": false, +"description": ["none"] +}, +"RFC_4115": { +"id": "RFC_4115", +"is-read-only": false, +"description": ["none"] +}, +"bandwidth-profile-type": { +"id": "bandwidth-profile-type", +"is-read-only": false, +"description": ["none"] +}, +"end-time": { +"id": "end-time", +"is-read-only": false, +"description": ["none"] +}, +"start-time": { +"id": "start-time", +"is-read-only": false, +"description": ["none"] +}, +"time-range-g": { +"id": "time-range-g", +"is-read-only": false, +"description": ["none"] +}, +"value": { +"id": "value", +"is-read-only": false, +"description": ["none"] +}, +"unit": { +"id": "unit", +"is-read-only": false, +"description": ["none"] +}, +"time-period-g": { +"id": "time-period-g", +"is-read-only": false, +"description": ["none"] +}, +"YEARS": { +"id": "YEARS", +"is-read-only": false, +"description": ["none"] +}, +"MONTHS": { +"id": "MONTHS", +"is-read-only": false, +"description": ["none"] +}, +"DAYS": { +"id": "DAYS", +"is-read-only": false, +"description": ["none"] +}, +"HOURS": { +"id": "HOURS", +"is-read-only": false, +"description": ["none"] +}, +"MINUTES": { +"id": "MINUTES", +"is-read-only": false, +"description": ["none"] +}, +"SECONDS": { +"id": "SECONDS", +"is-read-only": false, +"description": ["none"] +}, +"MILLISECONDS": { +"id": "MILLISECONDS", +"is-read-only": false, +"description": ["none"] +}, +"MICROSECONDS": { +"id": "MICROSECONDS", +"is-read-only": false, +"description": ["none"] +}, +"NANOSECONDS": { +"id": "NANOSECONDS", +"is-read-only": false, +"description": ["none"] +}, +"PICOSECONDS": { +"id": "PICOSECONDS", +"is-read-only": false, +"description": ["none"] +}, +"time-unit": { +"id": "time-unit", +"is-read-only": false, +"description": ["none"] +}, +"period": { +"id": "period", +"is-read-only": false, +"description": ["none"] +}, +"time-interval-g": { +"id": "time-interval-g", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-qualifier": { +"id": "layer-protocol-qualifier", +"is-read-only": false, +"description": ["This enumeration is used to qualify the sub-layers (if applicable) for a specific LayerProtocol. This extensible enumeration is intentionally empty in the common module and will be augmented with layer-specific values in the respective technology-specific modules. Examples: - LayerProtocolName := OPTICAL_DATA_UNIT LayerProtocolQualifier := 'ODU_FLEX', 'ODU_0', 'ODU_1', 'ODU_2', 'ODU_2E', 'ODU_3', 'ODU_4'', 'ODU_CBR'', 'ODU_GFP'', 'ODU_GFP_HAO', etc - LayerProtocolName := DIGITAL_SIGNAL_RATE LayerProtocolQualifier := 'GBE', '10_GBE_WAN', '10_GBE_LAN', '100_GBE', 'FC_100', 'FC_200', 'FC_400', 'FC_800', 'FC_1200', 'FC_1600', 'FC_3200', 'STM_1', 'STM_4', 'STM_16', 'STM_64', 'STM_256', 'OC_3', 'OC_12', 'OC_48', 'OC_192', 'OC_768', 'OTU_1', 'OTU_2', 'OTU_2E', 'OTU_3', 'OTU_4', 'GPON', 'XGPON', 'IB_SDR', 'IB_DDR', 'IB_QDR', 'SBCON_ESCON', 'DVB_ASI', 'SDI', 'SDI_1G5', 'SDI_3G', etc - LayerProtocolName := PHOTONIC_MEDIA LayerProtocolQualifier := OCH, OTSi, OTSiA, NMC, NMCA, SMC, SMCA, OMS, OTS"] +}, +"get-service-interface-point-details": { +"id": "get-service-interface-point-details", +"is-read-only": false, +"description": ["none"] +}, +"sip-id-or-name": { +"id": "sip-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"sip": { +"id": "sip", +"is-read-only": false, +"description": ["none"] +}, +"get-service-interface-point-list": { +"id": "get-service-interface-point-list", +"is-read-only": false, +"description": ["none"] +}, +"sip": { +"id": "sip", +"is-read-only": false, +"description": ["none"] +}, +"update-service-interface-point": { +"id": "update-service-interface-point", +"is-read-only": false, +"description": ["none"] +}, +"sip-id-or-name": { +"id": "sip-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-connectivity@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-connectivity@2018-08-31.schema-information.json new file mode 100644 index 000000000..17408df46 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-connectivity@2018-08-31.schema-information.json @@ -0,0 +1,693 @@ +{ "schama-information": { + +"tapi-connectivity": { +"id": "tapi-connectivity", +"is-read-only": false, +"description": ["This module contains TAPI Connectivity Model definitions. Source: TapiConnectivity.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"connectivity-service-uuid": { +"id": "connectivity-service-uuid", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-service-ref-g": { +"id": "connectivity-service-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-service-end-point-local-id": { +"id": "connectivity-service-end-point-local-id", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-service-end-point-ref-g": { +"id": "connectivity-service-end-point-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"connection-end-point-uuid": { +"id": "connection-end-point-uuid", +"is-read-only": false, +"description": ["none"] +}, +"connection-end-point-ref-g": { +"id": "connection-end-point-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"connection-uuid": { +"id": "connection-uuid", +"is-read-only": false, +"description": ["none"] +}, +"connection-ref-g": { +"id": "connection-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"switch-control-uuid": { +"id": "switch-control-uuid", +"is-read-only": false, +"description": ["none"] +}, +"switch-control-ref-g": { +"id": "switch-control-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"route-local-id": { +"id": "route-local-id", +"is-read-only": false, +"description": ["none"] +}, +"route-ref-g": { +"id": "route-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"connection-end-point": { +"id": "connection-end-point", +"is-read-only": false, +"description": ["none"] +}, +"lower-connection": { +"id": "lower-connection", +"is-read-only": false, +"description": ["An Connection object supports a recursive aggregation relationship such that the internal construction of an Connection can be exposed as multiple lower level Connection objects (partitioning). Aggregation is used as for the Node/Topology to allow changes in hierarchy. Connection aggregation reflects Node/Topology aggregation. The FC represents a Cross-Connection in an NE. The Cross-Connection in an NE is not necessarily the lowest level of FC partitioning."] +}, +"supported-client-link": { +"id": "supported-client-link", +"is-read-only": false, +"description": ["none"] +}, +"route": { +"id": "route", +"is-read-only": false, +"description": ["none"] +}, +"switch-control": { +"id": "switch-control", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"connection-g": { +"id": "connection-g", +"is-read-only": false, +"description": ["The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms. At the lowest level of recursion, a FC represents a cross-connection within an NE."] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-qualifier": { +"id": "layer-protocol-qualifier", +"is-read-only": false, +"description": ["none"] +}, +"parent-node-edge-point": { +"id": "parent-node-edge-point", +"is-read-only": false, +"description": ["none"] +}, +"client-node-edge-point": { +"id": "client-node-edge-point", +"is-read-only": false, +"description": ["none"] +}, +"aggregated-connection-end-point": { +"id": "aggregated-connection-end-point", +"is-read-only": false, +"description": ["none"] +}, +"connection-port-direction": { +"id": "connection-port-direction", +"is-read-only": false, +"description": ["The orientation of defined flow at the EndPoint."] +}, +"connection-port-role": { +"id": "connection-port-role", +"is-read-only": false, +"description": ["Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function."] +}, +"connection-end-point-g": { +"id": "connection-end-point-g", +"is-read-only": false, +"description": ["The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers. The structure of LTP supports all transport protocols including circuit and packet forms."] +}, +"service-layer": { +"id": "service-layer", +"is-read-only": false, +"description": ["none"] +}, +"service-type": { +"id": "service-type", +"is-read-only": false, +"description": ["none"] +}, +"service-level": { +"id": "service-level", +"is-read-only": false, +"description": ["An abstract value the meaning of which is mutually agreed – typically represents metrics such as - Class of service, priority, resiliency, availability"] +}, +"requested-capacity": { +"id": "requested-capacity", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-direction": { +"id": "connectivity-direction", +"is-read-only": false, +"description": ["none"] +}, +"schedule": { +"id": "schedule", +"is-read-only": false, +"description": ["none"] +}, +"coroute-inclusion": { +"id": "coroute-inclusion", +"is-read-only": false, +"description": ["none"] +}, +"diversity-exclusion": { +"id": "diversity-exclusion", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-constraint-g": { +"id": "connectivity-constraint-g", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"connection": { +"id": "connection", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-service-g": { +"id": "connectivity-service-g", +"is-read-only": false, +"description": ["The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms. At the lowest level of recursion, a FC represents a cross-connection within an NE."] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-qualifier": { +"id": "layer-protocol-qualifier", +"is-read-only": false, +"description": ["none"] +}, +"service-interface-point": { +"id": "service-interface-point", +"is-read-only": false, +"description": ["none"] +}, +"connection-end-point": { +"id": "connection-end-point", +"is-read-only": false, +"description": ["none"] +}, +"capacity": { +"id": "capacity", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["The orientation of defined flow at the EndPoint."] +}, +"role": { +"id": "role", +"is-read-only": false, +"description": ["Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function."] +}, +"protection-role": { +"id": "protection-role", +"is-read-only": false, +"description": ["To specify the protection role of this Port when create or update ConnectivityService."] +}, +"connectivity-service-end-point-g": { +"id": "connectivity-service-end-point-g", +"is-read-only": false, +"description": ["The association of the FC to LTPs is made via EndPoints. The EndPoint (EP) object class models the access to the FC function. The traffic forwarding between the associated EPs of the FC depends upon the type of FC and may be associated with FcSwitch object instances. In cases where there is resilience the EndPoint may convey the resilience role of the access to the FC. It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. The EP replaces the Protection Unit of a traditional protection model. The ForwadingConstruct can be considered as a component and the EndPoint as a Port on that component"] +}, +"connection-end-point": { +"id": "connection-end-point", +"is-read-only": false, +"description": ["none"] +}, +"route-g": { +"id": "route-g", +"is-read-only": false, +"description": ["The FC Route (FcRoute) object class models the individual routes of an FC. The route of an FC object is represented by a list of FCs at a lower level. Note that depending on the service supported by an FC, an the FC can have multiple routes."] +}, +"connectivity-service": { +"id": "connectivity-service", +"is-read-only": false, +"description": ["none"] +}, +"connection": { +"id": "connection", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-context-g": { +"id": "connectivity-context-g", +"is-read-only": false, +"description": ["none"] +}, +"selected-connection-end-point": { +"id": "selected-connection-end-point", +"is-read-only": false, +"description": ["none"] +}, +"selected-route": { +"id": "selected-route", +"is-read-only": false, +"description": ["none"] +}, +"selection-control": { +"id": "selection-control", +"is-read-only": false, +"description": ["Degree of administrative control applied to the switch selection."] +}, +"selection-reason": { +"id": "selection-reason", +"is-read-only": false, +"description": ["The reason for the current switch selection."] +}, +"switch-direction": { +"id": "switch-direction", +"is-read-only": false, +"description": ["Indicates whether the switch selects from ingress to the FC or to egress of the FC, or both."] +}, +"switch-g": { +"id": "switch-g", +"is-read-only": false, +"description": ["The class models the switched forwarding of traffic (traffic flow) between FcPorts (ConnectionEndPoints) and is present where there is protection functionality in the FC (Connection). If an FC exposes protection (having two or more FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects to represent the alternative flow choices visible at the edge of the FC. The FC switch represents and defines a protection switch structure encapsulated in the FC. Essentially performs one of the functions of the Protection Group in a traditional model. It associates to 2 or more FcPorts each playing the role of a Protection Unit. One or more protection, i.e. standby/backup, FcPorts provide protection for one or more working (i.e. regular/main/preferred) FcPorts where either protection or working can feed one or more protected FcPort. The switch may be used in revertive or non-revertive (symmetric) mode. When in revertive mode it may define a waitToRestore time. It may be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 and 1:1). It may be locked out (prevented from switching), force switched or manual switched. It will indicate switch state and change of state. The switch can be switched away from all sources such that it becomes open and hence two coordinated switches can both feed the same LTP so long as at least one of the two is switched away from all sources (is 'open'). The ability for a Switch to be 'high impedance' allows bidirectional ForwardingConstructs to be overlaid on the same bidirectional LTP where the appropriate control is enabled to prevent signal conflict. This ability allows multiple alternate routes to be present that otherwise would be in conflict."] +}, +"sub-switch-control": { +"id": "sub-switch-control", +"is-read-only": false, +"description": ["none"] +}, +"switch": { +"id": "switch", +"is-read-only": false, +"description": ["none"] +}, +"switch-control-g": { +"id": "switch-control-g", +"is-read-only": false, +"description": ["Represents the capability to control and coordinate switches, to add/delete/modify FCs and to add/delete/modify LTPs/LPs so as to realize a protection scheme."] +}, +"resilience-type": { +"id": "resilience-type", +"is-read-only": false, +"description": ["none"] +}, +"restoration-coordinate-type": { +"id": "restoration-coordinate-type", +"is-read-only": false, +"description": ["The coordination mechanism between multi-layers."] +}, +"restore-priority": { +"id": "restore-priority", +"is-read-only": false, +"description": ["none"] +}, +"reversion-mode": { +"id": "reversion-mode", +"is-read-only": false, +"description": ["Indcates whether the protection scheme is revertive or non-revertive."] +}, +"wait-to-revert-time": { +"id": "wait-to-revert-time", +"is-read-only": false, +"description": ["If the protection system is revertive, this attribute specifies the time, in minutes, to wait after a fault clears on a higher priority (preferred) resource before reverting to the preferred resource."] +}, +"hold-off-time": { +"id": "hold-off-time", +"is-read-only": false, +"description": ["This attribute indicates the time, in milliseconds, between declaration of signal degrade or signal fail, and the initialization of the protection switching algorithm."] +}, +"is-lock-out": { +"id": "is-lock-out", +"is-read-only": false, +"description": ["The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of. This overrides all other protection control states including forced. If the item is locked out then it cannot be used under any circumstances. Note: Only relevant when part of a protection scheme."] +}, +"is-frozen": { +"id": "is-frozen", +"is-read-only": false, +"description": ["Temporarily prevents any switch action to be taken and, as such, freezes the current state. Until the freeze is cleared, additional near-end external commands are rejected and fault condition changes and received APS messages are ignored. All administrative controls of any aspect of protection are rejected."] +}, +"is-coordinated-switching-both-ends": { +"id": "is-coordinated-switching-both-ends", +"is-read-only": false, +"description": ["Is operating such that switching at both ends of each flow acorss the FC is coordinated at both ingress and egress ends."] +}, +"max-switch-times": { +"id": "max-switch-times", +"is-read-only": false, +"description": ["Used to limit the maximum swtich times. When work fault disappears , and traffic return to the original work path, switch counter reset."] +}, +"preferred-restoration-layer": { +"id": "preferred-restoration-layer", +"is-read-only": false, +"description": ["Indicate which layer this resilience parameters package configured for."] +}, +"resilience-constraint-g": { +"id": "resilience-constraint-g", +"is-read-only": false, +"description": ["A list of control parameters to apply to a switch."] +}, +"connection-end-point": { +"id": "connection-end-point", +"is-read-only": false, +"description": ["none"] +}, +"cep-list-g": { +"id": "cep-list-g", +"is-read-only": false, +"description": ["none"] +}, +"POINT_TO_POINT_CONNECTIVITY": { +"id": "POINT_TO_POINT_CONNECTIVITY", +"is-read-only": false, +"description": ["none"] +}, +"POINT_TO_MULTIPOINT_CONNECTIVITY": { +"id": "POINT_TO_MULTIPOINT_CONNECTIVITY", +"is-read-only": false, +"description": ["none"] +}, +"MULTIPOINT_CONNECTIVITY": { +"id": "MULTIPOINT_CONNECTIVITY", +"is-read-only": false, +"description": ["none"] +}, +"ROOTED_MULTIPOINT_CONNECTIVITY": { +"id": "ROOTED_MULTIPOINT_CONNECTIVITY", +"is-read-only": false, +"description": ["none"] +}, +"service-type": { +"id": "service-type", +"is-read-only": false, +"description": ["none"] +}, +"REVERTIVE": { +"id": "REVERTIVE", +"is-read-only": false, +"description": ["An FC switched to a lower priority (non-preferred) resource will revert to a higher priority (preferred) resource when that recovers (potentially after some hold-off time)."] +}, +"NON-REVERTIVE": { +"id": "NON-REVERTIVE", +"is-read-only": false, +"description": ["An FC switched to a lower priority (non-preferred) resource will not revert to a higher priority (preferred) resource when that recovers."] +}, +"reversion-mode": { +"id": "reversion-mode", +"is-read-only": false, +"description": ["The reversion mode associated with protection."] +}, +"LOCK_OUT": { +"id": "LOCK_OUT", +"is-read-only": false, +"description": ["The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of. This overrides all other protection control states including forced. If the item is locked out then it cannot be used under any circumstances. Note: Only relevant when part of a protection scheme."] +}, +"NORMAL": { +"id": "NORMAL", +"is-read-only": false, +"description": ["none"] +}, +"MANUAL": { +"id": "MANUAL", +"is-read-only": false, +"description": ["none"] +}, +"FORCED": { +"id": "FORCED", +"is-read-only": false, +"description": ["none"] +}, +"selection-control": { +"id": "selection-control", +"is-read-only": false, +"description": ["Possible degrees of administrative control applied to the Route selection."] +}, +"LOCKOUT": { +"id": "LOCKOUT", +"is-read-only": false, +"description": ["none"] +}, +"NORMAL": { +"id": "NORMAL", +"is-read-only": false, +"description": ["none"] +}, +"MANUAL": { +"id": "MANUAL", +"is-read-only": false, +"description": ["none"] +}, +"FORCED": { +"id": "FORCED", +"is-read-only": false, +"description": ["none"] +}, +"WAIT_TO_REVERT": { +"id": "WAIT_TO_REVERT", +"is-read-only": false, +"description": ["none"] +}, +"SIGNAL_DEGRADE": { +"id": "SIGNAL_DEGRADE", +"is-read-only": false, +"description": ["none"] +}, +"SIGNAL_FAIL": { +"id": "SIGNAL_FAIL", +"is-read-only": false, +"description": ["none"] +}, +"selection-reason": { +"id": "selection-reason", +"is-read-only": false, +"description": ["The cause of the current route selection."] +}, +"NO_COORDINATE": { +"id": "NO_COORDINATE", +"is-read-only": false, +"description": ["none"] +}, +"HOLD_OFF_TIME": { +"id": "HOLD_OFF_TIME", +"is-read-only": false, +"description": ["none"] +}, +"WAIT_FOR_NOTIFICATION": { +"id": "WAIT_FOR_NOTIFICATION", +"is-read-only": false, +"description": ["none"] +}, +"coordinate-type": { +"id": "coordinate-type", +"is-read-only": false, +"description": ["none"] +}, +"WORK": { +"id": "WORK", +"is-read-only": false, +"description": ["none"] +}, +"PROTECT": { +"id": "PROTECT", +"is-read-only": false, +"description": ["none"] +}, +"PROTECTED": { +"id": "PROTECTED", +"is-read-only": false, +"description": ["none"] +}, +"NA": { +"id": "NA", +"is-read-only": false, +"description": ["none"] +}, +"WORK_RESTORE": { +"id": "WORK_RESTORE", +"is-read-only": false, +"description": ["none"] +}, +"PROTECT_RESTORE": { +"id": "PROTECT_RESTORE", +"is-read-only": false, +"description": ["none"] +}, +"protection-role": { +"id": "protection-role", +"is-read-only": false, +"description": ["none"] +}, +"get-connection-details": { +"id": "get-connection-details", +"is-read-only": false, +"description": ["none"] +}, +"service-id-or-name": { +"id": "service-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"connection-id-or-name": { +"id": "connection-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"connection": { +"id": "connection", +"is-read-only": false, +"description": ["none"] +}, +"get-connectivity-service-list": { +"id": "get-connectivity-service-list", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"get-connectivity-service-details": { +"id": "get-connectivity-service-details", +"is-read-only": false, +"description": ["none"] +}, +"service-id-or-name": { +"id": "service-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"create-connectivity-service": { +"id": "create-connectivity-service", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-constraint": { +"id": "connectivity-constraint", +"is-read-only": false, +"description": ["none"] +}, +"routing-constraint": { +"id": "routing-constraint", +"is-read-only": false, +"description": ["none"] +}, +"topology-constraint": { +"id": "topology-constraint", +"is-read-only": false, +"description": ["none"] +}, +"resilience-constraint": { +"id": "resilience-constraint", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"update-connectivity-service": { +"id": "update-connectivity-service", +"is-read-only": false, +"description": ["none"] +}, +"service-id-or-name": { +"id": "service-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-constraint": { +"id": "connectivity-constraint", +"is-read-only": false, +"description": ["none"] +}, +"routing-constraint": { +"id": "routing-constraint", +"is-read-only": false, +"description": ["none"] +}, +"topology-constraint": { +"id": "topology-constraint", +"is-read-only": false, +"description": ["none"] +}, +"resilience-constraint": { +"id": "resilience-constraint", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"delete-connectivity-service": { +"id": "delete-connectivity-service", +"is-read-only": false, +"description": ["none"] +}, +"service-id-or-name": { +"id": "service-id-or-name", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-dsr@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-dsr@2018-08-31.schema-information.json new file mode 100644 index 000000000..14b1c57e4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-dsr@2018-08-31.schema-information.json @@ -0,0 +1,203 @@ +{ "schama-information": { + +"tapi-dsr": { +"id": "tapi-dsr", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE": { +"id": "DIGITAL_SIGNAL_TYPE", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_GigE": { +"id": "DIGITAL_SIGNAL_TYPE_GigE", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_10_GigE_LAN": { +"id": "DIGITAL_SIGNAL_TYPE_10_GigE_LAN", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_10_GigE_WAN": { +"id": "DIGITAL_SIGNAL_TYPE_10_GigE_WAN", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_40_GigE": { +"id": "DIGITAL_SIGNAL_TYPE_40_GigE", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_100_GigE": { +"id": "DIGITAL_SIGNAL_TYPE_100_GigE", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_FC_100": { +"id": "DIGITAL_SIGNAL_TYPE_FC_100", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_FC_200": { +"id": "DIGITAL_SIGNAL_TYPE_FC_200", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_FC_400": { +"id": "DIGITAL_SIGNAL_TYPE_FC_400", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_FC_800": { +"id": "DIGITAL_SIGNAL_TYPE_FC_800", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_FC_1200": { +"id": "DIGITAL_SIGNAL_TYPE_FC_1200", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_FC_1600": { +"id": "DIGITAL_SIGNAL_TYPE_FC_1600", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_FC_3200": { +"id": "DIGITAL_SIGNAL_TYPE_FC_3200", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_STM_1": { +"id": "DIGITAL_SIGNAL_TYPE_STM_1", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_STM_4": { +"id": "DIGITAL_SIGNAL_TYPE_STM_4", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_STM_16": { +"id": "DIGITAL_SIGNAL_TYPE_STM_16", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_STM_64": { +"id": "DIGITAL_SIGNAL_TYPE_STM_64", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_STM_256": { +"id": "DIGITAL_SIGNAL_TYPE_STM_256", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OC_3": { +"id": "DIGITAL_SIGNAL_TYPE_OC_3", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OC_12": { +"id": "DIGITAL_SIGNAL_TYPE_OC_12", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OC_48": { +"id": "DIGITAL_SIGNAL_TYPE_OC_48", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OC_192": { +"id": "DIGITAL_SIGNAL_TYPE_OC_192", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OC_768": { +"id": "DIGITAL_SIGNAL_TYPE_OC_768", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OTU_1": { +"id": "DIGITAL_SIGNAL_TYPE_OTU_1", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OTU_2": { +"id": "DIGITAL_SIGNAL_TYPE_OTU_2", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OTU_2E": { +"id": "DIGITAL_SIGNAL_TYPE_OTU_2E", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OTU_3": { +"id": "DIGITAL_SIGNAL_TYPE_OTU_3", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_OTU_4": { +"id": "DIGITAL_SIGNAL_TYPE_OTU_4", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_GPON": { +"id": "DIGITAL_SIGNAL_TYPE_GPON", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_XGPON": { +"id": "DIGITAL_SIGNAL_TYPE_XGPON", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_IB_SDR": { +"id": "DIGITAL_SIGNAL_TYPE_IB_SDR", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_IB_DDR": { +"id": "DIGITAL_SIGNAL_TYPE_IB_DDR", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_IB_QDR": { +"id": "DIGITAL_SIGNAL_TYPE_IB_QDR", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_SBCON_ESCON": { +"id": "DIGITAL_SIGNAL_TYPE_SBCON_ESCON", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_DVB_ASI": { +"id": "DIGITAL_SIGNAL_TYPE_DVB_ASI", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_SDI": { +"id": "DIGITAL_SIGNAL_TYPE_SDI", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_SDI_1G5": { +"id": "DIGITAL_SIGNAL_TYPE_SDI_1G5", +"is-read-only": false, +"description": ["none"] +}, +"DIGITAL_SIGNAL_TYPE_SDI_3G": { +"id": "DIGITAL_SIGNAL_TYPE_SDI_3G", +"is-read-only": false, +"description": ["none"] +}, +"digital-signal-type": { +"id": "digital-signal-type", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-eth@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-eth@2018-08-31.schema-information.json new file mode 100644 index 000000000..8e8b903ee --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-eth@2018-08-31.schema-information.json @@ -0,0 +1,1778 @@ +{ "schama-information": { + +"tapi-eth": { +"id": "tapi-eth", +"is-read-only": false, +"description": ["This module contains TAPI ETH Model definitions. Source: TapiEth.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"auxiliary-function-position-sequence": { +"id": "auxiliary-function-position-sequence", +"is-read-only": false, +"description": ["This attribute indicates the positions (i.e., the relative order) of all the MEP, MIP, and TCS objects which are associated with the CTP."] +}, +"vlan-config": { +"id": "vlan-config", +"is-read-only": false, +"description": ["This attribute models the ETHx/ETH-m_A_So_MI_Vlan_Config information defined in G.8021. range of type : -1, 0, 1..4094"] +}, +"csf-rdi-fdi-enable": { +"id": "csf-rdi-fdi-enable", +"is-read-only": false, +"description": ["This attribute models the MI_CSFrdifdiEnable information defined in G.8021."] +}, +"csf-report": { +"id": "csf-report", +"is-read-only": false, +"description": ["This attribute models the MI_CSF_Reported information defined in G.8021. range of type : true, false"] +}, +"filter-config-snk": { +"id": "filter-config-snk", +"is-read-only": false, +"description": ["This attribute models the FilteConfig MI defined in 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are: 01-80-C2-00-00-10, 01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and 01-80-C2-00-00-20 to 01-80-C2-00-00-2F. The filter action is Pass or Block. If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. If none of the above addresses match, the ETH_CI_D is passed."] +}, +"mac-length": { +"id": "mac-length", +"is-read-only": false, +"description": ["This attribute models the MAC_Lenght MI defined in 8.6/G.8021 for the MAC Length Check process. It indicates the allowed maximum frame length in bytes. range of type : 1518, 1522, 2000"] +}, +"filter-config": { +"id": "filter-config", +"is-read-only": false, +"description": ["This attribute models the FilterConfig MI defined in section 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are: - All bridges address: 01-80-C2-00-00-10, - Reserved addresses: 01-80-C2-00-00-00 to 01-80-C2-00-00-0F, - GARP Application addresses: 01-80-C2-00-00-20 to 01-80-C2-00-00-2F. The filter action is Pass or Block. If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. If none of the above addresses match, the ETH_CI_D is passed."] +}, +"is-ssf-reported": { +"id": "is-ssf-reported", +"is-read-only": false, +"description": ["This attribute provisions whether the SSF defect should be reported as fault cause or not. It models the ETH-LAG_FT_Sk_MI_SSF_Reported defined in G.8021."] +}, +"pll-thr": { +"id": "pll-thr", +"is-read-only": false, +"description": ["This attribute provisions the threshold for the number of active ports. If the number of active ports is more than zero but less than the provisioned threshold, a cPLL (Partial Link Loss) is raised. See section 9.7.1.2 of G.8021. range of type : 0..number of ports"] +}, +"actor-oper-key": { +"id": "actor-oper-key", +"is-read-only": false, +"description": ["See 802.1AX: The current operational value of the Key for the Aggregator. The administrative Key value may differ from the operational Key value for the reasons discussed in 5.6.2. The meaning of particular Key values is of local significance. range of type : 16 bit"] +}, +"actor-system-id": { +"id": "actor-system-id", +"is-read-only": false, +"description": ["See 802.1AX: A MAC address used as a unique identifier for the System that contains this Aggregator."] +}, +"actor-system-priority": { +"id": "actor-system-priority", +"is-read-only": false, +"description": ["See 802.1AX: Indicating the priority associated with the Actor’s System ID. range of type : 2-octet"] +}, +"collector-max-delay": { +"id": "collector-max-delay", +"is-read-only": false, +"description": ["See 802.1AX: The value of this attribute defines the maximum delay, in tens of microseconds, that may be imposed by the Frame Collector between receiving a frame from an Aggregator Parser, and either delivering the frame to its MAC Client or discarding the frame (see IEEE 802.1AX clause 5.2.3.1.1). range of type : 16-bit"] +}, +"data-rate": { +"id": "data-rate", +"is-read-only": false, +"description": ["See 802.1AX: The current data rate, in bits per second, of the aggregate link. The value is calculated as N times the data rate of a single link in the aggregation, where N is the number of active links."] +}, +"partner-oper-key": { +"id": "partner-oper-key", +"is-read-only": false, +"description": ["See 802.1AX: The current operational value of the Key for the Aggregator’s current protocol Partner. If the aggregation is manually configured, this Key value will be a value assigned by the local System. range of type : 16-bit"] +}, +"partner-system-id": { +"id": "partner-system-id", +"is-read-only": false, +"description": ["See 802.1AX: A MAC address consisting of the unique identifier for the current protocol Partner of this Aggregator. A value of zero indicates that there is no known Partner. If the aggregation is manually configured, this System ID value will be a value assigned by the local System."] +}, +"partner-system-priority": { +"id": "partner-system-priority", +"is-read-only": false, +"description": ["See 802.1AX: Indicates the priority associated with the Partner’s System ID. If the aggregation is manually configured, this System Priority value will be a value assigned by the local System. range of type : 2-octet"] +}, +"csf-config": { +"id": "csf-config", +"is-read-only": false, +"description": ["This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021. range of type : true, false"] +}, +"traffic-shaping": { +"id": "traffic-shaping", +"is-read-only": false, +"description": ["none"] +}, +"traffic-conditioning": { +"id": "traffic-conditioning", +"is-read-only": false, +"description": ["none"] +}, +"eth-ctp-pac-g": { +"id": "eth-ctp-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"ety-term": { +"id": "ety-term", +"is-read-only": false, +"description": ["none"] +}, +"eth-term": { +"id": "eth-term", +"is-read-only": false, +"description": ["none"] +}, +"eth-ctp": { +"id": "eth-ctp", +"is-read-only": false, +"description": ["none"] +}, +"eth-connection-end-point-spec-g": { +"id": "eth-connection-end-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"priority-regenerate": { +"id": "priority-regenerate", +"is-read-only": false, +"description": ["This attribute models the ETHx/ETH-m _A_Sk_MI_P_Regenerate information defined in G.8021."] +}, +"ether-type": { +"id": "ether-type", +"is-read-only": false, +"description": ["This attribute models the ETHx/ETH-m _A_Sk_MI_Etype information defined in G.8021."] +}, +"filter-config-1": { +"id": "filter-config-1", +"is-read-only": false, +"description": ["This attribute models the ETHx/ETH-m_A_Sk_MI_Filter_Config information defined in G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are: 01-80-C2-00-00-10, 01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and 01-80-C2-00-00-20 to 01-80-C2-00-00-2F. The filter action is Pass or Block. If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action. If none of the above addresses match, the ETH_CI_D is passed. range of type : MacAddress: 01-80-C2-00-00-10, 01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and 01-80-C2-00-00-20 to 01-80-C2-00-00-2F; ActionEnum: PASS, BLOCK"] +}, +"frametype-config": { +"id": "frametype-config", +"is-read-only": false, +"description": ["This attribute models the ETHx/ETH-m_A_Sk_MI_Frametype_Config information defined in G.8021. range of type : see Enumeration"] +}, +"port-vid": { +"id": "port-vid", +"is-read-only": false, +"description": ["This attribute models the ETHx/ETH-m _A_Sk_MI_PVID information defined in G.8021."] +}, +"priority-code-point-config": { +"id": "priority-code-point-config", +"is-read-only": false, +"description": ["This attribute models the ETHx/ETH-m _A_Sk_MI_PCP_Config information defined in G.8021. range of type : see Enumeration"] +}, +"eth-termination-pac-g": { +"id": "eth-termination-pac-g", +"is-read-only": false, +"description": ["This object class models the Ethernet Flow Termination function located at a layer boundary."] +}, +"is-fts-enabled": { +"id": "is-fts-enabled", +"is-read-only": false, +"description": ["This attribute indicates whether Forced Transmitter Shutdown (FTS) is enabled or not. It models the ETYn_TT_So_MI_FTSEnable information."] +}, +"is-tx-pause-enabled": { +"id": "is-tx-pause-enabled", +"is-read-only": false, +"description": ["This attribute identifies whether the Transmit Pause process is enabled or not. It models the MI_TxPauseEnable defined in G.8021."] +}, +"phy-type": { +"id": "phy-type", +"is-read-only": false, +"description": ["This attribute identifies the PHY type of the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.2."] +}, +"phy-type-list": { +"id": "phy-type-list", +"is-read-only": false, +"description": ["This attribute identifies the possible PHY types that could be supported at the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.3."] +}, +"ety-termination-pac-g": { +"id": "ety-termination-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"prio-config-list": { +"id": "prio-config-list", +"is-read-only": false, +"description": ["This attribute indicates the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue."] +}, +"cond-config-list": { +"id": "cond-config-list", +"is-read-only": false, +"description": ["This attribute indicates for the conditioner process the conditioning parameters: - Queue ID: Indicates the Queue ID - Committed Information Rate (CIR): number of bits per second - Committed Burst Size (CBS): number of bytes - Excess Information Rate (EIR): number of bits per second - Excess Burst Size (EBS): number of bytes - Coupling flag (CF): 0 or 1 - Color mode (CM): color-blind and color-aware."] +}, +"codirectional": { +"id": "codirectional", +"is-read-only": false, +"description": ["This attribute indicates the direction of the conditioner. The value of true means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the sink part of the containing CTP. The value of false means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the source part of the containing CTP."] +}, +"traffic-conditioning-pac-g": { +"id": "traffic-conditioning-pac-g", +"is-read-only": false, +"description": ["This object class models the ETH traffic conditioning function as defined in G.8021. Basic attributes: codirectional, condConfigList, prioConfigList"] +}, +"prio-config-list": { +"id": "prio-config-list", +"is-read-only": false, +"description": ["This attribute configures the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue."] +}, +"queue-config-list": { +"id": "queue-config-list", +"is-read-only": false, +"description": ["This attribute configures the Queue depth and Dropping threshold parameters of the Queue process. The Queue depth sets the maximum size of the queue in bytes. An incoming ETH_CI traffic unit is dropped if there is insufficient space in the queue to hold the whole unit. The Dropping threshold sets the threshold of the queue. If the queue is filled beyond this threshold, incoming ETH_CI traffic units accompanied by the ETH_CI_DE signal set are dropped."] +}, +"sched-config": { +"id": "sched-config", +"is-read-only": false, +"description": ["This attribute configures the scheduler process. The value of this attribute is for further study because it is for further study in G.8021. Scheduler is a pointer to a Scheduler object, which is to be defined in the future (because in G.8021, this is FFS). Note that the only significance of the GTCS function defined in G.8021 is the use of a common scheduler for shaping. Given that, G.8052 models the common scheduler feature by having a common value for this attribute."] +}, +"codirectional": { +"id": "codirectional", +"is-read-only": false, +"description": ["This attribute indicates the direction of the shaping function. The value of true means that the shaping (modeled as a TCS Source according to G.8021) is associated with the source part of the containing CTP. The value of false means that the shaping (modeled as a TCS Source according to G.8021) is associated with the sink part of the containing CTP."] +}, +"traffic-shaping-pac-g": { +"id": "traffic-shaping-pac-g", +"is-read-only": false, +"description": ["This object class models the ETH traffic shaping function as defined in G.8021. Basic attribute: codirectional, prioConfigList, queueConfigList, schedConfig"] +}, +"client-mel": { +"id": "client-mel", +"is-read-only": false, +"description": ["none"] +}, +"eth-meg-spec-g": { +"id": "eth-meg-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"eth-mep-common": { +"id": "eth-mep-common", +"is-read-only": false, +"description": ["none"] +}, +"eth-mep-source-pac": { +"id": "eth-mep-source-pac", +"is-read-only": false, +"description": ["none"] +}, +"eth-mep-sink": { +"id": "eth-mep-sink", +"is-read-only": false, +"description": ["none"] +}, +"eth-mep-spec-g": { +"id": "eth-mep-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"eth-mip-spec-g": { +"id": "eth-mip-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"eth-lb-msg": { +"id": "eth-lb-msg", +"is-read-only": false, +"description": ["none"] +}, +"number": { +"id": "number", +"is-read-only": false, +"description": ["G.8052: This parameter specifies how many LB messages to be sent for the LB_Series process."] +}, +"eth-loopback-job-g": { +"id": "eth-loopback-job-g", +"is-read-only": false, +"description": ["This class represents the Loopback (LB) process (send a series of LB messages carrying a test pattern to a particular MEP). The termination occurs at specified stop time (schedule attribute of OamJob). This class models also the 'loopback discover' process, when destinationAddress is multicast. When number is greater than 1, then the process is to perform a Loopback (LB) Series process (send a series of N LB messages to a particular MEP/MIP."] +}, +"mep-mac": { +"id": "mep-mac", +"is-read-only": false, +"description": ["This attribute contains the MAC Address of the MEP."] +}, +"is-cc-enabled": { +"id": "is-cc-enabled", +"is-read-only": false, +"description": ["This attribute models the MI_CC_Enable signal defined in G.8021 and configured as specified in G8051."] +}, +"cc-period": { +"id": "cc-period", +"is-read-only": false, +"description": ["This attribute models the MI_CC_Period signal defined in G.8021 and configured as specified in G8051. It is the period at which the CCM message should be sent. Default values are: 3.33 ms for PS, 100 ms for PM, 1 s for FM."] +}, +"cc-priority": { +"id": "cc-priority", +"is-read-only": false, +"description": ["This attribute models the MI_CC_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the CCM message should be sent."] +}, +"lck-period": { +"id": "lck-period", +"is-read-only": false, +"description": ["This attribute models the MI_LCK_Period signal defined in G.8021 and configured as specified in G8051. It is the frequency at which the LCK messages should be sent. range of type : 1s, 1min"] +}, +"lck-priority": { +"id": "lck-priority", +"is-read-only": false, +"description": ["This attribute models the MI_LCK_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the LCK messages should be sent."] +}, +"eth-mep-common-g": { +"id": "eth-mep-common-g", +"is-read-only": false, +"description": ["Basic attributes: adminState, clientMel, megIdentifier, mepMac Continuity Check Process related attributes: ccPeriod, ccPriority, isCcEnabled Lock Process related attributes: lckPeriod, lckPriority This object class models the MEP functions that are common to MEP Sink and MEP Source."] +}, +"dm-1-priority": { +"id": "dm-1-priority", +"is-read-only": false, +"description": ["This attribute indicates the list of 1DM priorities for the MepSink."] +}, +"ais-priority": { +"id": "ais-priority", +"is-read-only": false, +"description": ["This attribute models the MI_AIS_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the AIS messages should be sent."] +}, +"ais-period": { +"id": "ais-period", +"is-read-only": false, +"description": ["This attribute models the MI_AIS_Period signal defined in G.8021 and configured as specified in G8051. It is the frequency at which the AIS messages should be sent. range of type : 1s, 1min"] +}, +"is-csf-reported": { +"id": "is-csf-reported", +"is-read-only": false, +"description": ["This attribute models the MI_CSF_Reported signal defined in G.8021 and configured as specified in G8051. It configures whether the secondary failure CSF should be reported or not."] +}, +"is-csf-rdi-fdi-enabled": { +"id": "is-csf-rdi-fdi-enabled", +"is-read-only": false, +"description": ["This attribute models the MI_CSFrdifdiEnable signal defined in G.8021 and configured as specified in G8051."] +}, +"bandwidth-report": { +"id": "bandwidth-report", +"is-read-only": false, +"description": ["This attribute models the content of the bandwidth report received by the MEP Sink from the peer MEP Source."] +}, +"lm-degm": { +"id": "lm-degm", +"is-read-only": false, +"description": ["This attribute defines the number of consecutive bad seconds necessary for the 'degraded' detection. See also section 'Degraded signal defect (dDEG)' in G.8021."] +}, +"lm-deg-thr": { +"id": "lm-deg-thr", +"is-read-only": false, +"description": ["This attribute defines the threshold for declaring a 'bad second'. See also section 'Degraded signal defect (dDEG)' in G.8021."] +}, +"lm-m": { +"id": "lm-m", +"is-read-only": false, +"description": ["This attribute defines the number of consecutive good seconds necessary for the clearing of 'degraded'. See also section 'Degraded signal defect (dDEG)' in G.8021."] +}, +"lm-tf-min": { +"id": "lm-tf-min", +"is-read-only": false, +"description": ["This attribute defines the necessary number of transmitted frames to enable the detection of 'bad seconds'. See also section 'Degraded signal defect (dDEG)' in G.8021."] +}, +"eth-mep-sink-g": { +"id": "eth-mep-sink-g", +"is-read-only": false, +"description": ["1DM related attribute: 1DmPriority AIS Process related attributes: aisPeriod, aisPriority Bandwidth notification Process related attribute: bandwidthReport Basic attribute: peerMepRefList CSF Process related attributes: isCsfRdiFdiEnabled, isCsfReported Defect correlation Process related attribute: currentProblemList This object class models the MEP sink function. Instance of this object class can be created and contained by ETH CTP or TTP objects. It also provides the management of the dual-ended maintenance job, such as test. This object contains the configuration parameters for detecting 'degraded signal' (DEG)."] +}, +"aps-priority": { +"id": "aps-priority", +"is-read-only": false, +"description": ["This attribute specifies the priority of the APS messages. See section 8.1.5 APS insert process in G.8021."] +}, +"csf-priority": { +"id": "csf-priority", +"is-read-only": false, +"description": ["This attribute models the MI_CSF_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the CSF messages should be sent"] +}, +"csf-period": { +"id": "csf-period", +"is-read-only": false, +"description": ["This attribute models the MI_CSF_Period signal defined in G.8021 and configured as specified in G8051. It is the period at which the CSF messages should be sent. range of type : 1s, 1min"] +}, +"csf-config": { +"id": "csf-config", +"is-read-only": false, +"description": ["This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021."] +}, +"eth-mep-source-g": { +"id": "eth-mep-source-g", +"is-read-only": false, +"description": ["APS Process related attribute: apsPriority Basic attribute: mepIdentifier CSF Process related attributes: csfConfig, csfPeriod, csfPriority Link trace related operation: linkTrace Loopback related operations: loopbackDiscover, loopbackSeries, loopbackTest, loopbackTestTerminate On demand measurement job control related operation: establishOnDemandDualEndedMeasurementJobSource Proactive measurement job control related operation: establishProActiveDualEndedMeasurementJobSource Test related operations: testInitiatorStart, testInitiatorTerminate This object class models the MEP source function. Instance of this object class can be created and contained by ETH CTP or TTP objects. It also provides the management of single-ended maintenance jobs, such as loopback test, loopback discover, loopback series, link trace, and dual-ended maintenance job, such as test."] +}, +"eth-lt-msg": { +"id": "eth-lt-msg", +"is-read-only": false, +"description": ["none"] +}, +"time-to-live": { +"id": "time-to-live", +"is-read-only": false, +"description": ["G.8052: This parameter provides the Time To Live (TTL) parameter of the Link Track protocol. The TTL parameter allows the receiver (MIP or MEP) of the LTM frame to determine if the frame can be terminated. TTL is decremented every time the LTM frame is relayed. LTM frame with TTL<=1 is terminated and not relayed."] +}, +"eth-link-trace-job-g": { +"id": "eth-link-trace-job-g", +"is-read-only": false, +"description": ["This class represents the Link Trace (LT) process for fault localization or for discovering the intermediate MIPs along the link from the MEP Source to a target MEP or MIP. An LTM frame will be sent from the MEP source to the target MEP/MIP. The termination occurs at specified stop time (schedule attribute of OamJob)."] +}, +"eth-test-msg": { +"id": "eth-test-msg", +"is-read-only": false, +"description": ["none"] +}, +"eth-test-job-g": { +"id": "eth-test-job-g", +"is-read-only": false, +"description": ["This class represents the 1-way on-demand in-service or out-of-service diagnostic test. The diagnostic test includes verifying bandwidth throughput, frame loss, bit errors, etc. TST frames are transmitted. The termination occurs at specified stop time (schedule attribute of OamJob)."] +}, +"responder-mep-id": { +"id": "responder-mep-id", +"is-read-only": false, +"description": ["none"] +}, +"source-address": { +"id": "source-address", +"is-read-only": false, +"description": ["This attribute contains the MAC address of the peer MEP. See G.8013 for details."] +}, +"priority": { +"id": "priority", +"is-read-only": false, +"description": ["This attribute contains the priority of the OAM PDU frames. range of type : 0, 1, 2, 3, 4, 5, 6, 7"] +}, +"test-identifier": { +"id": "test-identifier", +"is-read-only": false, +"description": ["This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP. range of type : 0..(2^32) - 1"] +}, +"eth-on-demand-measurement-job-control-sink-g": { +"id": "eth-on-demand-measurement-job-control-sink-g", +"is-read-only": false, +"description": ["This object class represents an on-demand measurement job controller sink for 1-way measurements. It is created as a result of an establishOnDemandDualEndedMeasurementJobSink() operation. It is deleted either automatically after the measurement job has completed (stop time reached) and the performance data AVC notification has been sent, or by an explicit abortOnDemandMeasurementJob() operation when the measurement job is running."] +}, +"controller-mep-id": { +"id": "controller-mep-id", +"is-read-only": false, +"description": ["none"] +}, +"oam-pdu-generation-type": { +"id": "oam-pdu-generation-type", +"is-read-only": false, +"description": ["This attribute contains the pattern that is used for the generation of OAM PDUs."] +}, +"destination-address": { +"id": "destination-address", +"is-read-only": false, +"description": ["This attribute contains the MAC address of the peer MEP. See G.8013 for details."] +}, +"priority": { +"id": "priority", +"is-read-only": false, +"description": ["This attribute contains the priority of the OAM PDU frames. range of type : 0, 1, 2, 3, 4, 5, 6, 7"] +}, +"message-period": { +"id": "message-period", +"is-read-only": false, +"description": ["This attribute contains the frequency of the OAM message (PDU) generation within a series. Note that the value 0 means that only one OAM message per measurement interval is generated. range of type : See corresponding Enum."] +}, +"repetition-period": { +"id": "repetition-period", +"is-read-only": false, +"description": ["This attribute contains the time between the start of two measurement intervals. This IS applicable for the repetitive instance type and MAY be applicable for the repetitive series type. Note that a value of 0 means not applicable (NA), which is for the cases of single instance, single series, or repetitive series without extra gap in between the measurement intervals (i.e., also as known as continuous series)."] +}, +"measurement-interval": { +"id": "measurement-interval", +"is-read-only": false, +"description": ["This attribute contains the discrete non overlapping periods of time (in seconds) during which measurements are performed (i.e., OAM messages are generated) and reports are gathered at the end of the measurement intervals. Note that the value 0 means a degenerated measurement interval with a single OAM message and the report is sent as immediately as possible. range of type : Non-negative"] +}, +"test-identifier": { +"id": "test-identifier", +"is-read-only": false, +"description": ["This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP. Note: The attribute is not used in case of LMM/LMR measurement. range of type : 0..(2^32) - 1"] +}, +"data-tlv-length": { +"id": "data-tlv-length", +"is-read-only": false, +"description": ["This parameter provides the size of the optional data TLV. Non-negative integer represents the number of bytes for the length of the padding TLV. Notes: When configuring this parameter one should be aware of the maximum allowed total frame size limitation. The attribute is not used in case of 2-way loss measurement. range of type : Depends on the allowed MTU size."] +}, +"eth-on-demand-measurement-job-control-source-g": { +"id": "eth-on-demand-measurement-job-control-source-g", +"is-read-only": false, +"description": ["Basic attributes: destinationAddress, priority Measurement configuration related attributes: oamPduGenerationType, startTime, stopTime, messagePeriod, repetitionPeriod, measurementInterval Optional attributes: dataTlvLength, testIdentifier This object class represents an on-demand measurement job controller source for 1-way measurements. It is created as a result of an establishOnDemandDualEndedMeasurementJobSource() operation. It is deleted either automatically after the measurement job has completed (stop time reached), or by an explicit abortOnDemandMeasurementJob() operation while the measurement job is running."] +}, +"responder-mep-id": { +"id": "responder-mep-id", +"is-read-only": false, +"description": ["none"] +}, +"is-enabled": { +"id": "is-enabled", +"is-read-only": false, +"description": ["This attribute identifies the state of the measurement job. If set to TRUE, the MEP performs proactive Performance Measurement."] +}, +"source-address": { +"id": "source-address", +"is-read-only": false, +"description": ["This attribute contains the MAC address of the peer MEP. See G.8013 for details."] +}, +"test-identifier": { +"id": "test-identifier", +"is-read-only": false, +"description": ["This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP. range of type : 0..(2^32) - 1"] +}, +"eth-pro-active-measurement-job-control-sink-g": { +"id": "eth-pro-active-measurement-job-control-sink-g", +"is-read-only": false, +"description": ["This object class allows the control of the proactive 1-way measurement. It is created as a part of an establishProActiveDualEndedMeasurementJobSink() operation. Lifecycle: A pre-condition of deleting the object is that the “Enable” attribute should have the value “FALSE”."] +}, +"controller-mep-id": { +"id": "controller-mep-id", +"is-read-only": false, +"description": ["none"] +}, +"is-enabled": { +"id": "is-enabled", +"is-read-only": false, +"description": ["This attribute identifies the state of the measurement job. If set to TRUE, the MEP performs proactive Performance Measurement."] +}, +"destination-address": { +"id": "destination-address", +"is-read-only": false, +"description": ["This attribute provides the Unicast MAC address of the intented destination."] +}, +"priority": { +"id": "priority", +"is-read-only": false, +"description": ["This attribute contains the priority value on which the MEP performs the measurement. When the measurement is enabled, the MEP should use this value to encode the priority of generated measurement frames. The EMF usese this value to assign the “P” parameter of the measurement operation."] +}, +"period": { +"id": "period", +"is-read-only": false, +"description": ["This attribute indicates the period (frequency) of the measurement frame transmission. range of type : 100ms, 1s, 10s"] +}, +"test-identifier": { +"id": "test-identifier", +"is-read-only": false, +"description": ["This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP. Note: The attribute is not used in case of 2-way loss measurement. range of type : 0..(2^32) - 1"] +}, +"data-tlv-length": { +"id": "data-tlv-length", +"is-read-only": false, +"description": ["This parameter provides the size of the optional data TLV. Non-negative integer represents the number of bytes for the length of the padding TLV. Notes: When configuring this parameter one should be aware of the maximum allowed total frame size limitation. The attribute is not used in case of 2-way loss measurement. range of type : Depends on the allowed MTU size."] +}, +"eth-pro-active-measurement-job-control-source-g": { +"id": "eth-pro-active-measurement-job-control-source-g", +"is-read-only": false, +"description": ["This object class represents a proactive measurement job controller source for 1way measurements. It is created as a part of an establishProactiveDualEndedMeasurementJobSource() operation."] +}, +"pro-active-near-end-1-dm-parameters": { +"id": "pro-active-near-end-1-dm-parameters", +"is-read-only": false, +"description": ["This attribute contains the statistical near end performnace parameters."] +}, +"eth-pro-active-1-dm-performance-data-g": { +"id": "eth-pro-active-1-dm-performance-data-g", +"is-read-only": false, +"description": ["This object class represents the PM current data collected in a pro-active delay measurement job (using 1DM)."] +}, +"pro-active-near-end-1-lm-parameters": { +"id": "pro-active-near-end-1-lm-parameters", +"is-read-only": false, +"description": ["This attribute contains the statistical near end performnace parameters."] +}, +"eth-pro-active-1-lm-performance-data-g": { +"id": "eth-pro-active-1-lm-performance-data-g", +"is-read-only": false, +"description": ["This object class represents the PM current data collected in a pro-active loss measurement job (using 1SL)."] +}, +"pro-active-bi-dir-dm-parameters": { +"id": "pro-active-bi-dir-dm-parameters", +"is-read-only": false, +"description": ["This attribute contains the statistical bidirectional performnace parameters."] +}, +"pro-active-far-end-dm-parameters": { +"id": "pro-active-far-end-dm-parameters", +"is-read-only": false, +"description": ["This attribute contains the statistical far end performnace parameters."] +}, +"pro-active-near-end-dm-parameters": { +"id": "pro-active-near-end-dm-parameters", +"is-read-only": false, +"description": ["This attribute contains the statistical near end performnace parameters."] +}, +"eth-pro-active-dm-performance-data-g": { +"id": "eth-pro-active-dm-performance-data-g", +"is-read-only": false, +"description": ["This object class represents the PM current data collected in a pro-active delay measurement job (using DMM/DMR)."] +}, +"pro-active-far-end-lm-parameters": { +"id": "pro-active-far-end-lm-parameters", +"is-read-only": false, +"description": ["This attribute contains the statistical far end performnace parameters."] +}, +"pro-active-near-end-lm-parameters": { +"id": "pro-active-near-end-lm-parameters", +"is-read-only": false, +"description": ["This attribute contains the statistical near end performnace parameters."] +}, +"bidirectional-uas": { +"id": "bidirectional-uas", +"is-read-only": false, +"description": ["This attribute contains the bidirectional UAS (unavailable seconds) detected in the monitoring interval. range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval."] +}, +"eth-pro-active-lm-performance-data-g": { +"id": "eth-pro-active-lm-performance-data-g", +"is-read-only": false, +"description": ["This object class represents the PM current data collected in a pro-active loss measurement job (using LMM/LMR or SLM/SLR)."] +}, +"on-demand-near-end-1-dm-parameters": { +"id": "on-demand-near-end-1-dm-parameters", +"is-read-only": false, +"description": ["This attribute contains the results of an on-demand frame delay measurement job in the ingress direction."] +}, +"eth-on-demand-1-dm-performance-data-g": { +"id": "eth-on-demand-1-dm-performance-data-g", +"is-read-only": false, +"description": ["none"] +}, +"on-demand-near-end-1-lm-parameters": { +"id": "on-demand-near-end-1-lm-parameters", +"is-read-only": false, +"description": ["This attribute contains the results of an on-demand synthetic loss measurement job in the ingress direction."] +}, +"eth-on-demand-1-lm-performance-data-g": { +"id": "eth-on-demand-1-lm-performance-data-g", +"is-read-only": false, +"description": ["none"] +}, +"on-demand-far-end-dm-parameters": { +"id": "on-demand-far-end-dm-parameters", +"is-read-only": false, +"description": ["This attribute contains the results of an on-demand frame delay measurement job in the ingress direction."] +}, +"on-demand-near-end-dm-parameters": { +"id": "on-demand-near-end-dm-parameters", +"is-read-only": false, +"description": ["This attribute contains the results of an on-demand frame delay measurement job in the ingress direction."] +}, +"eth-on-demand-dm-performance-data-g": { +"id": "eth-on-demand-dm-performance-data-g", +"is-read-only": false, +"description": ["none"] +}, +"on-demand-far-end-lm-parameters": { +"id": "on-demand-far-end-lm-parameters", +"is-read-only": false, +"description": ["This attribute contains the results of an on-demand synthetic loss measurement job in the egress direction."] +}, +"on-demand-near-end-lm-parameters": { +"id": "on-demand-near-end-lm-parameters", +"is-read-only": false, +"description": ["This attribute contains the results of an on-demand synthetic loss measurement job in the ingress direction."] +}, +"eth-on-demand-lm-performance-data-g": { +"id": "eth-on-demand-lm-performance-data-g", +"is-read-only": false, +"description": ["none"] +}, +"pro-active-control-1way-source": { +"id": "pro-active-control-1way-source", +"is-read-only": false, +"description": ["none"] +}, +"pro-active-control-1way-sink": { +"id": "pro-active-control-1way-sink", +"is-read-only": false, +"description": ["none"] +}, +"eth-pro-active-1way-measurement-job-g": { +"id": "eth-pro-active-1way-measurement-job-g", +"is-read-only": false, +"description": ["none"] +}, +"pro-active-control-2way-source": { +"id": "pro-active-control-2way-source", +"is-read-only": false, +"description": ["none"] +}, +"eth-pro-active-2way-measurement-job-g": { +"id": "eth-pro-active-2way-measurement-job-g", +"is-read-only": false, +"description": ["none"] +}, +"on-demand-control-2way-source": { +"id": "on-demand-control-2way-source", +"is-read-only": false, +"description": ["none"] +}, +"eth-on-demand-2way-measurement-job-g": { +"id": "eth-on-demand-2way-measurement-job-g", +"is-read-only": false, +"description": ["none"] +}, +"on-demand-control-1way-source": { +"id": "on-demand-control-1way-source", +"is-read-only": false, +"description": ["none"] +}, +"on-demand-control-1way-sink": { +"id": "on-demand-control-1way-sink", +"is-read-only": false, +"description": ["none"] +}, +"eth-on-demand-1way-measurement-job-g": { +"id": "eth-on-demand-1way-measurement-job-g", +"is-read-only": false, +"description": ["none"] +}, +"near-end-1-dm-cross-threshold": { +"id": "near-end-1-dm-cross-threshold", +"is-read-only": false, +"description": ["This attribute contains the near end cross threshold values of the delay measurements."] +}, +"near-end-1-dm-clear-threshold": { +"id": "near-end-1-dm-clear-threshold", +"is-read-only": false, +"description": ["This attribute contains the near end clear threshold values of the delay measurements."] +}, +"eth-1-dm-threshold-data-g": { +"id": "eth-1-dm-threshold-data-g", +"is-read-only": false, +"description": ["This data type contains the threshold values for frame delay related 1-way measurements."] +}, +"near-end-1-lm-cross-threshold": { +"id": "near-end-1-lm-cross-threshold", +"is-read-only": false, +"description": ["This attribute contains the near end cross threshold values of the loss measurements."] +}, +"near-end-1-lm-clear-threshold": { +"id": "near-end-1-lm-clear-threshold", +"is-read-only": false, +"description": ["This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the near end clear threshold values of the loss measurements."] +}, +"eth-1-lm-threshold-data-g": { +"id": "eth-1-lm-threshold-data-g", +"is-read-only": false, +"description": ["This data type contains the threshold values for frame loss related 1-way measurements."] +}, +"near-end-dm-cross-threshold": { +"id": "near-end-dm-cross-threshold", +"is-read-only": false, +"description": ["This attribute contains the near end cross threshold values of the delay measurements."] +}, +"near-end-dm-clear-threshold": { +"id": "near-end-dm-clear-threshold", +"is-read-only": false, +"description": ["This attribute contains the near end clear threshold values of the delay measurements."] +}, +"far-end-dm-cross-threshold": { +"id": "far-end-dm-cross-threshold", +"is-read-only": false, +"description": ["This attribute contains the far end cross threshold values of the delay measurements."] +}, +"far-end-dm-clear-threshold": { +"id": "far-end-dm-clear-threshold", +"is-read-only": false, +"description": ["This attribute contains the far end clear threshold values of the delay measurements."] +}, +"bi-dir-dm-cross-threshold": { +"id": "bi-dir-dm-cross-threshold", +"is-read-only": false, +"description": ["This attribute contains the bidirectional cross threshold values of the delay measurements."] +}, +"bi-dir-dm-clear-threshold": { +"id": "bi-dir-dm-clear-threshold", +"is-read-only": false, +"description": ["This attribute contains the bidirectional clear threshold values of the delay measurements."] +}, +"eth-dm-threshold-data-g": { +"id": "eth-dm-threshold-data-g", +"is-read-only": false, +"description": ["This data type contains the threshold values for frame delay related 2-way measurements."] +}, +"near-end-lm-cross-threshold": { +"id": "near-end-lm-cross-threshold", +"is-read-only": false, +"description": ["This attribute contains the near end cross threshold values of the loss measurements."] +}, +"near-end-lm-clear-threshold": { +"id": "near-end-lm-clear-threshold", +"is-read-only": false, +"description": ["This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the near end clear threshold values of the loss measurements."] +}, +"far-end-lm-cross-threshold": { +"id": "far-end-lm-cross-threshold", +"is-read-only": false, +"description": ["This attribute contains the far end cross threshold values of the loss measurements."] +}, +"far-end-lm-clear-threshold": { +"id": "far-end-lm-clear-threshold", +"is-read-only": false, +"description": ["This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the far end clear threshold values of the loss measurements."] +}, +"bi-dir-lm-uas-cross-threshold": { +"id": "bi-dir-lm-uas-cross-threshold", +"is-read-only": false, +"description": ["This attribute contains the bidirectional cross threshold value of the UAS loss measurement."] +}, +"bi-dir-lm-uas-clear-threshold": { +"id": "bi-dir-lm-uas-clear-threshold", +"is-read-only": false, +"description": ["This attribute is only valid for the UAS parameter working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the bidirectional clear threshold value of the UAS loss measurement."] +}, +"eth-lm-threshold-data-g": { +"id": "eth-lm-threshold-data-g", +"is-read-only": false, +"description": ["This data type contains the threshold values for frame loss related 2-way measurements."] +}, +"rec-lbr-frames": { +"id": "rec-lbr-frames", +"is-read-only": false, +"description": ["G.8052: This parameter returns the total number of received LBR messages, including the out of order LBR frames."] +}, +"out-of-order-lbr-frames": { +"id": "out-of-order-lbr-frames", +"is-read-only": false, +"description": ["G.8052: This parameter returns the number of LBR traffic unites (messages) that were received out of order (OO)."] +}, +"sent-lbm-frames": { +"id": "sent-lbm-frames", +"is-read-only": false, +"description": ["G.8052: This parameter returns the total number of sent LBM frames."] +}, +"crc-lbr-frames": { +"id": "crc-lbr-frames", +"is-read-only": false, +"description": ["G.8052: This parameter returns the number of LBR frames where the CRC in the pattern failed."] +}, +"ber-lbr-frames": { +"id": "ber-lbr-frames", +"is-read-only": false, +"description": ["G.8052: This parameter returns the number of LBR frames where there was a bit error in the pattern."] +}, +"detected-peer-mep": { +"id": "detected-peer-mep", +"is-read-only": false, +"description": ["G.8052: This parameter returns the MAC addresses of the discovered peer MEPs of the subject MEP."] +}, +"eth-loopback-result-data-g": { +"id": "eth-loopback-result-data-g", +"is-read-only": false, +"description": ["none"] +}, +"result-list": { +"id": "result-list", +"is-read-only": false, +"description": ["G.8052: This parameter returns the results of the LT process. It contains a list of the result received from the individual LTR frames. The result from the individual LTR frame include the Source Mac Address, the TTL, and TLV."] +}, +"eth-link-trace-result-data-g": { +"id": "eth-link-trace-result-data-g", +"is-read-only": false, +"description": ["none"] +}, +"sent-tst-frames": { +"id": "sent-tst-frames", +"is-read-only": false, +"description": ["G.8052: This parameter returns the total number of sent TST frames."] +}, +"eth-test-result-data-g": { +"id": "eth-test-result-data-g", +"is-read-only": false, +"description": ["none"] +}, +"destination-address": { +"id": "destination-address", +"is-read-only": false, +"description": ["G.8052: This parameter provides the destination address, i.e., the MAC Address of the target MEP or MIP."] +}, +"priority": { +"id": "priority", +"is-read-only": false, +"description": ["G.8052: This parameter provides the priority to be used in the LBM frame."] +}, +"eth-oam-operation-common-pac-g": { +"id": "eth-oam-operation-common-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"period": { +"id": "period", +"is-read-only": false, +"description": ["G.8052: This parameter provides the periodicity of the TST OAM messages."] +}, +"drop-eligibility": { +"id": "drop-eligibility", +"is-read-only": false, +"description": ["G.8052: This parameter provides the eligibility of frames with unicast ETH-TST information to be discarded when congestion conditions are encountered."] +}, +"data-tlv-length": { +"id": "data-tlv-length", +"is-read-only": false, +"description": ["G.8052: This parameter provides the length (in number of octet) of the optional Data TLV to be included in the TST frame."] +}, +"test-pattern": { +"id": "test-pattern", +"is-read-only": false, +"description": ["G.8052: This parameter provides the test pattern to be used in the optional Data TLV. Examples of test patterns include pseudo-random bit sequence (PRBS) 2^31-1 as specified in clause 5.8 of [ITU-T O.150], all '0' pattern, etc. The following values of pattern types are defined: 0: 'Null signal without CRC-32' 1: 'Null signal with CRC-32' 2: 'PRBS 2^31-1 without CRC-32' 3: 'PRBS 2^31-1 with CRC-32'."] +}, +"eth-oam-msg-common-pac-g": { +"id": "eth-oam-msg-common-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE": { +"id": "ETH_OAM_JOB_TYPE", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_1DM": { +"id": "ETH_OAM_JOB_TYPE_ETH_1DM", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_1SLM": { +"id": "ETH_OAM_JOB_TYPE_ETH_1SLM", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_LM_CCM": { +"id": "ETH_OAM_JOB_TYPE_ETH_LM_CCM", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_LM_LMM": { +"id": "ETH_OAM_JOB_TYPE_ETH_LM_LMM", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_SLM": { +"id": "ETH_OAM_JOB_TYPE_ETH_SLM", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_DM": { +"id": "ETH_OAM_JOB_TYPE_ETH_DM", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_LTC": { +"id": "ETH_OAM_JOB_TYPE_ETH_LTC", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_LBK": { +"id": "ETH_OAM_JOB_TYPE_ETH_LBK", +"is-read-only": false, +"description": ["none"] +}, +"ETH_OAM_JOB_TYPE_ETH_TEST": { +"id": "ETH_OAM_JOB_TYPE_ETH_TEST", +"is-read-only": false, +"description": ["none"] +}, +"priority": { +"id": "priority", +"is-read-only": false, +"description": ["none"] +}, +"queue-id": { +"id": "queue-id", +"is-read-only": false, +"description": ["none"] +}, +"priority-configuration-g": { +"id": "priority-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"queue-id": { +"id": "queue-id", +"is-read-only": false, +"description": ["This attribute indicates the queue id."] +}, +"queue-depth": { +"id": "queue-depth", +"is-read-only": false, +"description": ["This attribute defines the depth of the queue in bytes."] +}, +"queue-threshold": { +"id": "queue-threshold", +"is-read-only": false, +"description": ["This attribute defines the threshold of the queue in bytes."] +}, +"queue-configuration-g": { +"id": "queue-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"cir": { +"id": "cir", +"is-read-only": false, +"description": ["This attribute indicates the Committed Information Rate in bits/s."] +}, +"cbs": { +"id": "cbs", +"is-read-only": false, +"description": ["This attribute indicates the Committed Burst Size in bytes."] +}, +"eir": { +"id": "eir", +"is-read-only": false, +"description": ["This attribute indicates the Excess Information Rate in bits/s."] +}, +"ebs": { +"id": "ebs", +"is-read-only": false, +"description": ["This attribute indicates the Excess Burst Size in bytes."] +}, +"coupling-flag": { +"id": "coupling-flag", +"is-read-only": false, +"description": ["This attribute indicates the coupling flag."] +}, +"colour-mode": { +"id": "colour-mode", +"is-read-only": false, +"description": ["This attribute indicates the colour mode."] +}, +"queue-id": { +"id": "queue-id", +"is-read-only": false, +"description": ["This attribute indicates the queue id."] +}, +"traffic-conditioning-configuration-g": { +"id": "traffic-conditioning-configuration-g", +"is-read-only": false, +"description": ["none"] +}, +"mac-address": { +"id": "mac-address", +"is-read-only": false, +"description": ["This primitive data type contains an Ethernet MAC address defined by IEEE 802a. The format of the address consists of 12 hexadecimal characters, grouped in pairs and separated by '-' (e.g., 03-27-AC-75-3E-1D)."] +}, +"priority-0": { +"id": "priority-0", +"is-read-only": false, +"description": ["This attribute defines the new priority value for the old priority value 0."] +}, +"priority-1": { +"id": "priority-1", +"is-read-only": false, +"description": ["This attribute defines the new priority value for the old priority value 1."] +}, +"priority-2": { +"id": "priority-2", +"is-read-only": false, +"description": ["This attribute defines the new priority value for the old priority value 2."] +}, +"priority-3": { +"id": "priority-3", +"is-read-only": false, +"description": ["This attribute defines the new priority value for the old priority value 3."] +}, +"priority-4": { +"id": "priority-4", +"is-read-only": false, +"description": ["This attribute defines the new priority value for the old priority value 4."] +}, +"priority-5": { +"id": "priority-5", +"is-read-only": false, +"description": ["This attribute defines the new priority value for the old priority value 5."] +}, +"priority-6": { +"id": "priority-6", +"is-read-only": false, +"description": ["This attribute defines the new priority value for the old priority value 6."] +}, +"priority-7": { +"id": "priority-7", +"is-read-only": false, +"description": ["This attribute defines the new priority value for the old priority value 7."] +}, +"priority-mapping-g": { +"id": "priority-mapping-g", +"is-read-only": false, +"description": ["This data type provides the priority mapping done in the 'P Regenerate' process defined in G.8021."] +}, +"vid": { +"id": "vid", +"is-read-only": false, +"description": ["This primitive type models the 12 Bit VLAN identifier of a VLAN tag."] +}, +"modify-cross-connection-data": { +"id": "modify-cross-connection-data", +"is-read-only": false, +"description": ["none"] +}, +"address": { +"id": "address", +"is-read-only": false, +"description": ["This attribute contains the MAC address of the address tuple."] +}, +"port-list": { +"id": "port-list", +"is-read-only": false, +"description": ["This attribute contains the ports associated to the MAC address in the address tuple."] +}, +"address-tuple-g": { +"id": "address-tuple-g", +"is-read-only": false, +"description": ["This data type contains an address tuple consisting of a MAC address and a corresponding port list."] +}, +"scheduling-configuration": { +"id": "scheduling-configuration", +"is-read-only": false, +"description": ["The syntax of this dataType is pending on the specification in G.8021, which is for further study."] +}, +"c-2-00-00-10": { +"id": "c-2-00-00-10", +"is-read-only": false, +"description": ["This attribute identifies the 'All LANs Bridge Management Group Address'."] +}, +"c-2-00-00-00": { +"id": "c-2-00-00-00", +"is-read-only": false, +"description": ["This attribute identifies the STP/RSTP/MSTP protocol address."] +}, +"c-2-00-00-01": { +"id": "c-2-00-00-01", +"is-read-only": false, +"description": ["This attribute identifies the IEEE MAC-specific Control Protocols group address (PAUSE protocol)."] +}, +"c-2-00-00-02": { +"id": "c-2-00-00-02", +"is-read-only": false, +"description": ["This attribute identifies the IEEE 802.3 Slow_Protocols_Multicast address (LACP/LAMP or Link OAM protocols)."] +}, +"c-2-00-00-03": { +"id": "c-2-00-00-03", +"is-read-only": false, +"description": ["This attribute identifies the Nearest non-TPMR Bridge group address (Port Authentication protocol)."] +}, +"c-2-00-00-04": { +"id": "c-2-00-00-04", +"is-read-only": false, +"description": ["This attribute identifies the IEEE MAC-specific Control Protocols group address."] +}, +"c-2-00-00-05": { +"id": "c-2-00-00-05", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-06": { +"id": "c-2-00-00-06", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-07": { +"id": "c-2-00-00-07", +"is-read-only": false, +"description": ["This attribute identifies the Metro Ethernet Forum E-LMI protocol group address."] +}, +"c-2-00-00-08": { +"id": "c-2-00-00-08", +"is-read-only": false, +"description": ["This attribute identifies the Provider Bridge Group address."] +}, +"c-2-00-00-09": { +"id": "c-2-00-00-09", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-0-a": { +"id": "c-2-00-00-0-a", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-0-b": { +"id": "c-2-00-00-0-b", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-0-c": { +"id": "c-2-00-00-0-c", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-0-d": { +"id": "c-2-00-00-0-d", +"is-read-only": false, +"description": ["This attribute identifies the Provider Bridge MVRP address."] +}, +"c-2-00-00-0-e": { +"id": "c-2-00-00-0-e", +"is-read-only": false, +"description": ["This attribute identifies the Individual LAN Scope group address, Nearest Bridge group address (LLDP protocol)."] +}, +"c-2-00-00-0-f": { +"id": "c-2-00-00-0-f", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-20": { +"id": "c-2-00-00-20", +"is-read-only": false, +"description": ["This attribute identifies the Customer and Provider Bridge MMRP address."] +}, +"c-2-00-00-21": { +"id": "c-2-00-00-21", +"is-read-only": false, +"description": ["This attribute identifies the Customer Bridge MVRP address."] +}, +"c-2-00-00-22": { +"id": "c-2-00-00-22", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-23": { +"id": "c-2-00-00-23", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-24": { +"id": "c-2-00-00-24", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-25": { +"id": "c-2-00-00-25", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-26": { +"id": "c-2-00-00-26", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-27": { +"id": "c-2-00-00-27", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-28": { +"id": "c-2-00-00-28", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-29": { +"id": "c-2-00-00-29", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-2-a": { +"id": "c-2-00-00-2-a", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-2-b": { +"id": "c-2-00-00-2-b", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-2-c": { +"id": "c-2-00-00-2-c", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-2-d": { +"id": "c-2-00-00-2-d", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-2-e": { +"id": "c-2-00-00-2-e", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"c-2-00-00-2-f": { +"id": "c-2-00-00-2-f", +"is-read-only": false, +"description": ["Reserved for future standardization."] +}, +"control-frame-filter-g": { +"id": "control-frame-filter-g", +"is-read-only": false, +"description": ["This data type identifies the filter action for each of the 33 group MAC addresses (control frames). Value 'false' means block: The frame is discarded by the filter process. Value 'true' means pass: The frame is passed unchanged through the filter process."] +}, +"source-mac-address": { +"id": "source-mac-address", +"is-read-only": false, +"description": ["The sourceMacAddress is the address from the far end."] +}, +"port-id": { +"id": "port-id", +"is-read-only": false, +"description": ["This attribute returns the far end port identifier."] +}, +"nominal-bandwidth": { +"id": "nominal-bandwidth", +"is-read-only": false, +"description": ["This attribute returns the configured bandwidth"] +}, +"current-bandwidth": { +"id": "current-bandwidth", +"is-read-only": false, +"description": ["This attribute returns the current bandwidth."] +}, +"bandwidth-report-g": { +"id": "bandwidth-report-g", +"is-read-only": false, +"description": ["Data type for the bandwidth report."] +}, +"LOCK": { +"id": "LOCK", +"is-read-only": false, +"description": ["none"] +}, +"NORMAL": { +"id": "NORMAL", +"is-read-only": false, +"description": ["none"] +}, +"admin-state": { +"id": "admin-state", +"is-read-only": false, +"description": ["none"] +}, +"COLOUR_BLIND": { +"id": "COLOUR_BLIND", +"is-read-only": false, +"description": ["none"] +}, +"COLOUR_AWARE": { +"id": "COLOUR_AWARE", +"is-read-only": false, +"description": ["none"] +}, +"colour-mode": { +"id": "colour-mode", +"is-read-only": false, +"description": ["none"] +}, +"DISABLED": { +"id": "DISABLED", +"is-read-only": false, +"description": ["This literal covers the following states of the CSF related MI informations: - MI_CSF_Enable is false - MI_CSFrdifdi_Enable is false - MI_CSFdci_Enable is false."] +}, +"ENABLED": { +"id": "ENABLED", +"is-read-only": false, +"description": ["This literal covers the following states of the CSF related MI informations: - MI_CSF_Enable is true - MI_CSFrdifdi_Enable is false - MI_CSFdci_Enable is false."] +}, +"ENABLED_WITH_RDI_FDI": { +"id": "ENABLED_WITH_RDI_FDI", +"is-read-only": false, +"description": ["This literal covers the following states of the CSF related MI informations: - MI_CSF_Enable is true - MI_CSFrdifdi_Enable is true - MI_CSFdci_Enable is false."] +}, +"ENABLED_WITH_RDI_FDI_DCI": { +"id": "ENABLED_WITH_RDI_FDI_DCI", +"is-read-only": false, +"description": ["This literal covers the following states of the CSF related MI informations: - MI_CSF_Enable is true - MI_CSFrdifdi_Enable is true - MI_CSFdci_Enable is true."] +}, +"ENABLED_WITH_DCI": { +"id": "ENABLED_WITH_DCI", +"is-read-only": false, +"description": ["This literal covers the following states of the CSF related MI informations: - MI_CSF_Enable is true - MI_CSFrdifdi_Enable is false - MI_CSFdci_Enable is true."] +}, +"csf-config": { +"id": "csf-config", +"is-read-only": false, +"description": ["none"] +}, +"OTHER": { +"id": "OTHER", +"is-read-only": false, +"description": ["none"] +}, +"UNKNOWN": { +"id": "UNKNOWN", +"is-read-only": false, +"description": ["none"] +}, +"NONE": { +"id": "NONE", +"is-read-only": false, +"description": ["none"] +}, +"2BASE_TL": { +"id": "2BASE_TL", +"is-read-only": false, +"description": ["none"] +}, +"10MBIT_S": { +"id": "10MBIT_S", +"is-read-only": false, +"description": ["none"] +}, +"10PASS_TS": { +"id": "10PASS_TS", +"is-read-only": false, +"description": ["none"] +}, +"100BASE_T4": { +"id": "100BASE_T4", +"is-read-only": false, +"description": ["none"] +}, +"100BASE_X": { +"id": "100BASE_X", +"is-read-only": false, +"description": ["none"] +}, +"100BASE_T2": { +"id": "100BASE_T2", +"is-read-only": false, +"description": ["none"] +}, +"1000BASE_X": { +"id": "1000BASE_X", +"is-read-only": false, +"description": ["none"] +}, +"1000BASE_T": { +"id": "1000BASE_T", +"is-read-only": false, +"description": ["none"] +}, +"10GBASE-X": { +"id": "10GBASE-X", +"is-read-only": false, +"description": ["none"] +}, +"10GBASE_R": { +"id": "10GBASE_R", +"is-read-only": false, +"description": ["none"] +}, +"10GBASE_W": { +"id": "10GBASE_W", +"is-read-only": false, +"description": ["none"] +}, +"ety-phy-type": { +"id": "ety-phy-type", +"is-read-only": false, +"description": ["none"] +}, +"ADMIT_ONLY_VLAN_TAGGED_FRAMES": { +"id": "ADMIT_ONLY_VLAN_TAGGED_FRAMES", +"is-read-only": false, +"description": ["none"] +}, +"ADMIT_ONLY_UNTAGGED_AND_PRIORITY_TAGGED_FRAMES": { +"id": "ADMIT_ONLY_UNTAGGED_AND_PRIORITY_TAGGED_FRAMES", +"is-read-only": false, +"description": ["none"] +}, +"ADMIT_ALL_FRAMES": { +"id": "ADMIT_ALL_FRAMES", +"is-read-only": false, +"description": ["none"] +}, +"frame-type": { +"id": "frame-type", +"is-read-only": false, +"description": ["none"] +}, +"3_33MS": { +"id": "3_33MS", +"is-read-only": false, +"description": ["Default for protection."] +}, +"10MS": { +"id": "10MS", +"is-read-only": false, +"description": ["none"] +}, +"100MS": { +"id": "100MS", +"is-read-only": false, +"description": ["none"] +}, +"1S": { +"id": "1S", +"is-read-only": false, +"description": ["none"] +}, +"10S": { +"id": "10S", +"is-read-only": false, +"description": ["none"] +}, +"1MIN": { +"id": "1MIN", +"is-read-only": false, +"description": ["none"] +}, +"10MIN": { +"id": "10MIN", +"is-read-only": false, +"description": ["none"] +}, +"oam-period": { +"id": "oam-period", +"is-read-only": false, +"description": ["Provides the frequency for the OAM PDU insertion."] +}, +"8P0D": { +"id": "8P0D", +"is-read-only": false, +"description": ["none"] +}, +"7P1D": { +"id": "7P1D", +"is-read-only": false, +"description": ["none"] +}, +"6P2D": { +"id": "6P2D", +"is-read-only": false, +"description": ["none"] +}, +"5P3D": { +"id": "5P3D", +"is-read-only": false, +"description": ["none"] +}, +"DEI": { +"id": "DEI", +"is-read-only": false, +"description": ["This enumeration value means that all priorities should be drop eligible. DEI = Drop Eligibility Indicator"] +}, +"pcp-coding": { +"id": "pcp-coding", +"is-read-only": false, +"description": ["This enum models the coding of the Priority Code Point as defined in section 'Priority Code Point encoding' of IEEE 802.1Q."] +}, +"C_Tag": { +"id": "C_Tag", +"is-read-only": false, +"description": ["0x8100"] +}, +"S_Tag": { +"id": "S_Tag", +"is-read-only": false, +"description": ["0x88a8"] +}, +"I_Tag": { +"id": "I_Tag", +"is-read-only": false, +"description": ["88-e7"] +}, +"vlan-type": { +"id": "vlan-type", +"is-read-only": false, +"description": ["This enumeration contains the Ethertypes defined in IEEE 802.1Q."] +}, +"1MIN": { +"id": "1MIN", +"is-read-only": false, +"description": ["none"] +}, +"1S": { +"id": "1S", +"is-read-only": false, +"description": ["none"] +}, +"10S": { +"id": "10S", +"is-read-only": false, +"description": ["none"] +}, +"0": { +"id": "0", +"is-read-only": false, +"description": ["none"] +}, +"repetition-period": { +"id": "repetition-period", +"is-read-only": false, +"description": ["This enumeration defines the allowed values for the repetition period in on-demand measurements. Note: The value 0 means that the value is not relevant."] +}, +"10MS": { +"id": "10MS", +"is-read-only": false, +"description": ["none"] +}, +"100MS": { +"id": "100MS", +"is-read-only": false, +"description": ["none"] +}, +"1S": { +"id": "1S", +"is-read-only": false, +"description": ["none"] +}, +"10S": { +"id": "10S", +"is-read-only": false, +"description": ["none"] +}, +"0": { +"id": "0", +"is-read-only": false, +"description": ["none"] +}, +"message-period": { +"id": "message-period", +"is-read-only": false, +"description": ["This enumeration defines the allowed values for the message period in on-demand measurements. Notes: The value 10ms is only used in synthetic loss measurements. The value 0 means that the value is not relevant."] +}, +"SINGLE_INSTANCE": { +"id": "SINGLE_INSTANCE", +"is-read-only": false, +"description": ["none"] +}, +"REPETITIVE_INSTANCE": { +"id": "REPETITIVE_INSTANCE", +"is-read-only": false, +"description": ["none"] +}, +"SINGLE_SERIES": { +"id": "SINGLE_SERIES", +"is-read-only": false, +"description": ["none"] +}, +"REPETITIVE_SERIES": { +"id": "REPETITIVE_SERIES", +"is-read-only": false, +"description": ["none"] +}, +"oam-pdu-generation-type": { +"id": "oam-pdu-generation-type", +"is-read-only": false, +"description": ["This enumeration defines the generation pattern of the on-demand OAM PDUs (messages)."] +}, +"number-of-samples": { +"id": "number-of-samples", +"is-read-only": false, +"description": ["This attribute contains the number of received DM frames (successful samples) used for this frame delay measurement. range of type : non-negative"] +}, +"frame-delay-list": { +"id": "frame-delay-list", +"is-read-only": false, +"description": ["This attribute contains the frame delays measured in ns (nano second, 1x10e-9 seconds). The multiplicity is defined by the numberOfSamples attribute."] +}, +"frame-delay-variation-list": { +"id": "frame-delay-variation-list", +"is-read-only": false, +"description": ["This attribute contains the frame delay variations measured in ns (nano second). The multiplicity is defined by (numberOfSamples - 1, for numberOfSamples > 0)."] +}, +"on-demand-dm-performance-parameters-g": { +"id": "on-demand-dm-performance-parameters-g", +"is-read-only": false, +"description": ["This data type contains the results of an on-demand delay measurement job."] +}, +"total-transmitted-frames": { +"id": "total-transmitted-frames", +"is-read-only": false, +"description": ["This attribute contains the total number of frames transmitted."] +}, +"total-lost-frames": { +"id": "total-lost-frames", +"is-read-only": false, +"description": ["This attribute contains the total number of frames lost."] +}, +"total-frame-loss-ratio": { +"id": "total-frame-loss-ratio", +"is-read-only": false, +"description": ["This attribute contains the frame loss ratio (number of lost frames divided by the number of total frames (N_LF / N_TF)). The accuracy of the value is for further study."] +}, +"on-demand-lm-performance-parameters-g": { +"id": "on-demand-lm-performance-parameters-g", +"is-read-only": false, +"description": ["This data type contains the results of an on-demand loss measurement job."] +}, +"minimum-frame-delay": { +"id": "minimum-frame-delay", +"is-read-only": false, +"description": ["This attribute contains the minimum frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds)."] +}, +"average-frame-delay": { +"id": "average-frame-delay", +"is-read-only": false, +"description": ["This attribute contains the average frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds)."] +}, +"maximum-frame-delay": { +"id": "maximum-frame-delay", +"is-read-only": false, +"description": ["This attribute contains the maximum frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds)."] +}, +"minimum-frame-delay-variation": { +"id": "minimum-frame-delay-variation", +"is-read-only": false, +"description": ["This attribute contains the minimum frame delay variation measured in units of ns (nano second, 1x10e-9 seconds)."] +}, +"average-frame-delay-variation": { +"id": "average-frame-delay-variation", +"is-read-only": false, +"description": ["This attribute contains the average frame delay variation measured in units of ns (nano second, 1x10e-9 seconds)."] +}, +"maximum-frame-delay-variation": { +"id": "maximum-frame-delay-variation", +"is-read-only": false, +"description": ["This attribute contains the maximum frame delay variation measured in units of ns (nano second, 1x10e-9 seconds)."] +}, +"statistical-dm-performance-parameters-g": { +"id": "statistical-dm-performance-parameters-g", +"is-read-only": false, +"description": ["This data type contains the statistical delay measurement performance parameters."] +}, +"minimum-frame-loss-ratio": { +"id": "minimum-frame-loss-ratio", +"is-read-only": false, +"description": ["This attribute contains the minimum frame loss ratio calculated over a period of time. The accuracy of the value is for further study."] +}, +"average-frame-loss-ratio": { +"id": "average-frame-loss-ratio", +"is-read-only": false, +"description": ["This attribute contains the average frame loss ratio calculated over a period of time. The accuracy of the value is for further study."] +}, +"maximum-frame-loss-ratio": { +"id": "maximum-frame-loss-ratio", +"is-read-only": false, +"description": ["This attribute contains the maximum frame loss ratio calculated over a period of time. The accuracy of the value is for further study."] +}, +"ses": { +"id": "ses", +"is-read-only": false, +"description": ["This attribute contains the SES detected in the monitoring interval. range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval."] +}, +"uas": { +"id": "uas", +"is-read-only": false, +"description": ["This attribute contains UAS (unavailable seconds) detected in the monitoring interval. range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval."] +}, +"statistical-lm-performance-parameters-g": { +"id": "statistical-lm-performance-parameters-g", +"is-read-only": false, +"description": ["This data type contains the statistical loss measurement performance parameters."] +}, +"eth-oam-job-type": { +"id": "eth-oam-job-type", +"is-read-only": false, +"description": ["none"] +}, +"source-address": { +"id": "source-address", +"is-read-only": false, +"description": ["G.8052: This attribute contains the source MAC Address of an individual LTR frame result."] +}, +"time-to-live": { +"id": "time-to-live", +"is-read-only": false, +"description": ["G.8052: This attribute contains the Time To Live (TTL) value of an individual LTR frame result."] +}, +"data-tlv-length": { +"id": "data-tlv-length", +"is-read-only": false, +"description": ["G.8052: This attribute contains the length (in number of octets) of the Data TLV of an individual LTR frame result."] +}, +"link-trace-result-g": { +"id": "link-trace-result-g", +"is-read-only": false, +"description": ["G.8052: This data type contains the result from an individual LTR frame."] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-notification@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-notification@2018-08-31.schema-information.json new file mode 100644 index 000000000..cb170ac16 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-notification@2018-08-31.schema-information.json @@ -0,0 +1,648 @@ +{ "schama-information": { + +"tapi-notification": { +"id": "tapi-notification", +"is-read-only": false, +"description": ["This module contains TAPI Notification Model definitions. Source: TapiNotification.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"notification": { +"id": "notification", +"is-read-only": false, +"description": ["none"] +}, +"notification-channel": { +"id": "notification-channel", +"is-read-only": false, +"description": ["none"] +}, +"subscription-filter": { +"id": "subscription-filter", +"is-read-only": false, +"description": ["none"] +}, +"subscription-state": { +"id": "subscription-state", +"is-read-only": false, +"description": ["none"] +}, +"supported-notification-types": { +"id": "supported-notification-types", +"is-read-only": false, +"description": ["none"] +}, +"supported-object-types": { +"id": "supported-object-types", +"is-read-only": false, +"description": ["none"] +}, +"notification-subscription-service-g": { +"id": "notification-subscription-service-g", +"is-read-only": false, +"description": ["none"] +}, +"requested-notification-types": { +"id": "requested-notification-types", +"is-read-only": false, +"description": ["none"] +}, +"requested-object-types": { +"id": "requested-object-types", +"is-read-only": false, +"description": ["none"] +}, +"requested-layer-protocols": { +"id": "requested-layer-protocols", +"is-read-only": false, +"description": ["none"] +}, +"requested-object-identifier": { +"id": "requested-object-identifier", +"is-read-only": false, +"description": ["none"] +}, +"include-content": { +"id": "include-content", +"is-read-only": false, +"description": ["Indicates whether the published Notification includes content or just the Notification Id (which enables retrieval of the notification at the later stage)"] +}, +"subscription-filter-g": { +"id": "subscription-filter-g", +"is-read-only": false, +"description": ["none"] +}, +"notification": { +"id": "notification", +"is-read-only": false, +"description": ["none"] +}, +"notification-type": { +"id": "notification-type", +"is-read-only": false, +"description": ["none"] +}, +"target-object-type": { +"id": "target-object-type", +"is-read-only": false, +"description": ["none"] +}, +"target-object-identifier": { +"id": "target-object-identifier", +"is-read-only": false, +"description": ["none"] +}, +"target-object-name": { +"id": "target-object-name", +"is-read-only": false, +"description": ["none"] +}, +"event-time-stamp": { +"id": "event-time-stamp", +"is-read-only": false, +"description": ["none"] +}, +"sequence-number": { +"id": "sequence-number", +"is-read-only": false, +"description": ["A monotonous increasing sequence number associated with the notification. The exact semantics of how this sequence number is assigned (per channel or subscription or source or system) is left undefined."] +}, +"source-indicator": { +"id": "source-indicator", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"changed-attributes": { +"id": "changed-attributes", +"is-read-only": false, +"description": ["none"] +}, +"additional-info": { +"id": "additional-info", +"is-read-only": false, +"description": ["none"] +}, +"additional-text": { +"id": "additional-text", +"is-read-only": false, +"description": ["none"] +}, +"tca-info": { +"id": "tca-info", +"is-read-only": false, +"description": ["none"] +}, +"alarm-info": { +"id": "alarm-info", +"is-read-only": false, +"description": ["none"] +}, +"notification-g": { +"id": "notification-g", +"is-read-only": false, +"description": ["none"] +}, +"stream-address": { +"id": "stream-address", +"is-read-only": false, +"description": ["The address/location/URI of the channel/stream to which the subscribed notifications are published. This specifics of this is typically dependent on the implementation protocol & mechanism and hence is typed as a string."] +}, +"next-sequence-no": { +"id": "next-sequence-no", +"is-read-only": false, +"description": ["The sequence number of the next notification that will be published on the channel"] +}, +"notification-channel-g": { +"id": "notification-channel-g", +"is-read-only": false, +"description": ["none"] +}, +"notif-subscription": { +"id": "notif-subscription", +"is-read-only": false, +"description": ["none"] +}, +"notification": { +"id": "notification", +"is-read-only": false, +"description": ["none"] +}, +"notification-context-g": { +"id": "notification-context-g", +"is-read-only": false, +"description": ["none"] +}, +"is-transient": { +"id": "is-transient", +"is-read-only": false, +"description": ["none"] +}, +"perceived-severity": { +"id": "perceived-severity", +"is-read-only": false, +"description": ["none"] +}, +"probable-cause": { +"id": "probable-cause", +"is-read-only": false, +"description": ["none"] +}, +"service-affecting": { +"id": "service-affecting", +"is-read-only": false, +"description": ["none"] +}, +"alarm-info-g": { +"id": "alarm-info-g", +"is-read-only": false, +"description": ["none"] +}, +"is-transient": { +"id": "is-transient", +"is-read-only": false, +"description": ["none"] +}, +"threshold-crossing": { +"id": "threshold-crossing", +"is-read-only": false, +"description": ["none"] +}, +"threshold-parameter": { +"id": "threshold-parameter", +"is-read-only": false, +"description": ["none"] +}, +"threshold-value": { +"id": "threshold-value", +"is-read-only": false, +"description": ["none"] +}, +"perceived-severity": { +"id": "perceived-severity", +"is-read-only": false, +"description": ["none"] +}, +"measurement-interval": { +"id": "measurement-interval", +"is-read-only": false, +"description": ["none"] +}, +"suspect-interval-flag": { +"id": "suspect-interval-flag", +"is-read-only": false, +"description": ["none"] +}, +"tca-info-g": { +"id": "tca-info-g", +"is-read-only": false, +"description": ["none"] +}, +"value-name": { +"id": "value-name", +"is-read-only": false, +"description": ["The name of the value. The value need not have a name."] +}, +"old-value": { +"id": "old-value", +"is-read-only": false, +"description": ["The value"] +}, +"new-value": { +"id": "new-value", +"is-read-only": false, +"description": ["The value"] +}, +"name-and-value-change-g": { +"id": "name-and-value-change-g", +"is-read-only": false, +"description": ["A scoped name-value triple, including old value and new value"] +}, +"OBJECT_CREATION": { +"id": "OBJECT_CREATION", +"is-read-only": false, +"description": ["Not a normal state. The system is unable to determine the correct value."] +}, +"OBJECT_DELETION": { +"id": "OBJECT_DELETION", +"is-read-only": false, +"description": ["none"] +}, +"ATTRIBUTE_VALUE_CHANGE": { +"id": "ATTRIBUTE_VALUE_CHANGE", +"is-read-only": false, +"description": ["none"] +}, +"ALARM_EVENT": { +"id": "ALARM_EVENT", +"is-read-only": false, +"description": ["none"] +}, +"THRESHOLD_CROSSING_ALERT": { +"id": "THRESHOLD_CROSSING_ALERT", +"is-read-only": false, +"description": ["none"] +}, +"notification-type": { +"id": "notification-type", +"is-read-only": false, +"description": ["List of supported Notifications types."] +}, +"TOPOLOGY": { +"id": "TOPOLOGY", +"is-read-only": false, +"description": ["none"] +}, +"NODE": { +"id": "NODE", +"is-read-only": false, +"description": ["none"] +}, +"LINK": { +"id": "LINK", +"is-read-only": false, +"description": ["none"] +}, +"CONNECTION": { +"id": "CONNECTION", +"is-read-only": false, +"description": ["none"] +}, +"PATH": { +"id": "PATH", +"is-read-only": false, +"description": ["none"] +}, +"CONNECTIVITY_SERVICE": { +"id": "CONNECTIVITY_SERVICE", +"is-read-only": false, +"description": ["none"] +}, +"VIRTUAL_NETWORK_SERVICE": { +"id": "VIRTUAL_NETWORK_SERVICE", +"is-read-only": false, +"description": ["none"] +}, +"PATH_COMPUTATION_SERVICE": { +"id": "PATH_COMPUTATION_SERVICE", +"is-read-only": false, +"description": ["none"] +}, +"NODE_EDGE_POINT": { +"id": "NODE_EDGE_POINT", +"is-read-only": false, +"description": ["none"] +}, +"SERVICE_INTERFACE_POINT": { +"id": "SERVICE_INTERFACE_POINT", +"is-read-only": false, +"description": ["none"] +}, +"CONNECTION_END_POINT": { +"id": "CONNECTION_END_POINT", +"is-read-only": false, +"description": ["none"] +}, +"MAINTENANCE_ENTITY_GROUP": { +"id": "MAINTENANCE_ENTITY_GROUP", +"is-read-only": false, +"description": ["none"] +}, +"MAINTENANCE_ENTITY": { +"id": "MAINTENANCE_ENTITY", +"is-read-only": false, +"description": ["none"] +}, +"MEG_END_POINT": { +"id": "MEG_END_POINT", +"is-read-only": false, +"description": ["none"] +}, +"MEG_INTERMEDIATE_POINT": { +"id": "MEG_INTERMEDIATE_POINT", +"is-read-only": false, +"description": ["none"] +}, +"SWITCH_CONTROL": { +"id": "SWITCH_CONTROL", +"is-read-only": false, +"description": ["none"] +}, +"SWITCH": { +"id": "SWITCH", +"is-read-only": false, +"description": ["none"] +}, +"ROUTE": { +"id": "ROUTE", +"is-read-only": false, +"description": ["none"] +}, +"NODE_RULE_GROUP": { +"id": "NODE_RULE_GROUP", +"is-read-only": false, +"description": ["none"] +}, +"INTER_RULE_GROUP": { +"id": "INTER_RULE_GROUP", +"is-read-only": false, +"description": ["none"] +}, +"RULE": { +"id": "RULE", +"is-read-only": false, +"description": ["none"] +}, +"OAM_JOB": { +"id": "OAM_JOB", +"is-read-only": false, +"description": ["none"] +}, +"object-type": { +"id": "object-type", +"is-read-only": false, +"description": ["The list of TAPI Global Object Class types on which Notifications can be raised."] +}, +"RESOURCE_OPERATION": { +"id": "RESOURCE_OPERATION", +"is-read-only": false, +"description": ["none"] +}, +"MANAGEMENT_OPERATION": { +"id": "MANAGEMENT_OPERATION", +"is-read-only": false, +"description": ["none"] +}, +"UNKNOWN": { +"id": "UNKNOWN", +"is-read-only": false, +"description": ["none"] +}, +"source-indicator": { +"id": "source-indicator", +"is-read-only": false, +"description": ["none"] +}, +"SUSPENDED": { +"id": "SUSPENDED", +"is-read-only": false, +"description": ["none"] +}, +"ACTIVE": { +"id": "ACTIVE", +"is-read-only": false, +"description": ["none"] +}, +"subscription-state": { +"id": "subscription-state", +"is-read-only": false, +"description": ["none"] +}, +"CRITICAL": { +"id": "CRITICAL", +"is-read-only": false, +"description": ["none"] +}, +"MAJOR": { +"id": "MAJOR", +"is-read-only": false, +"description": ["none"] +}, +"MINOR": { +"id": "MINOR", +"is-read-only": false, +"description": ["none"] +}, +"WARNING": { +"id": "WARNING", +"is-read-only": false, +"description": ["none"] +}, +"CLEARED": { +"id": "CLEARED", +"is-read-only": false, +"description": ["none"] +}, +"perceived-severity-type": { +"id": "perceived-severity-type", +"is-read-only": false, +"description": ["none"] +}, +"THRESHOLD_ABOVE": { +"id": "THRESHOLD_ABOVE", +"is-read-only": false, +"description": ["none"] +}, +"THRESHOLD_BELOW": { +"id": "THRESHOLD_BELOW", +"is-read-only": false, +"description": ["none"] +}, +"CLEARED": { +"id": "CLEARED", +"is-read-only": false, +"description": ["none"] +}, +"threshold-crossing-type": { +"id": "threshold-crossing-type", +"is-read-only": false, +"description": ["none"] +}, +"SERVICE_AFFECTING": { +"id": "SERVICE_AFFECTING", +"is-read-only": false, +"description": ["none"] +}, +"NOT_SERVICE_AFFECTING": { +"id": "NOT_SERVICE_AFFECTING", +"is-read-only": false, +"description": ["none"] +}, +"UNKNOWN": { +"id": "UNKNOWN", +"is-read-only": false, +"description": ["none"] +}, +"service-affecting": { +"id": "service-affecting", +"is-read-only": false, +"description": ["none"] +}, +"WARNING": { +"id": "WARNING", +"is-read-only": false, +"description": ["none"] +}, +"CLEAR": { +"id": "CLEAR", +"is-read-only": false, +"description": ["none"] +}, +"perceived-tca-severity": { +"id": "perceived-tca-severity", +"is-read-only": false, +"description": ["none"] +}, +"get-supported-notification-types": { +"id": "get-supported-notification-types", +"is-read-only": false, +"description": ["none"] +}, +"supported-notification-types": { +"id": "supported-notification-types", +"is-read-only": false, +"description": ["none"] +}, +"supported-object-types": { +"id": "supported-object-types", +"is-read-only": false, +"description": ["none"] +}, +"create-notification-subscription-service": { +"id": "create-notification-subscription-service", +"is-read-only": false, +"description": ["none"] +}, +"subscription-filter": { +"id": "subscription-filter", +"is-read-only": false, +"description": ["none"] +}, +"subscription-state": { +"id": "subscription-state", +"is-read-only": false, +"description": ["none"] +}, +"subscription-service": { +"id": "subscription-service", +"is-read-only": false, +"description": ["none"] +}, +"update-notification-subscription-service": { +"id": "update-notification-subscription-service", +"is-read-only": false, +"description": ["none"] +}, +"subscription-id-or-name": { +"id": "subscription-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"subscription-filter": { +"id": "subscription-filter", +"is-read-only": false, +"description": ["none"] +}, +"subscription-state": { +"id": "subscription-state", +"is-read-only": false, +"description": ["none"] +}, +"subscription-service": { +"id": "subscription-service", +"is-read-only": false, +"description": ["none"] +}, +"delete-notification-subscription-service": { +"id": "delete-notification-subscription-service", +"is-read-only": false, +"description": ["none"] +}, +"subscription-id-or-name": { +"id": "subscription-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"subscription-service": { +"id": "subscription-service", +"is-read-only": false, +"description": ["none"] +}, +"get-notification-subscription-service-details": { +"id": "get-notification-subscription-service-details", +"is-read-only": false, +"description": ["none"] +}, +"subscription-id-or-name": { +"id": "subscription-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"subscription-service": { +"id": "subscription-service", +"is-read-only": false, +"description": ["none"] +}, +"get-notification-subscription-service-list": { +"id": "get-notification-subscription-service-list", +"is-read-only": false, +"description": ["none"] +}, +"subscription-service": { +"id": "subscription-service", +"is-read-only": false, +"description": ["none"] +}, +"get-notification-list": { +"id": "get-notification-list", +"is-read-only": false, +"description": ["none"] +}, +"subscription-id-or-name": { +"id": "subscription-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"time-period": { +"id": "time-period", +"is-read-only": false, +"description": ["none"] +}, +"notification": { +"id": "notification", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-oam@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-oam@2018-08-31.schema-information.json new file mode 100644 index 000000000..c6903ed35 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-oam@2018-08-31.schema-information.json @@ -0,0 +1,778 @@ +{ "schama-information": { + +"tapi-oam": { +"id": "tapi-oam", +"is-read-only": false, +"description": ["This module contains TAPI OAM Model definitions. Source: TapiOam.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"oam-service-uuid": { +"id": "oam-service-uuid", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-ref-g": { +"id": "oam-service-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-end-point-local-id": { +"id": "oam-service-end-point-local-id", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-end-point-ref-g": { +"id": "oam-service-end-point-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"meg-uuid": { +"id": "meg-uuid", +"is-read-only": false, +"description": ["none"] +}, +"meg-ref-g": { +"id": "meg-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"maintenance-entity-local-id": { +"id": "maintenance-entity-local-id", +"is-read-only": false, +"description": ["none"] +}, +"maintenance-entity-ref-g": { +"id": "maintenance-entity-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"mep-local-id": { +"id": "mep-local-id", +"is-read-only": false, +"description": ["none"] +}, +"mep-ref-g": { +"id": "mep-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"mip-local-id": { +"id": "mip-local-id", +"is-read-only": false, +"description": ["none"] +}, +"mip-ref-g": { +"id": "mip-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"oam-job-uuid": { +"id": "oam-job-uuid", +"is-read-only": false, +"description": ["none"] +}, +"oam-job-ref-g": { +"id": "oam-job-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"pm-current-data-local-id": { +"id": "pm-current-data-local-id", +"is-read-only": false, +"description": ["none"] +}, +"pm-current-data-ref-g": { +"id": "pm-current-data-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"pm-history-data-local-id": { +"id": "pm-history-data-local-id", +"is-read-only": false, +"description": ["none"] +}, +"pm-history-data-ref-g": { +"id": "pm-history-data-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"oam-profile-uuid": { +"id": "oam-profile-uuid", +"is-read-only": false, +"description": ["none"] +}, +"oam-profile-ref-g": { +"id": "oam-profile-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"pm-threshold-data-local-id": { +"id": "pm-threshold-data-local-id", +"is-read-only": false, +"description": ["none"] +}, +"pm-threshold-data-ref-g": { +"id": "pm-threshold-data-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"pm-bin-data-local-id": { +"id": "pm-bin-data-local-id", +"is-read-only": false, +"description": ["none"] +}, +"pm-bin-data-ref-g": { +"id": "pm-bin-data-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-end-point": { +"id": "oam-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["none"] +}, +"mep-identifier": { +"id": "mep-identifier", +"is-read-only": false, +"description": ["none"] +}, +"peer-mep-identifier": { +"id": "peer-mep-identifier", +"is-read-only": false, +"description": ["none"] +}, +"mep-g": { +"id": "mep-g", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-end-point": { +"id": "oam-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"oam-profile": { +"id": "oam-profile", +"is-read-only": false, +"description": ["none"] +}, +"pm-current-data": { +"id": "pm-current-data", +"is-read-only": false, +"description": ["Granularity period of the CurrentData identifies the specific CurrentData instance in the scope of this OamJob. For example, typically at least one 15min and one 24hr; optionally one additional configurable (< 15min)"] +}, +"oam-job-type": { +"id": "oam-job-type", +"is-read-only": false, +"description": ["none"] +}, +"schedule": { +"id": "schedule", +"is-read-only": false, +"description": ["none"] +}, +"creation-time": { +"id": "creation-time", +"is-read-only": false, +"description": ["none"] +}, +"oam-job-g": { +"id": "oam-job-g", +"is-read-only": false, +"description": ["none"] +}, +"me": { +"id": "me", +"is-read-only": false, +"description": ["none"] +}, +"mep": { +"id": "mep", +"is-read-only": false, +"description": ["1. ME may have 0 MEPs (case of transit domains where at least 1 MIP is present) 2. ME may have 1 MEP (case of edge domaind, where the peer MEP is ouside the managed domain) 3. ME may have 2 MEPs"] +}, +"mip": { +"id": "mip", +"is-read-only": false, +"description": ["ME may 0, 1, or more MIPs"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["none"] +}, +"meg-level": { +"id": "meg-level", +"is-read-only": false, +"description": ["none"] +}, +"meg-identifier": { +"id": "meg-identifier", +"is-read-only": false, +"description": ["none"] +}, +"meg-g": { +"id": "meg-g", +"is-read-only": false, +"description": ["none"] +}, +"mep": { +"id": "mep", +"is-read-only": false, +"description": ["none"] +}, +"mip": { +"id": "mip", +"is-read-only": false, +"description": ["none"] +}, +"connection-route": { +"id": "connection-route", +"is-read-only": false, +"description": ["none"] +}, +"maintenance-entity-g": { +"id": "maintenance-entity-g", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-end-point": { +"id": "oam-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"mip-g": { +"id": "mip-g", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"meg": { +"id": "meg", +"is-read-only": false, +"description": ["none"] +}, +"oam-profile": { +"id": "oam-profile", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-g": { +"id": "oam-service-g", +"is-read-only": false, +"description": ["none"] +}, +"oam-service": { +"id": "oam-service", +"is-read-only": false, +"description": ["none"] +}, +"meg": { +"id": "meg", +"is-read-only": false, +"description": ["none"] +}, +"oam-job": { +"id": "oam-job", +"is-read-only": false, +"description": ["none"] +}, +"oam-profile": { +"id": "oam-profile", +"is-read-only": false, +"description": ["none"] +}, +"oam-context-g": { +"id": "oam-context-g", +"is-read-only": false, +"description": ["none"] +}, +"service-interface-point": { +"id": "service-interface-point", +"is-read-only": false, +"description": ["none"] +}, +"connectivity-service-end-point": { +"id": "connectivity-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"mep": { +"id": "mep", +"is-read-only": false, +"description": ["none"] +}, +"mip": { +"id": "mip", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-end-point-g": { +"id": "oam-service-end-point-g", +"is-read-only": false, +"description": ["none"] +}, +"mip": { +"id": "mip", +"is-read-only": false, +"description": ["none"] +}, +"mep": { +"id": "mep", +"is-read-only": false, +"description": ["none"] +}, +"mep-mip-list-g": { +"id": "mep-mip-list-g", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["none"] +}, +"meg-level": { +"id": "meg-level", +"is-read-only": false, +"description": ["none"] +}, +"oam-constraint-g": { +"id": "oam-constraint-g", +"is-read-only": false, +"description": ["none"] +}, +"pm-history-data": { +"id": "pm-history-data", +"is-read-only": false, +"description": ["in case of 24hr Current Data, at least 1 History Data. In case of 15min Current Data, at least 16 History Data. In case of <15min, the number of History Data shall be able to cover a span of 4 hours."] +}, +"granularity-period": { +"id": "granularity-period", +"is-read-only": false, +"description": ["none"] +}, +"timestamp": { +"id": "timestamp", +"is-read-only": false, +"description": ["This attribute indicates the start of the current monitoring interval. The value is bound to the quarter of an hour in case of a 15 minute interval and bound to the hour in case of a 24 hour interval."] +}, +"elapsed-time": { +"id": "elapsed-time", +"is-read-only": false, +"description": ["none"] +}, +"suspect-interval-flag": { +"id": "suspect-interval-flag", +"is-read-only": false, +"description": ["This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are: – Suspect data were detected by the actual resource doing data collection. – Transition of the administrativeState attribute to/from the 'lock' state. – Transition of the operationalState to/from the 'disabled' state. – Scheduler setting that inhibits the collection function. – The performance counters were reset during the interval. – The currentData (or subclass) object instance was created during the monitoring period."] +}, +"pm-current-data-g": { +"id": "pm-current-data-g", +"is-read-only": false, +"description": ["none"] +}, +"granularity-period": { +"id": "granularity-period", +"is-read-only": false, +"description": ["none"] +}, +"period-end-time": { +"id": "period-end-time", +"is-read-only": false, +"description": ["none"] +}, +"suspect-interval-flag": { +"id": "suspect-interval-flag", +"is-read-only": false, +"description": ["This attribute indicates that the performance data may not be reliable."] +}, +"pm-history-data-g": { +"id": "pm-history-data-g", +"is-read-only": false, +"description": ["none"] +}, +"pm-threshold-data": { +"id": "pm-threshold-data", +"is-read-only": false, +"description": ["none"] +}, +"pm-bin-data": { +"id": "pm-bin-data", +"is-read-only": false, +"description": ["none"] +}, +"oam-profile-g": { +"id": "oam-profile-g", +"is-read-only": false, +"description": ["none"] +}, +"granularity-period": { +"id": "granularity-period", +"is-read-only": false, +"description": ["none"] +}, +"is-transient": { +"id": "is-transient", +"is-read-only": false, +"description": ["none"] +}, +"pm-threshold-data-g": { +"id": "pm-threshold-data-g", +"is-read-only": false, +"description": ["none"] +}, +"granularity-period": { +"id": "granularity-period", +"is-read-only": false, +"description": ["none"] +}, +"pm-bin-data-g": { +"id": "pm-bin-data-g", +"is-read-only": false, +"description": ["none"] +}, +"OAM_JOB_TYPE": { +"id": "OAM_JOB_TYPE", +"is-read-only": false, +"description": ["none"] +}, +"oam-job-type": { +"id": "oam-job-type", +"is-read-only": false, +"description": ["none"] +}, +"create-oam-service": { +"id": "create-oam-service", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"oam-constraint": { +"id": "oam-constraint", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"delete-oam-service": { +"id": "delete-oam-service", +"is-read-only": false, +"description": ["none"] +}, +"service-id": { +"id": "service-id", +"is-read-only": false, +"description": ["none"] +}, +"get-oam-service": { +"id": "get-oam-service", +"is-read-only": false, +"description": ["none"] +}, +"service-id": { +"id": "service-id", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"create-oam-job": { +"id": "create-oam-job", +"is-read-only": false, +"description": ["none"] +}, +"oam-job-type": { +"id": "oam-job-type", +"is-read-only": false, +"description": ["none"] +}, +"oam-service-end-point": { +"id": "oam-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"oam-profile": { +"id": "oam-profile", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"schedule": { +"id": "schedule", +"is-read-only": false, +"description": ["none"] +}, +"oam-job": { +"id": "oam-job", +"is-read-only": false, +"description": ["none"] +}, +"get-oam-job": { +"id": "get-oam-job", +"is-read-only": false, +"description": ["none"] +}, +"job-id": { +"id": "job-id", +"is-read-only": false, +"description": ["none"] +}, +"oam-job": { +"id": "oam-job", +"is-read-only": false, +"description": ["none"] +}, +"get-oam-service-list": { +"id": "get-oam-service-list", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"get-meg": { +"id": "get-meg", +"is-read-only": false, +"description": ["none"] +}, +"service-id": { +"id": "service-id", +"is-read-only": false, +"description": ["none"] +}, +"meg": { +"id": "meg", +"is-read-only": false, +"description": ["none"] +}, +"update-oam-service": { +"id": "update-oam-service", +"is-read-only": false, +"description": ["none"] +}, +"service-id": { +"id": "service-id", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"oam-constraint": { +"id": "oam-constraint", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"delete-oam-job": { +"id": "delete-oam-job", +"is-read-only": false, +"description": ["none"] +}, +"job-id": { +"id": "job-id", +"is-read-only": false, +"description": ["none"] +}, +"update-oam-job": { +"id": "update-oam-job", +"is-read-only": false, +"description": ["none"] +}, +"job-id": { +"id": "job-id", +"is-read-only": false, +"description": ["none"] +}, +"oam-profile": { +"id": "oam-profile", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"schedule": { +"id": "schedule", +"is-read-only": false, +"description": ["none"] +}, +"oam-job": { +"id": "oam-job", +"is-read-only": false, +"description": ["none"] +}, +"create-oam-service-end-point": { +"id": "create-oam-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"service-id": { +"id": "service-id", +"is-read-only": false, +"description": ["none"] +}, +"sip-id": { +"id": "sip-id", +"is-read-only": false, +"description": ["none"] +}, +"c-sep-id": { +"id": "c-sep-id", +"is-read-only": false, +"description": ["none"] +}, +"layer": { +"id": "layer", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"delete-oam-service-end-point": { +"id": "delete-oam-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"service-id": { +"id": "service-id", +"is-read-only": false, +"description": ["none"] +}, +"o-sep-id": { +"id": "o-sep-id", +"is-read-only": false, +"description": ["none"] +}, +"update-oam-service-end-point": { +"id": "update-oam-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"service-id": { +"id": "service-id", +"is-read-only": false, +"description": ["none"] +}, +"o-sep-id": { +"id": "o-sep-id", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"get-oam-service-end-point": { +"id": "get-oam-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"service-id": { +"id": "service-id", +"is-read-only": false, +"description": ["none"] +}, +"o-sep-id": { +"id": "o-sep-id", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-odu@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-odu@2018-08-31.schema-information.json new file mode 100644 index 000000000..b59a737a4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-odu@2018-08-31.schema-information.json @@ -0,0 +1,733 @@ +{ "schama-information": { + +"tapi-odu": { +"id": "tapi-odu", +"is-read-only": false, +"description": ["This module contains TAPI Odu Model definitions. Source: TapiOdu.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"opu-tributary-slot-size": { +"id": "opu-tributary-slot-size", +"is-read-only": false, +"description": ["This attribute is applicable for ODU2 and ODU3 CTP only. It indicates the slot size of the ODU CTP."] +}, +"auto-payload-type": { +"id": "auto-payload-type", +"is-read-only": false, +"description": ["This attribute is applicable when the ODU CTP object instance represents a lower order ODU CTP Source at the client layer of the ODUP/ODUj-21 adaptation function. The value of true of this attribute configures that the adaptation source function shall fall back to the payload type PT=20 if the conditions specified in 14.3.10.1/G.798 are satisfied."] +}, +"configured-client-type": { +"id": "configured-client-type", +"is-read-only": false, +"description": ["This attribute configures the type of the client CTP of the server ODU TTP."] +}, +"configured-mapping-type": { +"id": "configured-mapping-type", +"is-read-only": false, +"description": ["This attributes indicates the configured mapping type."] +}, +"accepted-payload-type": { +"id": "accepted-payload-type", +"is-read-only": false, +"description": ["This attribute is applicable when the ODU CTP object instance represents a lower order ODU CTP Sink at the client layer of the ODUP/ODU[i]j or ODUP/ODUj-21 adaptation function. This attribute is a 2-digit Hex code that indicates the new accepted payload type. Valid values are defined in Table 15-8 of ITU-T Recommendation G.709 with one additional value UN_INTERPRETABLE."] +}, +"odu-termination-and-client-adaptation-pac-g": { +"id": "odu-termination-and-client-adaptation-pac-g", +"is-read-only": false, +"description": ["This Pac contains the attributes associated with the client adaptation function of the server layer TTP It is present only if the CEP contains a TTP"] +}, +"odu-common": { +"id": "odu-common", +"is-read-only": false, +"description": ["none"] +}, +"odu-term-and-adapter": { +"id": "odu-term-and-adapter", +"is-read-only": false, +"description": ["none"] +}, +"odu-ctp": { +"id": "odu-ctp", +"is-read-only": false, +"description": ["none"] +}, +"odu-protection": { +"id": "odu-protection", +"is-read-only": false, +"description": ["none"] +}, +"odu-connection-end-point-spec-g": { +"id": "odu-connection-end-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"client-capacity": { +"id": "client-capacity", +"is-read-only": false, +"description": ["none"] +}, +"max-client-instances": { +"id": "max-client-instances", +"is-read-only": false, +"description": ["none"] +}, +"max-client-size": { +"id": "max-client-size", +"is-read-only": false, +"description": ["none"] +}, +"odu-pool-pac-g": { +"id": "odu-pool-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"odu-pool": { +"id": "odu-pool", +"is-read-only": false, +"description": ["none"] +}, +"odu-node-edge-point-spec-g": { +"id": "odu-node-edge-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"tributary-slot-list": { +"id": "tributary-slot-list", +"is-read-only": false, +"description": ["This attribute contains a set of distinct (i.e. unique) integers (e.g. 2, 3, 5, 9, 15 representing the tributary slots TS2, TS3, TS5, TS9 and TS15) which represents the resources occupied by the Low Order ODU Link Connection (e.g. carrying an ODUflex with a bit rate of 6.25G). This attribute applies when the LO ODU_ ConnectionTerminationPoint connects with an HO ODU_TrailTerminationPoint object. It will not apply if this ODU_ ConnectionTerminationPoint object directly connects to an OTU_TrailTerminationPoint object (i.e. OTU has no trib slots). The upper bound of the integer allowed in this set is a function of the HO-ODU server layer to which the ODU connection has been mapped (adapted). Thus, for example, M=8/32/80 for ODU2/ODU3/ODU4 server layers (respectively). Note that the value of this attribute can be changed only in the case of ODUflex and has to be through specific operations (i.e. not be changing the attribute tributarySlotList directly)."] +}, +"tributary-port-number": { +"id": "tributary-port-number", +"is-read-only": false, +"description": ["This attribute identifies the tributary port number that is associated with the ODU CTP. range of type : The value range depends on the size of the Tributary Port Number (TPN) field used which depends on th server-layer ODU or OTU. In case of ODUk mapping into OTUk, there is no TPN field, so the tributaryPortNumber shall be zero. In case of LO ODUj mapping over ODU1, ODU2 or ODU3, the TPN is encoded in a 6-bit field so the value range is 0-63. See clause 14.4.1/G.709-2016. In case of LO ODUj mapping over ODU4, the TPN is encoded in a 7-bit field so the value range is 0-127. See clause 14.4.1.4/G.709-2016. In case of ODUk mapping over ODUCn, the TPN is encoded in a 14-bit field so the value range is 0-16383. See clause 20.4.1.1/G.709-2016."] +}, +"accepted-msi": { +"id": "accepted-msi", +"is-read-only": false, +"description": ["This attribute is applicable when the ODU CTP object instance represents a lower order ODU1 or ODU2 CTP Sink at the client layer of the ODU3P/ODU12 adaptation function or represents a lower order ODUj CTP Sink at the client layer of the ODUP/ODUj-21 adaptation function. This attribute is a 1-byte field that represents the accepted multiplex structure of the adaptation function."] +}, +"odu-ctp-pac-g": { +"id": "odu-ctp-pac-g", +"is-read-only": false, +"description": ["This Pac contains the attributes associated with the CTP It is present only if the CEP contains a CTP"] +}, +"odu-mep": { +"id": "odu-mep", +"is-read-only": false, +"description": ["none"] +}, +"odu-ncm": { +"id": "odu-ncm", +"is-read-only": false, +"description": ["none"] +}, +"odu-tcm": { +"id": "odu-tcm", +"is-read-only": false, +"description": ["none"] +}, +"odu-defect": { +"id": "odu-defect", +"is-read-only": false, +"description": ["none"] +}, +"odu-pm": { +"id": "odu-pm", +"is-read-only": false, +"description": ["none"] +}, +"odu-mep-spec-g": { +"id": "odu-mep-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"aps-enable": { +"id": "aps-enable", +"is-read-only": false, +"description": ["This attribute is for enabling/disabling the automatic protection switching (APS) capability at the transport adaptation function that is represented by the ODU_ConnectionTerminationPoint object class. It triggers the MI_APS_EN signal to the transport adaptation function."] +}, +"aps-level": { +"id": "aps-level", +"is-read-only": false, +"description": ["This attribute is for configuring the automatic protection switching (APS) level that should operate at the transport adaptation function that is represented by the ODU_ConnectionTerminationPoint object class. It triggers the MI_APS_LVL signal to the transport adaptation function. The value 0 means path and the values 1 through 6 mean TCM level 1 through 6 respectively."] +}, +"odu-protection-pac-g": { +"id": "odu-protection-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"tcm-fields-in-use": { +"id": "tcm-fields-in-use", +"is-read-only": false, +"description": ["This attribute indicates the used TCM fields of the ODU OH."] +}, +"odu-ncm-pac-g": { +"id": "odu-ncm-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"tcm-extension": { +"id": "tcm-extension", +"is-read-only": false, +"description": ["none"] +}, +"tcm-mode": { +"id": "tcm-mode", +"is-read-only": false, +"description": ["This attribute specifies the TCM mode at the entity. Valid values are: Operational, Monitor, and Transparent."] +}, +"codirectional": { +"id": "codirectional", +"is-read-only": false, +"description": ["This attribute specifies the directionality of the ODUT MEP with respect to the associated ODU CEP. The value of TRUE means that the sink part of the ODUT MEP terminates the same signal direction as the sink part of the ODU CEP. The Source part behaves similarly. This attribute is meaningful only on objects instantiated under ODU CEP, and at least one among ODU CEP and the subordinate object is bidirectional."] +}, +"ac-status-source": { +"id": "ac-status-source", +"is-read-only": false, +"description": ["This attribute indicates the status of the accepted TCM."] +}, +"ac-status-sink": { +"id": "ac-status-sink", +"is-read-only": false, +"description": ["This attribute indicates the status of the accepted TCM."] +}, +"admin-state-source": { +"id": "admin-state-source", +"is-read-only": false, +"description": ["This attribute provides the capability to provision the LOCK signal at the source, which is one of the ODU maintenance signals. When a Tandem Connection endpoint is set to admin state locked, it will insert the ODU-LCK signal in the source direction."] +}, +"admin-state-sink": { +"id": "admin-state-sink", +"is-read-only": false, +"description": ["This attribute provides the capability to provision the LOCK signal at the sink, which is one of the ODU maintenance signals. When a Tandem Connection endpoint is set to admin state locked, it will insert the ODU-LCK signal in the downstream direction."] +}, +"odu-tcm-mep-pac-g": { +"id": "odu-tcm-mep-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"odu-mip": { +"id": "odu-mip", +"is-read-only": false, +"description": ["none"] +}, +"odu-ncm": { +"id": "odu-ncm", +"is-read-only": false, +"description": ["none"] +}, +"odu-tcm": { +"id": "odu-tcm", +"is-read-only": false, +"description": ["none"] +}, +"odu-pm": { +"id": "odu-pm", +"is-read-only": false, +"description": ["none"] +}, +"odu-defect": { +"id": "odu-defect", +"is-read-only": false, +"description": ["none"] +}, +"odu-mip-spec-g": { +"id": "odu-mip-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"acti": { +"id": "acti", +"is-read-only": false, +"description": ["The Trail Trace Identifier (TTI) information recovered (Accepted) from the TTI overhead position at the sink of a trail."] +}, +"ex-dapi": { +"id": "ex-dapi", +"is-read-only": false, +"description": ["The Expected Destination Access Point Identifier (ExDAPI), provisioned by the managing system, to be compared with the TTI accepted at the overhead position of the sink for the purpose of checking the integrity of connectivity."] +}, +"ex-sapi": { +"id": "ex-sapi", +"is-read-only": false, +"description": ["The Expected Source Access Point Identifier (ExSAPI), provisioned by the managing system, to be compared with the TTI accepted at the overhead position of the sink for the purpose of checking the integrity of connectivity."] +}, +"tim-act-disabled": { +"id": "tim-act-disabled", +"is-read-only": false, +"description": ["This attribute provides the control capability for the managing system to enable or disable the Consequent Action function when detecting Trace Identifier Mismatch (TIM) at the trail termination sink."] +}, +"tim-det-mode": { +"id": "tim-det-mode", +"is-read-only": false, +"description": ["This attribute indicates the mode of the Trace Identifier Mismatch (TIM) Detection function allowed values: OFF, SAPIonly, DAPIonly, SAPIandDAPI"] +}, +"deg-m": { +"id": "deg-m", +"is-read-only": false, +"description": ["This attribute indicates the threshold level for declaring a Degraded Signal defect (dDEG). A dDEG shall be declared if DegM consecutive bad PM Seconds are detected."] +}, +"deg-thr": { +"id": "deg-thr", +"is-read-only": false, +"description": ["This attribute indicates the threshold level for declaring a performance monitoring (PM) Second to be bad. The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer."] +}, +"odu-mip-pac-g": { +"id": "odu-mip-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"tcm-field": { +"id": "tcm-field", +"is-read-only": false, +"description": ["This attribute indicates the tandem connection monitoring field of the ODU OH."] +}, +"odu-tcm-mip-pac-g": { +"id": "odu-tcm-mip-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"dm-source": { +"id": "dm-source", +"is-read-only": false, +"description": ["This attribute is for configuring the delay measurement process at the trail termination function represented by the subject TTP object class. It models the MI_DM_Source MI signal. If MI_DM_Source is false, then the value of the DMp bit is determined by the RI_DM. If MI_DM_Source is true, then the value of the DMp bit is set to MI_DMValue."] +}, +"dm-value": { +"id": "dm-value", +"is-read-only": false, +"description": ["This attribute is for setting the DMp and DMti bits of the delay measurement process. The value of 'true' sets the DMp and DMti bits to 0 and the value of 'false' to 1."] +}, +"txti": { +"id": "txti", +"is-read-only": false, +"description": ["The Trail Trace Identifier (TTI) information, provisioned by the managing system at the termination source, to be placed in the TTI overhead position of the source of a trail for transmission."] +}, +"odu-mep-pac-g": { +"id": "odu-mep-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"odu-type": { +"id": "odu-type", +"is-read-only": false, +"description": ["This attribute specifies the type of the ODU termination point."] +}, +"odu-rate": { +"id": "odu-rate", +"is-read-only": false, +"description": ["This attribute indicates the rate of the ODU terminatino point. This attribute is Set at create; i.e., once created it cannot be changed directly. In case of resizable ODU flex, its value can be changed via HAO (not directly on the attribute)."] +}, +"odu-rate-tolerance": { +"id": "odu-rate-tolerance", +"is-read-only": false, +"description": ["This attribute indicates the rate tolerance of the ODU termination point. Valid values are real value in the unit of ppm. Standardized values are defined in Table 7-2/G.709."] +}, +"odu-common-pac-g": { +"id": "odu-common-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"n-bbe": { +"id": "n-bbe", +"is-read-only": false, +"description": ["Near-end Background Block Error"] +}, +"f-bbe": { +"id": "f-bbe", +"is-read-only": false, +"description": ["Far-end Background Block Error"] +}, +"n-ses": { +"id": "n-ses", +"is-read-only": false, +"description": ["Near-end Severely Errored Second"] +}, +"f-ses": { +"id": "f-ses", +"is-read-only": false, +"description": ["Far-end Severely Errored Second"] +}, +"uas": { +"id": "uas", +"is-read-only": false, +"description": ["UnAvailable Second"] +}, +"odu-pm-pac-g": { +"id": "odu-pm-pac-g", +"is-read-only": false, +"description": ["Instance of this object class contains the ODUP layer-specific Current Data. This object class is a subclass of the OTN_CurrentData object class. PM data attributes: fBbe, fSes, nBbe, nSes. uas"] +}, +"bdi": { +"id": "bdi", +"is-read-only": false, +"description": ["Backward Defect Indication"] +}, +"deg": { +"id": "deg", +"is-read-only": false, +"description": ["Signal Degraded"] +}, +"lck": { +"id": "lck", +"is-read-only": false, +"description": ["Locked"] +}, +"oci": { +"id": "oci", +"is-read-only": false, +"description": ["Open Connection Indicator"] +}, +"ssf": { +"id": "ssf", +"is-read-only": false, +"description": ["Server Signal Failure"] +}, +"tim": { +"id": "tim", +"is-read-only": false, +"description": ["Trail Trace Identifier Mismatch"] +}, +"odu-defect-pac-g": { +"id": "odu-defect-pac-g", +"is-read-only": false, +"description": ["The valid list of defects raised on the entity. If the value of any attribute is true, then the corresponding defect is raised."] +}, +"ODU_TYPE": { +"id": "ODU_TYPE", +"is-read-only": false, +"description": ["none"] +}, +"ODU_TYPE_ODU0": { +"id": "ODU_TYPE_ODU0", +"is-read-only": false, +"description": ["none"] +}, +"ODU_TYPE_ODU1": { +"id": "ODU_TYPE_ODU1", +"is-read-only": false, +"description": ["none"] +}, +"ODU_TYPE_ODU2": { +"id": "ODU_TYPE_ODU2", +"is-read-only": false, +"description": ["none"] +}, +"ODU_TYPE_ODU2E": { +"id": "ODU_TYPE_ODU2E", +"is-read-only": false, +"description": ["none"] +}, +"ODU_TYPE_ODU3": { +"id": "ODU_TYPE_ODU3", +"is-read-only": false, +"description": ["none"] +}, +"ODU_TYPE_ODU4": { +"id": "ODU_TYPE_ODU4", +"is-read-only": false, +"description": ["none"] +}, +"ODU_TYPE_ODU_FLEX": { +"id": "ODU_TYPE_ODU_FLEX", +"is-read-only": false, +"description": ["none"] +}, +"ODU_TYPE_ODU_CN": { +"id": "ODU_TYPE_ODU_CN", +"is-read-only": false, +"description": ["none"] +}, +"odu-type": { +"id": "odu-type", +"is-read-only": false, +"description": ["none"] +}, +"AMP": { +"id": "AMP", +"is-read-only": false, +"description": ["none"] +}, +"BMP": { +"id": "BMP", +"is-read-only": false, +"description": ["none"] +}, +"GFP-F": { +"id": "GFP-F", +"is-read-only": false, +"description": ["none"] +}, +"GMP": { +"id": "GMP", +"is-read-only": false, +"description": ["none"] +}, +"TTP_GFP_BMP": { +"id": "TTP_GFP_BMP", +"is-read-only": false, +"description": ["none"] +}, +"NULL": { +"id": "NULL", +"is-read-only": false, +"description": ["none"] +}, +"mapping-type": { +"id": "mapping-type", +"is-read-only": false, +"description": ["none"] +}, +"DAPI": { +"id": "DAPI", +"is-read-only": false, +"description": ["none"] +}, +"SAPI": { +"id": "SAPI", +"is-read-only": false, +"description": ["none"] +}, +"BOTH": { +"id": "BOTH", +"is-read-only": false, +"description": ["none"] +}, +"OFF": { +"id": "OFF", +"is-read-only": false, +"description": ["none"] +}, +"tim-det-mo": { +"id": "tim-det-mo", +"is-read-only": false, +"description": ["List of modes for trace identifier mismatch detection."] +}, +"1G25": { +"id": "1G25", +"is-read-only": false, +"description": ["none"] +}, +"2G5": { +"id": "2G5", +"is-read-only": false, +"description": ["none"] +}, +"odu-slot-size": { +"id": "odu-slot-size", +"is-read-only": false, +"description": ["none"] +}, +"named-payload-type": { +"id": "named-payload-type", +"is-read-only": false, +"description": ["none"] +}, +"hex-payload-type": { +"id": "hex-payload-type", +"is-read-only": false, +"description": ["none"] +}, +"odu-payload-type-g": { +"id": "odu-payload-type-g", +"is-read-only": false, +"description": ["none"] +}, +"UNKNOWN": { +"id": "UNKNOWN", +"is-read-only": false, +"description": ["none"] +}, +"UNINTERPRETABLE": { +"id": "UNINTERPRETABLE", +"is-read-only": false, +"description": ["none"] +}, +"odu-named-payload-type": { +"id": "odu-named-payload-type", +"is-read-only": false, +"description": ["none"] +}, +"deg-thr-value": { +"id": "deg-thr-value", +"is-read-only": false, +"description": ["Percentage of detected errored blocks"] +}, +"deg-thr-type": { +"id": "deg-thr-type", +"is-read-only": false, +"description": ["Number of errored blocks"] +}, +"percentage-granularity": { +"id": "percentage-granularity", +"is-read-only": false, +"description": ["none"] +}, +"deg-thr-g": { +"id": "deg-thr-g", +"is-read-only": false, +"description": ["Degraded Threshold, specify either the percentage or the number of Errored Blocks in the defined interval. degThrValue when type is PERCENTAGE: percentageGranularity is used to indicate the number of decimal points So if percentageGranularity is ones, a value of 1 in degThrValue would indicate 1%, a value of 10 = 10%, a value of 100 = 100% So if percentageGranularity is thousandths a value of 1 in degThrValue would indicate 0.001%, a value of 1000 = 1%, a value of 1000000 = 100% degThrValue when type is NUMBER_ERROR_BLOCKS: Number of Errored Blocks is captured in an integer value."] +}, +"PERCENTAGE": { +"id": "PERCENTAGE", +"is-read-only": false, +"description": ["Choice of % or Number of errored blocks"] +}, +"NUMBER_ERRORED_BLOCKS": { +"id": "NUMBER_ERRORED_BLOCKS", +"is-read-only": false, +"description": ["Number of % or blocks"] +}, +"deg-thr-type": { +"id": "deg-thr-type", +"is-read-only": false, +"description": ["The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer."] +}, +"NO_SOURCE_TC": { +"id": "NO_SOURCE_TC", +"is-read-only": false, +"description": ["TCM byte 3 (bits 6 7 8) -- 0 0 0, No source Tandem Connection"] +}, +"IN_USE_WITHOUT_IAE": { +"id": "IN_USE_WITHOUT_IAE", +"is-read-only": false, +"description": ["TCM byte 3 (bits 6 7 8) -- 0 0 1, In use without IAE (Incoming Alignment Error)"] +}, +"IN_USE_WITH_IAE": { +"id": "IN_USE_WITH_IAE", +"is-read-only": false, +"description": ["TCM byte 3 (bits 6 7 8) -- 0 1 0, In use with IAE (Incoming Alignment Error)"] +}, +"RESERVED_1": { +"id": "RESERVED_1", +"is-read-only": false, +"description": ["TCM byte 3 (bits 6 7 8) -- 0 1 1, Reserved for future international standardization"] +}, +"RESERVED_2": { +"id": "RESERVED_2", +"is-read-only": false, +"description": ["TCM byte 3 (bits 6 7 8) -- 1 0 0, Reserved for future international standardization"] +}, +"LCK": { +"id": "LCK", +"is-read-only": false, +"description": ["TCM byte 3 (bits 6 7 8) -- 1 0 1, Maintenance signal: ODU-LCK"] +}, +"OCI": { +"id": "OCI", +"is-read-only": false, +"description": ["TCM byte 3 (bits 6 7 8) -- 1 1 0, Maintenance signal: ODU-OCI"] +}, +"AIS": { +"id": "AIS", +"is-read-only": false, +"description": ["TCM byte 3 (bits 6 7 8) -- 1 1 1, Maintenance signal: ODU-AIS"] +}, +"tcm-status": { +"id": "tcm-status", +"is-read-only": false, +"description": ["See Table 15-5/G.709/Y.1331"] +}, +"OPERATIONAL": { +"id": "OPERATIONAL", +"is-read-only": false, +"description": ["none"] +}, +"TRANSPARENT": { +"id": "TRANSPARENT", +"is-read-only": false, +"description": ["none"] +}, +"MONITOR": { +"id": "MONITOR", +"is-read-only": false, +"description": ["none"] +}, +"tcm-mode": { +"id": "tcm-mode", +"is-read-only": false, +"description": ["List of value modes for the sink side of the tandem connection monitoring function."] +}, +"INTRUSIVE": { +"id": "INTRUSIVE", +"is-read-only": false, +"description": ["none"] +}, +"NON-INTRUSIVE": { +"id": "NON-INTRUSIVE", +"is-read-only": false, +"description": ["none"] +}, +"tcm-monitoring": { +"id": "tcm-monitoring", +"is-read-only": false, +"description": ["Monitoring types for the tandem connection monitoring function."] +}, +"NORMAL": { +"id": "NORMAL", +"is-read-only": false, +"description": ["none"] +}, +"PASS-THROUGH": { +"id": "PASS-THROUGH", +"is-read-only": false, +"description": ["none"] +}, +"ERASE": { +"id": "ERASE", +"is-read-only": false, +"description": ["none"] +}, +"tcm-extension": { +"id": "tcm-extension", +"is-read-only": false, +"description": ["none"] +}, +"ONES": { +"id": "ONES", +"is-read-only": false, +"description": ["none"] +}, +"ONE_TENTHS": { +"id": "ONE_TENTHS", +"is-read-only": false, +"description": ["value * (1/10)"] +}, +"ONE_HUNDREDTHS": { +"id": "ONE_HUNDREDTHS", +"is-read-only": false, +"description": ["value * (1/100)"] +}, +"ONE_THOUSANDTHS": { +"id": "ONE_THOUSANDTHS", +"is-read-only": false, +"description": ["value * (1/1000)"] +}, +"percentage-granularity": { +"id": "percentage-granularity", +"is-read-only": false, +"description": ["none"] +}, +"bidirectional": { +"id": "bidirectional", +"is-read-only": false, +"description": ["none"] +}, +"uas": { +"id": "uas", +"is-read-only": false, +"description": ["none"] +}, +"nuas": { +"id": "nuas", +"is-read-only": false, +"description": ["none"] +}, +"fuas": { +"id": "fuas", +"is-read-only": false, +"description": ["none"] +}, +"uas-choice-g": { +"id": "uas-choice-g", +"is-read-only": false, +"description": ["If bidirectional is TRUE then use the uas attribute, if bidirectional is FALSE use the nuas, and fuas attributes"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-path-computation@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-path-computation@2018-08-31.schema-information.json new file mode 100644 index 000000000..4cf6b1c30 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-path-computation@2018-08-31.schema-information.json @@ -0,0 +1,403 @@ +{ "schama-information": { + +"tapi-path-computation": { +"id": "tapi-path-computation", +"is-read-only": false, +"description": ["This module contains TAPI Path Computation Model definitions. Source: TapiPathComputation.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"path-uuid": { +"id": "path-uuid", +"is-read-only": false, +"description": ["none"] +}, +"path-ref-g": { +"id": "path-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"link": { +"id": "link", +"is-read-only": false, +"description": ["none"] +}, +"routing-constraint": { +"id": "routing-constraint", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"path-g": { +"id": "path-g", +"is-read-only": false, +"description": ["Path is described by an ordered list of TE Links. A TE Link is defined by a pair of Node/NodeEdgePoint IDs. A Connection is realized by concatenating link resources (associated with a Link) and the lower-level connections (cross-connections) in the different nodes"] +}, +"service-interface-point": { +"id": "service-interface-point", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-qualifier": { +"id": "layer-protocol-qualifier", +"is-read-only": false, +"description": ["none"] +}, +"capacity": { +"id": "capacity", +"is-read-only": false, +"description": ["none"] +}, +"role": { +"id": "role", +"is-read-only": false, +"description": ["Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function."] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["The orientation of defined flow at the EndPoint."] +}, +"path-service-end-point-g": { +"id": "path-service-end-point-g", +"is-read-only": false, +"description": ["The association of the FC to LTPs is made via EndPoints. The EndPoint (EP) object class models the access to the FC function. The traffic forwarding between the associated EPs of the FC depends upon the type of FC and may be associated with FcSwitch object instances. In cases where there is resilience the EndPoint may convey the resilience role of the access to the FC. It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. The EP replaces the Protection Unit of a traditional protection model. The ForwadingConstruct can be considered as a component and the EndPoint as a Port on that component"] +}, +"path": { +"id": "path", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"routing-constraint": { +"id": "routing-constraint", +"is-read-only": false, +"description": ["none"] +}, +"topology-constraint": { +"id": "topology-constraint", +"is-read-only": false, +"description": ["none"] +}, +"objective-function": { +"id": "objective-function", +"is-read-only": false, +"description": ["none"] +}, +"optimization-constraint": { +"id": "optimization-constraint", +"is-read-only": false, +"description": ["none"] +}, +"path-computation-service-g": { +"id": "path-computation-service-g", +"is-read-only": false, +"description": ["none"] +}, +"bandwidth-optimization": { +"id": "bandwidth-optimization", +"is-read-only": false, +"description": ["none"] +}, +"concurrent-paths": { +"id": "concurrent-paths", +"is-read-only": false, +"description": ["none"] +}, +"cost-optimization": { +"id": "cost-optimization", +"is-read-only": false, +"description": ["none"] +}, +"link-utilization": { +"id": "link-utilization", +"is-read-only": false, +"description": ["none"] +}, +"resource-sharing": { +"id": "resource-sharing", +"is-read-only": false, +"description": ["none"] +}, +"path-objective-function-g": { +"id": "path-objective-function-g", +"is-read-only": false, +"description": ["none"] +}, +"traffic-interruption": { +"id": "traffic-interruption", +"is-read-only": false, +"description": ["none"] +}, +"path-optimization-constraint-g": { +"id": "path-optimization-constraint-g", +"is-read-only": false, +"description": ["none"] +}, +"cost-characteristic": { +"id": "cost-characteristic", +"is-read-only": false, +"description": ["The list of costs where each cost relates to some aspect of the TopologicalEntity."] +}, +"latency-characteristic": { +"id": "latency-characteristic", +"is-read-only": false, +"description": ["The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic."] +}, +"risk-diversity-characteristic": { +"id": "risk-diversity-characteristic", +"is-read-only": false, +"description": ["none"] +}, +"diversity-policy": { +"id": "diversity-policy", +"is-read-only": false, +"description": ["none"] +}, +"route-objective-function": { +"id": "route-objective-function", +"is-read-only": false, +"description": ["none"] +}, +"route-direction": { +"id": "route-direction", +"is-read-only": false, +"description": ["none"] +}, +"is-exclusive": { +"id": "is-exclusive", +"is-read-only": false, +"description": ["To distinguish if the resources are to be exclusive to the service"] +}, +"routing-constraint-g": { +"id": "routing-constraint-g", +"is-read-only": false, +"description": ["none"] +}, +"path-comp-service": { +"id": "path-comp-service", +"is-read-only": false, +"description": ["none"] +}, +"path": { +"id": "path", +"is-read-only": false, +"description": ["none"] +}, +"path-computation-context-g": { +"id": "path-computation-context-g", +"is-read-only": false, +"description": ["none"] +}, +"include-topology": { +"id": "include-topology", +"is-read-only": false, +"description": ["none"] +}, +"avoid-topology": { +"id": "avoid-topology", +"is-read-only": false, +"description": ["none"] +}, +"include-path": { +"id": "include-path", +"is-read-only": false, +"description": ["none"] +}, +"exclude-path": { +"id": "exclude-path", +"is-read-only": false, +"description": ["none"] +}, +"include-link": { +"id": "include-link", +"is-read-only": false, +"description": ["This is a loose constraint - that is it is unordered and could be a partial list"] +}, +"exclude-link": { +"id": "exclude-link", +"is-read-only": false, +"description": ["none"] +}, +"include-node": { +"id": "include-node", +"is-read-only": false, +"description": ["This is a loose constraint - that is it is unordered and could be a partial list"] +}, +"exclude-node": { +"id": "exclude-node", +"is-read-only": false, +"description": ["none"] +}, +"preferred-transport-layer": { +"id": "preferred-transport-layer", +"is-read-only": false, +"description": ["soft constraint requested by client to indicate the layer(s) of transport connection that it prefers to carry the service. This could be same as the service layer or one of the supported server layers"] +}, +"topology-constraint-g": { +"id": "topology-constraint-g", +"is-read-only": false, +"description": ["none"] +}, +"MIN_WORK_ROUTE_HOP": { +"id": "MIN_WORK_ROUTE_HOP", +"is-read-only": false, +"description": ["none"] +}, +"MIN_WORK_ROUTE_COST": { +"id": "MIN_WORK_ROUTE_COST", +"is-read-only": false, +"description": ["none"] +}, +"MIN_WORK_ROUTE_LATENCY": { +"id": "MIN_WORK_ROUTE_LATENCY", +"is-read-only": false, +"description": ["none"] +}, +"MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_HOP": { +"id": "MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_HOP", +"is-read-only": false, +"description": ["none"] +}, +"MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_COST": { +"id": "MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_COST", +"is-read-only": false, +"description": ["none"] +}, +"MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_LATENCY": { +"id": "MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_LATENCY", +"is-read-only": false, +"description": ["none"] +}, +"LOAD_BALANCE_MAX_UNUSED_CAPACITY": { +"id": "LOAD_BALANCE_MAX_UNUSED_CAPACITY", +"is-read-only": false, +"description": ["none"] +}, +"route-objective-function": { +"id": "route-objective-function", +"is-read-only": false, +"description": ["none"] +}, +"SRLG": { +"id": "SRLG", +"is-read-only": false, +"description": ["none"] +}, +"SRNG": { +"id": "SRNG", +"is-read-only": false, +"description": ["none"] +}, +"SNG": { +"id": "SNG", +"is-read-only": false, +"description": ["none"] +}, +"NODE": { +"id": "NODE", +"is-read-only": false, +"description": ["none"] +}, +"LINK": { +"id": "LINK", +"is-read-only": false, +"description": ["none"] +}, +"diversity-policy": { +"id": "diversity-policy", +"is-read-only": false, +"description": ["none"] +}, +"compute-p-2-p-path": { +"id": "compute-p-2-p-path", +"is-read-only": false, +"description": ["none"] +}, +"sep": { +"id": "sep", +"is-read-only": false, +"description": ["none"] +}, +"routing-constraint": { +"id": "routing-constraint", +"is-read-only": false, +"description": ["none"] +}, +"topology-constraint": { +"id": "topology-constraint", +"is-read-only": false, +"description": ["none"] +}, +"objective-function": { +"id": "objective-function", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"optimize-p-2-p-path": { +"id": "optimize-p-2-p-path", +"is-read-only": false, +"description": ["none"] +}, +"path-id-or-name": { +"id": "path-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"routing-constraint": { +"id": "routing-constraint", +"is-read-only": false, +"description": ["none"] +}, +"optimization-constraint": { +"id": "optimization-constraint", +"is-read-only": false, +"description": ["none"] +}, +"objective-function": { +"id": "objective-function", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"delete-p-2-p-path": { +"id": "delete-p-2-p-path", +"is-read-only": false, +"description": ["none"] +}, +"path-id-or-name": { +"id": "path-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-photonic-media@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-photonic-media@2018-08-31.schema-information.json new file mode 100644 index 000000000..d4cf4ef7a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-photonic-media@2018-08-31.schema-information.json @@ -0,0 +1,798 @@ +{ "schama-information": { + +"tapi-photonic-media": { +"id": "tapi-photonic-media", +"is-read-only": false, +"description": ["This module contains TAPI PhotonicMedia Model definitions. Source: TapiPhotonicMedia.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"number-of-otsi": { +"id": "number-of-otsi", +"is-read-only": false, +"description": ["none"] +}, +"otsi-gserver-adaptation-pac-g": { +"id": "otsi-gserver-adaptation-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"otsi-termination": { +"id": "otsi-termination", +"is-read-only": false, +"description": ["none"] +}, +"otsi-connection-end-point-spec-g": { +"id": "otsi-connection-end-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"selected-central-frequency": { +"id": "selected-central-frequency", +"is-read-only": false, +"unit":"MHz", +"description": ["none"] +}, +"selected-application-identifier": { +"id": "selected-application-identifier", +"is-read-only": false, +"description": ["This attribute indicates the selected Application Identifier that is used by the OCh trail termination function. The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code."] +}, +"selected-modulation": { +"id": "selected-modulation", +"is-read-only": false, +"description": ["This parameter defines the modulation used at the source"] +}, +"selected-spectrum": { +"id": "selected-spectrum", +"is-read-only": false, +"description": ["none"] +}, +"transmited-power": { +"id": "transmited-power", +"is-read-only": false, +"description": ["Measured power at the Transmitter."] +}, +"received-power": { +"id": "received-power", +"is-read-only": false, +"description": ["none"] +}, +"laser-properties": { +"id": "laser-properties", +"is-read-only": false, +"description": ["Laser properties."] +}, +"otsi-termination-pac-g": { +"id": "otsi-termination-pac-g", +"is-read-only": false, +"description": ["Provides status information only."] +}, +"supportable-spectrum": { +"id": "supportable-spectrum", +"is-read-only": false, +"description": ["none"] +}, +"available-spectrum": { +"id": "available-spectrum", +"is-read-only": false, +"description": ["none"] +}, +"occupied-spectrum": { +"id": "occupied-spectrum", +"is-read-only": false, +"description": ["none"] +}, +"media-channel-pool-capability-pac-g": { +"id": "media-channel-pool-capability-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"mc-pool": { +"id": "mc-pool", +"is-read-only": false, +"description": ["none"] +}, +"media-channel-node-edge-point-spec-g": { +"id": "media-channel-node-edge-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"optical-routing-strategy": { +"id": "optical-routing-strategy", +"is-read-only": false, +"description": ["none"] +}, +"otsi-routing-spec-g": { +"id": "otsi-routing-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"occupied-spectrum": { +"id": "occupied-spectrum", +"is-read-only": false, +"description": ["none"] +}, +"measured-power-ingress": { +"id": "measured-power-ingress", +"is-read-only": false, +"description": ["none"] +}, +"measured-power-egress": { +"id": "measured-power-egress", +"is-read-only": false, +"description": ["none"] +}, +"media-channel-properties-pac-g": { +"id": "media-channel-properties-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"otsi-adapter": { +"id": "otsi-adapter", +"is-read-only": false, +"description": ["none"] +}, +"fec-parameters": { +"id": "fec-parameters", +"is-read-only": false, +"description": ["none"] +}, +"otsi-assembly-connection-end-point-spec-g": { +"id": "otsi-assembly-connection-end-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"supportable-lower-central-frequency": { +"id": "supportable-lower-central-frequency", +"is-read-only": false, +"unit":"MHz", +"description": ["The lower frequency of the channel spectrum"] +}, +"supportable-upper-central-frequency": { +"id": "supportable-upper-central-frequency", +"is-read-only": false, +"unit":"MHz", +"description": ["The Upper frequency of the channel spectrum"] +}, +"supportable-application-identifier": { +"id": "supportable-application-identifier", +"is-read-only": false, +"description": ["The list of supportable ApplicationIdentifiers."] +}, +"supportable-modulation": { +"id": "supportable-modulation", +"is-read-only": false, +"description": ["This parameter defines the modulation used at the source"] +}, +"total-power-warn-threshold": { +"id": "total-power-warn-threshold", +"is-read-only": false, +"unit":"dBm", +"description": ["none"] +}, +"otsi-capability-pac-g": { +"id": "otsi-capability-pac-g", +"is-read-only": false, +"description": ["Can read the status of the warning for the upper value that the power can reach."] +}, +"otsi-capability": { +"id": "otsi-capability", +"is-read-only": false, +"description": ["none"] +}, +"otsi-service-interface-point-spec-g": { +"id": "otsi-service-interface-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"otsi-config": { +"id": "otsi-config", +"is-read-only": false, +"description": ["none"] +}, +"nmc-config": { +"id": "nmc-config", +"is-read-only": false, +"description": ["none"] +}, +"otsi-connectivity-service-end-point-spec-g": { +"id": "otsi-connectivity-service-end-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"central-frequency": { +"id": "central-frequency", +"is-read-only": false, +"unit":"MHz", +"description": ["The central frequency of the laser. It is the oscillation frequency of the corresponding electromagnetic wave"] +}, +"application-identifier": { +"id": "application-identifier", +"is-read-only": false, +"description": ["This attribute indicates the selected Application Identifier."] +}, +"modulation": { +"id": "modulation", +"is-read-only": false, +"description": ["The modulation techniqu selected at the source."] +}, +"laser-control": { +"id": "laser-control", +"is-read-only": false, +"description": ["Laser control can be FORCED-ON, FORCED-OFF or AUTOMATIC-LASER-SHUTDOWN"] +}, +"transmit-power": { +"id": "transmit-power", +"is-read-only": false, +"description": ["Transmit power as requested."] +}, +"total-power-warn-threshold-upper": { +"id": "total-power-warn-threshold-upper", +"is-read-only": false, +"unit":"dBm", +"description": ["Configure the Max, Default and Min values for the Upper power threshold."] +}, +"total-power-warn-threshold-lower": { +"id": "total-power-warn-threshold-lower", +"is-read-only": false, +"unit":"dBm", +"description": ["Configure Max, Default and Min values for lower power threshold."] +}, +"otsi-termination-config-pac-g": { +"id": "otsi-termination-config-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"pre-fec-ber": { +"id": "pre-fec-ber", +"is-read-only": false, +"description": ["counter: bit error rate before correction by FEC"] +}, +"post-fec-ber": { +"id": "post-fec-ber", +"is-read-only": false, +"description": ["counter: bit error rate after correction by FEC"] +}, +"corrected-bytes": { +"id": "corrected-bytes", +"is-read-only": false, +"description": ["Bytes corrected between those that were received corrupted"] +}, +"corrected-bits": { +"id": "corrected-bits", +"is-read-only": false, +"description": ["Bits corrected between those that were received corrupted"] +}, +"uncorrectable-bytes": { +"id": "uncorrectable-bytes", +"is-read-only": false, +"description": ["Bytes that could not be corrected by FEC"] +}, +"uncorrectable-bits": { +"id": "uncorrectable-bits", +"is-read-only": false, +"description": ["Bits that could not be corrected by FEC"] +}, +"fec-properties-pac-g": { +"id": "fec-properties-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"mc-pool": { +"id": "mc-pool", +"is-read-only": false, +"description": ["none"] +}, +"media-channel-service-interface-point-spec-g": { +"id": "media-channel-service-interface-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"mc-config": { +"id": "mc-config", +"is-read-only": false, +"description": ["none"] +}, +"media-channel-connectivity-service-end-point-spec-g": { +"id": "media-channel-connectivity-service-end-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"spectrum": { +"id": "spectrum", +"is-read-only": false, +"description": ["none"] +}, +"media-channel-config-pac-g": { +"id": "media-channel-config-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"media-channel": { +"id": "media-channel", +"is-read-only": false, +"description": ["none"] +}, +"media-channel-connection-end-point-spec-g": { +"id": "media-channel-connection-end-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"ots-media-channel": { +"id": "ots-media-channel", +"is-read-only": false, +"description": ["none"] +}, +"ots-connection-end-point-spec-g": { +"id": "ots-connection-end-point-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"media-channel-assembly-spec-g": { +"id": "media-channel-assembly-spec-g", +"is-read-only": false, +"description": ["none"] +}, +"laser-status": { +"id": "laser-status", +"is-read-only": false, +"description": ["none"] +}, +"laser-application-type": { +"id": "laser-application-type", +"is-read-only": false, +"description": ["The type of laser, its operational wavelengths, and its applications. String size 255."] +}, +"laser-bias-current": { +"id": "laser-bias-current", +"is-read-only": false, +"description": ["The Bias current of the laser that is the medium polarization current of the laser."] +}, +"laser-temperature": { +"id": "laser-temperature", +"is-read-only": false, +"description": ["The temperature of the laser"] +}, +"laser-properties-pac-g": { +"id": "laser-properties-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"total-power": { +"id": "total-power", +"is-read-only": false, +"description": ["The total power at any point in a channel specified in dBm. range of type : -99.000..99.000"] +}, +"power-spectral-density": { +"id": "power-spectral-density", +"is-read-only": false, +"description": ["This describes how power of a signal is distributed over frequency specified in nW/MHz range of type : -2147483648..2147483648"] +}, +"power-properties-pac-g": { +"id": "power-properties-pac-g", +"is-read-only": false, +"description": ["Indication with severity warning raised when a total power value measured is above the threshold."] +}, +"total-power-upper-warn-threshold-default": { +"id": "total-power-upper-warn-threshold-default", +"is-read-only": false, +"description": ["Can read the value of the default threshold that was set"] +}, +"total-power-upper-warn-threshold-min": { +"id": "total-power-upper-warn-threshold-min", +"is-read-only": false, +"description": ["Can read the value of the lower threshold that was set"] +}, +"total-power-upper-warn-threshold-max": { +"id": "total-power-upper-warn-threshold-max", +"is-read-only": false, +"description": ["Can read the value of the upper threshold that was set"] +}, +"total-power-lower-warn-threshold-default": { +"id": "total-power-lower-warn-threshold-default", +"is-read-only": false, +"description": ["Can read the value of the default threshold that was set"] +}, +"total-power-lower-warn-threshold-max": { +"id": "total-power-lower-warn-threshold-max", +"is-read-only": false, +"description": ["Can read the value of the upper threshold that was set"] +}, +"total-power-lower-warn-threshold-min": { +"id": "total-power-lower-warn-threshold-min", +"is-read-only": false, +"description": ["Can read the value of the lower threshold that was set"] +}, +"total-power-threshold-pac-g": { +"id": "total-power-threshold-pac-g", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE": { +"id": "SPECTRUM_TYPE", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_OTSi": { +"id": "SPECTRUM_TYPE_OTSi", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_OTSiA": { +"id": "SPECTRUM_TYPE_OTSiA", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_OTSiG": { +"id": "SPECTRUM_TYPE_OTSiG", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_NMC": { +"id": "SPECTRUM_TYPE_NMC", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_NMCA": { +"id": "SPECTRUM_TYPE_NMCA", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_SMC": { +"id": "SPECTRUM_TYPE_SMC", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_SMCA": { +"id": "SPECTRUM_TYPE_SMCA", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_OCH": { +"id": "SPECTRUM_TYPE_OCH", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_OMS": { +"id": "SPECTRUM_TYPE_OMS", +"is-read-only": false, +"description": ["none"] +}, +"SPECTRUM_TYPE_OTS": { +"id": "SPECTRUM_TYPE_OTS", +"is-read-only": false, +"description": ["none"] +}, +"application-identifier-type": { +"id": "application-identifier-type", +"is-read-only": false, +"description": ["The ITU-T recommendation which defines the application code format."] +}, +"application-code": { +"id": "application-code", +"is-read-only": false, +"description": ["none"] +}, +"application-identifier-g": { +"id": "application-identifier-g", +"is-read-only": false, +"description": ["The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code."] +}, +"grid-type": { +"id": "grid-type", +"is-read-only": false, +"description": ["Specifies the frequency grid standard used to determine the nominal central frequency and frequency slot width"] +}, +"adjustment-granularity": { +"id": "adjustment-granularity", +"is-read-only": false, +"description": ["Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency (in THz)"] +}, +"central-frequency": { +"id": "central-frequency", +"is-read-only": false, +"unit":"MHz", +"description": ["The central frequency of the laser specified in MHz. It is the oscillation frequency of the corresponding electromagnetic wave."] +}, +"channel-number": { +"id": "channel-number", +"is-read-only": false, +"description": ["As per ITU-T G.694.1, this attribute is denoted as 'n' and is used to calculate the nominal central frequency (in THz) as follows: 193.1 + <channelNumber> × <adjustmentGranularity> where channelNumber is a positive or negative integer including 0 and adjustment_granularity is the nominal central frequency granularity in THz"] +}, +"central-frequency-or-wavelength-g": { +"id": "central-frequency-or-wavelength-g", +"is-read-only": false, +"description": ["This data-type holds the central frequency directly or optionally the information to determine the nominal central frequency of a FIXED grid (DWDM or CWDM) and FLEX grid type systems. As per ITU-T G.694.1, the nominal central frequency (in THz) is calculated as follows: 193.1 + <channelNumber> × <adjustmentGranularity> where channelNumber is a positive or negative integer including 0 and <adjustment_granularity> is the nominal central frequency granularity in THz For FIXED grid types, the adjustmentGranularity is one of (0.1/0.05/0.025/0.0125) THz corresponding to channel spacing of one of (100/50/25/12.5) GHz For FLEX grid type, the adjusmentGranularity is 0.00625 THz and the slot width is variable in increments of 12.5 GHz"] +}, +"OPTIMAL_OSNR": { +"id": "OPTIMAL_OSNR", +"is-read-only": false, +"description": ["none"] +}, +"NO_RELAY": { +"id": "NO_RELAY", +"is-read-only": false, +"description": ["none"] +}, +"MIN_RELAY": { +"id": "MIN_RELAY", +"is-read-only": false, +"description": ["none"] +}, +"PREFERRED_NO_CHANGE_WAVELENGTH_AS_RESTORE": { +"id": "PREFERRED_NO_CHANGE_WAVELENGTH_AS_RESTORE", +"is-read-only": false, +"description": ["none"] +}, +"PREFERRED_NO_SKIPPING_WAVELENGTH": { +"id": "PREFERRED_NO_SKIPPING_WAVELENGTH", +"is-read-only": false, +"description": ["none"] +}, +"optical-routing-strategy": { +"id": "optical-routing-strategy", +"is-read-only": false, +"description": ["none"] +}, +"PROPRIETARY": { +"id": "PROPRIETARY", +"is-read-only": false, +"description": ["none"] +}, +"ITUT_G959_1": { +"id": "ITUT_G959_1", +"is-read-only": false, +"description": ["none"] +}, +"ITUT_G698_1": { +"id": "ITUT_G698_1", +"is-read-only": false, +"description": ["none"] +}, +"ITUT_G698_2": { +"id": "ITUT_G698_2", +"is-read-only": false, +"description": ["none"] +}, +"ITUT_G696_1": { +"id": "ITUT_G696_1", +"is-read-only": false, +"description": ["none"] +}, +"ITUT_G695": { +"id": "ITUT_G695", +"is-read-only": false, +"description": ["none"] +}, +"application-identifier-type": { +"id": "application-identifier-type", +"is-read-only": false, +"description": ["none"] +}, +"DWDM": { +"id": "DWDM", +"is-read-only": false, +"description": ["Fixed frequency grid in C & L bands as specified in ITU-T G.694.1"] +}, +"CWDM": { +"id": "CWDM", +"is-read-only": false, +"description": ["Fixed frequency grid as specified in ITU-T G.694.2"] +}, +"FLEX": { +"id": "FLEX", +"is-read-only": false, +"description": ["Flexible frequency grid as specified in ITU-T G.694.1. In this case, - the allowed frequency slots have a nominal central frequency (in THz) defined by: 193.1 + n × 0.00625 where n is a positive or negative integer including 0 and 0.00625 is the nominal central frequency granularity in THz - and a slot width defined by: 12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz. Any combination of frequency slots is allowed as long as no two frequency slots overlap."] +}, +"GRIDLESS": { +"id": "GRIDLESS", +"is-read-only": false, +"description": ["none"] +}, +"UNSPECIFIED": { +"id": "UNSPECIFIED", +"is-read-only": false, +"description": ["Unspecified/proprietary frequency grid"] +}, +"grid-type": { +"id": "grid-type", +"is-read-only": false, +"description": ["The frequency grid standard that specify reference set of frequencies used to denote allowed nominal central frequencies that may be used for defining applications."] +}, +"G_100GHZ": { +"id": "G_100GHZ", +"is-read-only": false, +"description": ["100000 MHz"] +}, +"G_50GHZ": { +"id": "G_50GHZ", +"is-read-only": false, +"description": ["50000 MHz"] +}, +"G_25GHZ": { +"id": "G_25GHZ", +"is-read-only": false, +"description": ["25000 MHz"] +}, +"G_12_5GHZ": { +"id": "G_12_5GHZ", +"is-read-only": false, +"description": ["12500 MHz"] +}, +"G_6_25GHZ": { +"id": "G_6_25GHZ", +"is-read-only": false, +"description": ["6250 MHz"] +}, +"G_3_125GHZ": { +"id": "G_3_125GHZ", +"is-read-only": false, +"description": ["3125 MHz"] +}, +"UNCONSTRAINED": { +"id": "UNCONSTRAINED", +"is-read-only": false, +"description": ["none"] +}, +"adjustment-granularity": { +"id": "adjustment-granularity", +"is-read-only": false, +"description": ["Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency"] +}, +"upper-frequency": { +"id": "upper-frequency", +"is-read-only": false, +"unit":"MHz", +"description": ["The upper frequency bound of the media channel spectrum specified in MHz"] +}, +"lower-frequency": { +"id": "lower-frequency", +"is-read-only": false, +"unit":"MHz", +"description": ["The lower frequency bound of the media channel spectrum specified in MHz"] +}, +"frequency-slot": { +"id": "frequency-slot", +"is-read-only": false, +"description": ["none"] +}, +"spectrum-g": { +"id": "spectrum-g", +"is-read-only": false, +"description": ["This data-type holds the spectrum information in termsof upper/lower frequency directly or optionally the information to determin this in terms of the nominal central frequency and spectral width for a FIXED grid (DWDM or CWDM) and FLEX grid type systems."] +}, +"RZ": { +"id": "RZ", +"is-read-only": false, +"description": ["none"] +}, +"NRZ": { +"id": "NRZ", +"is-read-only": false, +"description": ["none"] +}, +"BPSK": { +"id": "BPSK", +"is-read-only": false, +"description": ["none"] +}, +"DPSK": { +"id": "DPSK", +"is-read-only": false, +"description": ["none"] +}, +"QPSK": { +"id": "QPSK", +"is-read-only": false, +"description": ["none"] +}, +"8QAM": { +"id": "8QAM", +"is-read-only": false, +"description": ["none"] +}, +"16QAM": { +"id": "16QAM", +"is-read-only": false, +"description": ["none"] +}, +"UNDEFINED": { +"id": "UNDEFINED", +"is-read-only": false, +"description": ["none"] +}, +"modulation-technique": { +"id": "modulation-technique", +"is-read-only": false, +"description": ["none"] +}, +"spectral-width": { +"id": "spectral-width", +"is-read-only": false, +"description": ["Width of the media channel spectrum specified in MHz"] +}, +"slot-width-number": { +"id": "slot-width-number", +"is-read-only": false, +"description": ["As per ITU-T G.694.1, this attribute is denoted as 'm' and is used to calculate the slot width (in GHz) as follows: 12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz."] +}, +"frequency-slot-g": { +"id": "frequency-slot-g", +"is-read-only": false, +"description": ["The frequency range allocated to a slot and unavailable to other slots within a flexible grid. A frequency slot is defined by its nominal central frequency. As per ITU-T G.694.1 the slot width is calculated as follows: 12.5 × <slotWidthNumber> where slotWidthNumber is a positive integer and 12.5 is the slot width granularity in GHz"] +}, +"PUMP": { +"id": "PUMP", +"is-read-only": false, +"description": ["none"] +}, +"MODULATED": { +"id": "MODULATED", +"is-read-only": false, +"description": ["none"] +}, +"PULSE": { +"id": "PULSE", +"is-read-only": false, +"description": ["none"] +}, +"laser-type": { +"id": "laser-type", +"is-read-only": false, +"description": ["none"] +}, +"spectrum-type": { +"id": "spectrum-type", +"is-read-only": false, +"description": ["none"] +}, +"FORCED-ON": { +"id": "FORCED-ON", +"is-read-only": false, +"description": ["none"] +}, +"FORCED-OFF": { +"id": "FORCED-OFF", +"is-read-only": false, +"description": ["none"] +}, +"AUTOMATIC-LASER-SHUTDOWN": { +"id": "AUTOMATIC-LASER-SHUTDOWN", +"is-read-only": false, +"description": ["none"] +}, +"UNDEFINED": { +"id": "UNDEFINED", +"is-read-only": false, +"description": ["none"] +}, +"laser-control-type": { +"id": "laser-control-type", +"is-read-only": false, +"description": ["none"] +}, +"ON": { +"id": "ON", +"is-read-only": false, +"description": ["none"] +}, +"OFF": { +"id": "OFF", +"is-read-only": false, +"description": ["none"] +}, +"PULSING": { +"id": "PULSING", +"is-read-only": false, +"description": ["none"] +}, +"UNDEFINED": { +"id": "UNDEFINED", +"is-read-only": false, +"description": ["none"] +}, +"laser-control-status-type": { +"id": "laser-control-status-type", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-topology@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-topology@2018-08-31.schema-information.json new file mode 100644 index 000000000..b4a0dc1e9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-topology@2018-08-31.schema-information.json @@ -0,0 +1,648 @@ +{ "schama-information": { + +"tapi-topology": { +"id": "tapi-topology", +"is-read-only": false, +"description": ["This module contains TAPI Topology Model definitions. Source: TapiTopology.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"topology-uuid": { +"id": "topology-uuid", +"is-read-only": false, +"description": ["none"] +}, +"topology-ref-g": { +"id": "topology-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"link-uuid": { +"id": "link-uuid", +"is-read-only": false, +"description": ["none"] +}, +"link-ref-g": { +"id": "link-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"node-uuid": { +"id": "node-uuid", +"is-read-only": false, +"description": ["none"] +}, +"node-ref-g": { +"id": "node-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"node-edge-point-uuid": { +"id": "node-edge-point-uuid", +"is-read-only": false, +"description": ["none"] +}, +"node-edge-point-ref-g": { +"id": "node-edge-point-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"node-rule-group-uuid": { +"id": "node-rule-group-uuid", +"is-read-only": false, +"description": ["none"] +}, +"node-rule-group-ref-g": { +"id": "node-rule-group-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"node-edge-point": { +"id": "node-edge-point", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["The directionality of the Link. Is applicable to simple Links where all LinkEnds are BIDIRECTIONAL (the Link will be BIDIRECTIONAL) or UNIDIRECTIONAL (the Link will be UNIDIRECTIONAL). Is not present in more complex cases."] +}, +"resilience-type": { +"id": "resilience-type", +"is-read-only": false, +"description": ["none"] +}, +"link-g": { +"id": "link-g", +"is-read-only": false, +"description": ["The Link object class models effective adjacency between two or more ForwardingDomains (FD)."] +}, +"owned-node-edge-point": { +"id": "owned-node-edge-point", +"is-read-only": false, +"description": ["none"] +}, +"aggregated-node-edge-point": { +"id": "aggregated-node-edge-point", +"is-read-only": false, +"description": ["none"] +}, +"node-rule-group": { +"id": "node-rule-group", +"is-read-only": false, +"description": ["none"] +}, +"encap-topology": { +"id": "encap-topology", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"node-g": { +"id": "node-g", +"is-read-only": false, +"description": ["The ForwardingDomain (FD) object class models the ForwardingDomain topological component which is used to effect forwarding of transport characteristic information and offers the potential to enable forwarding. At the lowest level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs)."] +}, +"node": { +"id": "node", +"is-read-only": false, +"description": ["none"] +}, +"link": { +"id": "link", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"topology-g": { +"id": "topology-g", +"is-read-only": false, +"description": ["The ForwardingDomain (FD) object class models the ForwardingDomain topological component which is used to effect forwarding of transport characteristic information and offers the potential to enable forwarding. At the lowest level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs)."] +}, +"transitioned-layer-protocol-name": { +"id": "transitioned-layer-protocol-name", +"is-read-only": false, +"description": ["Provides the ordered structure of layer protocol transitions encapsulated in the TopologicalEntity. The ordering relates to the LinkPort role."] +}, +"layer-protocol-transition-pac-g": { +"id": "layer-protocol-transition-pac-g", +"is-read-only": false, +"description": ["Relevant for a Link that is formed by abstracting one or more LTPs (in a stack) to focus on the flow and deemphasize the protocol transformation. This abstraction is relevant when considering multi-layer routing. The layer protocols of the LTP and the order of their application to the signal is still relevant and need to be accounted for. This is derived from the LTP spec details. This Pac provides the relevant abstractions of the LTPs and provides the necessary association to the LTPs involved. Links that included details in this Pac are often referred to as Transitional Links."] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"supported-cep-layer-protocol-qualifier": { +"id": "supported-cep-layer-protocol-qualifier", +"is-read-only": false, +"description": ["none"] +}, +"aggregated-node-edge-point": { +"id": "aggregated-node-edge-point", +"is-read-only": false, +"description": ["none"] +}, +"mapped-service-interface-point": { +"id": "mapped-service-interface-point", +"is-read-only": false, +"description": ["NodeEdgePoint mapped to more than ServiceInterfacePoint (slicing/virtualizing) or a ServiceInterfacePoint mapped to more than one NodeEdgePoint (load balancing/Resilience) should be considered experimental"] +}, +"link-port-direction": { +"id": "link-port-direction", +"is-read-only": false, +"description": ["The orientation of defined flow at the LinkEnd."] +}, +"link-port-role": { +"id": "link-port-role", +"is-read-only": false, +"description": ["Each LinkEnd of the Link has a role (e.g., symmetric, hub, spoke, leaf, root) in the context of the Link with respect to the Link function."] +}, +"node-edge-point-g": { +"id": "node-edge-point-g", +"is-read-only": false, +"description": ["The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers. The structure of LTP supports all transport protocols including circuit and packet forms."] +}, +"risk-characteristic": { +"id": "risk-characteristic", +"is-read-only": false, +"description": ["A list of risk characteristics for consideration in an analysis of shared risk. Each element of the list represents a specific risk consideration."] +}, +"risk-parameter-pac-g": { +"id": "risk-parameter-pac-g", +"is-read-only": false, +"description": ["The risk characteristics of a TopologicalEntity come directly from the underlying physical realization. The risk characteristics propagate from the physical realization to the client and from the server layer to the client layer, this propagation may be modified by protection. A TopologicalEntity may suffer degradation or failure as a result of a problem in a part of the underlying realization. The realization can be partitioned into segments which have some relevant common failure modes. There is a risk of failure/degradation of each segment of the underlying realization. Each segment is a part of a larger physical/geographical unit that behaves as one with respect to failure (i.e. a failure will have a high probability of impacting the whole unit (e.g. all cables in the same duct). Disruptions to that larger physical/geographical unit will impact (cause failure/errors to) all TopologicalEntities that use any part of that larger physical/geographical entity. Any TopologicalEntity that uses any part of that larger physical/geographical unit will suffer impact and hence each TopologicalEntity shares risk. The identifier of each physical/geographical unit that is involved in the realization of each segment of a Topological entity can be listed in the RiskParameter_Pac of that TopologicalEntity. A segment has one or more risk characteristic. Shared risk between two TopologicalEntities compromises the integrity of any solution that use one of those TopologicalEntity as a backup for the other. Where two TopologicalEntities have a common risk characteristic they have an elevated probability of failing simultaneously compared to two TopologicalEntities that do not share risk characteristics."] +}, +"cost-characteristic": { +"id": "cost-characteristic", +"is-read-only": false, +"description": ["The list of costs where each cost relates to some aspect of the TopologicalEntity."] +}, +"transfer-cost-pac-g": { +"id": "transfer-cost-pac-g", +"is-read-only": false, +"description": ["The cost characteristics of a TopologicalEntity not necessarily correlated to the cost of the underlying physical realization. They may be quite specific to the individual TopologicalEntity e.g. opportunity cost. Relates to layer capacity There may be many perspectives from which cost may be considered for a particular TopologicalEntity and hence many specific costs and potentially cost algorithms. Using an entity will incur a cost."] +}, +"error-characteristic": { +"id": "error-characteristic", +"is-read-only": false, +"description": ["Describes the degree to which the signal propagated can be errored. Applies to TDM systems as the errored signal will be propagated and not packet as errored packets will be discarded."] +}, +"loss-characteristic": { +"id": "loss-characteristic", +"is-read-only": false, +"description": ["Describes the acceptable characteristic of lost packets where loss may result from discard due to errors or overflow. Applies to packet systems and not TDM (as for TDM errored signals are propagated unless grossly errored and overflow/underflow turns into timing slips)."] +}, +"repeat-delivery-characteristic": { +"id": "repeat-delivery-characteristic", +"is-read-only": false, +"description": ["Primarily applies to packet systems where a packet may be delivered more than once (in fault recovery for example). It can also apply to TDM where several frames may be received twice due to switching in a system with a large differential propagation delay."] +}, +"delivery-order-characteristic": { +"id": "delivery-order-characteristic", +"is-read-only": false, +"description": ["Describes the degree to which packets will be delivered out of sequence. Does not apply to TDM as the TDM protocols maintain strict order."] +}, +"unavailable-time-characteristic": { +"id": "unavailable-time-characteristic", +"is-read-only": false, +"description": ["Describes the duration for which there may be no valid signal propagated."] +}, +"server-integrity-process-characteristic": { +"id": "server-integrity-process-characteristic", +"is-read-only": false, +"description": ["Describes the effect of any server integrity enhancement process on the characteristics of the TopologicalEntity."] +}, +"transfer-integrity-pac-g": { +"id": "transfer-integrity-pac-g", +"is-read-only": false, +"description": ["Transfer intergrity characteristic covers expected/specified/acceptable characteristic of degradation of the transfered signal. It includes all aspects of possible degradation of signal content as well as any damage of any form to the total TopologicalEntity and to the carried signals. Note that the statement is of total impact to the TopologicalEntity so any partial usage of the TopologicalEntity (e.g. a signal that does not use full capacity) will only suffer its portion of the impact."] +}, +"latency-characteristic": { +"id": "latency-characteristic", +"is-read-only": false, +"description": ["The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic."] +}, +"transfer-timing-pac-g": { +"id": "transfer-timing-pac-g", +"is-read-only": false, +"description": ["A TopologicalEntity will suffer effects from the underlying physical realization related to the timing of the information passed by the TopologicalEntity."] +}, +"validation-mechanism": { +"id": "validation-mechanism", +"is-read-only": false, +"description": ["Provides details of the specific validation mechanism(s) used to confirm the presence of an intended topologicalEntity."] +}, +"validation-pac-g": { +"id": "validation-pac-g", +"is-read-only": false, +"description": ["Validation covers the various adjacenct discovery and reachability verification protocols. Also may cover Information source and degree of integrity."] +}, +"topology": { +"id": "topology", +"is-read-only": false, +"description": ["none"] +}, +"network-topology-service-g": { +"id": "network-topology-service-g", +"is-read-only": false, +"description": ["none"] +}, +"nw-topology-service": { +"id": "nw-topology-service", +"is-read-only": false, +"description": ["none"] +}, +"topology": { +"id": "topology", +"is-read-only": false, +"description": ["none"] +}, +"topology-context-g": { +"id": "topology-context-g", +"is-read-only": false, +"description": ["none"] +}, +"rule": { +"id": "rule", +"is-read-only": false, +"description": ["none"] +}, +"associated-node-rule-group": { +"id": "associated-node-rule-group", +"is-read-only": false, +"description": ["none"] +}, +"inter-rule-group-g": { +"id": "inter-rule-group-g", +"is-read-only": false, +"description": ["none"] +}, +"rule": { +"id": "rule", +"is-read-only": false, +"description": ["none"] +}, +"node-edge-point": { +"id": "node-edge-point", +"is-read-only": false, +"description": ["none"] +}, +"composed-rule-group": { +"id": "composed-rule-group", +"is-read-only": false, +"description": ["none"] +}, +"inter-rule-group": { +"id": "inter-rule-group", +"is-read-only": false, +"description": ["none"] +}, +"node-rule-group-g": { +"id": "node-rule-group-g", +"is-read-only": false, +"description": ["none"] +}, +"rule-type": { +"id": "rule-type", +"is-read-only": false, +"description": ["none"] +}, +"forwarding-rule": { +"id": "forwarding-rule", +"is-read-only": false, +"description": ["none"] +}, +"override-priority": { +"id": "override-priority", +"is-read-only": false, +"description": ["none"] +}, +"rule-g": { +"id": "rule-g", +"is-read-only": false, +"description": ["none"] +}, +"cost-name": { +"id": "cost-name", +"is-read-only": false, +"description": ["The cost characteristic will related to some aspect of the TopologicalEntity (e.g. $ cost, routing weight). This aspect will be conveyed by the costName."] +}, +"cost-value": { +"id": "cost-value", +"is-read-only": false, +"description": ["The specific cost."] +}, +"cost-algorithm": { +"id": "cost-algorithm", +"is-read-only": false, +"description": ["The cost may vary based upon some properties of the TopologicalEntity. The rules for the variation are conveyed by the costAlgorithm."] +}, +"cost-characteristic-g": { +"id": "cost-characteristic-g", +"is-read-only": false, +"description": ["The information for a particular cost characteristic."] +}, +"traffic-property-name": { +"id": "traffic-property-name", +"is-read-only": false, +"description": ["The identifier of the specific traffic property to which the queuing latency applies."] +}, +"fixed-latency-characteristic": { +"id": "fixed-latency-characteristic", +"is-read-only": false, +"description": ["A TopologicalEntity suffers delay caused by the realization of the servers (e.g. distance related; FEC encoding etc.) along with some client specific processing. This is the total average latency effect of the TopologicalEntity"] +}, +"queing-latency-characteristic": { +"id": "queing-latency-characteristic", +"is-read-only": false, +"description": ["The specific queuing latency for the traffic property."] +}, +"jitter-characteristic": { +"id": "jitter-characteristic", +"is-read-only": false, +"description": ["High frequency deviation from true periodicity of a signal and therefore a small high rate of change of transfer latency. Applies to TDM systems (and not packet)."] +}, +"wander-characteristic": { +"id": "wander-characteristic", +"is-read-only": false, +"description": ["Low frequency deviation from true periodicity of a signal and therefore a small low rate of change of transfer latency. Applies to TDM systems (and not packet)."] +}, +"latency-characteristic-g": { +"id": "latency-characteristic-g", +"is-read-only": false, +"description": ["Provides information on latency characteristic for a particular stated trafficProperty."] +}, +"risk-characteristic-name": { +"id": "risk-characteristic-name", +"is-read-only": false, +"description": ["The name of the risk characteristic. The characteristic may be related to a specific degree of closeness. For example a particular characteristic may apply to failures that are localized (e.g. to one side of a road) where as another characteristic may relate to failures that have a broader impact (e.g. both sides of a road that crosses a bridge). Depending upon the importance of the traffic being routed different risk characteristics will be evaluated."] +}, +"risk-identifier-list": { +"id": "risk-identifier-list", +"is-read-only": false, +"description": ["A list of the identifiers of each physical/geographic unit (with the specific risk characteristic) that is related to a segment of the TopologicalEntity."] +}, +"risk-characteristic-g": { +"id": "risk-characteristic-g", +"is-read-only": false, +"description": ["The information for a particular risk characteristic where there is a list of risk identifiers related to that characteristic."] +}, +"validation-mechanism": { +"id": "validation-mechanism", +"is-read-only": false, +"description": ["Name of mechanism used to validate adjacency"] +}, +"layer-protocol-adjacency-validated": { +"id": "layer-protocol-adjacency-validated", +"is-read-only": false, +"description": ["State of validatiion"] +}, +"validation-robustness": { +"id": "validation-robustness", +"is-read-only": false, +"description": ["Quality of validation (i.e. how likely is the stated validation to be invalid)"] +}, +"validation-mechanism-g": { +"id": "validation-mechanism-g", +"is-read-only": false, +"description": ["Identifies the validation mechanism and describes the characteristics of that mechanism"] +}, +"MAY_FORWARD_ACROSS_GROUP": { +"id": "MAY_FORWARD_ACROSS_GROUP", +"is-read-only": false, +"description": ["none"] +}, +"MUST_FORWARD_ACROSS_GROUP": { +"id": "MUST_FORWARD_ACROSS_GROUP", +"is-read-only": false, +"description": ["none"] +}, +"CANNOT_FORWARD_ACROSS_GROUP": { +"id": "CANNOT_FORWARD_ACROSS_GROUP", +"is-read-only": false, +"description": ["none"] +}, +"NO_STATEMENT_ON_FORWARDING": { +"id": "NO_STATEMENT_ON_FORWARDING", +"is-read-only": false, +"description": ["none"] +}, +"forwarding-rule": { +"id": "forwarding-rule", +"is-read-only": false, +"description": ["none"] +}, +"FORWARDING": { +"id": "FORWARDING", +"is-read-only": false, +"description": ["none"] +}, +"CAPACITY": { +"id": "CAPACITY", +"is-read-only": false, +"description": ["none"] +}, +"COST": { +"id": "COST", +"is-read-only": false, +"description": ["none"] +}, +"TIMING": { +"id": "TIMING", +"is-read-only": false, +"description": ["none"] +}, +"RISK": { +"id": "RISK", +"is-read-only": false, +"description": ["none"] +}, +"GROUPING": { +"id": "GROUPING", +"is-read-only": false, +"description": ["none"] +}, +"rule-type": { +"id": "rule-type", +"is-read-only": false, +"description": ["none"] +}, +"restoration-policy": { +"id": "restoration-policy", +"is-read-only": false, +"description": ["none"] +}, +"protection-type": { +"id": "protection-type", +"is-read-only": false, +"description": ["none"] +}, +"resilience-type-g": { +"id": "resilience-type-g", +"is-read-only": false, +"description": ["none"] +}, +"PER_DOMAIN_RESTORATION": { +"id": "PER_DOMAIN_RESTORATION", +"is-read-only": false, +"description": ["none"] +}, +"END_TO_END_RESTORATION": { +"id": "END_TO_END_RESTORATION", +"is-read-only": false, +"description": ["none"] +}, +"NA": { +"id": "NA", +"is-read-only": false, +"description": ["none"] +}, +"restoration-policy": { +"id": "restoration-policy", +"is-read-only": false, +"description": ["none"] +}, +"NO_PROTECTON": { +"id": "NO_PROTECTON", +"is-read-only": false, +"description": ["none"] +}, +"ONE_PLUS_ONE_PROTECTION": { +"id": "ONE_PLUS_ONE_PROTECTION", +"is-read-only": false, +"description": ["none"] +}, +"ONE_PLUS_ONE_PROTECTION_WITH_DYNAMIC_RESTORATION": { +"id": "ONE_PLUS_ONE_PROTECTION_WITH_DYNAMIC_RESTORATION", +"is-read-only": false, +"description": ["none"] +}, +"PERMANENT_ONE_PLUS_ONE_PROTECTION": { +"id": "PERMANENT_ONE_PLUS_ONE_PROTECTION", +"is-read-only": false, +"description": ["none"] +}, +"ONE_FOR_ONE_PROTECTION": { +"id": "ONE_FOR_ONE_PROTECTION", +"is-read-only": false, +"description": ["none"] +}, +"DYNAMIC_RESTORATION": { +"id": "DYNAMIC_RESTORATION", +"is-read-only": false, +"description": ["none"] +}, +"PRE_COMPUTED_RESTORATION": { +"id": "PRE_COMPUTED_RESTORATION", +"is-read-only": false, +"description": ["none"] +}, +"protection-type": { +"id": "protection-type", +"is-read-only": false, +"description": ["none"] +}, +"get-topology-details": { +"id": "get-topology-details", +"is-read-only": false, +"description": ["none"] +}, +"topology-id-or-name": { +"id": "topology-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"topology": { +"id": "topology", +"is-read-only": false, +"description": ["none"] +}, +"get-node-details": { +"id": "get-node-details", +"is-read-only": false, +"description": ["none"] +}, +"topology-id-or-name": { +"id": "topology-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"node-id-or-name": { +"id": "node-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"node": { +"id": "node", +"is-read-only": false, +"description": ["none"] +}, +"get-node-edge-point-details": { +"id": "get-node-edge-point-details", +"is-read-only": false, +"description": ["none"] +}, +"topology-id-or-name": { +"id": "topology-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"node-id-or-name": { +"id": "node-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"ep-id-or-name": { +"id": "ep-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"node-edge-point": { +"id": "node-edge-point", +"is-read-only": false, +"description": ["none"] +}, +"get-link-details": { +"id": "get-link-details", +"is-read-only": false, +"description": ["none"] +}, +"topology-id-or-name": { +"id": "topology-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"link-id-or-name": { +"id": "link-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"link": { +"id": "link", +"is-read-only": false, +"description": ["none"] +}, +"get-topology-list": { +"id": "get-topology-list", +"is-read-only": false, +"description": ["none"] +}, +"topology": { +"id": "topology", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-virtual-network@2018-08-31.schema-information.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-virtual-network@2018-08-31.schema-information.json new file mode 100644 index 000000000..868841df1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/modelDescription/tapi-virtual-network@2018-08-31.schema-information.json @@ -0,0 +1,198 @@ +{ "schama-information": { + +"tapi-virtual-network": { +"id": "tapi-virtual-network", +"is-read-only": false, +"description": ["This module contains TAPI Virtual Network Model definitions. Source: TapiVirtualNetwork.uml Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. License: This module is distributed under the Apache License 2.0"] +}, +"virtual-nw-service-uuid": { +"id": "virtual-nw-service-uuid", +"is-read-only": false, +"description": ["none"] +}, +"virtual-nw-service-ref-g": { +"id": "virtual-nw-service-ref-g", +"is-read-only": false, +"description": ["none"] +}, +"src-service-end-point": { +"id": "src-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"sink-service-end-point": { +"id": "sink-service-end-point", +"is-read-only": false, +"description": ["none"] +}, +"diversity-exclusion": { +"id": "diversity-exclusion", +"is-read-only": false, +"description": ["none"] +}, +"requested-capacity": { +"id": "requested-capacity", +"is-read-only": false, +"description": ["none"] +}, +"service-level": { +"id": "service-level", +"is-read-only": false, +"description": ["An abstract value the meaning of which is mutually agreed – typically represents metrics such as - Class of service, priority, resiliency, availability"] +}, +"service-layer": { +"id": "service-layer", +"is-read-only": false, +"description": ["none"] +}, +"cost-characteristic": { +"id": "cost-characteristic", +"is-read-only": false, +"description": ["The list of costs where each cost relates to some aspect of the TopologicalEntity."] +}, +"latency-characteristic": { +"id": "latency-characteristic", +"is-read-only": false, +"description": ["The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic."] +}, +"virtual-network-constraint-g": { +"id": "virtual-network-constraint-g", +"is-read-only": false, +"description": ["none"] +}, +"topology": { +"id": "topology", +"is-read-only": false, +"description": ["none"] +}, +"end-point": { +"id": "end-point", +"is-read-only": false, +"description": ["none"] +}, +"vnw-constraint": { +"id": "vnw-constraint", +"is-read-only": false, +"description": ["none"] +}, +"schedule": { +"id": "schedule", +"is-read-only": false, +"description": ["none"] +}, +"state": { +"id": "state", +"is-read-only": false, +"description": ["none"] +}, +"layer-protocol-name": { +"id": "layer-protocol-name", +"is-read-only": false, +"description": ["none"] +}, +"virtual-network-service-g": { +"id": "virtual-network-service-g", +"is-read-only": false, +"description": ["The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms. At the lowest level of recursion, a FC represents a cross-connection within an NE."] +}, +"service-interface-point": { +"id": "service-interface-point", +"is-read-only": false, +"description": ["none"] +}, +"role": { +"id": "role", +"is-read-only": false, +"description": ["Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function."] +}, +"direction": { +"id": "direction", +"is-read-only": false, +"description": ["The orientation of defined flow at the EndPoint."] +}, +"service-layer": { +"id": "service-layer", +"is-read-only": false, +"description": ["none"] +}, +"virtual-network-service-end-point-g": { +"id": "virtual-network-service-end-point-g", +"is-read-only": false, +"description": ["The association of the FC to LTPs is made via EndPoints. The EndPoint (EP) object class models the access to the FC function. The traffic forwarding between the associated EPs of the FC depends upon the type of FC and may be associated with FcSwitch object instances. In cases where there is resilience the EndPoint may convey the resilience role of the access to the FC. It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. The EP replaces the Protection Unit of a traditional protection model. The ForwadingConstruct can be considered as a component and the EndPoint as a Port on that component"] +}, +"virtual-nw-service": { +"id": "virtual-nw-service", +"is-read-only": false, +"description": ["none"] +}, +"virtual-network-context-g": { +"id": "virtual-network-context-g", +"is-read-only": false, +"description": ["none"] +}, +"create-virtual-network-service": { +"id": "create-virtual-network-service", +"is-read-only": false, +"description": ["none"] +}, +"sep": { +"id": "sep", +"is-read-only": false, +"description": ["none"] +}, +"vnw-constraint": { +"id": "vnw-constraint", +"is-read-only": false, +"description": ["none"] +}, +"conn-schedule": { +"id": "conn-schedule", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"delete-virtual-network-service": { +"id": "delete-virtual-network-service", +"is-read-only": false, +"description": ["none"] +}, +"service-id-or-name": { +"id": "service-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"get-virtual-network-service-details": { +"id": "get-virtual-network-service-details", +"is-read-only": false, +"description": ["none"] +}, +"service-id-or-name": { +"id": "service-id-or-name", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}, +"get-virtual-network-service-list": { +"id": "get-virtual-network-service-list", +"is-read-only": false, +"description": ["none"] +}, +"service": { +"id": "service", +"is-read-only": false, +"description": ["none"] +}} +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/mwtnMapping.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/mwtnMapping.json new file mode 100644 index 000000000..21c7efb36 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/mwtnMapping.json @@ -0,0 +1,54 @@ +{ + "settings": { + "analysis": { + "analyzer": { + "standard": { + "type": "whitespace" + } + } + } + }, + "mappings": { + "required-networkelement": { + "date_detection": false + }, + "maintenancemode": { + "date_detection": false + }, + "site": { + "properties": { + "id": { + "index": "not_analyzed", + "type": "string" + }, + "name": { + "index": "not_analyzed", + "type": "string" + }, + "location": { + "geohash": true, + "geohash_precision": 10, + "type": "geo_point", + "lat_lon": true, + "geohash_prefix": true + } + } + }, + "site-link": { + "properties": { + "id": { + "index": "not_analyzed", + "type": "string" + }, + "siteZ": { + "index": "not_analyzed", + "type": "string" + }, + "siteA": { + "index": "not_analyzed", + "type": "string" + } + } + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/mwtnV1Alias.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/mwtnV1Alias.json new file mode 100644 index 000000000..e4aa7458f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/mwtn/mwtnV1Alias.json @@ -0,0 +1,8 @@ +{ + "actions":[ + { "add": { + "alias": "mwtn", + "index": "mwtn_v1" + }} + ] +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/sdnevents/sdneventsMapping.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/sdnevents/sdneventsMapping.json new file mode 100644 index 000000000..25cabedfc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/sdnevents/sdneventsMapping.json @@ -0,0 +1,157 @@ +{
+ "mappings": {
+ "faultlog": {
+ "properties": {
+ "fault": {
+ "properties": {
+ "nodeName": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "severity": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "timeStamp": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "problem": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "counter": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "objectId": {
+ "index": "not_analyzed",
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "faultcurrent": {
+ "properties": {
+ "faultCurrent": {
+ "properties": {
+ "nodeName": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "severity": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "timeStamp": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "problem": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "counter": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "objectId": {
+ "index": "not_analyzed",
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+ "eventlog": {
+ "properties": {
+ "event": {
+ "properties": {
+ "nodeName": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "timeStamp": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "newValue": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "attributeName": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "counter": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "objectId": {
+ "index": "not_analyzed",
+ "type": "string"
+ }
+ }
+ }
+ }
+ },
+
+ "inventorytoplevel": {
+ "properties": {
+ "uuidList": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "mountpoint": {
+ "index": "not_analyzed",
+ "type": "string"
+ }
+ }
+ },
+ "inventoryequipment": {
+ "properties": {
+ "date": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "modelIdentifier": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "partTypeId": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "serial": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "typeName": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "description": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "uuid": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "version": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "containedHolder": {
+ "index": "not_analyzed",
+ "type": "string"
+ },
+ "mountpoint": {
+ "index": "not_analyzed",
+ "type": "string"
+ }
+ }
+ }
+ }
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/sdnperformance/sdnperformanceMapping.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/sdnperformance/sdnperformanceMapping.json new file mode 100644 index 000000000..92d5ad2fb --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/index/sdnperformance/sdnperformanceMapping.json @@ -0,0 +1,92 @@ +{ + "mappings": + { + "historicalperformance24h": + { + "properties": + { + "node-name": + { + "index": "not_analyzed", + "type": "string" + }, + "time-stamp": + { + "index": "not_analyzed", + "type": "string" + }, + "suspect-interval-flag": + { + "type": "boolean" + }, + "scanner-id": + { + "index": "not_analyzed", + "type": "string" + }, + "uuid-interface": + { + "index": "not_analyzed", + "type": "string" + }, + "layer-protocol-name": { + "index": "not_analyzed", + "type": "string" + }, + "granularity-period": + { + "index": "not_analyzed", + "type": "string" + }, + "radio-signal-id": { + "index": "not_analyzed", + "type": "string" + } + } + }, + + "historicalperformance15min": + { + "properties": + { + "node-name": + { + "index": "not_analyzed", + "type": "string" + }, + "time-stamp": + { + "index": "not_analyzed", + "type": "string" + }, + "suspect-interval-flag": + { + "type": "boolean" + }, + "scanner-id": + { + "index": "not_analyzed", + "type": "string" + }, + "uuid-interface": + { + "index": "not_analyzed", + "type": "string" + }, + "layer-protocol-name": { + "index": "not_analyzed", + "type": "string" + }, + "granularity-period": + { + "index": "not_analyzed", + "type": "string" + }, + "radio-signal-id": { + "index": "not_analyzed", + "type": "string" + } + } + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/delete-by-query/plugin-descriptor.properties b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/delete-by-query/plugin-descriptor.properties new file mode 100644 index 000000000..70b21dcd1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/delete-by-query/plugin-descriptor.properties @@ -0,0 +1,80 @@ +# Elasticsearch plugin descriptor file +# This file must exist as 'plugin-descriptor.properties' at +# the root directory of all plugins. +# +# A plugin can be 'site', 'jvm', or both. +# +### example site plugin for "foo": +# +# foo.zip <-- zip file for the plugin, with this structure: +# _site/ <-- the contents that will be served +# plugin-descriptor.properties <-- example contents below: +# +# site=true +# description=My cool plugin +# version=1.0 +# +### example jvm plugin for "foo" +# +# foo.zip <-- zip file for the plugin, with this structure: +# <arbitrary name1>.jar <-- classes, resources, dependencies +# <arbitrary nameN>.jar <-- any number of jars +# plugin-descriptor.properties <-- example contents below: +# +# jvm=true +# classname=foo.bar.BazPlugin +# description=My cool plugin +# version=2.0.0-rc1 +# elasticsearch.version=2.0 +# java.version=1.7 +# +### mandatory elements for all plugins: +# +# 'description': simple summary of the plugin +description=The Delete By Query plugin allows to delete documents in Elasticsearch with a single query. +# +# 'version': plugin's version +version=2.2.0 +# +# 'name': the plugin name +name=delete-by-query + +### mandatory elements for site plugins: +# +# 'site': set to true to indicate contents of the _site/ +# directory in the root of the plugin should be served. +site=false +# +### mandatory elements for jvm plugins : +# +# 'jvm': true if the 'classname' class should be loaded +# from jar files in the root directory of the plugin. +# Note that only jar files in the root directory are +# added to the classpath for the plugin! If you need +# other resources, package them into a resources jar. +jvm=true +# +# 'classname': the name of the class to load, fully-qualified. +classname=org.elasticsearch.plugin.deletebyquery.DeleteByQueryPlugin +# +# 'java.version' version of java the code is built against +# use the system property java.specification.version +# version string must be a sequence of nonnegative decimal integers +# separated by "."'s and may have leading zeros +java.version=1.7 +# +# 'elasticsearch.version' version of elasticsearch compiled against +# You will have to release a new version of the plugin for each new +# elasticsearch release. This version is checked when the plugin +# is loaded so Elasticsearch will refuse to start in the presence of +# plugins with the incorrect elasticsearch.version. +elasticsearch.version=2.2.0 +# +### deprecated elements for jvm plugins : +# +# 'isolated': true if the plugin should have its own classloader. +# passing false is deprecated, and only intended to support plugins +# that have hard dependencies against each other. If this is +# not specified, then the plugin is isolated by default. +isolated=true +# diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/.jshintrc b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/.jshintrc new file mode 100644 index 000000000..757f96929 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/.jshintrc @@ -0,0 +1,40 @@ +{ + "maxerr": 1000, + + "predef": [ + "exports", + "describe", + "expect", + "it", + "beforeEach", + "afterEach", + "jasmine", + "test", + "spyOn" + ], + + "jquery" : true, + "browser" : true, + + "curly": true, + "debug": false, + "devel": true, + "eqeqeq": true, + "eqnull": true, + "expr": true, + "forin": false, + "immed": false, + "latedef": true, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "white": false, + "scripturl": true, + "esnext": true +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/Gruntfile.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/Gruntfile.js new file mode 100644 index 000000000..d9607ac76 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/Gruntfile.js @@ -0,0 +1,115 @@ +module.exports = function(grunt) { + + var fileSets = require("./grunt_fileSets.js"); + + // Project configuration. + grunt.initConfig({ + clean: { + _site: { + src: ['_site'] + } + }, + concat: { + vendorjs: { + src: fileSets.vendorJs, + dest: '_site/vendor.js' + }, + vendorcss: { + src: fileSets.vendorCss, + dest: '_site/vendor.css' + }, + appjs: { + src: fileSets.srcJs, + dest: '_site/app.js' + }, + appcss: { + src: fileSets.srcCss, + dest: '_site/app.css' + } + }, + + copy: { + site_index: { + src: 'index.html', + dest: '_site/index.html', + options: { + process: function( src ) { + return src.replace(/_site\//g, ""); + } + } + }, + base: { + expand: true, + cwd: 'src/app/base/', + src: [ '*.gif', '*.png', '*.css' ], + dest: '_site/base/' + }, + iconFonts: { + expand: true, + cwd: 'src/vendor/font-awesome/fonts/', + src: '**', + dest: '_site/fonts' + }, + i18n: { + src: 'src/vendor/i18n/i18n.js', + dest: '_site/i18n.js' + }, + lang: { + expand: true, + cwd: 'src/app/lang/', + src: '**', + dest: '_site/lang/' + } + }, + + jasmine: { + task: { + src: [ fileSets.vendorJs, 'src/vendor/i18n/i18n.js', 'src/app/lang/en_strings.js', fileSets.srcJs ], + options: { + specs: 'src/app/**/*Spec.js', + helpers: 'test/spec/*Helper.js', + display: "short", + summary: true + } + } + }, + + watch: { + "scripts": { + files: ['src/**/*', 'test/spec/*' ], + tasks: ['default'], + options: { + spawn: false + } + }, + "grunt": { + files: [ 'Gruntfile.js' ] + } + }, + + connect: { + server: { + options: { + port: 9100, + base: '.', + keepalive: true + } + } + } + + }); + + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-connect'); + grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-contrib-jasmine'); + + // Default task(s). + grunt.registerTask('default', ['clean', 'concat', 'copy', 'jasmine']); + grunt.registerTask('server', ['connect:server']); + grunt.registerTask('dev', [ 'default', 'watch' ]); + + +}; diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/LICENCE b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/LICENCE new file mode 100644 index 000000000..a93b4df40 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/LICENCE @@ -0,0 +1,13 @@ +Copyright 2010-2013 Ben Birch + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this software 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. diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/README.textile b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/README.textile new file mode 100644 index 000000000..6db8d5b49 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/README.textile @@ -0,0 +1,98 @@ +h1. elasticsearch-head + +h2. A web front end for an Elasticsearch cluster + +h3. "http://mobz.github.io/elasticsearch-head":http://mobz.github.io/elasticsearch-head + +h2. Installing and Running + +There are two main ways of running and installing elasticsearch-head + +h4. Running as a plugin of Elasticsearch + +* Install elasticsearch-head: + - for Elasticsearch 5.x: + site plugins are not supported. Run elasticsearch-head "as a standalone server":#running-with-built-in-server + - for Elasticsearch 2.x - 4.x: + @sudo elasticsearch/bin/plugin install mobz/elasticsearch-head@ + - for Elasticsearch 1.x: + @sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head/1.x@ + - for Elasticsearch 0.9: + @sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head/0.9@ + +* @open http://localhost:9200/_plugin/head/@ + +This will automatically download the latest version of elasticsearch-head from github and run it as a plugin within the elasticsearch cluster. In this mode; +* elasticsearch-head automatically connects to the node that is running it + +Note on different Elasticsearch installation path: +* If you've installed the .deb package, then the plugin executable will be available at @/usr/share/elasticsearch/bin/plugin@. +* If you've installed Elasticsearch via Homebrew, plugin executable will be available at @/usr/local/Cellar/elasticsearch/(elasticsearch version)/libexec/bin/plugin@. + +h4. Running with built in server + +* enable "cors":http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-http.html by adding @http.cors.enabled: true@ in elasticsearch configuration. Don't forget to also set @http.cors.allow-origin@ because no origin allowed by default. @http.cors.allow-origin: "*"@ is valid value, however it's considered as a security risk as your cluster is open to cross origin from *anywhere*. Check Elasticsearch documentation on this parameter: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-http.html#modules-http +* @git clone git://github.com/mobz/elasticsearch-head.git@ +* @cd elasticsearch-head@ +* @npm install@ +* @grunt server@ +* @open@ "http://localhost:9100/":http://localhost:9100/ + +This will start a local webserver running on port 9100 serving elasticsearch-head +* Best option if you are likely to connect to several different clusters + +h4. Alternatives + +h5. Running from the filesystem + +elastisearch-head is a standalone webapp written in good-ol' html5. This means, you can put it up on any webserver, run it directly from the filesystem, use it on an iPad, or put it on a floppy disk and carry it with you. + +h4. URL Parameters + +Parameters may be appended to the url to set an initial state eg. @head/index.html?base_uri=http://node-01.example.com:9200@ + +* @base_uri@ force elasticsearch-head to connect to a particular node. +* @dashboard@ experimental feature to open elasticsearch-head in a mode suitable for dashboard / radiator. Accepts one parameter @dashboard=cluster@ +* @auth_user@ adds basic auth credentials to http requests ( requires "elasticsearch-http-basic":https://github.com/karussell/elasticsearch-http-basic plugin or a reverse proxy ) +* @auth_password@ basic auth password as above (note: without "additional security layers":http://security.stackexchange.com/questions/988/is-basic-auth-secure-if-done-over-https, passwords are sent over the network *in the clear* ) + +h4. Contributing + +To contribute to elasticsearch-head you will need the following developer tools + +# git and a "github":https://github.com/ account +# "node ( including npm )":http://nodejs.org/download +# "grunt-cli":http://gruntjs.com/getting-started +# (to run jasmine tests) "phantomjs":http://phantomjs.org + +Then + +# create a fork of elasticsearch-head on github +# clone your fork to your machine +# @cd elasticsearch-head@ +# @npm install@ # downloads node dev dependencies +# @grunt dev@ # builds the distribution files, then watches the src directory for changes + +Changes to both _site and src directories *must* be committed, to allow people to +run elasticsearch-head without running dev tools and follow existing dev patterns, +such as indenting with tabs. + +h5. Contributing an Internationalisation + + +* Chinese by "darkcount":https://github.com/hangxin1940 +* English (primary) by "Ben Birch":https://twitter.com/mobz +* French by "David Pilato":https://twitter.com/dadoonet +* Portuguese by "caiodangelo":https://github.com/caiodangelo +* Turkish by "Cemre Mengu":https://github.com/cemremengu + +To contribute an internationalisation + +# Follow "Contributing" instructions above +# Find your 2-character "ISO 639-1 language code":http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes +# edit _site/index.html to add your 2 letter language code to the data-langs attribute of this line @<script src="_site/i18n.js" data-baseDir="_site/lang" data-langs="en,fr,your_lang_here"></script>@ +# make a copy of @src/app/langs/en_strings.js@ prefixed with your language code +# convert english strings and fragments to your language. "Formatting Rules":http://docs.oracle.com/javase/tutorial/i18n/format/messageintro.html +# Submit a pull request + +!http://mobz.github.com/elasticsearch-head/screenshots/clusterOverview.png(ClusterOverview Screenshot)! diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/app.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/app.css new file mode 100644 index 000000000..2fa215229 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/app.css @@ -0,0 +1,704 @@ +TABLE.table { + border-collapse: collapse; +} + + +TABLE.table TH { + font-weight: normal; + text-align: left; + vertical-align: middle; +} + +TABLE.table TBODY.striped TR:nth-child(odd) { + background: #eee; +} + +TABLE.table H3 { + margin: 0; + font-weight: bold; + font-size: 140%; +} + +.require { color: #a00; } + +.uiButton { + padding: 0; + border: 0; + margin: 3px; + width: auto; + overflow: visible; + cursor: pointer; + background: transparent; +} + +.uiButton-content { + height: 20px; + border: 1px solid #668dc6; + border-radius: 2px; + background: #96c6eb; + background: -moz-linear-gradient(top, #96c6eb, #5296c7); + background: -webkit-linear-gradient(top, #96c6eb, #5296c7); + color: white; + font-weight: bold; +} + +.moz .uiButton-content { margin: 0 -2px; } + +.uiButton-label { + padding: 2px 6px; + white-space: nowrap; +} +.uiButton:hover .uiButton-content { + background: #2777ba; + background: -moz-linear-gradient(top, #6aaadf, #2777ba); + background: -webkit-linear-gradient(top, #6aaadf, #2777ba); +} +.uiButton.active .uiButton-content, +.uiButton:active .uiButton-content { + background: #2575b7; + background: -moz-linear-gradient(top, #2576b8, #2575b7); + background: -webkit-linear-gradient(top, #2576b8, #2575b7); +} +.uiButton.disabled .uiButton-content, +.uiButton.disabled:active .uiButton-content { + border-color: #c6c6c6; + color: #999999; + background: #ddd; + background: -moz-linear-gradient(top, #ddd, #ddd); + background: -webkit-linear-gradient(top, #ddd, #ddd); +} + +.uiButton.disabled { + cursor: default; +} + +.uiMenuButton { + display: inline-block; +} + +.uiMenuButton .uiButton-label { + background-image: url('data:image/gif;base64,R0lGODlhDwAPAIABAP///////yH5BAEAAAEALAAAAAAPAA8AAAITjI+py+0P4wG0gmavq1HLD4ZiAQA7'); + background-position: right 50%; + background-repeat: no-repeat; + padding-right: 17px; + text-align: left; +} + +.uiSplitButton { + white-space: nowrap; +} + +.uiSplitButton .uiButton:first-child { + margin-right: 0; + display: inline-block; +} + +.uiSplitButton .uiButton:first-child .uiButton-content { + border-right-width: 1; + border-right-color: #5296c7; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.uiSplitButton .uiMenuButton { + margin-left: 0; +} + +.uiSplitButton .uiButton:last-child .uiButton-content { + border-radius: 2px; + border-left-width: 1; + border-left-color: #96c6eb; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + height: 20px; +} + +.uiSplitButton .uiButton:last-child .uiButton-label { + padding: 2px 17px 2px 6px; + margin-left: -8px; +} + +.uiToolbar { + height: 28px; + background: #fdfefe; + background: -moz-linear-gradient(top, #fdfefe, #eaedef); + background: -webkit-linear-gradient(top, #fdfefe, #eaedef); + border-bottom: 1px solid #d2d5d7; + padding: 3px 10px; +} + +.uiToolbar H2 { + display: inline-block; + font-size: 120%; + margin: 0; + padding: 5px 20px 5px 0; +} + +.uiToolbar .uiTextField { + display: inline-block; +} + +.uiToolbar .uiTextField INPUT { + padding-top: 2px; + padding-bottom: 5px; +} +#uiModal { + background: black; +} + +.uiPanel { + box-shadow: -1px 2.5px 4px -3px black, -1px -2.5px 4px -3px black, 3px 2.5px 4px -3px black, 3px -2.5px 4px -3px black; + position: absolute; + background: #eee; + border: 1px solid #666; +} + +.uiPanel-titleBar { + text-align: center; + font-weight: bold; + padding: 2px 0; + background: rgba(223, 223, 223, 0.75); + background: -moz-linear-gradient(top, rgba(223, 223, 223, 0.75), rgba(193, 193, 193, 0.75), rgba(223, 223, 223, 0.75)); + background: -webkit-linear-gradient(top, rgba(223, 223, 223, 0.75), rgba(193, 193, 193, 0.75), rgba(223, 223, 223, 0.75)); + border-bottom: 1px solid #bbb; +} + +.uiPanel-close { + cursor: pointer; + border: 1px solid #aaa; + background: #fff; + color: #fff; + float: left; + height: 10px; + left: 3px; + line-height: 9px; + padding: 1px 0; + position: relative; + text-shadow: 0 0 1px #000; + top: 0px; + width: 12px; +} +.uiPanel-close:hover { + background: #eee; +} + +.uiPanel-body { + overflow: auto; +} + + +.uiInfoPanel { + background: rgba(0, 0, 0, 0.75); + color: white; + border-radius: 8px; + padding: 1px; +} +.uiInfoPanel .uiPanel-titleBar { + background: rgba(74, 74, 74, 0.75); + background: -moz-linear-gradient(top, rgba(84, 84, 84, 0.75), rgba(54, 54, 54, 0.75), rgba(64, 64, 64, 0.75)); + background: -webkit-linear-gradient(top, rgba(84, 84, 84, 0.75), rgba(54, 54, 54, 0.75), rgba(64, 64, 64, 0.75)); + border-radius: 8px 8px 0 0; + padding: 1px 0 2px 0; + border-bottom: 0; +} +.uiInfoPanel .uiPanel-close { + border-radius: 6px; + height: 13px; + width: 13px; + background: #ccc; + left: 3px; + top: 1px; + color: #333; + text-shadow: #222 0 0 1px; + line-height: 11px; + border: 0; + padding: 0; +} +.uiInfoPanel .uiPanel-close:hover { + background: #eee; +} + +.uiInfoPanel .uiPanel-body { + background: transparent; + padding: 20px; + border-radius: 0 0 8px 8px; + border: 1px solid #222; +} + +.uiMenuPanel { + border: 1px solid #668dc6; + position: absolute; + background: #96c6eb; + color: white; +} + +.uiMenuPanel LI { + list-style: none; + border-bottom: 1px solid #668dc6; +} + +.uiMenuPanel LI:hover { + background: #2575b7; +} + +.uiMenuPanel LI:last-child { + border-bottom: 0; +} + +.uiMenuPanel-label { + white-space: nowrap; + padding: 2px 10px 2px 10px; + cursor: pointer; +} + +.disabled .uiMenuPanel-label { + cursor: auto; + color: #888; +} + +.uiSelectMenuPanel .uiMenuPanel-label { + margin-left: 1em; + padding-left: 4px; +} + +.uiSelectMenuPanel .uiMenuPanel-item.selected .uiMenuPanel-label:before { + content: "\2713"; + width: 12px; + margin-left: -12px; + display: inline-block; +} + +.uiTable TABLE { + border-collapse: collapse; +} + +.uiTable-body { + overflow-y: scroll; + overflow-x: auto; +} + +.uiTable-headers { + overflow-x: hidden; +} + +.uiTable-body TD { + white-space: nowrap; +} + +.uiTable-body .uiTable-header-row TH, +.uiTable-body .uiTable-header-row TH DIV { + padding-top: 0; + padding-bottom: 0; +} + +.uiTable-body .uiTable-header-cell > DIV { + height: 0; + overflow: hidden; +} + +.uiTable-headercell-menu { + float: right; +} + +.uiTable-tools { + padding: 3px 4px; + height: 14px; +} + +.uiTable-header-row { + background: #ddd; + background: -moz-linear-gradient(top, #eee, #ccc); + background: -webkit-linear-gradient(top, #eee, #ccc); +} + +.uiTable-headercell-text { + margin-right: 20px; +} + +.uiTable-headercell-menu { + display: none; +} + +.uiTable-header-row TH { + border-right: 1px solid #bbb; + padding: 0; + text-align: left; +} + +.uiTable-header-row TH > DIV { + padding: 3px 4px; + border-right: 1px solid #eee; +} + +.uiTable-headerEndCap > DIV { + width: 19px; +} + +.uiTable-header-row .uiTable-sort { + background: #ccc; + background: -moz-linear-gradient(top, #bebebe, #ccc); + background: -webkit-linear-gradient(top, #bebebe, #ccc); +} +.uiTable-header-row TH.uiTable-sort > DIV { + border-right: 1px solid #ccc; +} + +.uiTable-sort .uiTable-headercell-menu { + display: block; +} + +.uiTable TABLE TD { + border-right: 1px solid transparent; + padding: 3px 4px; +} + +.uiTable-body TABLE TR:nth-child(even) { + background: #f3f3f3; +} + +.uiTable-body TABLE TR.selected { + color: white; + background: #6060f1; +} + +DIV.uiJsonPretty-object { font-size: 1.26em; font-family: monospace; } +UL.uiJsonPretty-object, +UL.uiJsonPretty-array { margin: 0; padding: 0 0 0 2em; list-style: none; } +UL.uiJsonPretty-object LI, +UL.uiJsonPretty-array LI { padding: 0; margin: 0; } +.expando > SPAN.uiJsonPretty-name:before { content: "\25bc\a0"; color: #555; position: relative; top: 2px; } +.expando.uiJsonPretty-minimised > SPAN.uiJsonPretty-name:before { content: "\25ba\a0"; top: 0; } +.uiJsonPretty-minimised > UL SPAN.uiJsonPretty-name:before, +.expando .uiJsonPretty-minimised > UL SPAN.uiJsonPretty-name:before { content: ""; } +SPAN.uiJsonPretty-string, +SPAN.uiJsonPretty-string A { color: green; } +SPAN.uiJsonPretty-string A { text-decoration: underline;} +SPAN.uiJsonPretty-number { color: blue; } +SPAN.uiJsonPretty-null { color: red; } +SPAN.uiJsonPretty-boolean { color: purple; } +.expando > .uiJsonPretty-name { cursor: pointer; } +.expando > .uiJsonPretty-name:hover { text-decoration: underline; } +.uiJsonPretty-minimised { white-space: nowrap; overflow: hidden; } +.uiJsonPretty-minimised > UL { opacity: 0.6; } +.uiJsonPretty-minimised .uiJsonPretty-minimised > UL { opacity: 1; } +.uiJsonPretty-minimised UL, .uiJsonPretty-minimised LI { display: inline; padding: 0; } + + +.uiJsonPanel SPAN.uiJsonPretty-string { color: #6F6; } +.uiJsonPanel SPAN.uiJsonPretty-number { color: #66F; } +.uiJsonPanel SPAN.uiJsonPretty-null { color: #F66; } +.uiJsonPanel SPAN.uiJsonPretty-boolean { color: #F6F; } + +.uiPanelForm-field { + display: block; + padding: 2px 0; + clear: both; +} + +.uiPanelForm-label { + float: left; + width: 200px; + padding: 3px 7px; + text-align: right; +} + +.uiSidebarSection-head { + background-color: #b9cfff; + background-image: url('data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAcCAMAAABifa5OAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQUCFf///wICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///2Oyy/cAAAACdFJOU/8A5bcwSgAAADxJREFUeNq8zzkOACAMA8Hd/3+agiuRcIsrRopIjArOoLK1QAMNNBCRPkhLyzkn35Bjfd7JR1Nr09NoDACnvgDl1zlzoQAAAABJRU5ErkJggg=='); + background-repeat: no-repeat; + background-position: 2px 5px; + margin-bottom: 1px; + padding: 3px 3px 3px 17px; + cursor: pointer; +} + +.shown > .uiSidebarSection-head { + background-position: 2px -13px; +} + +.uiSidebarSection-body { + margin-bottom: 3px; + display: none; +} + +.uiSidebarSection-help { + text-shadow: #228 1px 1px 2px; + color: blue; + cursor: pointer; +} + +.uiSidebarSection-help:hover { + text-decoration: underline; +} + +.uiQueryFilter { + width: 350px; + padding: 5px; + background: #d8e7ff; + background: -moz-linear-gradient(left, #d8e7ff, #e8f1ff); + background: -webkit-linear-gradient(left, #d8e7ff, #e8f1ff); +} + +.uiQueryFilter DIV.uiQueryFilter-section { + margin-bottom: 5px; +} + +.uiQueryFilter HEADER { + display: block; + font-variant: small-caps; + font-weight: bold; + margin: 5px 0; +} + +.uiQueryFilter-aliases SELECT { + width: 100%; +} + +.uiQueryFilter-booble { + cursor: pointer; + background: #e8f1ff; + border: 1px solid #e8f1ff; + border-radius: 5px; + padding: 1px 4px; + margin-bottom: 1px; + overflow: hidden; + white-space: nowrap; +} + +.uiQueryFilter-booble.selected { + background: #dae3f0; + border-top: 1px solid #c8d4e6; + border-left: 1px solid #c8d4e6; + border-bottom: 1px solid #ffffff; + border-right: 1px solid #ffffff; +} + +.uiQueryFilter-filterName { + background-color: #cbdfff; + margin-bottom: 4px; + padding: 3px; + cursor: pointer; +} + +.uiQueryFilter-filters INPUT { + width: 300px; +} + +.uiQueryFilter-subMultiFields { + padding-left: 10px; +} + +.uiQueryFilter-rangeHintFrom, +.uiQueryFilter-rangeHintTo { + margin: 0; + opacity: 0.75; +} +.uiBrowser-filter { + float: left; +} + +.uiBrowser-table { + margin-left: 365px; +} + +.uiAnyRequest-request { + float: left; + width: 350px; + padding: 5px; + background: #d8e7ff; + background: -moz-linear-gradient(left, #d8e7ff, #e8f1ff); + background: -webkit-linear-gradient(left, #d8e7ff, #e8f1ff); +} + +.uiAnyRequest-request INPUT[type=text], +.uiAnyRequest-request TEXTAREA { + width: 340px; +} + +.anyRequest INPUT[name=path] { + width: 259px; +} + +.uiAnyRequest-out { + margin-left: 365px; +} + +.uiAnyRequest-out P { + margin-top: 0; +} + +.uiAnyRequest-jsonErr { + color: red; +} + +.uiAnyRequest-history { + margin: 0; + padding: 0; + list-style: none; + max-height: 100px; + overflow-x: hidden; + overflow-y: auto; +} + +.uiNodesView TH, +.uiNodesView TD { + vertical-align: top; + padding: 2px 20px; +} + +.uiNodesView TH.close, +.uiNodesView TD.close { + color: #888; + background: #f2f2f2; +} + +.uiNodesView .uiMenuButton .uiButton-content { + padding-right: 3px; + border-radius: 8px; + height: 14px; +} + +.uiNodesView .uiMenuButton.active .uiButton-content, +.uiNodesView .uiMenuButton:active .uiButton-content { + border-bottom-right-radius: 0px; + border-bottom-left-radius: 0px; +} + +.uiNodesView .uiMenuButton .uiButton-label { + padding: 0px 17px 0px 7px; +} + +.uiNodesView-hasAlias { + text-align: center; +} +.uiNodesView-hasAlias.max { + border-top-right-radius: 8px; + border-bottom-right-radius: 8px; +} +.uiNodesView-hasAlias.min { + border-top-left-radius: 8px; + border-bottom-left-radius: 8px; +} +.uiNodesView-hasAlias-remove { + float: right; + font-weight: bold; + cursor: pointer; +} + +.uiNodesView TD.uiNodesView-icon { + padding: 20px 0px 15px 20px; +} + +.uiNodesView-node:nth-child(odd) { + background: #eee; +} + +.uiNodesView-routing { + position: relative; + min-width: 90px; +} + +.uiNodesView-nullReplica, +.uiNodesView-replica { + box-sizing: border-box; + cursor: pointer; + float: left; + height: 40px; + width: 35px; + margin: 4px; + border: 2px solid #444; + padding: 2px; + font-size: 32px; + line-height: 32px; + text-align: center; + letter-spacing: -5px; + text-indent: -7px; +} + +.uiNodesView-replica.primary { + border-width: 4px; + line-height: 29px; +} + +.uiNodesView-nullReplica { + border-color: transparent; +} + +.uiNodesView-replica.state-UNASSIGNED { background: #eeeeee; color: #999; border-color: #666; float: none; display: inline-block; } +.uiNodesView-replica.state-INITIALIZING { background: #dddc88; } +.uiNodesView-replica.state-STARTED { background: #99dd88; } +.uiNodesView-replica.state-RELOCATING { background: #dc88dd; } + + +.uiClusterConnect-uri { + width: 280px; +} + +.uiStructuredQuery { + padding: 10px; +} + +.uiStructuredQuery-out { + min-height: 30px; +} + +.uiFilterBrowser-row * { + margin-right: 0.4em; +} + +.uiFilterBrowser-row BUTTON { + height: 22px; + position: relative; + top: 1px; +} + +.uiHeader { + padding: 3px 10px; +} + +.uiHeader-name, .uiHeader-status { + font-size: 1.2em; + font-weight: bold; + padding: 0 10px; +} + + +.uiApp-header { + background: #eee; + position: fixed; + width: 100%; + z-index: 9; +} + +.uiApp-header H1 { + margin: -2px 0 -4px 0; + float: left; + padding-right: 25px; +} + +.uiApp-headerMenu { + border-bottom: 1px solid #bbb; + padding: 0px 3px; + height: 22px; +} + +.uiApp-headerMenu .active { + background: white; + border-bottom-color: white; +} + +.uiApp-headerMenuItem { + border: 1px solid #bbb; + padding: 4px 8px 1px ; + margin: 2px 1px 0; + height: 14px; + cursor: pointer; +} + +.uiApp-body { + padding: 51px 0px 0px 0px; +} + +.uiApp-headerNewMenuItem { + color: blue; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/app.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/app.js new file mode 100644 index 000000000..1cdc1f543 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/app.js @@ -0,0 +1,4389 @@ +(function() { + + var window = this, + $ = jQuery; + + function ns( namespace ) { + return (namespace || "").split(".").reduce( function( space, name ) { + return space[ name ] || ( space[ name ] = { ns: ns } ); + }, this ); + } + + var app = ns("app"); + + var acx = ns("acx"); + + /** + * object iterator, returns an array with one element for each property of the object + * @function + */ + acx.eachMap = function(obj, fn, thisp) { + var ret = []; + for(var n in obj) { + ret.push(fn.call(thisp, n, obj[n], obj)); + } + return ret; + }; + + /** + * augments the first argument with the properties of the second and subsequent arguments + * like {@link $.extend} except that existing properties are not overwritten + */ + acx.augment = function() { + var args = Array.prototype.slice.call(arguments), + src = (args.length === 1) ? this : args.shift(), + augf = function(n, v) { + if(! (n in src)) { + src[n] = v; + } + }; + for(var i = 0; i < args.length; i++) { + $.each(args[i], augf); + } + return src; + }; + + /** + * tests whether the argument is an array + * @function + */ + acx.isArray = $.isArray; + + /** + * tests whether the argument is an object + * @function + */ + acx.isObject = function (value) { + return Object.prototype.toString.call(value) == "[object Object]"; + }; + + /** + * tests whether the argument is a function + * @function + */ + acx.isFunction = $.isFunction; + + /** + * tests whether the argument is a date + * @function + */ + acx.isDate = function (value) { + return Object.prototype.toString.call(value) == "[object Date]"; + }; + + /** + * tests whether the argument is a regexp + * @function + */ + acx.isRegExp = function (value) { + return Object.prototype.toString.call(value) == "[object RegExp]"; + }; + + /** + * tests whether the value is blank or empty + * @function + */ + acx.isEmpty = function (value, allowBlank) { + return value === null || value === undefined || ((acx.isArray(value) && !value.length)) || (!allowBlank ? value === '' : false); + }; + + /** + * data type for performing chainable geometry calculations<br> + * can be initialised x,y | {x, y} | {left, top} + */ + acx.vector = function(x, y) { + return new acx.vector.prototype.Init(x, y); + }; + + acx.vector.prototype = { + Init : function(x, y) { + x = x || 0; + this.y = isFinite(x.y) ? x.y : (isFinite(x.top) ? x.top : (isFinite(y) ? y : 0)); + this.x = isFinite(x.x) ? x.x : (isFinite(x.left) ? x.left : (isFinite(x) ? x : 0)); + }, + + add : function(i, j) { + var d = acx.vector(i, j); + return new this.Init(this.x + d.x, this.y + d.y); + }, + + sub : function(i, j) { + var d = acx.vector(i, j); + return new this.Init(this.x - d.x, this.y - d.y); + }, + + addX : function(i) { + return new this.Init(this.x + i, this.y); + }, + + addY : function(j) { + return new this.Init(this.x, this.y + j); + }, + + mod : function(fn) { // runs a function against the x and y values + return new this.Init({x: fn.call(this, this.x, "x"), y: fn.call(this, this.y, "y")}); + }, + + /** returns true if this is within a rectangle formed by the points p and q */ + within : function(p, q) { + return ( this.x >= ((p.x < q.x) ? p.x : q.x) && this.x <= ((p.x > q.x) ? p.x : q.x) && + this.y >= ((p.y < q.y) ? p.y : q.y) && this.y <= ((p.y > q.y) ? p.y : q.y) ); + }, + + asOffset : function() { + return { top: this.y, left: this.x }; + }, + + asSize : function() { + return { height: this.y, width: this.x }; + } + }; + + acx.vector.prototype.Init.prototype = acx.vector.prototype; + + /** + * short cut functions for working with vectors and jquery. + * Each function returns the equivalent jquery value in a two dimentional vector + */ + $.fn.vSize = function() { return acx.vector(this.width(), this.height()); }; + $.fn.vOuterSize = function(margin) { return acx.vector(this.outerWidth(margin), this.outerHeight(margin)); }; + $.fn.vScroll = function() { return acx.vector(this.scrollLeft(), this.scrollTop()); }; + $.fn.vOffset = function() { return acx.vector(this.offset()); }; + $.fn.vPosition = function() { return acx.vector(this.position()); }; + $.Event.prototype.vMouse = function() { return acx.vector(this.pageX, this.pageY); }; + + /** + * object extensions (ecma5 compatible) + */ + acx.augment(Object, { + keys: function(obj) { + var ret = []; + for(var n in obj) if(Object.prototype.hasOwnProperty.call(obj, n)) ret.push(n); + return ret; + } + }); + + /** + * Array prototype extensions + */ + acx.augment(Array.prototype, { + 'contains' : function(needle) { + return this.indexOf(needle) !== -1; + }, + + // returns a new array consisting of all the members that are in both arrays + 'intersection' : function(b) { + var ret = []; + for(var i = 0; i < this.length; i++) { + if(b.contains(this[i])) { + ret.push(this[i]); + } + } + return ret; + }, + + 'remove' : function(value) { + var i = this.indexOf(value); + if(i !== -1) { + this.splice(i, 1); + } + } + }); + + /** + * String prototype extensions + */ + acx.augment(String.prototype, { + 'contains' : function(needle) { + return this.indexOf(needle) !== -1; + }, + + 'equalsIgnoreCase' : function(match) { + return this.toLowerCase() === match.toLowerCase(); + }, + + 'escapeHtml' : function() { + return this.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); + }, + + 'escapeJS' : function() { + var meta = {'"':'\\"', '\\':'\\\\', '/':'\\/', '\b':'\\b', '\f':'\\f', '\n':'\\n', '\r':'\\r', '\t':'\\t'}, + xfrm = function(c) { return meta[c] || "\\u" + c.charCodeAt(0).toString(16).zeroPad(4); }; + return this.replace(new RegExp('(["\\\\\x00-\x1f\x7f-\uffff])', 'g'), xfrm); + }, + + 'escapeRegExp' : function() { + var ret = "", esc = "\\^$*+?.()=|{,}[]-"; + for ( var i = 0; i < this.length; i++) { + ret += (esc.contains(this.charAt(i)) ? "\\" : "") + this.charAt(i); + } + return ret; + }, + + 'zeroPad' : function(len) { + return ("0000000000" + this).substring(this.length - len + 10); + } + }); + + $.fn.forEach = Array.prototype.forEach; + + // joey / jquery integration + $.joey = function( obj ) { + return $( window.joey( obj ) ); + }; + + window.joey.plugins.push( function( obj ) { + if( obj instanceof jQuery ) { + return obj[0]; + } + }); + +})(); + +/** + * base class for creating inheritable classes + * based on resigs 'Simple Javascript Inheritance Class' (based on base2 and prototypejs) + * modified with static super and auto config + * @name Class + * @constructor + */ +(function( $, app ){ + + var ux = app.ns("ux"); + + var initializing = false, fnTest = /\b_super\b/; + + ux.Class = function(){}; + + ux.Class.extend = function(prop) { + function Class() { + if(!initializing) { + var args = Array.prototype.slice.call(arguments); + this.config = $.extend( function(t) { // automatically construct a config object based on defaults and last item passed into the constructor + return $.extend(t._proto && t._proto() && arguments.callee(t._proto()) || {}, t.defaults); + } (this) , args.pop() ); + this.init && this.init.apply(this, args); // automatically run the init function when class created + } + } + + initializing = true; + var prototype = new this(); + initializing = false; + + var _super = this.prototype; + prototype._proto = function() { + return _super; + }; + + for(var name in prop) { + prototype[name] = typeof prop[name] === "function" && typeof _super[name] === "function" && fnTest.test(prop[name]) ? + (function(name, fn){ + return function() { this._super = _super[name]; return fn.apply(this, arguments); }; + })(name, prop[name]) : prop[name]; + } + + Class.prototype = prototype; + Class.constructor = Class; + + Class.extend = arguments.callee; // make class extendable + + return Class; + }; +})( this.jQuery, this.app ); + +(function( app ) { + + var ut = app.ns("ut"); + + ut.option_template = function(v) { return { tag: "OPTION", value: v, text: v }; }; + + ut.require_template = function(f) { return f.require ? { tag: "SPAN", cls: "require", text: "*" } : null; }; + + + var sib_prefix = ['B','ki','Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi']; + + ut.byteSize_template = function(n) { + var i = 0; + while( n >= 1000 ) { + i++; + n /= 1024; + } + return (i === 0 ? n.toString() : n.toFixed( 3 - parseInt(n,10).toString().length )) + ( sib_prefix[ i ] || "..E" ); + }; + + var sid_prefix = ['','k','M', 'G', 'T', 'P', 'E', 'Z', 'Y']; + + ut.count_template = function(n) { + var i = 0; + while( n >= 1000 ) { + i++; + n /= 1000; + } + return i === 0 ? n.toString() : ( n.toFixed( 3 - parseInt(n,10).toString().length ) + ( sid_prefix[ i ] || "..E" ) ); + }; + +})( this.app ); + +(function( app ) { + + var ux = app.ns("ux"); + + ux.Observable = ux.Class.extend((function() { + return { + init: function() { + this.observers = {}; + for( var opt in this.config ) { // automatically install observers that are defined in the configuration + if( opt.indexOf( 'on' ) === 0 ) { + this.on( opt.substring(2) , this.config[ opt ] ); + } + } + }, + _getObs: function( type ) { + return ( this.observers[ type.toLowerCase() ] || ( this.observers[ type.toLowerCase() ] = [] ) ); + }, + on: function( type, fn, params, thisp ) { + this._getObs( type ).push( { "cb" : fn, "args" : params || [] , "cx" : thisp || this } ); + return this; + }, + fire: function( type ) { + var params = Array.prototype.slice.call( arguments, 1 ); + this._getObs( type ).slice().forEach( function( ob ) { + ob["cb"].apply( ob["cx"], ob["args"].concat( params ) ); + } ); + return this; + }, + removeAllObservers: function() { + this.observers = {}; + }, + removeObserver: function( type, fn ) { + var obs = this._getObs( type ), + index = obs.reduce( function(p, t, i) { return (t.cb === fn) ? i : p; }, -1 ); + if(index !== -1) { + obs.splice( index, 1 ); + } + return this; // make observable functions chainable + }, + hasObserver: function( type ) { + return !! this._getObs( type ).length; + } + }; + })()); + +})( this.app ); +(function( app ) { + + var ux = app.ns("ux"); + + var extend = ux.Observable.extend; + var instance = function() { + if( ! ("me" in this) ) { + this.me = new this(); + } + return this.me; + }; + + ux.Singleton = ux.Observable.extend({}); + + ux.Singleton.extend = function() { + var Self = extend.apply( this, arguments ); + Self.instance = instance; + return Self; + }; + +})( this.app ); + +(function( $, app ) { + + var ux = app.ns("ux"); + + /** + * Provides drag and drop functionality<br> + * a DragDrop instance is created for each usage pattern and then used over and over again<br> + * first a dragObj is defined - this is the jquery node that will be dragged around<br> + * second, the event callbacks are defined - these allow you control the ui during dragging and run functions when successfully dropping<br> + * thirdly drop targets are defined - this is a list of DOM nodes, the constructor works in one of two modes: + * <li>without targets - objects can be picked up and dragged around, dragStart and dragStop events fire</li> + * <li>with targets - as objects are dragged over targets dragOver, dragOut and DragDrop events fire + * to start dragging call the DragDrop.pickup_handler() function, dragging stops when the mouse is released. + * @constructor + * The following options are supported + * <dt>targetSelector</dt> + * <dd>an argument passed directly to jquery to create a list of targets, as such it can be a CSS style selector, or an array of DOM nodes<br>if target selector is null the DragDrop does Drag only and will not fire dragOver dragOut and dragDrop events</dd> + * <dt>pickupSelector</dt> + * <dd>a jquery selector. The pickup_handler is automatically bound to matched elements (eg clicking on these elements starts the drag). if pickupSelector is null, the pickup_handler must be manually bound <code>$(el).bind("mousedown", dragdrop.pickup_handler)</code></dd> + * <dt>dragObj</dt> + * <dd>the jQuery element to drag around when pickup is called. If not defined, dragObj must be set in onDragStart</dd> + * <dt>draggingClass</dt> + * <dd>the class(es) added to items when they are being dragged</dd> + * The following observables are supported + * <dt>dragStart</dt> + * <dd>a callback when start to drag<br><code>function(jEv)</code></dd> + * <dt>dragOver</dt> + * <dd>a callback when we drag into a target<br><code>function(jEl)</code></dd> + * <dt>dragOut</dt> + * <dd>a callback when we drag out of a target, or when we drop over a target<br><code>function(jEl)</code></dd> + * <dt>dragDrop</dt> + * <dd>a callback when we drop on a target<br><code>function(jEl)</code></dd> + * <dt>dragStop</dt> + * <dd>a callback when we stop dragging<br><code>function(jEv)</code></dd> + */ + ux.DragDrop = ux.Observable.extend({ + defaults : { + targetsSelector : null, + pickupSelector: null, + dragObj : null, + draggingClass : "dragging" + }, + + init: function(options) { + this._super(); // call the class initialiser + + this.drag_handler = this.drag.bind(this); + this.drop_handler = this.drop.bind(this); + this.pickup_handler = this.pickup.bind(this); + this.targets = []; + this.dragObj = null; + this.dragObjOffset = null; + this.currentTarget = null; + if(this.config.pickupSelector) { + $(this.config.pickupSelector).bind("mousedown", this.pickup_handler); + } + }, + + drag : function(jEv) { + jEv.preventDefault(); + var mloc = acx.vector( this.lockX || jEv.pageX, this.lockY || jEv.pageY ); + this.dragObj.css(mloc.add(this.dragObjOffset).asOffset()); + if(this.targets.length === 0) { + return; + } + if(this.currentTarget !== null && mloc.within(this.currentTarget[1], this.currentTarget[2])) { + return; + } + if(this.currentTarget !== null) { + this.fire('dragOut', this.currentTarget[0]); + this.currentTarget = null; + } + for(var i = 0; i < this.targets.length; i++) { + if(mloc.within(this.targets[i][1], this.targets[i][2])) { + this.currentTarget = this.targets[i]; + break; + } + } + if(this.currentTarget !== null) { + this.fire('dragOver', this.currentTarget[0]); + } + }, + + drop : function(jEv) { + $(document).unbind("mousemove", this.drag_handler); + $(document).unbind("mouseup", this.drop_handler); + this.dragObj.removeClass(this.config.draggingClass); + if(this.currentTarget !== null) { + this.fire('dragOut', this.currentTarget[0]); + this.fire('dragDrop', this.currentTarget[0]); + } + this.fire('dragStop', jEv); + this.dragObj = null; + }, + + pickup : function(jEv, opts) { + $.extend(this.config, opts); + this.fire('dragStart', jEv); + this.dragObj = this.dragObj || this.config.dragObj; + this.dragObjOffset = this.config.dragObjOffset || acx.vector(this.dragObj.offset()).sub(jEv.pageX, jEv.pageY); + this.lockX = this.config.lockX ? jEv.pageX : 0; + this.lockY = this.config.lockY ? jEv.pageY : 0; + this.dragObj.addClass(this.config.draggingClass); + if(!this.dragObj.get(0).parentNode || this.dragObj.get(0).parentNode.nodeType === 11) { // 11 = document fragment + $(document.body).append(this.dragObj); + } + if(this.config.targetsSelector) { + this.currentTarget = null; + var targets = ( this.targets = [] ); + // create an array of elements optimised for rapid collision detection calculation + $(this.config.targetsSelector).each(function(i, el) { + var jEl = $(el); + var tl = acx.vector(jEl.offset()); + var br = tl.add(jEl.width(), jEl.height()); + targets.push([jEl, tl, br]); + }); + } + $(document).bind("mousemove", this.drag_handler); + $(document).bind("mouseup", this.drop_handler); + this.drag_handler(jEv); + } + }); + +})( this.jQuery, this.app ); + +(function( app ) { + + var ux = app.ns("ux"); + + ux.FieldCollection = ux.Observable.extend({ + defaults: { + fields: [] // the collection of fields + }, + init: function() { + this._super(); + this.fields = this.config.fields; + }, + validate: function() { + return this.fields.reduce(function(r, field) { + return r && field.validate(); + }, true); + }, + getData: function(type) { + return this.fields.reduce(function(r, field) { + r[field.name] = field.val(); return r; + }, {}); + } + }); + +})( this.app ); + +(function( $, app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.Model = ux.Observable.extend({ + defaults: { + data: null + }, + init: function() { + this.set( this.config.data ); + }, + set: function( key, value ) { + if( arguments.length === 1 ) { + this._data = $.extend( {}, key ); + } else { + key.split(".").reduce(function( ptr, prop, i, props) { + if(i === (props.length - 1) ) { + ptr[prop] = value; + } else { + if( !(prop in ptr) ) { + ptr[ prop ] = {}; + } + return ptr[prop]; + } + }, this._data ); + } + }, + get: function( key ) { + return key.split(".").reduce( function( ptr, prop ) { + return ( ptr && ( prop in ptr ) ) ? ptr[ prop ] : undefined; + }, this._data ); + }, + }); +})( this.jQuery, this.app ); + +(function( app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.DataSourceInterface = ux.Observable.extend({ + /* + properties + meta = { total: 0 }, + headers = [ { name: "" } ], + data = [ { column: value, column: value } ], + sort = { column: "name", dir: "desc" } + events + data: function( DataSourceInterface ) + */ + _getSummary: function(res) { + this.summary = i18n.text("TableResults.Summary", res._shards.successful, res._shards.total, res.hits.total, (res.took / 1000).toFixed(3)); + }, + _getMeta: function(res) { + this.meta = { total: res.hits.total, shards: res._shards, tool: res.took }; + } + }); + +})( this.app ); +(function( app ) { + + var data = app.ns("data"); + + data.ResultDataSourceInterface = data.DataSourceInterface.extend({ + results: function(res) { + this._getSummary(res); + this._getMeta(res); + this._getData(res); + this.sort = {}; + this.fire("data", this); + }, + _getData: function(res) { + var columns = this.columns = []; + this.data = res.hits.hits.map(function(hit) { + var row = (function(path, spec, row) { + for(var prop in spec) { + if(acx.isObject(spec[prop])) { + arguments.callee(path.concat(prop), spec[prop], row); + } else if(acx.isArray(spec[prop])) { + if(spec[prop].length) { + arguments.callee(path.concat(prop), spec[prop][0], row) + } + } else { + var dpath = path.concat(prop).join("."); + if(! columns.contains(dpath)) { + columns.push(dpath); + } + row[dpath] = (spec[prop] || "null").toString(); + } + } + return row; + })([ hit._type ], hit, {}); + row._source = hit; + return row; + }, this); + } + }); + +})( this.app ); + +(function( app ) { + + /* + notes on elasticsearch terminology used in this project + + indices[index] contains one or more + types[type] contains one or more + documents contain one or more + paths[path] + each path contains one element of data + each path maps to one field + + eg PUT, "/twitter/tweet/1" + { + user: "mobz", + date: "2011-01-01", + message: "You know, for browsing elasticsearch", + name: { + first: "Ben", + last: "Birch" + } + } + + creates + 1 index: twitter + this is the collection of index data + 1 type: tweet + this is the type of document (kind of like a table in sql) + 1 document: /twitter/tweet/1 + this is an actual document in the index ( kind of like a row in sql) + 5 paths: [ ["user"], ["date"], ["message"], ["name","first"], ["name","last"] ] + since documents can be heirarchical this maps a path from a document root to a piece of data + 5 fields: [ "user", "date", "message", "first", "last" ] + this is an indexed 'column' of data. fields are not heirarchical + + the relationship between a path and a field is called a mapping. mappings also contain a wealth of information about how es indexes the field + + notes + 1) a path is stored as an array, the dpath is <index> . <type> . path.join("."), + which can be considered the canonical reference for a mapping + 2) confusingly, es uses the term index for both the collection of indexed data, and the individually indexed fields + so the term index_name is the same as field_name in this sense. + + */ + + var data = app.ns("data"); + var ux = app.ns("ux"); + + var coretype_map = { + "string" : "string", + "keyword" : "string", + "text" : "string", + "byte" : "number", + "short" : "number", + "long" : "number", + "integer" : "number", + "float" : "number", + "double" : "number", + "ip" : "number", + "date" : "date", + "boolean" : "boolean", + "binary" : "binary", + "multi_field" : "multi_field" + }; + + var default_property_map = { + "string" : { "store" : "no", "index" : "analysed" }, + "number" : { "store" : "no", "precision_steps" : 4 }, + "date" : { "store" : "no", "format" : "dateOptionalTime", "index": "yes", "precision_steps": 4 }, + "boolean" : { "store" : "no", "index": "yes" }, + "binary" : { }, + "multi_field" : { } + }; + + // parses metatdata from a cluster, into a bunch of useful data structures + data.MetaData = ux.Observable.extend({ + defaults: { + state: null // (required) response from a /_cluster/state request + }, + init: function() { + this._super(); + this.refresh(this.config.state); + }, + getIndices: function(alias) { + return alias ? this.aliases[alias] : this.indicesList; + }, + // returns an array of strings containing all types that are in all of the indices passed in, or all types + getTypes: function(indices) { + var indices = indices || [], types = []; + this.typesList.forEach(function(type) { + for(var i = 0; i < indices.length; i++) { + if(! this.indices[indices[i]].types.contains(type)) + return; + } + types.push(type); + }, this); + return types; + }, + refresh: function(state) { + // currently metadata expects all like named fields to have the same type, even when from different types and indices + var aliases = this.aliases = {}; + var indices = this.indices = {}; + var types = this.types = {}; + var fields = this.fields = {}; + var paths = this.paths = {}; + + function createField( mapping, index, type, path, name ) { + var dpath = [ index, type ].concat( path ).join( "." ); + var field_name = mapping.index_name || path.join( "." ); + var field = paths[ dpath ] = fields[ field_name ] || $.extend({ + field_name : field_name, + core_type : coretype_map[ mapping.type ], + dpaths : [] + }, default_property_map[ coretype_map[ mapping.type ] ], mapping ); + + if (field.type === "multi_field" && typeof field.fields !== "undefined") { + for (var subField in field.fields) { + field.fields[ subField ] = createField( field.fields[ subField ], index, type, path.concat( subField ), name + "." + subField ); + } + } + if (fields.dpaths) { + field.dpaths.push(dpath); + } + return field; + } + function getFields(properties, type, index, listeners) { + (function procPath(prop, path) { + for (var n in prop) { + if ("properties" in prop[n]) { + procPath( prop[ n ].properties, path.concat( n ) ); + } else { + var field = createField(prop[n], index, type, path.concat(n), n); + listeners.forEach( function( listener ) { + listener[ field.field_name ] = field; + } ); + } + } + })(properties, []); + } + for (var index in state.metadata.indices) { + indices[index] = { + types : [], fields : {}, paths : {}, parents : {} + }; + indices[index].aliases = state.metadata.indices[index].aliases; + indices[index].aliases.forEach(function(alias) { + (aliases[alias] || (aliases[alias] = [])).push(index); + }); + var mapping = state.metadata.indices[index].mappings; + for (var type in mapping) { + indices[index].types.push(type); + if ( type in types) { + types[type].indices.push(index); + } else { + types[type] = { + indices : [index], fields : {} + }; + } + getFields(mapping[type].properties, type, index, [fields, types[type].fields, indices[index].fields]); + if ( typeof mapping[type]._parent !== "undefined") { + indices[index].parents[type] = mapping[type]._parent.type; + } + } + } + + this.aliasesList = Object.keys(aliases); + this.indicesList = Object.keys(indices); + this.typesList = Object.keys(types); + this.fieldsList = Object.keys(fields); + } + }); + +})( this.app ); + +(function( app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.MetaDataFactory = ux.Observable.extend({ + defaults: { + cluster: null // (required) an app.services.Cluster + }, + init: function() { + this._super(); + this.config.cluster.get("_cluster/state", function(data) { + this.metaData = new app.data.MetaData({state: data}); + this.fire("ready", this.metaData, { originalData: data }); // TODO originalData needed for legacy ui.FilterBrowser + }.bind(this)); + } + }); + +})( this.app ); + +(function( app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.Query = ux.Observable.extend({ + defaults: { + cluster: null, // (required) instanceof app.services.Cluster + size: 50 // size of pages to return + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.refuid = 0; + this.refmap = {}; + this.indices = []; + this.types = []; + this.search = { + query: { bool: { must: [], must_not: [], should: [] } }, + from: 0, + size: this.config.size, + sort: [], + aggs: {}, + version: true + }; + this.defaultClause = this.addClause(); + this.history = [ this.getState() ]; + }, + clone: function() { + var q = new data.Query({ cluster: this.cluster }); + q.restoreState(this.getState()); + for(var uqid in q.refmap) { + q.removeClause(uqid); + } + return q; + }, + getState: function() { + return $.extend(true, {}, { search: this.search, indices: this.indices, types: this.types }); + }, + restoreState: function(state) { + state = $.extend(true, {}, state || this.history[this.history.length - 1]); + this.indices = state.indices; + this.types = state.types; + this.search = state.search; + }, + getData: function() { + return JSON.stringify(this.search); + }, + query: function() { + var state = this.getState(); + this.cluster.post( + (this.indices.join(",") || "_all") + "/" + ( this.types.length ? this.types.join(",") + "/" : "") + "_search", + this.getData(), + function(results) { + if(results === null) { + alert(i18n.text("Query.FailAndUndo")); + this.restoreState(); + return; + } + this.history.push(state); + + this.fire("results", this, results); + }.bind(this)); + }, + loadParents: function(res,metadata){ + //create data for mget + var data = { docs :[] }; + var indexToTypeToParentIds = {}; + res.hits.hits.forEach(function(hit) { + if (typeof hit.fields != "undefined"){ + if (typeof hit.fields._parent != "undefined"){ + var parentType = metadata.indices[hit._index].parents[hit._type]; + if (typeof indexToTypeToParentIds[hit._index] == "undefined"){ + indexToTypeToParentIds[hit._index] = new Object(); + } + if (typeof indexToTypeToParentIds[hit._index][hit._type] == "undefined"){ + indexToTypeToParentIds[hit._index][hit._type] = new Object(); + } + if (typeof indexToTypeToParentIds[hit._index][hit._type][hit.fields._parent] == "undefined"){ + indexToTypeToParentIds[hit._index][hit._type][hit.fields._parent] = null; + data.docs.push({ _index:hit._index, _type:parentType, _id:hit.fields._parent}); + } + } + } + }); + + //load parents + var state = this.getState(); + this.cluster.post("_mget",JSON.stringify(data), + function(results) { + if(results === null) { + alert(i18n.text("Query.FailAndUndo")); + this.restoreState(); + return; + } + this.history.push(state); + var indexToTypeToParentIdToHit = new Object(); + results.docs.forEach(function(doc) { + if (typeof indexToTypeToParentIdToHit[doc._index] == "undefined"){ + indexToTypeToParentIdToHit[doc._index] = new Object(); + } + + if (typeof indexToTypeToParentIdToHit[doc._index][doc._type] == "undefined"){ + indexToTypeToParentIdToHit[doc._index][doc._type] = new Object(); + } + + indexToTypeToParentIdToHit[doc._index][doc._type][doc._id] = doc; + }); + + res.hits.hits.forEach(function(hit) { + if (typeof hit.fields != "undefined"){ + if (typeof hit.fields._parent != "undefined"){ + var parentType = metadata.indices[hit._index].parents[hit._type]; + hit._parent = indexToTypeToParentIdToHit[hit._index][parentType][hit.fields._parent]; + } + } + }); + + this.fire("resultsWithParents", this, res); + }.bind(this)); + }, + setPage: function(page) { + this.search.from = this.config.size * (page - 1); + }, + setSort: function(index, desc) { + var sortd = {}; sortd[index] = { reverse: !!desc }; + this.search.sort.unshift( sortd ); + for(var i = 1; i < this.search.sort.length; i++) { + if(Object.keys(this.search.sort[i])[0] === index) { + this.search.sort.splice(i, 1); + break; + } + } + }, + setIndex: function(index, add) { + if(add) { + if(! this.indices.contains(index)) this.indices.push(index); + } else { + this.indices.remove(index); + } + this.fire("setIndex", this, { index: index, add: !!add }); + }, + setType: function(type, add) { + if(add) { + if(! this.types.contains(type)) this.types.push(type); + } else { + this.types.remove(type); + } + this.fire("setType", this, { type: type, add: !!add }); + }, + addClause: function(value, field, op, bool) { + bool = bool || "should"; + op = op || "match_all"; + field = field || "_all"; + var clause = this._setClause(value, field, op, bool); + var uqid = "q-" + this.refuid++; + this.refmap[uqid] = { clause: clause, value: value, field: field, op: op, bool: bool }; + if(this.search.query.bool.must.length + this.search.query.bool.should.length > 1) { + this.removeClause(this.defaultClause); + } + this.fire("queryChanged", this, { uqid: uqid, search: this.search} ); + return uqid; // returns reference to inner query object to allow fast updating + }, + removeClause: function(uqid) { + var ref = this.refmap[uqid], + bool = this.search.query.bool[ref.bool]; + bool.remove(ref.clause); + if(this.search.query.bool.must.length + this.search.query.bool.should.length === 0) { + this.defaultClause = this.addClause(); + } + }, + addAggs: function(aggs) { + var aggsId = "f-" + this.refuid++; + this.search.aggs[aggsId] = aggs; + this.refmap[aggsId] = { aggsId: aggsId, aggs: aggs }; + return aggsId; + }, + removeAggs: function(aggsId) { + delete this.search.aggs[aggsId]; + delete this.refmap[aggsId]; + }, + _setClause: function(value, field, op, bool) { + var clause = {}, query = {}; + if(op === "match_all") { + } else if(op === "query_string") { + query["default_field"] = field; + query["query"] = value; + } else if(op === "missing") { + op = "constant_score" + var missing = {}, filter = {}; + missing["field"] = field; + filter["missing"] = missing + query["filter"] = filter; + } else { + query[field] = value; + } + clause[op] = query; + this.search.query.bool[bool].push(clause); + return clause; + } + }); + +})( this.app ); + +(function( app ) { + + var data = app.ns("data"); + + data.QueryDataSourceInterface = data.DataSourceInterface.extend({ + defaults: { + metadata: null, // (required) instanceof app.data.MetaData, the cluster metadata + query: null // (required) instanceof app.data.Query the data source + }, + init: function() { + this._super(); + this.config.query.on("results", this._results_handler.bind(this) ); + this.config.query.on("resultsWithParents", this._load_parents.bind(this) ); + }, + _results_handler: function(query, res) { + this._getSummary(res); + this._getMeta(res); + var sort = query.search.sort[0] || { "_score": { reverse: false }}; + var sortField = Object.keys(sort)[0]; + this.sort = { column: sortField, dir: (sort[sortField].reverse ? "asc" : "desc") }; + this._getData(res, this.config.metadata); + this.fire("data", this); + }, + _load_parents: function(query, res) { + query.loadParents(res, this.config.metadata); + }, + _getData: function(res, metadata) { + var metaColumns = ["_index", "_type", "_id", "_score"]; + var columns = this.columns = [].concat(metaColumns); + + this.data = res.hits.hits.map(function(hit) { + var row = (function(path, spec, row) { + for(var prop in spec) { + if(acx.isObject(spec[prop])) { + arguments.callee(path.concat(prop), spec[prop], row); + } else if(acx.isArray(spec[prop])) { + if(spec[prop].length) { + arguments.callee(path.concat(prop), spec[prop][0], row) + } + } else { + var dpath = path.concat(prop).join("."); + if(metadata.paths[dpath]) { + var field_name = metadata.paths[dpath].field_name; + if(! columns.contains(field_name)) { + columns.push(field_name); + } + row[field_name] = (spec[prop] === null ? "null" : spec[prop] ).toString(); + } else { + // TODO: field not in metadata index + } + } + } + return row; + })([ hit._index, hit._type ], hit._source, {}); + metaColumns.forEach(function(n) { row[n] = hit[n]; }); + row._source = hit; + if (typeof hit._parent!= "undefined") { + (function(prefix, path, spec, row) { + for(var prop in spec) { + if(acx.isObject(spec[prop])) { + arguments.callee(prefix, path.concat(prop), spec[prop], row); + } else if(acx.isArray(spec[prop])) { + if(spec[prop].length) { + arguments.callee(prefix, path.concat(prop), spec[prop][0], row) + } + } else { + var dpath = path.concat(prop).join("."); + if(metadata.paths[dpath]) { + var field_name = metadata.paths[dpath].field_name; + var column_name = prefix+"."+field_name; + if(! columns.contains(column_name)) { + columns.push(column_name); + } + row[column_name] = (spec[prop] === null ? "null" : spec[prop] ).toString(); + } else { + // TODO: field not in metadata index + } + } + } + })(hit._parent._type,[hit._parent._index, hit._parent._type], hit._parent._source, row); + } + return row; + }, this); + } + }); + +})( this.app ); + +(function( app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.BoolQuery = ux.Observable.extend({ + defaults: { + size: 50 // size of pages to return + }, + init: function() { + this._super(); + this.refuid = 0; + this.refmap = {}; + this.search = { + query: { bool: { must: [], must_not: [], should: [] } }, + from: 0, + size: this.config.size, + sort: [], + aggs: {} + }; + this.defaultClause = this.addClause(); + }, + setSize: function(size) { + this.search.size = parseInt( size, 10 ); + }, + setPage: function(page) { + this.search.from = this.config.size * (page - 1) + 1; + }, + addClause: function(value, field, op, bool) { + bool = bool || "should"; + op = op || "match_all"; + field = field || "_all"; + var clause = this._setClause(value, field, op, bool); + var uqid = "q-" + this.refuid++; + this.refmap[uqid] = { clause: clause, value: value, field: field, op: op, bool: bool }; + if(this.search.query.bool.must.length + this.search.query.bool.should.length > 1) { + this.removeClause(this.defaultClause); + } + this.fire("queryChanged", this, { uqid: uqid, search: this.search} ); + return uqid; // returns reference to inner query object to allow fast updating + }, + removeClause: function(uqid) { + var ref = this.refmap[uqid], + bool = this.search.query.bool[ref.bool]; + var clauseIdx = bool.indexOf(ref.clause); + // Check that this clause hasn't already been removed + if (clauseIdx >=0) { + bool.splice(clauseIdx, 1); + } + }, + _setClause: function(value, field, op, bool) { + var clause = {}, query = {}; + if(op === "match_all") { + } else if(op === "query_string") { + query["default_field"] = field; + query["query"] = value; + } else if(op === "missing") { + op = "constant_score" + var missing = {}, filter = {}; + missing["field"] = field; + filter["missing"] = missing + query["filter"] = filter; + } else { + query[field.substring(field.indexOf(".")+1)] = value; + } + clause[op] = query; + this.search.query.bool[bool].push(clause); + return clause; + }, + getData: function() { + return JSON.stringify(this.search); + } + }); + +})( this.app ); +(function( app ) { + + var ux = app.ns("ux"); + var services = app.ns("services"); + + services.Preferences = ux.Singleton.extend({ + init: function() { + this._storage = window.localStorage; + this._setItem("__version", 1 ); + }, + get: function( key ) { + return this._getItem( key ); + }, + set: function( key, val ) { + return this._setItem( key, val ); + }, + _getItem: function( key ) { + try { + return JSON.parse( this._storage.getItem( key ) ); + } catch(e) { + console.warn( e ); + return undefined; + } + }, + _setItem: function( key, val ) { + try { + return this._storage.setItem( key, JSON.stringify( val ) ); + } catch(e) { + console.warn( e ); + return undefined; + } + } + }); + +})( this.app ); + +(function( $, app ) { + + var services = app.ns("services"); + var ux = app.ns("ux"); + + function parse_version( v ) { + return v.match(/^(\d+)\.(\d+)\.(\d+)/).slice(1,4).map( function(d) { return parseInt(d || 0, 10); } ); + } + + services.Cluster = ux.Class.extend({ + defaults: { + base_uri: null + }, + init: function() { + this.base_uri = this.config.base_uri; + }, + setVersion: function( v ) { + this.version = v; + this._version_parts = parse_version( v ); + }, + versionAtLeast: function( v ) { + var testVersion = parse_version( v ); + for( var i = 0; i < 3; i++ ) { + if( testVersion[i] !== this._version_parts[i] ) { + return testVersion[i] < this._version_parts[i]; + } + } + return true; + }, + request: function( params ) { + return $.ajax( $.extend({ + url: this.base_uri + params.path, + dataType: "json", + error: function(xhr, type, message) { + if("console" in window) { + console.log({ "XHR Error": type, "message": message }); + } + } + }, params) ); + }, + "get": function(path, success) { return this.request( { type: "GET", path: path, success: success } ); }, + "post": function(path, data, success) { return this.request( { type: "POST", path: path, data: data, success: success } ); }, + "put": function(path, data, success) { return this.request( { type: "PUT", path: path, data: data, success: success } ); }, + "delete": function(path, data, success) { return this.request( { type: "DELETE", path: path, data: data, success: success } ); } + }); + +})( this.jQuery, this.app ); + + (function( app ) { + + var services = app.ns("services"); + var ux = app.ns("ux"); + + services.ClusterState = ux.Observable.extend({ + defaults: { + cluster: null + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.clusterState = null; + this.status = null; + this.nodeStats = null; + this.clusterNodes = null; + }, + refresh: function() { + var self = this, clusterState, status, nodeStats, clusterNodes, clusterHealth; + function updateModel() { + if( clusterState && status && nodeStats && clusterNodes && clusterHealth ) { + this.clusterState = clusterState; + this.status = status; + this.nodeStats = nodeStats; + this.clusterNodes = clusterNodes; + this.clusterHealth = clusterHealth; + this.fire( "data", this ); + } + } + this.cluster.get("_cluster/state", function( data ) { + clusterState = data; + updateModel.call( self ); + }); + this.cluster.get("_stats", function( data ) { + status = data; + updateModel.call( self ); + }); + this.cluster.get("_nodes/stats", function( data ) { + nodeStats = data; + updateModel.call( self ); + }); + this.cluster.get("_nodes", function( data ) { + clusterNodes = data; + updateModel.call( self ); + }); + this.cluster.get("_cluster/health", function( data ) { + clusterHealth = data; + updateModel.call( self ); + }); + }, + _clusterState_handler: function(state) { + this.clusterState = state; + this.redraw("clusterState"); + }, + _status_handler: function(status) { + this.status = status; + this.redraw("status"); + }, + _clusterNodeStats_handler: function(stats) { + this.nodeStats = stats; + this.redraw("nodeStats"); + }, + _clusterNodes_handler: function(nodes) { + this.clusterNodes = nodes; + this.redraw("clusterNodes"); + }, + _clusterHealth_handler: function(health) { + this.clusterHealth = health; + this.redraw("status"); + } + }); + +})( this.app ); + +(function( $, joey, app ) { + + var ui = app.ns("ui"); + var ux = app.ns("ux"); + + ui.AbstractWidget = ux.Observable.extend({ + defaults : { + id: null // the id of the widget + }, + + el: null, // this is the jquery wrapped dom element(s) that is the root of the widget + + init: function() { + this._super(); + for(var prop in this) { // automatically bind all the event handlers + if(prop.contains("_handler")) { + this[prop] = this[prop].bind(this); + } + } + }, + + id: function(suffix) { + return this.config.id ? (this.config.id + (suffix ? "-" + suffix : "")) : undefined; + }, + + attach: function( parent, method ) { + if( parent ) { + this.el[ method || "appendTo"]( parent ); + } + this.fire("attached", this ); + return this; + }, + + remove: function() { + this.el.remove(); + this.fire("removed", this ); + this.removeAllObservers(); + this.el = null; + return this; + } + }); + + joey.plugins.push( function( obj ) { + if( obj instanceof ui.AbstractWidget ) { + return obj.el[0]; + } + }); + +})( this.jQuery, this.joey, this.app ); + +(function( $, app, joey ) { + + var ui = app.ns("ui"); + + ui.AbstractField = ui.AbstractWidget.extend({ + + defaults: { + name : "", // (required) - name of the field + require: false, // validation requirements (false, true, regexp, function) + value: "", // default value + label: "" // human readable label of this field + }, + + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + this.field = this.el.find("[name="+this.config.name+"]"); + this.label = this.config.label; + this.require = this.config.require; + this.name = this.config.name; + this.val( this.config.value ); + this.attach( parent ); + }, + + val: function( val ) { + if(val === undefined) { + return this.field.val(); + } else { + this.field.val( val ); + return this; + } + }, + + validate: function() { + var val = this.val(), req = this.require; + if( req === false ) { + return true; + } else if( req === true ) { + return val.length > 0; + } else if( req.test && $.isFunction(req.test) ) { + return req.test( val ); + } else if( $.isFunction(req) ) { + return req( val, this ); + } + } + + }); + +})( this.jQuery, this.app, this.joey ); + +(function( app ) { + + var ui = app.ns("ui"); + + ui.TextField = ui.AbstractField.extend({ + init: function() { + this._super(); + }, + _keyup_handler: function() { + this.fire("change", this ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiField uiTextField", children: [ + { tag: "INPUT", + type: "text", + name: this.config.name, + placeholder: this.config.placeholder, + onkeyup: this._keyup_handler + } + ]}; + } + }); + +})( this.app ); + +(function( app ) { + + var ui = app.ns("ui"); + + ui.CheckField = ui.AbstractField.extend({ + _main_template: function() { return ( + { tag: "DIV", id: this.id(), cls: "uiCheckField", children: [ + { tag: "INPUT", type: "checkbox", name: this.config.name, checked: !!this.config.value } + ] } + ); }, + validate: function() { + return this.val() || ( ! this.require ); + }, + val: function( val ) { + if( val === undefined ) { + return !!this.field.attr( "checked" ); + } else { + this.field.attr( "checked", !!val ); + } + } + }); + +})( this.app ); + + + +(function( $, joey, app ) { + + var ui = app.ns("ui"); + + ui.Button = ui.AbstractWidget.extend({ + defaults : { + label: "", // the label text + disabled: false, // create a disabled button + autoDisable: false // automatically disable the button when clicked + }, + + _baseCls: "uiButton", + + init: function(parent) { + this._super(); + this.el = $.joey(this.button_template()) + .bind("click", this.click_handler); + this.config.disabled && this.disable(); + this.attach( parent ); + }, + + click_handler: function(jEv) { + if(! this.disabled) { + this.fire("click", jEv, this); + this.config.autoDisable && this.disable(); + } + }, + + enable: function() { + this.el.removeClass("disabled"); + this.disabled = false; + return this; + }, + + disable: function(disable) { + if(disable === false) { + return this.enable(); + } + this.el.addClass("disabled"); + this.disabled = true; + return this; + }, + + button_template: function() { return ( + { tag: 'BUTTON', type: 'button', id: this.id(), cls: this._baseCls, children: [ + { tag: 'DIV', cls: 'uiButton-content', children: [ + { tag: 'DIV', cls: 'uiButton-label', text: this.config.label } + ] } + ] } + ); } + }); + +})( this.jQuery, this.joey, this.app ); + +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.MenuButton = app.ui.Button.extend({ + defaults: { + menu: null + }, + _baseCls: "uiButton uiMenuButton", + init: function(parent) { + this._super(parent); + this.menu = this.config.menu; + this.on("click", this.openMenu_handler); + this.menu.on("open", function() { this.el.addClass("active"); }.bind(this)); + this.menu.on("close", function() { this.el.removeClass("active"); }.bind(this)); + }, + openMenu_handler: function(jEv) { + this.menu && this.menu.open(jEv); + } + }); + +})( this.jQuery, this.app ); + +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.SplitButton = ui.AbstractWidget.extend({ + defaults: { + items: [], + label: "" + }, + _baseCls: "uiSplitButton", + init: function( parent ) { + this._super( parent ); + this.value = null; + this.button = new ui.Button({ + label: this.config.label, + onclick: this._click_handler + }); + this.menu = new ui.SelectMenuPanel({ + value: this.config.value, + items: this._getItems(), + onSelect: this._select_handler + }); + this.menuButton = new ui.MenuButton({ + label: "\u00a0", + menu: this.menu + }); + this.el = $.joey(this._main_template()); + }, + remove: function() { + this.menu.remove(); + }, + disable: function() { + this.button.disable(); + }, + enable: function() { + this.button.enable(); + }, + _click_handler: function() { + this.fire("click", this, { value: this.value } ); + }, + _select_handler: function( panel, event ) { + this.fire( "select", this, event ); + }, + _getItems: function() { + return this.config.items; + }, + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: [ + this.button, this.menuButton + ] }; + } + }); + +})( this.jQuery, this.app ); + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.RefreshButton = ui.SplitButton.extend({ + defaults: { + timer: -1 + }, + init: function( parent ) { + this.config.label = i18n.text("General.RefreshResults"); + this._super( parent ); + this.set( this.config.timer ); + }, + set: function( value ) { + this.value = value; + window.clearInterval( this._timer ); + if( this.value > 0 ) { + this._timer = window.setInterval( this._refresh_handler, this.value ); + } + }, + _click_handler: function() { + this._refresh_handler(); + }, + _select_handler: function( el, event ) { + this.set( event.value ); + this.fire("change", this ); + }, + _refresh_handler: function() { + this.fire("refresh", this ); + }, + _getItems: function() { + return [ + { text: i18n.text("General.ManualRefresh"), value: -1 }, + { text: i18n.text("General.RefreshQuickly"), value: 100 }, + { text: i18n.text("General.Refresh5seconds"), value: 5000 }, + { text: i18n.text("General.Refresh1minute"), value: 60000 } + ]; + } + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.Toolbar = ui.AbstractWidget.extend({ + defaults: { + label: "", + left: [], + right: [] + }, + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + }, + _main_template: function() { + return { tag: "DIV", cls: "uiToolbar", children: [ + { tag: "DIV", cls: "pull-left", children: [ + { tag: "H2", text: this.config.label } + ].concat(this.config.left) }, + { tag: "DIV", cls: "pull-right", children: this.config.right } + ]}; + } + }); + +})( this.jQuery, this.app ); + +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.AbstractPanel = ui.AbstractWidget.extend({ + defaults: { + body: null, // initial content of the body + modal: true, // create a modal panel - creates a div that blocks interaction with page + height: 'auto', // panel height + width: 400, // panel width (in pixels) + open: false, // show the panel when it is created + parent: 'BODY', // node that panel is attached to + autoRemove: false // remove the panel from the dom and destroy it when the widget is closed + }, + shared: { // shared data for all instances of ui.Panel and decendants + stack: [], // array of all open panels + modal: $( { tag: "DIV", id: "uiModal", css: { opacity: 0.2, position: "absolute", top: "0px", left: "0px" } } ) + }, + init: function() { + this._super(); + }, + open: function( ev ) { + this.el + .css( { visibility: "hidden" } ) + .appendTo( this.config.parent ) + .css( this._getPosition( ev ) ) + .css( { zIndex: (this.shared.stack.length ? (+this.shared.stack[this.shared.stack.length - 1].el.css("zIndex") + 10) : 100) } ) + .css( { visibility: "visible", display: "block" } ); + this.shared.stack.remove(this); + this.shared.stack.push(this); + this._setModal(); + $(document).bind("keyup", this._close_handler ); + this.fire("open", { source: this, event: ev } ); + return this; + }, + close: function() { + var index = this.shared.stack.indexOf(this); + if(index !== -1) { + this.shared.stack.splice(index, 1); + this.el.css( { left: "-2999px" } ); // move the dialog to the left rather than hiding to prevent ie6 rendering artifacts + this._setModal(); + this.fire("close", this ); + if(this.config.autoRemove) { + this.remove(); + } + } + return this; + }, + // close the panel and remove it from the dom, destroying it (you can not reuse the panel after calling remove) + remove: function() { + this.close(); + $(document).unbind("keyup", this._close_handler ); + this._super(); + }, + // starting at the top of the stack, find the first panel that wants a modal and put it just underneath, otherwise remove the modal + _setModal: function() { + for(var stackPtr = this.shared.stack.length - 1; stackPtr >= 0; stackPtr--) { + if(this.shared.stack[stackPtr].config.modal) { + this.shared.modal + .appendTo( document.body ) + .css( { zIndex: this.shared.stack[stackPtr].el.css("zIndex") - 5 } ) + .css( $(document).vSize().asSize() ); + return; + } + } + this.shared.modal.remove(); // no panels that want a modal were found + }, + _getPosition: function() { + return $(window).vSize() // get the current viewport size + .sub(this.el.vSize()) // subtract the size of the panel + .mod(function(s) { return s / 2; }) // divide by 2 (to center it) + .add($(document).vScroll()) // add the current scroll offset + .mod(function(s) { return Math.max(5, s); }) // make sure the panel is not off the edge of the window + .asOffset(); // and return it as a {top, left} object + }, + _close_handler: function( ev ) { + if( ev.type === "keyup" && ev.keyCode !== 27) { return; } // press esc key to close + $(document).unbind("keyup", this._close_handler); + this.close( ev ); + } + }); + +})( this.jQuery, this.app ); + +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.DraggablePanel = ui.AbstractPanel.extend({ + defaults: { + // title: "" // (required) text for the panel title + }, + + _baseCls: "uiPanel", + + init: function() { + this._super(); + this.body = $(this._body_template()); + this.title = $(this._title_template()); + this.el = $.joey( this._main_template() ); + this.el.css( { width: this.config.width } ); + this.dd = new app.ux.DragDrop({ + pickupSelector: this.el.find(".uiPanel-titleBar"), + dragObj: this.el + }); + // open the panel if set in configuration + this.config.open && this.open(); + }, + + setBody: function(body) { + this.body.empty().append(body); + }, + _body_template: function() { return { tag: "DIV", cls: "uiPanel-body", css: { height: this.config.height + (this.config.height === 'auto' ? "" : "px" ) }, children: [ this.config.body ] }; }, + _title_template: function() { return { tag: "SPAN", cls: "uiPanel-title", text: this.config.title }; }, + _main_template: function() { return ( + { tag: "DIV", id: this.id(), cls: this._baseCls, children: [ + { tag: "DIV", cls: "uiPanel-titleBar", children: [ + { tag: "DIV", cls: "uiPanel-close", onclick: this._close_handler, text: "x" }, + this.title + ]}, + this.body + ] } + ); } + }); + +})( this.jQuery, this.app ); + +(function( app ) { + + var ui = app.ns("ui"); + + ui.InfoPanel = ui.DraggablePanel.extend({ + _baseCls: "uiPanel uiInfoPanel" + }); + +})( this.app ); + +(function( app ) { + + var ui = app.ns("ui"); + + ui.DialogPanel = ui.DraggablePanel.extend({ + _commit_handler: function(jEv) { + this.fire("commit", this, { jEv: jEv }); + }, + _main_template: function() { + var t = this._super(); + t.children.push(this._actionsBar_template()); + return t; + }, + _actionsBar_template: function() { + return { tag: "DIV", cls: "pull-right", children: [ + new app.ui.Button({ label: "Cancel", onclick: this._close_handler }), + new app.ui.Button({ label: "OK", onclick: this._commit_handler }) + ]}; + } + }); + +})( this.app ); + +(function( app ) { + + var ui = app.ns("ui"); + + ui.MenuPanel = ui.AbstractPanel.extend({ + defaults: { + items: [], // (required) an array of menu items + modal: false + }, + _baseCls: "uiMenuPanel", + init: function() { + this._super(); + this.el = $(this._main_template()); + }, + open: function(jEv) { + this._super(jEv); + var cx = this; setTimeout(function() { $(document).bind("click", cx._close_handler); }, 50); + }, + _getItems: function() { + return this.config.items; + }, + _close_handler: function(jEv) { + this._super(jEv); + $(document).unbind("click", this._close_handler); + }, + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: this._getItems().map(this._menuItem_template, this) }; + }, + _menuItem_template: function(item) { + var dx = item.disabled ? { onclick: function() {} } : {}; + return { tag: "LI", cls: "uiMenuPanel-item" + (item.disabled ? " disabled" : "") + (item.selected ? " selected" : ""), children: [ $.extend({ tag: "DIV", cls: "uiMenuPanel-label" }, item, dx ) ] }; + }, + _getPosition: function(jEv) { + var right = !! $(jEv.target).parents(".pull-right").length; + var parent = $(jEv.target).closest("BUTTON"); + return parent.vOffset() + .addY(parent.vSize().y) + .addX( right ? parent.vSize().x - this.el.vOuterSize().x : 0 ) + .asOffset(); + } + }); + +})( this.app ); + +(function( app ) { + + var ui = app.ns("ui"); + + ui.SelectMenuPanel = ui.MenuPanel.extend({ + defaults: { + items: [], // (required) an array of menu items + value: null + }, + _baseCls: "uiSelectMenuPanel uiMenuPanel", + init: function() { + this.value = this.config.value; + this._super(); + }, + _getItems: function() { + return this.config.items.map( function( item ) { + return { + text: item.text, + selected: this.value === item.value, + onclick: function( jEv ) { + var el = $( jEv.target ).closest("LI"); + el.parent().children().removeClass("selected"); + el.addClass("selected"); + this.fire( "select", this, { value: item.value } ); + this.value = item.value; + }.bind(this) + }; + }, this ); + + } + }); + +})( this.app ); + +( function( $, app ) { + + var ui = app.ns("ui"); + + ui.Table = ui.AbstractWidget.extend({ + defaults: { + store: null, // (required) implements interface app.data.DataSourceInterface + height: 0, + width: 0 + }, + _baseCls: "uiTable", + init: function(parent) { + this._super(); + this.initElements(parent); + this.config.store.on("data", this._data_handler); + }, + attach: function(parent) { + if(parent) { + this._super(parent); + this._reflow(); + } + }, + initElements: function(parent) { + this.el = $.joey(this._main_template()); + this.body = this.el.find(".uiTable-body"); + this.headers = this.el.find(".uiTable-headers"); + this.tools = this.el.find(".uiTable-tools"); + this.attach( parent ); + }, + _data_handler: function(store) { + this.tools.text(store.summary); + this.headers.empty().append(this._header_template(store.columns)); + this.body.empty().append(this._body_template(store.data, store.columns)); + this._reflow(); + }, + _reflow: function() { + var firstCol = this.body.find("TR:first TH.uiTable-header-cell > DIV"), + headers = this.headers.find("TR:first TH.uiTable-header-cell > DIV"); + for(var i = 0; i < headers.length; i++) { + $(headers[i]).width( $(firstCol[i]).width() ); + } + this._scroll_handler(); + }, + _scroll_handler: function(ev) { + this.el.find(".uiTable-headers").scrollLeft(this.body.scrollLeft()); + }, + _dataClick_handler: function(ev) { + var row = $(ev.target).closest("TR"); + if(row.length) { + this.fire("rowClick", this, { row: row } ); + } + }, + _headerClick_handler: function(ev) { + var header = $(ev.target).closest("TH.uiTable-header-cell"); + if(header.length) { + this.fire("headerClick", this, { header: header, column: header.data("column"), dir: header.data("dir") }); + } + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), css: { width: this.config.width + "px" }, cls: this._baseCls, children: [ + { tag: "DIV", cls: "uiTable-tools" }, + { tag: "DIV", cls: "uiTable-headers", onclick: this._headerClick_handler }, + { tag: "DIV", cls: "uiTable-body", + onclick: this._dataClick_handler, + onscroll: this._scroll_handler, + css: { height: this.config.height + "px", width: this.config.width + "px" } + } + ] }; + }, + _header_template: function(columns) { + var ret = { tag: "TABLE", children: [ this._headerRow_template(columns) ] }; + ret.children[0].children.push(this._headerEndCap_template()); + return ret; + }, + _headerRow_template: function(columns) { + return { tag: "TR", cls: "uiTable-header-row", children: columns.map(function(column) { + var dir = ((this.config.store.sort.column === column) && this.config.store.sort.dir) || "none"; + return { tag: "TH", data: { column: column, dir: dir }, cls: "uiTable-header-cell" + ((dir !== "none") ? " uiTable-sort" : ""), children: [ + { tag: "DIV", children: [ + { tag: "DIV", cls: "uiTable-headercell-menu", text: dir === "asc" ? "\u25b2" : "\u25bc" }, + { tag: "DIV", cls: "uiTable-headercell-text", text: column } + ]} + ]}; + }, this)}; + }, + _headerEndCap_template: function() { + return { tag: "TH", cls: "uiTable-headerEndCap", children: [ { tag: "DIV" } ] }; + }, + _body_template: function(data, columns) { + return { tag: "TABLE", children: [] + .concat(this._headerRow_template(columns)) + .concat(data.map(function(row) { + return { tag: "TR", data: { row: row }, cls: "uiTable-row", children: columns.map(function(column){ + return { tag: "TD", cls: "uiTable-cell", children: [ { tag: "DIV", text: (row[column] || "").toString() } ] }; + })}; + })) + }; + } + + }); + +})( this.jQuery, this.app ); + +( function( $, app, joey ) { + + var ui = app.ns("ui"); + + var CELL_SEPARATOR = ","; + var CELL_QUOTE = '"'; + var LINE_SEPARATOR = "\r\n"; + + ui.CSVTable = ui.AbstractWidget.extend({ + defaults: { + results: null + }, + _baseCls: "uiCSVTable", + init: function( parent ) { + this._super(); + var results = this.config.results.hits.hits; + var columns = this._parseResults( results ); + this._downloadButton = new ui.Button({ + label: "Generate Download Link", + onclick: this._downloadLinkGenerator_handler + }); + this._downloadLink = $.joey( { tag: "A", text: "download", }); + this._downloadLink.hide(); + this._csvText = this._csv_template( columns, results ); + this.el = $.joey( this._main_template() ); + this.attach( parent ); + }, + _downloadLinkGenerator_handler: function() { + var csvData = new Blob( [ this._csvText ], { type: 'text/csv' }); + var csvURL = URL.createObjectURL( csvData ); + this._downloadLink.attr( "href", csvURL ); + this._downloadLink.show(); + }, + _parseResults: function( results ) { + var columnPaths = {}; + (function parse( path, obj ) { + if( obj instanceof Array ) { + for( var i = 0; i < obj.length; i++ ) { + parse( path, obj[i] ); + } + } else if( typeof obj === "object" ) { + for( var prop in obj ) { + parse( path + "." + prop, obj[ prop ] ); + } + } else { + columnPaths[ path ] = true; + } + })( "root", results ); + var columns = []; + for( var column in columnPaths ) { + columns.push( column.split(".").slice(1) ); + } + return columns; + }, + _main_template: function() { return ( + { tag: "DIV", cls: this._baseCls, id: this.id(), children: [ + this._downloadButton, + this._downloadLink, + { tag: "PRE", text: this._csvText } + ] } + ); }, + _csv_template: function( columns, results ) { + return this._header_template( columns ) + LINE_SEPARATOR + this._results_template( columns, results ); + }, + _header_template: function( columns ) { + return columns.map( function( column ) { + return column.join("."); + }).join( CELL_SEPARATOR ); + }, + _results_template: function( columns, results ) { + return results.map( function( result ) { + return columns.map( function( column ) { + var l = 0, + ptr = result; + while( l !== column.length && ptr != null ) { + ptr = ptr[ column[ l++ ] ]; + } + return ( ptr == null ) ? "" : ( CELL_QUOTE + ptr.toString().replace(/"/g, '""') + CELL_QUOTE ); + }).join( CELL_SEPARATOR ); + }).join( LINE_SEPARATOR ); + } + }); + +})( this.jQuery, this.app, this.joey ); + +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.JsonPretty = ui.AbstractWidget.extend({ + defaults: { + obj: null + }, + init: function(parent) { + this._super(); + this.el = $(this._main_template()); + this.attach(parent); + this.el.click(this._click_handler); + }, + + _click_handler: function(jEv) { + var t = $(jEv.target).closest(".uiJsonPretty-name").closest("LI"); + if(t.length === 0 || t.parents(".uiJsonPretty-minimised").length > 0) { return; } + t.toggleClass("uiJsonPretty-minimised"); + jEv.stopPropagation(); + }, + + _main_template: function() { + try { + return { tag: "DIV", cls: "uiJsonPretty", children: this.pretty.parse(this.config.obj) }; + } catch (error) { + throw "JsonPretty error: " + error.message; + } + }, + + pretty: { // from https://github.com/RyanAmos/Pretty-JSON/blob/master/pretty_json.js + "expando" : function(value) { + return (value && (/array|object/i).test(value.constructor.name)) ? "expando" : ""; + }, + "parse": function (member) { + return this[(member == null) ? 'null' : member.constructor.name.toLowerCase()](member); + }, + "null": function (value) { + return this['value']('null', 'null'); + }, + "array": function (value) { + var results = []; + var lastItem = value.length - 1; + value.forEach(function( v, i ) { + results.push({ tag: "LI", cls: this.expando(v), children: [ this['parse'](v) ] }); + if( i !== lastItem ) { + results.push(","); + } + }, this); + return [ "[ ", ((results.length > 0) ? { tag: "UL", cls: "uiJsonPretty-array", children: results } : null), "]" ]; + }, + "object": function (value) { + var results = []; + var keys = Object.keys( value ); + var lastItem = keys.length - 1; + keys.forEach( function( key, i ) { + var children = [ this['value']( 'name', '"' + key + '"' ), ": ", this['parse']( value[ key ]) ]; + if( i !== lastItem ) { + children.push(","); + } + results.push( { tag: "LI", cls: this.expando( value[ key ] ), children: children } ); + }, this); + return [ "{ ", ((results.length > 0) ? { tag: "UL", cls: "uiJsonPretty-object", children: results } : null ), "}" ]; + }, + "number": function (value) { + return this['value']('number', value.toString()); + }, + "string": function (value) { + if (/^(http|https|file):\/\/[^\s]+$/.test(value)) { + return this['link']( value ); + } else { + return this['value']('string', '"' + value.toString() + '"'); + } + }, + "boolean": function (value) { + return this['value']('boolean', value.toString()); + }, + "link": function( value ) { + return this['value']("string", { tag: "A", href: value, target: "_blank", text: '"' + value + '"' } ); + }, + "value": function (type, value) { + if (/^(http|https|file):\/\/[^\s]+$/.test(value)) { + } + return { tag: "SPAN", cls: "uiJsonPretty-" + type, text: value }; + } + } + }); + +})( this.jQuery, this.app ); + +(function( $, app ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.PanelForm = ui.AbstractWidget.extend({ + defaults: { + fields: null // (required) instanceof app.ux.FieldCollection + }, + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + this.attach( parent ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiPanelForm", children: this.config.fields.fields.map(this._field_template, this) }; + }, + _field_template: function(field) { + return { tag: "LABEL", cls: "uiPanelForm-field", children: [ + { tag: "DIV", cls: "uiPanelForm-label", children: [ field.label, ut.require_template(field) ] }, + field + ]}; + } + }); + +})( this.jQuery, this.app ); + +(function( app ){ + + var ui = app.ns("ui"); + + ui.HelpPanel = ui.InfoPanel.extend({ + defaults: { + ref: "", + open: true, + autoRemove: true, + modal: false, + width: 500, + height: 450, + title: i18n.text("General.Help") + }, + init: function() { + this._super(); + this.body.append(i18n.text(this.config.ref)); + } + }); + +})( this.app ); + +(function( app ) { + + var ui = app.ns("ui"); + + ui.JsonPanel = ui.InfoPanel.extend({ + defaults: { + json: null, // (required) + modal: false, + open: true, + autoRemove: true, + height: 500, + width: 600 + }, + + _baseCls: "uiPanel uiInfoPanel uiJsonPanel", + + _body_template: function() { + var body = this._super(); + body.children = [ new ui.JsonPretty({ obj: this.config.json }) ]; + return body; + } + }); + +})( this.app ); + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.SidebarSection = ui.AbstractWidget.extend({ + defaults: { + title: "", + help: null, + body: null, + open: false + }, + init: function() { + this._super(); + this.el = $.joey( this._main_template() ); + this.body = this.el.children(".uiSidebarSection-body"); + this.config.open && ( this.el.addClass("shown") && this.body.css("display", "block") ); + }, + _showSection_handler: function( ev ) { + var shown = $( ev.target ).closest(".uiSidebarSection") + .toggleClass("shown") + .children(".uiSidebarSection-body").slideToggle(200, function() { this.fire("animComplete", this); }.bind(this)) + .end() + .hasClass("shown"); + this.fire(shown ? "show" : "hide", this); + }, + _showHelp_handler: function( ev ) { + new ui.HelpPanel({ref: this.config.help}); + ev.stopPropagation(); + }, + _main_template: function() { return ( + { tag: "DIV", cls: "uiSidebarSection", children: [ + (this.config.title && { tag: "DIV", cls: "uiSidebarSection-head", onclick: this._showSection_handler, children: [ + this.config.title, + ( this.config.help && { tag: "SPAN", cls: "uiSidebarSection-help pull-right", onclick: this._showHelp_handler, text: i18n.text("General.HelpGlyph") } ) + ] }), + { tag: "DIV", cls: "uiSidebarSection-body", children: [ this.config.body ] } + ] } + ); } + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.ResultTable = ui.Table.extend({ + defaults: { + width: 500, + height: 400 + }, + + init: function() { + this._super(); + this.on("rowClick", this._showPreview_handler); + this.selectedRow = null; + $(document).bind("keydown", this._nav_handler); + }, + remove: function() { + $(document).unbind("keydown", this._nav_handler); + this._super(); + }, + attach: function(parent) { + if(parent) { + var height = parent.height() || ( $(document).height() - parent.offset().top - 41 ); // 41 = height in px of .uiTable-tools + uiTable-header + var width = parent.width(); + this.el.width( width ); + this.body.width( width ).height( height ); + } + this._super(parent); + }, + showPreview: function(row) { + row.addClass("selected"); + this.preview = new app.ui.JsonPanel({ + title: i18n.text("Browser.ResultSourcePanelTitle"), + json: row.data("row")._source, + onClose: function() { row.removeClass("selected"); } + }); + }, + _nav_handler: function(jEv) { + if(jEv.keyCode !== 40 && jEv.keyCode !== 38) { + return; + } + this.selectedRow && this.preview && this.preview.remove(); + if(jEv.keyCode === 40) { // up arrow + this.selectedRow = this.selectedRow ? this.selectedRow.next("TR") : this.body.find("TR:first"); + } else if(jEv.keyCode === 38) { // down arrow + this.selectedRow = this.selectedRow ? this.selectedRow.prev("TR") : this.body.find("TR:last"); + } + this.selectedRow && this.showPreview(this.selectedRow); + }, + _showPreview_handler: function(obj, data) { + this.showPreview(this.selectedRow = data.row); + } + }); + +})( this.jQuery, this.app ); + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.QueryFilter = ui.AbstractWidget.extend({ + defaults: { + metadata: null, // (required) instanceof app.data.MetaData + query: null // (required) instanceof app.data.Query that the filters will act apon + }, + init: function() { + this._super(); + this.metadata = this.config.metadata; + this.query = this.config.query; + this.el = $(this._main_template()); + }, + helpTypeMap: { + "date" : "QueryFilter.DateRangeHelp" + }, + requestUpdate: function(jEv) { + if(jEv && jEv.originalEvent) { // we only want to update on real user interaction not generated events + this.query.setPage(1); + this.query.query(); + } + }, + getSpec: function(fieldName) { + return this.metadata.fields[fieldName]; + }, + _selectAlias_handler: function(jEv) { + var indices = (jEv.target.selectedIndex === 0) ? [] : this.metadata.getIndices($(jEv.target).val()); + $(".uiQueryFilter-index").each(function(i, el) { + var jEl = $(el); + if(indices.contains(jEl.text()) !== jEl.hasClass("selected")) { + jEl.click(); + } + }); + this.requestUpdate(jEv); + }, + _selectIndex_handler: function(jEv) { + var jEl = $(jEv.target).closest(".uiQueryFilter-index"); + jEl.toggleClass("selected"); + var selected = jEl.hasClass("selected"); + this.query.setIndex(jEl.text(), selected); + if(selected) { + var types = this.metadata.getTypes(this.query.indices); + this.el.find("DIV.uiQueryFilter-type.selected").each(function(n, el) { + if(! types.contains($(el).text())) { + $(el).click(); + } + }); + } + this.requestUpdate(jEv); + }, + _selectType_handler: function(jEv) { + var jEl = $(jEv.target).closest(".uiQueryFilter-type"); + jEl.toggleClass("selected"); + var type = jEl.text(), selected = jEl.hasClass("selected"); + this.query.setType(type, selected); + if(selected) { + var indices = this.metadata.types[type].indices; + // es throws a 500 if searching an index for a type it does not contain - so we prevent that + this.el.find("DIV.uiQueryFilter-index.selected").each(function(n, el) { + if(! indices.contains($(el).text())) { + $(el).click(); + } + }); + // es throws a 500 if you specify types from different indices with _all + jEl.siblings(".uiQueryFilter-type.selected").forEach(function(el) { + if(this.metadata.types[$(el).text()].indices.intersection(indices).length === 0) { + $(el).click(); + } + }, this); + } + this.requestUpdate(jEv); + }, + _openFilter_handler: function(section) { + var field_name = section.config.title; + if(! section.loaded) { + var spec = this.getSpec(field_name); + if(spec.core_type === "string") { + section.body.append(this._textFilter_template(spec)); + } else if(spec.core_type === "date") { + section.body.append(this._dateFilter_template(spec)); + section.body.append(new ui.DateHistogram({ printEl: section.body.find("INPUT"), cluster: this.cluster, query: this.query, spec: spec })); + } else if(spec.core_type === "number") { + section.body.append(this._numericFilter_template(spec)); + } else if(spec.core_type === 'boolean') { + section.body.append(this._booleanFilter_template(spec)); + } else if (spec.core_type === 'multi_field') { + section.body.append(this._multiFieldFilter_template(section, spec)); + } + section.loaded = true; + } + section.on("animComplete", function(section) { section.body.find("INPUT").focus(); }); + }, + _textFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqids = jEl.data("uqids") || []; + uqids.forEach(function(uqid) { + uqid && this.query.removeClause(uqid); + }, this); + if(val.length) { + if(jEl[0] === document.activeElement && jEl[0].selectionStart === jEl[0].selectionEnd) { + val = val.replace(new RegExp("(.{"+jEl[0].selectionStart+"})"), "$&*"); + } + uqids = val.split(/\s+/).map(function(term) { + // Figure out the actual field name - needed for multi_field, because + // querying for "field.field" will not work. Simply "field" must be used + // if nothing is aliased. + var fieldNameParts = spec.field_name.split('.'); + var part = fieldNameParts.length - 1; + var name = fieldNameParts[part]; + while (part >= 1) { + if (fieldNameParts[part] !== fieldNameParts[part - 1]) { + name = fieldNameParts[part - 1] + "." + name; + } + part--; + } + return term && this.query.addClause(term, name, "wildcard", "must"); + }, this); + } + jEl.data("uqids", uqids); + this.requestUpdate(jEv); + }, + _dateFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + var range = window.dateRangeParser.parse(val); + var lastRange = jEl.data("lastRange"); + if(!range || (lastRange && lastRange.start === range.start && lastRange.end === range.end)) { + return; + } + uqid && this.query.removeClause(uqid); + if((range.start && range.end) === null) { + uqid = null; + } else { + var value = {}; + if( range.start ) { + value["gte"] = range.start; + } + if( range.end ) { + value["lte"] = range.end; + } + uqid = this.query.addClause( value, spec.field_name, "range", "must"); + } + jEl.data("lastRange", range); + jEl.siblings(".uiQueryFilter-rangeHintFrom") + .text(i18n.text("QueryFilter.DateRangeHint.from", range.start && new Date(range.start).toUTCString())); + jEl.siblings(".uiQueryFilter-rangeHintTo") + .text(i18n.text("QueryFilter.DateRangeHint.to", range.end && new Date(range.end).toUTCString())); + jEl.data("uqid", uqid); + this.requestUpdate(jEv); + }, + _numericFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + var lastRange = jEl.data("lastRange"); + var range = (function(val) { + var ops = val.split(/->|<>|</).map( function(v) { return parseInt(v.trim(), 10); }); + if(/<>/.test(val)) { + return { gte: (ops[0] - ops[1]), lte: (ops[0] + ops[1]) }; + } else if(/->|</.test(val)) { + return { gte: ops[0], lte: ops[1] }; + } else { + return { gte: ops[0], lte: ops[0] }; + } + })(val || ""); + if(!range || (lastRange && lastRange.lte === range.lte && lastRange.gte === range.gte)) { + return; + } + jEl.data("lastRange", range); + uqid && this.query.removeClause(uqid); + uqid = this.query.addClause( range, spec.field_name, "range", "must"); + jEl.data("uqid", uqid); + this.requestUpdate(jEv); + }, + _booleanFilterChange_handler: function( jEv ) { + var jEl = $(jEv.target).closest("SELECT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + uqid && this.query.removeClause(uqid); + if(val === "true" || val === "false") { + jEl.data("uqid", this.query.addClause(val, spec.field_name, "term", "must") ); + } + this.requestUpdate(jEv); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiQueryFilter", children: [ + this._aliasSelector_template(), + this._indexSelector_template(), + this._typesSelector_template(), + this._filters_template() + ] }; + }, + _aliasSelector_template: function() { + var aliases = Object.keys(this.metadata.aliases).sort(); + aliases.unshift( i18n.text("QueryFilter.AllIndices") ); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-aliases", children: [ + { tag: "SELECT", onChange: this._selectAlias_handler, children: aliases.map(ut.option_template) } + ] }; + }, + _indexSelector_template: function() { + var indices = Object.keys( this.metadata.indices ).sort(); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-indices", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Indices") }, + { tag: "DIV", onClick: this._selectIndex_handler, children: indices.map( function( name ) { + return { tag: "DIV", cls: "uiQueryFilter-booble uiQueryFilter-index", text: name }; + })} + ] }; + }, + _typesSelector_template: function() { + var types = Object.keys( this.metadata.types ).sort(); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-types", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Types") }, + { tag: "DIV", onClick: this._selectType_handler, children: types.map( function( name ) { + return { tag: "DIV", cls: "uiQueryFilter-booble uiQueryFilter-type", text: name }; + })} + ] }; + }, + _filters_template: function() { + var _metadataFields = this.metadata.fields; + var fields = Object.keys( _metadataFields ).sort() + .filter(function(d) { return (_metadataFields[d].core_type !== undefined); }); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-filters", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Fields") }, + { tag: "DIV", children: fields.map( function(name ) { + return new app.ui.SidebarSection({ + title: name, + help: this.helpTypeMap[this.metadata.fields[ name ].type], + onShow: this._openFilter_handler + }); + }, this ) } + ] }; + }, + _textFilter_template: function(spec) { + return { tag: "INPUT", data: { spec: spec }, onKeyup: this._textFilterChange_handler }; + }, + _dateFilter_template: function(spec) { + return { tag: "DIV", children: [ + { tag: "INPUT", data: { spec: spec }, onKeyup: this._dateFilterChange_handler }, + { tag: "PRE", cls: "uiQueryFilter-rangeHintFrom", text: i18n.text("QueryFilter.DateRangeHint.from", "")}, + { tag: "PRE", cls: "uiQueryFilter-rangeHintTo", text: i18n.text("QueryFilter.DateRangeHint.to", "") } + ]}; + }, + _numericFilter_template: function(spec) { + return { tag: "INPUT", data: { spec: spec }, onKeyup: this._numericFilterChange_handler }; + }, + _booleanFilter_template: function(spec) { + return { tag: "SELECT", data: { spec: spec }, onChange: this._booleanFilterChange_handler, + children: [ i18n.text("QueryFilter.AnyValue"), "true", "false" ].map( function( val ) { + return { tag: "OPTION", value: val, text: val }; + }) + }; + }, + _multiFieldFilter_template: function(section, spec) { + return { + tag : "DIV", cls : "uiQueryFilter-subMultiFields", children : acx.eachMap(spec.fields, function(name, data) { + if (name === spec.field_name) { + section.config.title = spec.field_name + "." + name; + return this._openFilter_handler(section); + } + return new app.ui.SidebarSection({ + title : data.field_name, help : this.helpTypeMap[data.type], onShow : this._openFilter_handler + }); + }, this) + }; + } + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( app ) { + + var ui = app.ns("ui"); + + ui.Page = ui.AbstractWidget.extend({ + show: function() { + this.el.show(); + }, + hide: function() { + this.el.hide(); + } + }); + +})( this.app ); +(function( $, app, i18n ){ + + var ui = app.ns("ui"); + var data = app.ns("data"); + + ui.Browser = ui.Page.extend({ + defaults: { + cluster: null // (required) instanceof app.services.Cluster + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.query = new app.data.Query( { cluster: this.cluster } ); + this._refreshButton = new ui.Button({ + label: i18n.text("General.RefreshResults"), + onclick: function( btn ) { + this.query.query(); + }.bind(this) + }); + this.el = $(this._main_template()); + new data.MetaDataFactory({ + cluster: this.cluster, + onReady: function(metadata) { + this.metadata = metadata; + this.store = new data.QueryDataSourceInterface( { metadata: metadata, query: this.query } ); + this.queryFilter = new ui.QueryFilter({ metadata: metadata, query: this.query }); + this.queryFilter.attach(this.el.find("> .uiBrowser-filter") ); + this.resultTable = new ui.ResultTable( { + onHeaderClick: this._changeSort_handler, + store: this.store + } ); + this.resultTable.attach( this.el.find("> .uiBrowser-table") ); + this.updateResults(); + }.bind(this) + }); + }, + updateResults: function() { + this.query.query(); + }, + _changeSort_handler: function(table, wEv) { + this.query.setSort(wEv.column, wEv.dir === "desc"); + this.query.setPage(1); + this.query.query(); + }, + _main_template: function() { + return { tag: "DIV", cls: "uiBrowser", children: [ + new ui.Toolbar({ + label: i18n.text("Browser.Title"), + left: [ ], + right: [ this._refreshButton ] + }), + { tag: "DIV", cls: "uiBrowser-filter" }, + { tag: "DIV", cls: "uiBrowser-table" } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( $, app, i18n, raphael ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + var services = app.ns("services"); + + ui.AnyRequest = ui.Page.extend({ + defaults: { + cluster: null, // (required) instanceof app.services.Cluster + path: "_search", // default uri to send a request to + query: { query: { match_all: { }}}, + transform: " return root;" // default transformer function (does nothing) + }, + init: function(parent) { + this._super(); + this.prefs = services.Preferences.instance(); + this.history = this.prefs.get("anyRequest-history") || [ { type: "POST", path: this.config.path, query : JSON.stringify(this.config.query), transform: this.config.transform } ]; + this.el = $.joey(this._main_template()); + this.base_uriEl = this.el.find("INPUT[name=base_uri]"); + this.pathEl = this.el.find("INPUT[name=path]"); + this.typeEl = this.el.find("SELECT[name=method]"); + this.dataEl = this.el.find("TEXTAREA[name=body]"); + this.prettyEl = this.el.find("INPUT[name=pretty]"); + this.transformEl = this.el.find("TEXTAREA[name=transform]"); + this.asGraphEl = this.el.find("INPUT[name=asGraph]"); + this.asTableEl = this.el.find("INPUT[name=asTable]"); + this.asJsonEl = this.el.find("INPUT[name=asJson]"); + this.cronEl = this.el.find("SELECT[name=cron]"); + this.outEl = this.el.find("DIV.uiAnyRequest-out"); + this.errEl = this.el.find("DIV.uiAnyRequest-jsonErr"); + this.typeEl.val("GET"); + this.attach(parent); + this.setHistoryItem(this.history[this.history.length - 1]); + }, + setHistoryItem: function(item) { + this.pathEl.val(item.path); + this.typeEl.val(item.type); + this.dataEl.val(item.query); + this.transformEl.val(item.transform); + }, + _request_handler: function( ev ) { + if(! this._validateJson_handler()) { + return; + } + var path = this.pathEl.val(), + type = this.typeEl.val(), + query = JSON.stringify(JSON.parse(this.dataEl.val())), + transform = this.transformEl.val(), + base_uri = this.base_uriEl.val(); + if( ev ) { // if the user click request + if(this.timer) { + window.clearTimeout(this.timer); // stop any cron jobs + } + delete this.prevData; // remove data from previous cron runs + this.outEl.text(i18n.text("AnyRequest.Requesting")); + if( ! /\/$/.test( base_uri )) { + base_uri += "/"; + this.base_uriEl.val( base_uri ); + } + for(var i = 0; i < this.history.length; i++) { + if(this.history[i].path === path && + this.history[i].type === type && + this.history[i].query === query && + this.history[i].transform === transform) { + this.history.splice(i, 1); + } + } + this.history.push({ + path: path, + type: type, + query: query, + transform: transform + }); + this.history.slice(250); // make sure history does not get too large + this.prefs.set( "anyRequest-history", this.history ); + this.el.find("UL.uiAnyRequest-history") + .empty() + .append($( { tag: "UL", children: this.history.map(this._historyItem_template, this) }).children()) + .children().find(":last-child").each(function(i, j) { j.scrollIntoView(false); }).end() + .scrollLeft(0); + } + this.config.cluster.request({ + url: base_uri + path, + type: type, + data: query, + success: this._responseWriter_handler, + error: this._responseError_handler + }); + }, + _responseError_handler: function (response) { + var obj; + try { + obj = JSON.parse(response.responseText); + if (obj) { + this._responseWriter_handler(obj); + } + } catch (err) { + } + }, + _responseWriter_handler: function(data) { + this.outEl.empty(); + try { + data = (new Function("root", "prev", this.transformEl.val()))(data, this.prevData) + } catch(e) { + this.errEl.text(e.message); + return; + } + if(this.asGraphEl.attr("checked")) { + var w = this.outEl.width(); + raphael(this.outEl[0], w - 10, 300) + .g.barchart(10, 10, w - 20, 280, [data]); + } + if(this.asTableEl.attr("checked")) { + try { + var store = new app.data.ResultDataSourceInterface(); + this.outEl.append(new app.ui.ResultTable({ + width: this.outEl.width() - 23, + store: store + } ) ); + store.results(data); + } catch(e) { + this.errEl.text("Results Table Failed: " + e.message); + } + } + if(this.asJsonEl.attr("checked")) { + this.outEl.append(new ui.JsonPretty({ obj: data })); + } + if(this.cronEl.val() > 0) { + this.timer = window.setTimeout(function(){ + this._request_handler(); + }.bind(this), this.cronEl.val()); + } + this.prevData = data; + }, + _validateJson_handler: function( ev ) { + /* if the textarea is empty, we replace its value by an empty JSON object : "{}" and the request goes on as usual */ + var jsonData = this.dataEl.val().trim(); + var j; + if(jsonData === "") { + jsonData = "{}"; + this.dataEl.val( jsonData ); + } + try { + j = JSON.parse(jsonData); + } catch(e) { + this.errEl.text(e.message); + return false; + } + this.errEl.text(""); + if(this.prettyEl.attr("checked")) { + this.dataEl.val(JSON.stringify(j, null, " ")); + } + return true; + }, + _historyClick_handler: function( ev ) { + var item = $( ev.target ).closest( "LI" ).data( "item" ); + this.setHistoryItem( item ); + }, + _main_template: function() { + return { tag: "DIV", cls: "anyRequest", children: [ + { tag: "DIV", cls: "uiAnyRequest-request", children: [ + new app.ui.SidebarSection({ + open: false, + title: i18n.text("AnyRequest.History"), + body: { tag: "UL", onclick: this._historyClick_handler, cls: "uiAnyRequest-history", children: this.history.map(this._historyItem_template, this) } + }), + new app.ui.SidebarSection({ + open: true, + title: i18n.text("AnyRequest.Query"), + body: { tag: "DIV", children: [ + { tag: "INPUT", type: "text", name: "base_uri", value: this.config.cluster.config.base_uri }, + { tag: "BR" }, + { tag: "INPUT", type: "text", name: "path", value: this.config.path }, + { tag: "SELECT", name: "method", children: ["POST", "GET", "PUT", "HEAD", "DELETE"].map(ut.option_template) }, + { tag: "TEXTAREA", name: "body", rows: 20, text: JSON.stringify(this.config.query) }, + { tag: "BUTTON", css: { cssFloat: "right" }, type: "button", children: [ { tag: "B", text: i18n.text("AnyRequest.Request") } ], onclick: this._request_handler }, + { tag: "BUTTON", type: "button", text: i18n.text("AnyRequest.ValidateJSON"), onclick: this._validateJson_handler }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "pretty" }, i18n.text("AnyRequest.Pretty") ] }, + { tag: "DIV", cls: "uiAnyRequest-jsonErr" } + ]} + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.Transformer"), + help: "AnyRequest.TransformerHelp", + body: { tag: "DIV", children: [ + { tag: "CODE", text: "function(root, prev) {" }, + { tag: "BR" }, + { tag: "TEXTAREA", name: "transform", rows: 5, text: this.config.transform }, + { tag: "BR" }, + { tag: "CODE", text: "}" } + ] } + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.RepeatRequest"), + body: { tag: "DIV", children: [ + i18n.text("AnyRequest.RepeatRequestSelect"), " ", + { tag: "SELECT", name: "cron", children: [ + { value: 0, text: "do not repeat" }, + { value: 1000, text: "second" }, + { value: 1000 * 2, text: "2 seconds" }, + { value: 1000 * 5, text: "5 seconds" }, + { value: 1000 * 20, text: "20 seconds" }, + { value: 1000 * 60, text: "minute" }, + { value: 1000 * 60 * 10, text: "10 minutes" }, + { value: 1000 * 60 * 60, text: "hour" } + ].map(function(op) { return $.extend({ tag: "OPTION"}, op); }) } + ] } + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.DisplayOptions"), + help: "AnyRequest.DisplayOptionsHelp", + body: { tag: "DIV", children: [ + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", checked: true, name: "asJson" }, i18n.text("AnyRequest.AsJson") ] }, + { tag: "BR" }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "asGraph" }, i18n.text("AnyRequest.AsGraph") ] }, + { tag: "BR" }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "asTable" }, i18n.text("AnyRequest.AsTable") ] } + ] } + }) + ] }, + { tag: "DIV", cls: "uiAnyRequest-out" } + ] }; + }, + _historyItem_template: function(item) { + return { tag: "LI", cls: "booble", data: { item: item }, children: [ + { tag: "SPAN", text: item.path }, + " ", + { tag: "EM", text: item.query }, + " ", + { tag: "SPAN", text: item.transform } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n, this.Raphael ); + +(function( app, i18n, joey ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.NodesView = ui.AbstractWidget.extend({ + defaults: { + interactive: true, + aliasRenderer: "list", + scaleReplicas: 1, + cluster: null, + data: null + }, + init: function() { + this._super(); + this.interactive = this.config.interactive; + this.cluster = this.config.cluster; + this._aliasRenderFunction = { + "none": this._aliasRender_template_none, + "list": this._aliasRender_template_list, + "full": this._aliasRender_template_full + }[ this.config.aliasRenderer ]; + this._styleSheetEl = joey({ tag: "STYLE", text: ".uiNodesView-nullReplica, .uiNodesView-replica { zoom: " + this.config.scaleReplicas + " }" }); + this.el = $( this._main_template( this.config.data.cluster, this.config.data.indices ) ); + }, + + _newAliasAction_handler: function( index ) { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("AliasForm.AliasName"), name: "alias", require: true }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("AliasForm.NewAliasForIndexName", index.name), + body: new ui.PanelForm({ fields: fields }), + onCommit: function(panel, args) { + if(fields.validate()) { + var data = fields.getData(); + var command = { + "actions" : [ + { "add" : { "index" : index.name, "alias" : data["alias"] } } + ] + }; + this.config.cluster.post('_aliases', JSON.stringify(command), function(d) { + dialog.close(); + alert(JSON.stringify(d)); + this.fire("redraw"); + }.bind(this) ); + } + }.bind(this) + }).open(); + }, + _postIndexAction_handler: function(action, index, redraw) { + this.cluster.post(encodeURIComponent( index.name ) + "/" + encodeURIComponent( action ), null, function(r) { + alert(JSON.stringify(r)); + redraw && this.fire("redraw"); + }.bind(this)); + }, + _optimizeIndex_handler: function(index) { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("OptimizeForm.MaxSegments"), name: "max_num_segments", value: "1", require: true }), + new ui.CheckField({ label: i18n.text("OptimizeForm.ExpungeDeletes"), name: "only_expunge_deletes", value: false }), + new ui.CheckField({ label: i18n.text("OptimizeForm.FlushAfter"), name: "flush", value: true }), + new ui.CheckField({ label: i18n.text("OptimizeForm.WaitForMerge"), name: "wait_for_merge", value: false }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("OptimizeForm.OptimizeIndex", index.name), + body: new ui.PanelForm({ fields: fields }), + onCommit: function( panel, args ) { + if(fields.validate()) { + this.cluster.post(encodeURIComponent( index.name ) + "/_optimize", fields.getData(), function(r) { + alert(JSON.stringify(r)); + }); + dialog.close(); + } + }.bind(this) + }).open(); + }, + _testAnalyser_handler: function(index) { + this.cluster.get(encodeURIComponent( index.name ) + "/_analyze?text=" + encodeURIComponent( prompt( i18n.text("IndexCommand.TextToAnalyze") ) ), function(r) { + alert(JSON.stringify(r, true, " ")); + }); + }, + _deleteIndexAction_handler: function(index) { + if( prompt( i18n.text("AliasForm.DeleteAliasMessage", i18n.text("Command.DELETE"), index.name ) ) === i18n.text("Command.DELETE") ) { + this.cluster["delete"](encodeURIComponent( index.name ), null, function(r) { + alert(JSON.stringify(r)); + this.fire("redraw"); + }.bind(this) ); + } + }, + _shutdownNode_handler: function(node) { + if(prompt( i18n.text("IndexCommand.ShutdownMessage", i18n.text("Command.SHUTDOWN"), node.cluster.name ) ) === i18n.text("Command.SHUTDOWN") ) { + this.cluster.post( "_cluster/nodes/" + encodeURIComponent( node.name ) + "/_shutdown", null, function(r) { + alert(JSON.stringify(r)); + this.fire("redraw"); + }.bind(this)); + } + }, + _deleteAliasAction_handler: function( index, alias ) { + if( confirm( i18n.text("Command.DeleteAliasMessage" ) ) ) { + var command = { + "actions" : [ + { "remove" : { "index" : index.name, "alias" : alias.name } } + ] + }; + this.config.cluster.post('_aliases', JSON.stringify(command), function(d) { + alert(JSON.stringify(d)); + this.fire("redraw"); + }.bind(this) ); + } + }, + + _replica_template: function(replica) { + var r = replica.replica; + return { tag: "DIV", + cls: "uiNodesView-replica" + (r.primary ? " primary" : "") + ( " state-" + r.state ), + text: r.shard.toString(), + onclick: function() { new ui.JsonPanel({ + json: replica.status || r, + title: r.index + "/" + r.node + " [" + r.shard + "]" }); + } + }; + }, + _routing_template: function(routing) { + var cell = { tag: "TD", cls: "uiNodesView-routing" + (routing.open ? "" : " close"), children: [] }; + for(var i = 0; i < routing.replicas.length; i++) { + if(i % routing.max_number_of_shards === 0 && i > 0) { + cell.children.push({ tag: "BR" }); + } + if( routing.replicas[i] ) { + cell.children.push(this._replica_template(routing.replicas[i])); + } else { + cell.children.push( { tag: "DIV", cls: "uiNodesView-nullReplica" } ); + } + } + return cell; + }, + _nodeControls_template: function( node ) { return ( + { tag: "DIV", cls: "uiNodesView-controls", children: [ + new ui.MenuButton({ + label: i18n.text("NodeInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("NodeInfoMenu.ClusterNodeInfo"), onclick: function() { new ui.JsonPanel({ json: node.cluster, title: node.name });} }, + { text: i18n.text("NodeInfoMenu.NodeStats"), onclick: function() { new ui.JsonPanel({ json: node.stats, title: node.name });} } + ] + }) + }), + new ui.MenuButton({ + label: i18n.text("NodeActionsMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("NodeActionsMenu.Shutdown"), onclick: function() { this._shutdownNode_handler(node); }.bind(this) } + ] + }) + }) + ] } + ); }, + _nodeIcon_template: function( node ) { + var icon, alt; + if( node.name === "Unassigned" ) { + icon = "fa-exclamation-triangle"; + alt = i18n.text( "NodeType.Unassigned" ); + } else if( node.cluster.settings && "tribe" in node.cluster.settings) { + icon = "fa-sitemap"; + alt = i18n.text("NodeType.Tribe" ); + } else { + icon = "fa-" + (node.master_node ? "star" : "circle") + (node.data_node ? "" : "-o" ); + alt = i18n.text( node.master_node ? ( node.data_node ? "NodeType.Master" : "NodeType.Coord" ) : ( node.data_node ? "NodeType.Worker" : "NodeType.Client" ) ); + } + return { tag: "TD", title: alt, cls: "uiNodesView-icon", children: [ + { tag: "SPAN", cls: "fa fa-2x " + icon } + ] }; + }, + _node_template: function(node) { + return { tag: "TR", cls: "uiNodesView-node" + (node.master_node ? " master": ""), children: [ + this._nodeIcon_template( node ), + { tag: "TH", children: node.name === "Unassigned" ? [ + { tag: "H3", text: node.name } + ] : [ + { tag: "H3", text: node.cluster.name }, + { tag: "DIV", text: node.cluster.hostname }, + this.interactive ? this._nodeControls_template( node ) : null + ] } + ].concat(node.routings.map(this._routing_template, this))}; + }, + _indexHeaderControls_template: function( index ) { return ( + { tag: "DIV", cls: "uiNodesView-controls", children: [ + new ui.MenuButton({ + label: i18n.text("IndexInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("IndexInfoMenu.Status"), onclick: function() { new ui.JsonPanel({ json: index.status, title: index.name }); } }, + { text: i18n.text("IndexInfoMenu.Metadata"), onclick: function() { new ui.JsonPanel({ json: index.metadata, title: index.name }); } } + ] + }) + }), + new ui.MenuButton({ + label: i18n.text("IndexActionsMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("IndexActionsMenu.NewAlias"), onclick: function() { this._newAliasAction_handler(index); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Refresh"), onclick: function() { this._postIndexAction_handler("_refresh", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Flush"), onclick: function() { this._postIndexAction_handler("_flush", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Optimize"), onclick: function () { this._optimizeIndex_handler(index); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Snapshot"), disabled: closed, onclick: function() { this._postIndexAction_handler("_gateway/snapshot", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Analyser"), onclick: function() { this._testAnalyser_handler(index); }.bind(this) }, + { text: (index.state === "close") ? i18n.text("IndexActionsMenu.Open") : i18n.text("IndexActionsMenu.Close"), onclick: function() { this._postIndexAction_handler((index.state === "close") ? "_open" : "_close", index, true); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Delete"), onclick: function() { this._deleteIndexAction_handler(index); }.bind(this) } + ] + }) + }) + ] } + ); }, + _indexHeader_template: function( index ) { + var closed = index.state === "close"; + var line1 = closed ? "index: close" : ( "size: " + (index.status && index.status.primaries && index.status.total ? ut.byteSize_template( index.status.primaries.store.size_in_bytes ) + " (" + ut.byteSize_template( index.status.total.store.size_in_bytes ) + ")" : "unknown" ) ); + var line2 = closed ? "\u00A0" : ( "docs: " + (index.status && index.status.primaries && index.status.primaries.docs && index.status.total && index.status.total.docs ? index.status.primaries.docs.count.toLocaleString() + " (" + (index.status.total.docs.count + index.status.total.docs.deleted).toLocaleString() + ")" : "unknown" ) ); + return index.name ? { tag: "TH", cls: (closed ? "close" : ""), children: [ + { tag: "H3", text: index.name }, + { tag: "DIV", text: line1 }, + { tag: "DIV", text: line2 }, + this.interactive ? this._indexHeaderControls_template( index ) : null + ] } : [ { tag: "TD" }, { tag: "TH" } ]; + }, + _aliasRender_template_none: function( cluster, indices ) { + return null; + }, + _aliasRender_template_list: function( cluster, indices ) { + return cluster.aliases.length && { tag: "TBODY", children: [ + { tag: "TR", children: [ + { tag: "TD" } + ].concat( indices.map( function( index ) { + return { tag: "TD", children: index.metadata && index.metadata.aliases.map( function( alias ) { + return { tag: "LI", text: alias }; + } ) }; + })) } + ] }; + }, + _aliasRender_template_full: function( cluster, indices ) { + return cluster.aliases.length && { tag: "TBODY", children: cluster.aliases.map( function(alias, row) { + return { tag: "TR", children: [ { tag: "TD" },{ tag: "TD" } ].concat(alias.indices.map(function(index, i) { + if (index) { + return { + tag: "TD", + css: { background: "#" + "9ce9c7fc9".substr((row+6)%7,3) }, + cls: "uiNodesView-hasAlias" + ( alias.min === i ? " min" : "" ) + ( alias.max === i ? " max" : "" ), + text: alias.name, + children: this.interactive ? [ + { tag: 'SPAN', + text: i18n.text("General.CloseGlyph"), + cls: 'uiNodesView-hasAlias-remove', + onclick: this._deleteAliasAction_handler.bind( this, index, alias ) + } + ]: null + }; + } else { + return { tag: "TD" }; + } + }, this ) ) }; + }, this ) }; + }, + _main_template: function(cluster, indices) { + return { tag: "TABLE", cls: "table uiNodesView", children: [ + this._styleSheetEl, + { tag: "THEAD", children: [ { tag: "TR", children: indices.map(this._indexHeader_template, this) } ] }, + this._aliasRenderFunction( cluster, indices ), + { tag: "TBODY", children: cluster.nodes.map(this._node_template, this) } + ] }; + } + + }); + +})( this.app, this.i18n, this.joey ); + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var services = app.ns("services"); + + // ( master ) master = true, data = true + // ( coordinator ) master = true, data = false + // ( worker ) master = false, data = true; + // ( client ) master = false, data = false; + // http enabled ? + + function nodeSort_name(a, b) { + if (!(a.cluster && b.cluster)) { + return 0; + } + return a.cluster.name.toString().localeCompare( b.cluster.name.toString() ); + } + + function nodeSort_addr( a, b ) { + if (!(a.cluster && b.cluster)) { + return 0; + } + return a.cluster.transport_address.toString().localeCompare( b.cluster.transport_address.toString() ); + } + + function nodeSort_type( a, b ) { + if (!(a.cluster && b.cluster)) { + return 0; + } + if( a.master_node ) { + return -1; + } else if( b.master_node ) { + return 1; + } else if( a.data_node && !b.data_node ) { + return -1; + } else if( b.data_node && !a.data_node ) { + return 1; + } else { + return a.cluster.name.toString().localeCompare( b.cluster.name.toString() ); + } + } + + var NODE_SORT_TYPES = { + "Sort.ByName": nodeSort_name, + "Sort.ByAddress": nodeSort_addr, + "Sort.ByType": nodeSort_type + }; + + function nodeFilter_none( a ) { + return true; + } + + function nodeFilter_clients( a ) { + return (a.master_node || a.data_node ); + } + + + ui.ClusterOverview = ui.Page.extend({ + defaults: { + cluster: null // (reqired) an instanceof app.services.Cluster + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.prefs = services.Preferences.instance(); + this._clusterState = this.config.clusterState; + this._clusterState.on("data", this.draw_handler ); + this._refreshButton = new ui.RefreshButton({ + onRefresh: this.refresh.bind(this), + onChange: function( btn ) { + if( btn.value === -1 ) { + this.draw_handler(); + } + }.bind( this ) + }); + var nodeSortPref = this.prefs.get("clusterOverview-nodeSort") || Object.keys(NODE_SORT_TYPES)[0]; + this._nodeSort = NODE_SORT_TYPES[ nodeSortPref ]; + this._nodeSortMenu = new ui.MenuButton({ + label: i18n.text( "Preference.SortCluster" ), + menu: new ui.SelectMenuPanel({ + value: nodeSortPref, + items: Object.keys( NODE_SORT_TYPES ).map( function( k ) { + return { text: i18n.text( k ), value: k }; + }), + onSelect: function( panel, event ) { + this._nodeSort = NODE_SORT_TYPES[ event.value ]; + this.prefs.set("clusterOverview-nodeSort", event.value ); + this.draw_handler(); + }.bind(this) + }) + }); + this._indicesSort = this.prefs.get( "clusterOverview-indicesSort") || "desc"; + this._indicesSortMenu = new ui.MenuButton({ + label: i18n.text( "Preference.SortIndices" ), + menu: new ui.SelectMenuPanel({ + value: this._indicesSort, + items: [ + { value: "desc", text: i18n.text( "SortIndices.Descending" ) }, + { value: "asc", text: i18n.text( "SortIndices.Ascending" ) } ], + onSelect: function( panel, event ) { + this._indicesSort = event.value; + this.prefs.set( "clusterOverview-indicesSort", this._indicesSort ); + this.draw_handler(); + }.bind(this) + }) + }); + this._aliasRenderer = this.prefs.get( "clusterOverview-aliasRender" ) || "full"; + this._aliasMenu = new ui.MenuButton({ + label: i18n.text( "Preference.ViewAliases" ), + menu: new ui.SelectMenuPanel({ + value: this._aliasRenderer, + items: [ + { value: "full", text: i18n.text( "ViewAliases.Grouped" ) }, + { value: "list", text: i18n.text( "ViewAliases.List" ) }, + { value: "none", text: i18n.text( "ViewAliases.None" ) } ], + onSelect: function( panel, event ) { + this._aliasRenderer = event.value; + this.prefs.set( "clusterOverview-aliasRender", this._aliasRenderer ); + this.draw_handler(); + }.bind(this) + }) + }); + this._indexFilter = new ui.TextField({ + value: this.prefs.get("clusterOverview-indexFilter"), + placeholder: i18n.text( "Overview.IndexFilter" ), + onchange: function( indexFilter ) { + this.prefs.set("clusterOverview-indexFilter", indexFilter.val() ); + this.draw_handler(); + }.bind(this) + }); + this.el = $(this._main_template()); + this.tablEl = this.el.find(".uiClusterOverview-table"); + this.refresh(); + }, + remove: function() { + this._clusterState.removeObserver( "data", this.draw_handler ); + }, + refresh: function() { + this._refreshButton.disable(); + this._clusterState.refresh(); + }, + draw_handler: function() { + var data = this._clusterState; + var indexFilter; + try { + var indexFilterRe = new RegExp( this._indexFilter.val() ); + indexFilter = function(s) { return indexFilterRe.test(s); }; + } catch(e) { + indexFilter = function() { return true; }; + } + var clusterState = data.clusterState; + var status = data.status; + var nodeStats = data.nodeStats; + var clusterNodes = data.clusterNodes; + var nodes = []; + var indices = []; + var cluster = {}; + var nodeIndices = {}; + var indexIndices = {}, indexIndicesIndex = 0; + function newNode(n) { + return { + name: n, + routings: [], + master_node: clusterState.master_node === n + }; + } + function newIndex(i) { + return { + name: i, + replicas: [] + }; + } + function getIndexForNode(n) { + return nodeIndices[n] = (n in nodeIndices) ? nodeIndices[n] : nodes.push(newNode(n)) - 1; + } + function getIndexForIndex(routings, i) { + var index = indexIndices[i] = (i in indexIndices) ? + (routings[indexIndices[i]] = routings[indexIndices[i]] || newIndex(i)) && indexIndices[i] + : ( ( routings[indexIndicesIndex] = newIndex(i) ) && indexIndicesIndex++ ); + indices[index] = i; + return index; + } + $.each(clusterNodes.nodes, function(name, node) { + getIndexForNode(name); + }); + + var indexNames = []; + $.each(clusterState.routing_table.indices, function(name, index){ + indexNames.push(name); + }); + indexNames.sort(); + if (this._indicesSort === "desc") indexNames.reverse(); + indexNames.filter( indexFilter ).forEach(function(name) { + var indexObject = clusterState.routing_table.indices[name]; + $.each(indexObject.shards, function(name, shard) { + shard.forEach(function(replica){ + var node = replica.node; + if(node === null) { node = "Unassigned"; } + var index = replica.index; + var shard = replica.shard; + var routings = nodes[getIndexForNode(node)].routings; + var indexIndex = getIndexForIndex(routings, index); + var replicas = routings[indexIndex].replicas; + if(node === "Unassigned" || !indexObject.shards[shard]) { + replicas.push({ replica: replica }); + } else { + replicas[shard] = { + replica: replica, + status: indexObject.shards[shard].filter(function(replica) { + return replica.node === node; + })[0] + }; + } + }); + }); + }); + indices = indices.map(function(index){ + return { + name: index, + state: "open", + metadata: clusterState.metadata.indices[index], + status: status.indices[index] + }; + }, this); + $.each(clusterState.metadata.indices, function(name, index) { + if(index.state === "close" && indexFilter( name )) { + indices.push({ + name: name, + state: "close", + metadata: index, + status: null + }); + } + }); + nodes.forEach(function(node) { + node.stats = nodeStats.nodes[node.name]; + var cluster = clusterNodes.nodes[node.name]; + node.cluster = cluster || { name: "<unknown>" }; + node.data_node = !( cluster && cluster.attributes && cluster.attributes.data === "false" ); + for(var i = 0; i < indices.length; i++) { + node.routings[i] = node.routings[i] || { name: indices[i].name, replicas: [] }; + node.routings[i].max_number_of_shards = indices[i].metadata.settings["index.number_of_shards"]; + node.routings[i].open = indices[i].state === "open"; + } + }); + var aliasesIndex = {}; + var aliases = []; + var indexClone = indices.map(function() { return false; }); + $.each(clusterState.metadata.indices, function(name, index) { + index.aliases.forEach(function(alias) { + var aliasIndex = aliasesIndex[alias] = (alias in aliasesIndex) ? aliasesIndex[alias] : aliases.push( { name: alias, max: -1, min: 999, indices: [].concat(indexClone) }) - 1; + var indexIndex = indexIndices[name]; + var aliasRow = aliases[aliasIndex]; + aliasRow.min = Math.min(aliasRow.min, indexIndex); + aliasRow.max = Math.max(aliasRow.max, indexIndex); + aliasRow.indices[indexIndex] = indices[indexIndex]; + }); + }); + cluster.aliases = aliases; + cluster.nodes = nodes + .filter( nodeFilter_none ) + .sort( this._nodeSort ); + indices.unshift({ name: null }); + this._drawNodesView( cluster, indices ); + this._refreshButton.enable(); + }, + _drawNodesView: function( cluster, indices ) { + this._nodesView && this._nodesView.remove(); + this._nodesView = new ui.NodesView({ + onRedraw: function() { + this.refresh(); + }.bind(this), + interactive: ( this._refreshButton.value === -1 ), + aliasRenderer: this._aliasRenderer, + cluster: this.cluster, + data: { + cluster: cluster, + indices: indices + } + }); + this._nodesView.attach( this.tablEl ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiClusterOverview", children: [ + new ui.Toolbar({ + label: i18n.text("Overview.PageTitle"), + left: [ + this._nodeSortMenu, + this._indicesSortMenu, + this._aliasMenu, + this._indexFilter + ], + right: [ + this._refreshButton + ] + }), + { tag: "DIV", cls: "uiClusterOverview-table" } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( app, i18n, raphael ) { + + var ui = app.ns("ui"); + + ui.DateHistogram = ui.AbstractWidget.extend({ + defaults: { + printEl: null, // (optional) if supplied, clicking on elements in the histogram changes the query + cluster: null, // (required) + query: null, // (required) the current query + spec: null // (required) // date field spec + }, + init: function() { + this._super(); + this.el = $(this._main_template()); + this.query = this.config.query.clone(); + // check if the index/types have changed and rebuild the histogram + this.config.query.on("results", function(query) { + if(this.queryChanged) { + this.buildHistogram(query); + this.queryChanged = false; + } + }.bind(this)); + this.config.query.on("setIndex", function(query, params) { + this.query.setIndex(params.index, params.add); + this.queryChanged = true; + }.bind(this)); + this.config.query.on("setType", function(query, params) { + this.query.setType(params.type, params.add); + this.queryChanged = true; + }.bind(this)); + this.query.search.size = 0; + this.query.on("results", this._stat_handler); + this.query.on("results", this._aggs_handler); + this.buildHistogram(); + }, + buildHistogram: function(query) { + this.statAggs = this.query.addAggs({ + stats: { field: this.config.spec.field_name } + }); + this.query.query(); + this.query.removeAggs(this.statAggs); + }, + _stat_handler: function(query, results) { + if(! results.aggregations[this.statAggs]) { return; } + this.stats = results.aggregations[this.statAggs]; + // here we are calculating the approximate range that will give us less than 121 columns + var rangeNames = [ "year", "year", "month", "day", "hour", "minute" ]; + var rangeFactors = [100000, 12, 30, 24, 60, 60000 ]; + this.intervalRange = 1; + var range = this.stats.max - this.stats.min; + do { + this.intervalName = rangeNames.pop(); + var factor = rangeFactors.pop(); + this.intervalRange *= factor; + range = range / factor; + } while(range > 70); + this.dateAggs = this.query.addAggs({ + date_histogram : { + field: this.config.spec.field_name, + interval: this.intervalName + } + }); + this.query.query(); + this.query.removeAggs(this.dateAggs); + }, + _aggs_handler: function(query, results) { + if(! results.aggregations[this.dateAggs]) { return; } + var buckets = [], range = this.intervalRange; + var min = Math.floor(this.stats.min / range) * range; + var prec = [ "year", "month", "day", "hour", "minute", "second" ].indexOf(this.intervalName); + results.aggregations[this.dateAggs].buckets.forEach(function(entry) { + buckets[parseInt((entry.key - min) / range , 10)] = entry.doc_count; + }, this); + for(var i = 0; i < buckets.length; i++) { + buckets[i] = buckets[i] || 0; + } + this.el.removeClass("loading"); + var el = this.el.empty(); + var w = el.width(), h = el.height(); + var r = raphael(el[0], w, h ); + var printEl = this.config.printEl; + query = this.config.query; + r.g.barchart(0, 0, w, h, [buckets], { gutter: "0", vgutter: 0 }).hover( + function() { + this.flag = r.g.popup(this.bar.x, h - 5, this.value || "0").insertBefore(this); + }, function() { + this.flag.animate({opacity: 0}, 200, ">", function () {this.remove();}); + } + ).click(function() { + if(printEl) { + printEl.val(window.dateRangeParser.print(min + this.bar.index * range, prec)); + printEl.trigger("keyup"); + query.query(); + } + }); + }, + _main_template: function() { return ( + { tag: "DIV", cls: "uiDateHistogram loading", css: { height: "50px" }, children: [ + i18n.text("General.LoadingAggs") + ] } + ); } + }); + +})( this.app, this.i18n, this.Raphael ); +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var services = app.ns("services"); + + ui.ClusterConnect = ui.AbstractWidget.extend({ + defaults: { + cluster: null + }, + init: function() { + this._super(); + this.prefs = services.Preferences.instance(); + this.cluster = this.config.cluster; + this.el = $.joey(this._main_template()); + this.cluster.get( "", this._node_handler ); + }, + + _node_handler: function(data) { + if(data) { + this.prefs.set("app-base_uri", this.cluster.base_uri); + } + }, + + _reconnect_handler: function() { + var base_uri = this.el.find(".uiClusterConnect-uri").val(); + $("body").empty().append(new app.App("body", { id: "es", base_uri: base_uri })); + }, + + _main_template: function() { + return { tag: "SPAN", cls: "uiClusterConnect", children: [ + { tag: "INPUT", type: "text", cls: "uiClusterConnect-uri", onkeyup: function( ev ) { + if(ev.which === 13) { + ev.preventDefault(); + this._reconnect_handler(); + } + }.bind(this), id: this.id("baseUri"), value: this.cluster.base_uri }, + { tag: "BUTTON", type: "button", text: i18n.text("Header.Connect"), onclick: this._reconnect_handler } + ]}; + } + }); + +})( this.jQuery, this.app, this.i18n ); + + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var data = app.ns("data"); + + var StructuredQuery = ui.AbstractWidget.extend({ + defaults: { + cluster: null // (required) instanceof app.services.Cluster + }, + _baseCls: "uiStructuredQuery", + init: function(parent) { + this._super(); + this.selector = new ui.IndexSelector({ + onIndexChanged: this._indexChanged_handler, + cluster: this.config.cluster + }); + this.el = $(this._main_template()); + this.out = this.el.find("DIV.uiStructuredQuery-out"); + this.attach( parent ); + }, + + _indexChanged_handler: function( index ) { + this.filter && this.filter.remove(); + this.filter = new ui.FilterBrowser({ + cluster: this.config.cluster, + index: index, + onStartingSearch: function() { this.el.find("DIV.uiStructuredQuery-out").text( i18n.text("General.Searching") ); this.el.find("DIV.uiStructuredQuery-src").hide(); }.bind(this), + onSearchSource: this._searchSource_handler, + onResults: this._results_handler + }); + this.el.find(".uiStructuredQuery-body").append(this.filter); + }, + + _results_handler: function( filter, event ) { + var typeMap = { + "json": this._jsonResults_handler, + "table": this._tableResults_handler, + "csv": this._csvResults_handler + }; + typeMap[ event.type ].call( this, event.data, event.metadata ); + }, + _jsonResults_handler: function( results ) { + this.el.find("DIV.uiStructuredQuery-out").empty().append( new ui.JsonPretty({ obj: results })); + }, + _csvResults_handler: function( results ) { + this.el.find("DIV.uiStructuredQuery-out").empty().append( new ui.CSVTable({ results: results })); + }, + _tableResults_handler: function( results, metadata ) { + // hack up a QueryDataSourceInterface so that StructuredQuery keeps working without using a Query object + var qdi = new data.QueryDataSourceInterface({ metadata: metadata, query: new data.Query() }); + var tab = new ui.Table( { + store: qdi, + height: 400, + width: this.out.innerWidth() + } ).attach(this.out.empty()); + qdi._results_handler(qdi.config.query, results); + }, + + _showRawJSON : function() { + if($("#rawJsonText").length === 0) { + var hiddenButton = $("#showRawJSON"); + var jsonText = $({tag: "P", type: "p", id: "rawJsonText"}); + jsonText.text(hiddenButton[0].value); + hiddenButton.parent().append(jsonText); + } + }, + + _searchSource_handler: function(src) { + var searchSourceDiv = this.el.find("DIV.uiStructuredQuery-src"); + searchSourceDiv.empty().append(new app.ui.JsonPretty({ obj: src })); + if(typeof JSON !== "undefined") { + var showRawJSON = $({ tag: "BUTTON", type: "button", text: i18n.text("StructuredQuery.ShowRawJson"), id: "showRawJSON", value: JSON.stringify(src), onclick: this._showRawJSON }); + searchSourceDiv.append(showRawJSON); + } + searchSourceDiv.show(); + }, + + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: [ + this.selector, + { tag: "DIV", cls: "uiStructuredQuery-body" }, + { tag: "DIV", cls: "uiStructuredQuery-src", css: { display: "none" } }, + { tag: "DIV", cls: "uiStructuredQuery-out" } + ]}; + } + }); + + ui.StructuredQuery = ui.Page.extend({ + init: function() { + this.q = new StructuredQuery( this.config ); + this.el = this.q.el; + } + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var data = app.ns("data"); + var ut = app.ns("ut"); + + ui.FilterBrowser = ui.AbstractWidget.extend({ + defaults: { + cluster: null, // (required) instanceof app.services.Cluster + index: "" // (required) name of the index to query + }, + + init: function(parent) { + this._super(); + this._cluster = this.config.cluster; + this.el = $(this._main_template()); + this.filtersEl = this.el.find(".uiFilterBrowser-filters"); + this.attach( parent ); + new data.MetaDataFactory({ cluster: this._cluster, onReady: function(metadata, eventData) { + this.metadata = metadata; + this._createFilters_handler(eventData.originalData.metadata.indices); + }.bind(this) }); + }, + + _createFilters_handler: function(data) { + var filters = []; + function scan_properties(path, obj) { + if (obj.properties) { + for (var prop in obj.properties) { + scan_properties(path.concat(prop), obj.properties[prop]); + } + } else { + // handle multi_field + if (obj.fields) { + for (var subField in obj.fields) { + filters.push({ path: (path[path.length - 1] !== subField) ? path.concat(subField) : path, type: obj.fields[subField].type, meta: obj.fields[subField] }); + } + } else { + filters.push({ path: path, type: obj.type, meta: obj }); + } + } + } + for(var type in data[this.config.index].mappings) { + scan_properties([type], data[this.config.index].mappings[type]); + } + + filters.sort( function(a, b) { + var x = a.path.join("."); + var y = b.path.join("."); + return (x < y) ? -1 : (x > y) ? 1 : 0; + }); + + this.filters = [ + { path: ["match_all"], type: "match_all", meta: {} }, + { path: ["_all"], type: "_all", meta: {}} + ].concat(filters); + + this._addFilterRow_handler(); + }, + + _addFilterRow_handler: function() { + this.filtersEl.append(this._filter_template()); + }, + + _removeFilterRow_handler: function(jEv) { + $(jEv.target).closest("DIV.uiFilterBrowser-row").remove(); + if(this.filtersEl.children().length === 0) { + this._addFilterRow_handler(); + } + }, + + _search_handler: function() { + var search = new data.BoolQuery(); + search.setSize( this.el.find(".uiFilterBrowser-outputSize").val() ) + this.fire("startingSearch"); + this.filtersEl.find(".uiFilterBrowser-row").each(function(i, row) { + row = $(row); + var bool = row.find(".bool").val(); + var field = row.find(".field").val(); + var op = row.find(".op").val(); + var value = {}; + if(field === "match_all") { + op = "match_all"; + } else if(op === "range") { + var lowqual = row.find(".lowqual").val(), + highqual = row.find(".highqual").val(); + if(lowqual.length) { + value[row.find(".lowop").val()] = lowqual; + } + if(highqual.length) { + value[row.find(".highop").val()] = highqual; + } + } else if(op === "fuzzy") { + var qual = row.find(".qual").val(), + fuzzyqual = row.find(".fuzzyqual").val(); + if(qual.length) { + value["value"] = qual; + } + if(fuzzyqual.length) { + value[row.find(".fuzzyop").val()] = fuzzyqual; + } + } else { + value = row.find(".qual").val(); + } + search.addClause(value, field, op, bool); + }); + if(this.el.find(".uiFilterBrowser-showSrc").attr("checked")) { + this.fire("searchSource", search.search); + } + this._cluster.post( this.config.index + "/_search", search.getData(), this._results_handler ); + }, + + _results_handler: function( data ) { + var type = this.el.find(".uiFilterBrowser-outputFormat").val(); + this.fire("results", this, { type: type, data: data, metadata: this.metadata }); + }, + + _changeQueryField_handler: function(jEv) { + var select = $(jEv.target); + var spec = select.children(":selected").data("spec"); + select.siblings().remove(".op,.qual,.range,.fuzzy"); + var ops = []; + if(spec.type === 'match_all') { + } else if(spec.type === '_all') { + ops = ["query_string"]; + } else if(spec.type === 'string' || spec.type === 'text' || spec.type === 'keyword') { + ops = ["term", "wildcard", "prefix", "fuzzy", "range", "query_string", "text", "missing"]; + } else if(spec.type === 'long' || spec.type === 'integer' || spec.type === 'float' || + spec.type === 'byte' || spec.type === 'short' || spec.type === 'double') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'date') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'geo_point') { + ops = ["missing"]; + } else if(spec.type === 'ip') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'boolean') { + ops = ["term"] + } + select.after({ tag: "SELECT", cls: "op", onchange: this._changeQueryOp_handler, children: ops.map(ut.option_template) }); + select.next().change(); + }, + + _changeQueryOp_handler: function(jEv) { + var op = $(jEv.target), opv = op.val(); + op.siblings().remove(".qual,.range,.fuzzy"); + if(opv === 'term' || opv === 'wildcard' || opv === 'prefix' || opv === "query_string" || opv === 'text') { + op.after({ tag: "INPUT", cls: "qual", type: "text" }); + } else if(opv === 'range') { + op.after(this._range_template()); + } else if(opv === 'fuzzy') { + op.after(this._fuzzy_template()); + } + }, + + _main_template: function() { + return { tag: "DIV", children: [ + { tag: "DIV", cls: "uiFilterBrowser-filters" }, + { tag: "BUTTON", type: "button", text: i18n.text("General.Search"), onclick: this._search_handler }, + { tag: "LABEL", children: + i18n.complex("FilterBrowser.OutputType", { tag: "SELECT", cls: "uiFilterBrowser-outputFormat", children: [ + { text: i18n.text("Output.Table"), value: "table" }, + { text: i18n.text("Output.JSON"), value: "json" }, + { text: i18n.text("Output.CSV"), value: "csv" } + ].map(function( o ) { return $.extend({ tag: "OPTION" }, o ); } ) } ) + }, + { tag: "LABEL", children: + i18n.complex("FilterBrowser.OutputSize", { tag: "SELECT", cls: "uiFilterBrowser-outputSize", + children: [ "10", "50", "250", "1000", "5000", "25000" ].map( ut.option_template ) + } ) + }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", cls: "uiFilterBrowser-showSrc" }, i18n.text("Output.ShowSource") ] } + ]}; + }, + + _filter_template: function() { + return { tag: "DIV", cls: "uiFilterBrowser-row", children: [ + { tag: "SELECT", cls: "bool", children: ["must", "must_not", "should"].map(ut.option_template) }, + { tag: "SELECT", cls: "field", onchange: this._changeQueryField_handler, children: this.filters.map(function(f) { + return { tag: "OPTION", data: { spec: f }, value: f.path.join("."), text: f.path.join(".") }; + })}, + { tag: "BUTTON", type: "button", text: "+", onclick: this._addFilterRow_handler }, + { tag: "BUTTON", type: "button", text: "-", onclick: this._removeFilterRow_handler } + ]}; + }, + + _range_template: function() { + return { tag: "SPAN", cls: "range", children: [ + { tag: "SELECT", cls: "lowop", children: ["gt", "gte"].map(ut.option_template) }, + { tag: "INPUT", type: "text", cls: "lowqual" }, + { tag: "SELECT", cls: "highop", children: ["lt", "lte"].map(ut.option_template) }, + { tag: "INPUT", type: "text", cls: "highqual" } + ]}; + }, + + _fuzzy_template: function() { + return { tag: "SPAN", cls: "fuzzy", children: [ + { tag: "INPUT", cls: "qual", type: "text" }, + { tag: "SELECT", cls: "fuzzyop", children: ["max_expansions", "min_similarity"].map(ut.option_template) }, + { tag: "INPUT", cls: "fuzzyqual", type: "text" } + ]}; + } + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.IndexSelector = ui.AbstractWidget.extend({ + init: function(parent) { + this._super(); + this.el = $(this._main_template()); + this.attach( parent ); + this.cluster = this.config.cluster; + this.update(); + }, + update: function() { + this.cluster.get( "_stats", this._update_handler ); + }, + + _update_handler: function(data) { + var options = []; + var index_names = Object.keys(data.indices).sort(); + for(var i=0; i < index_names.length; i++) { + name = index_names[i]; + options.push(this._option_template(name, data.indices[name])); + } + this.el.find(".uiIndexSelector-select").empty().append(this._select_template(options)); + this._indexChanged_handler(); + }, + + _main_template: function() { + return { tag: "DIV", cls: "uiIndexSelector", children: i18n.complex( "IndexSelector.SearchIndexForDocs", { tag: "SPAN", cls: "uiIndexSelector-select" } ) }; + }, + + _indexChanged_handler: function() { + this.fire("indexChanged", this.el.find("SELECT").val()); + }, + + _select_template: function(options) { + return { tag: "SELECT", children: options, onChange: this._indexChanged_handler }; + }, + + _option_template: function(name, index) { + return { tag: "OPTION", value: name, text: i18n.text("IndexSelector.NameWithDocs", name, index.primaries.docs.count ) }; + } + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.Header = ui.AbstractWidget.extend({ + defaults: { + cluster: null, + clusterState: null + }, + _baseCls: "uiHeader", + init: function() { + this._clusterConnect = new ui.ClusterConnect({ + cluster: this.config.cluster + }); + var quicks = [ + { text: i18n.text("Nav.Info"), path: "" }, + { text: i18n.text("Nav.Status"), path: "_stats" }, + { text: i18n.text("Nav.NodeStats"), path: "_nodes/stats" }, + { text: i18n.text("Nav.ClusterNodes"), path: "_nodes" }, + { text: i18n.text("Nav.Plugins"), path: "_nodes/plugins" }, + { text: i18n.text("Nav.ClusterState"), path: "_cluster/state" }, + { text: i18n.text("Nav.ClusterHealth"), path: "_cluster/health" }, + { text: i18n.text("Nav.Templates"), path: "_template" } + ]; + var cluster = this.config.cluster; + var quickPanels = {}; + var menuItems = quicks.map( function( item ) { + return { text: item.text, onclick: function() { + cluster.get( item.path, function( data ) { + quickPanels[ item.path ] && quickPanels[ item.path ].el && quickPanels[ item.path ].remove(); + quickPanels[ item.path ] = new ui.JsonPanel({ + title: item.text, + json: data + }); + } ); + } }; + }, this ); + this._quickMenu = new ui.MenuButton({ + label: i18n.text("NodeInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: menuItems + }) + }); + this.el = $.joey( this._main_template() ); + this.nameEl = this.el.find(".uiHeader-name"); + this.statEl = this.el.find(".uiHeader-status"); + this._clusterState = this.config.clusterState; + this._clusterState.on("data", function( state ) { + var shards = state.status._shards; + var colour = state.clusterHealth.status; + var name = state.clusterState.cluster_name; + this.nameEl.text( name ); + this.statEl + .text( i18n.text("Header.ClusterHealth", colour, shards.successful, shards.total ) ) + .css( "background", colour ); + }.bind(this)); + this.statEl.text( i18n.text("Header.ClusterNotConnected") ).css("background", "grey"); + this._clusterState.refresh(); + }, + _main_template: function() { return ( + { tag: "DIV", cls: this._baseCls, children: [ + this._clusterConnect, + { tag: "SPAN", cls: "uiHeader-name" }, + { tag: "SPAN", cls: "uiHeader-status" }, + { tag: "H1", text: i18n.text("General.Elasticsearch") }, + { tag: "SPAN", cls: "pull-right", children: [ + this._quickMenu + ] } + ] } + ); } + } ); + +})( this.jQuery, this.app, this.i18n ); + +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.IndexOverview = ui.Page.extend({ + defaults: { + cluster: null + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this._clusterState = this.config.clusterState; + this._clusterState.on("data", this._refresh_handler ); + this.el = $(this._main_template()); + this._refresh_handler(); + }, + remove: function() { + this._clusterState.removeObserver( "data", this._refresh_handler ); + }, + _refresh_handler: function() { + var state = this._clusterState; + var view = { + indices: acx.eachMap( state.status.indices, function( name, index ) { + return { + name: name, + state: index + }; + }).sort( function( a, b ) { + return a.name < b.name ? -1 : 1; + }) + }; + this._indexViewEl && this._indexViewEl.remove(); + this._indexViewEl = $( this._indexTable_template( view ) ); + this.el.find(".uiIndexOverview-table").append( this._indexViewEl ); + }, + _newIndex_handler: function() { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("ClusterOverView.IndexName"), name: "_name", require: true }), + new ui.TextField({ + label: i18n.text("ClusterOverview.NumShards"), + name: "number_of_shards", + value: "5", + require: function( val ) { return parseInt( val, 10 ) >= 1; } + }), + new ui.TextField({ + label: i18n.text("ClusterOverview.NumReplicas"), + name: "number_of_replicas", + value: "1", + require: function( val ) { return parseInt( val, 10 ) >= 0; } + }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("ClusterOverview.NewIndex"), + body: new ui.PanelForm({ fields: fields }), + onCommit: function(panel, args) { + if(fields.validate()) { + var data = fields.getData(); + var name = data["_name"]; + delete data["_name"]; + this.config.cluster.put( encodeURIComponent( name ), JSON.stringify({ settings: { index: data } }), function(d) { + dialog.close(); + alert(JSON.stringify(d)); + this._clusterState.refresh(); + }.bind(this) ); + } + }.bind(this) + }).open(); + }, + _indexTable_template: function( view ) { return ( + { tag: "TABLE", cls: "table", children: [ + { tag: "THEAD", children: [ + { tag: "TR", children: [ + { tag: "TH" }, + { tag: "TH", children: [ + { tag: "H3", text: "Size" } + ] }, + { tag: "TH", children: [ + { tag: "H3", text: "Docs" } + ] } + ] } + ] }, + { tag: "TBODY", cls: "striped", children: view.indices.map( this._index_template, this ) } + ] } + ); }, + + _index_template: function( index ) { return ( + { tag: "TR", children: [ + { tag: "TD", children: [ + { tag: "H3", text: index.name } + ] }, + { tag: "TD", text: ut.byteSize_template( index.state.primaries.store.size_in_bytes ) + "/" + ut.byteSize_template( index.state.total.store.size_in_bytes ) }, + { tag: "TD", text: ut.count_template( index.state.primaries.docs.count ) } + ] } + ); }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiIndexOverview", children: [ + new ui.Toolbar({ + label: i18n.text("IndexOverview.PageTitle"), + left: [ + new ui.Button({ + label: i18n.text("ClusterOverview.NewIndex"), + onclick: this._newIndex_handler + }), + ] + }), + { tag: "DIV", cls: "uiIndexOverview-table", children: this._indexViewEl } + ] }; + } + + }); + +})( this.jQuery, this.app, this.i18n ); + +(function( app, i18n ) { + + var ui = app.ns("ui"); + var services = app.ns("services"); + + app.App = ui.AbstractWidget.extend({ + defaults: { + base_uri: null + }, + init: function(parent) { + this._super(); + this.prefs = services.Preferences.instance(); + this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200"; + if( this.base_uri.charAt( this.base_uri.length - 1 ) !== "/" ) { + // XHR request fails if the URL is not ending with a "/" + this.base_uri += "/"; + } + if( this.config.auth_user ) { + var credentials = window.btoa( this.config.auth_user + ":" + this.config.auth_password ); + $.ajaxSetup({ + headers: { + "Authorization": "Basic " + credentials + } + }); + } + this.cluster = new services.Cluster({ base_uri: this.base_uri }); + this._clusterState = new services.ClusterState({ + cluster: this.cluster + }); + + this._header = new ui.Header({ cluster: this.cluster, clusterState: this._clusterState }); + this.$body = $.joey( this._body_template() ); + this.el = $.joey(this._main_template()); + this.attach( parent ); + this.instances = {}; + this.el.find(".uiApp-headerMenuItem:first").click(); + if( this.config.dashboard ) { + if( this.config.dashboard === "cluster" ) { + var page = this.instances["ClusterOverview"]; + page._refreshButton.set( 5000 ); + } + } + }, + + navigateTo: function( type, config, ev ) { + if( ev.target.classList.contains( "uiApp-headerNewMenuItem" ) ) { + this.showNew( type, config, ev ); + } else { + var ref = type + "0"; + if(! this.instances[ ref ]) { + this.createPage( type, 0, config ); + } + this.show( ref, ev ); + } + }, + + createPage: function( type, id, config ) { + var page = this.instances[ type + id ] = new ui[ type ]( config ); + this.$body.append( page ); + return page; + }, + + show: function( ref, ev ) { + $( ev.target ).closest("DIV.uiApp-headerMenuItem").addClass("active").siblings().removeClass("active"); + for(var p in this.instances) { + this.instances[p][ p === ref ? "show" : "hide" ](); + } + }, + + showNew: function( type, config, jEv ) { + var ref, page, $tab, + type_index = 0; + + while ( ! page ) { + ref = type + ( ++type_index ); + if (! ( ref in this.instances ) ) { + page = this.createPage( type, type_index, config ); + } + } + + // Add the tab and its click handlers + $tab = $.joey({ + tag: "DIV", + cls: "uiApp-headerMenuItem pull-left", + text: i18n.text("Nav." + type ) + " " + type_index, + onclick: function( ev ) { this.show( ref, ev ); }.bind(this), + children: [ + { tag: "A", text: " [-]", onclick: function (ev) { + $tab.remove(); + page.remove(); + delete this.instances[ ref ]; + }.bind(this) } + ] + }); + + $('.uiApp-headerMenu').append( $tab ); + $tab.trigger("click"); + }, + + _openAnyRequest_handler: function(ev) { this.navigateTo("AnyRequest", { cluster: this.cluster }, ev ); }, + _openStructuredQuery_handler: function(ev) { this.navigateTo("StructuredQuery", { cluster: this.cluster }, ev ); }, + _openBrowser_handler: function(ev) { this.navigateTo("Browser", { cluster: this.cluster }, ev ); }, + _openClusterOverview_handler: function(ev) { this.navigateTo("ClusterOverview", { cluster: this.cluster, clusterState: this._clusterState }, ev ); }, + _openIndexOverview_handler: function(ev) { this.navigateTo("IndexOverview", { cluster: this.cluster, clusterState: this._clusterState }, ev ); }, + + _body_template: function() { return ( + { tag: "DIV", id: this.id("body"), cls: "uiApp-body" } + ); }, + + _main_template: function() { + return { tag: "DIV", cls: "uiApp", children: [ + { tag: "DIV", id: this.id("header"), cls: "uiApp-header", children: [ + this._header, + { tag: "DIV", cls: "uiApp-headerMenu", children: [ + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.Overview"), onclick: this._openClusterOverview_handler }, + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.Indices"), onclick: this._openIndexOverview_handler }, + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.Browser"), onclick: this._openBrowser_handler }, + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.StructuredQuery"), onclick: this._openStructuredQuery_handler, children: [ + { tag: "A", cls: "uiApp-headerNewMenuItem ", text: ' [+]' } + ] }, + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.AnyRequest"), onclick: this._openAnyRequest_handler, children: [ + { tag: "A", cls: "uiApp-headerNewMenuItem ", text: ' [+]' } + ] }, + ]} + ]}, + this.$body + ]}; + } + + }); + +})( this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/favicon.png b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/favicon.png Binary files differnew file mode 100644 index 000000000..f433ec6d0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/favicon.png diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/loading.gif b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/loading.gif Binary files differnew file mode 100644 index 000000000..f001e23f7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/loading.gif diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/reset.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/reset.css new file mode 100644 index 000000000..29a5f1b69 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/base/reset.css @@ -0,0 +1,44 @@ +BODY { + font-family: Verdana, sans-serif; + font-size: 73%; + padding: 0; + margin: 0; +} + +INPUT, SELECT, TEXTAREA { + border: 1px solid #cecece; + padding: 1px 3px; + background: white; +} + +SELECT { + padding: 0; +} + +.saf SELECT { + margin-top: 0; + margin-bottom: 0; +} + +TEXTAREA, CODE { + font-family: monospace; + font-size: 13px; +} + +BUTTON::-moz-focus-inner { + border: none; +} + +.pull-left { + float: left; +} + +.pull-right { + float: right; +} + +.loading { + background-image: url(loading.gif); + background-repeat: no-repeat; + text-indent: 20px; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/FontAwesome.otf b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/FontAwesome.otf Binary files differnew file mode 100644 index 000000000..8b0f54e47 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/FontAwesome.otf diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.eot b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.eot Binary files differnew file mode 100644 index 000000000..7c79c6a6b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.eot diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.svg b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..45fdf3383 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.svg @@ -0,0 +1,414 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="fontawesomeregular" horiz-adv-x="1536" > +<font-face units-per-em="1792" ascent="1536" descent="-256" /> +<missing-glyph horiz-adv-x="448" /> +<glyph unicode=" " horiz-adv-x="448" /> +<glyph unicode="	" horiz-adv-x="448" /> +<glyph unicode=" " horiz-adv-x="448" /> +<glyph unicode="¨" horiz-adv-x="1792" /> +<glyph unicode="©" horiz-adv-x="1792" /> +<glyph unicode="®" horiz-adv-x="1792" /> +<glyph unicode="´" horiz-adv-x="1792" /> +<glyph unicode="Æ" horiz-adv-x="1792" /> +<glyph unicode=" " horiz-adv-x="768" /> +<glyph unicode=" " /> +<glyph unicode=" " horiz-adv-x="768" /> +<glyph unicode=" " /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode=" " horiz-adv-x="256" /> +<glyph unicode=" " horiz-adv-x="256" /> +<glyph unicode=" " horiz-adv-x="192" /> +<glyph unicode=" " horiz-adv-x="307" /> +<glyph unicode=" " horiz-adv-x="85" /> +<glyph unicode=" " horiz-adv-x="307" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode="™" horiz-adv-x="1792" /> +<glyph unicode="∞" horiz-adv-x="1792" /> +<glyph unicode="≠" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> +<glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> +<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " /> +<glyph unicode="" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> +<glyph unicode="" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" /> +<glyph unicode="" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> +<glyph unicode="" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" /> +<glyph unicode="" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> +<glyph unicode="" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> +<glyph unicode="" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> +<glyph unicode="" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" /> +<glyph unicode="" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" /> +<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" /> +<glyph unicode="" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" /> +<glyph unicode="" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" /> +<glyph unicode="" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> +<glyph unicode="" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> +<glyph unicode="" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> +<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> +<glyph unicode="" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" /> +<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> +<glyph unicode="" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> +<glyph unicode="" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" /> +<glyph unicode="" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> +<glyph unicode="" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> +<glyph unicode="" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> +<glyph unicode="" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> +<glyph unicode="" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " /> +<glyph unicode="" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> +<glyph unicode="" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> +<glyph unicode="" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> +<glyph unicode="" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" /> +<glyph unicode="" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> +<glyph unicode="" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> +<glyph unicode="" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> +<glyph unicode="" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> +<glyph unicode="" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" /> +<glyph unicode="" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" /> +<glyph unicode="" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> +<glyph unicode="" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" /> +<glyph unicode="" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> +<glyph unicode="" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> +<glyph unicode="" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> +<glyph unicode="" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " /> +<glyph unicode="" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " /> +<glyph unicode="" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> +<glyph unicode="" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" /> +<glyph unicode="" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> +<glyph unicode="" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> +<glyph unicode="" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> +<glyph unicode="" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> +<glyph unicode="" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" /> +<glyph unicode="" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" /> +<glyph unicode="" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> +<glyph unicode="" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> +<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> +<glyph unicode="" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" /> +<glyph unicode="" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> +<glyph unicode="" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" /> +<glyph unicode="" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> +<glyph unicode="" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> +<glyph unicode="" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" /> +<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> +<glyph unicode="" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> +<glyph unicode="" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> +<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" /> +<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" /> +<glyph unicode="" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> +<glyph unicode="" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> +<glyph unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> +<glyph unicode="" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> +<glyph unicode="" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" /> +<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> +<glyph unicode="" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> +<glyph unicode="" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" /> +<glyph unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> +<glyph unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" /> +<glyph unicode="" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> +<glyph unicode="" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> +<glyph unicode="" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> +<glyph unicode="" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> +<glyph unicode="" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" /> +<glyph unicode="" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" /> +<glyph unicode="" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> +<glyph unicode="" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" /> +<glyph unicode="" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> +<glyph unicode="" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> +<glyph unicode="" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " /> +<glyph unicode="" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> +<glyph unicode="" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> +<glyph unicode="" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> +<glyph unicode="" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> +<glyph unicode="" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> +<glyph unicode="" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" /> +<glyph unicode="" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> +<glyph unicode="" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> +<glyph unicode="" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " /> +<glyph unicode="" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> +<glyph unicode="" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +</font> +</defs></svg>
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.ttf b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.ttf Binary files differnew file mode 100644 index 000000000..e89738de5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.ttf diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.woff b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.woff Binary files differnew file mode 100644 index 000000000..8c1748aab --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/fonts/fontawesome-webfont.woff diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/i18n.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/i18n.js new file mode 100644 index 000000000..de0fc5178 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/i18n.js @@ -0,0 +1,93 @@ +(function() { + /** + * provides text formatting and i18n key storage features<br> + * implements most of the Sun Java MessageFormat functionality. + * @see <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html" target="sun">Sun's Documentation</a> + */ + + var keys = {}; + + var format = function(message, args) { + var substitute = function() { + var format = arguments[1].split(','); + var substr = escape(args[format.shift()]); + if(format.length === 0) { + return substr; // simple substitution eg {0} + } + switch(format.shift()) { + case "number" : return (new Number(substr)).toLocaleString(); + case "date" : return (new Date(+substr)).toLocaleDateString(); // date and time require milliseconds since epoch + case "time" : return (new Date(+substr)).toLocaleTimeString(); // eg i18n.text("Key", +(new Date())); for current time + } + var styles = format.join("").split("|").map(function(style) { + return style.match(/(-?[\.\d]+)(#|<)([^{}]*)/); + }); + var match = styles[0][3]; + for(var i=0; i<styles.length; i++) { + if((styles[i][2] === "#" && (+styles[i][1]) === (+substr)) || + (styles[i][2] === "<" && ((+styles[i][1]) < (+substr)))) { + match = styles[i][3]; + } + } + return match; + }; + + return message && message.replace(/'(')|'([^']+)'|([^{']+)|([^']+)/g, function(x, sq, qs, ss, sub) { + do {} while(sub && (sub !== (sub = (sub.replace(/\{([^{}]+)\}/, substitute))))); + return sq || qs || ss || unescape(sub); + }); + }; + + this.i18n = { + + setKeys: function(strings) { + for(var key in strings) { + keys[key] = strings[key]; + } + }, + + text: function() { + var args = Array.prototype.slice.call(arguments), + key = keys[args.shift()]; + if(args.length === 0) { + return key; + } + return format(key, args); + }, + + complex: function() { + var args = Array.prototype.slice.call(arguments), + key = keys[args.shift()], + ret = [], + replacer = function(x, pt, sub) { ret.push(pt || args[+sub]); return ""; }; + do {} while(key && key !== (key = key.replace(/([^{]+)|\{(\d+)\}/, replacer ))); + return ret; + } + + }; + +})(); + +(function() { + var nav = window.navigator; + var userLang = ( nav.languages && nav.languages[0] ) || nav.language || nav.userLanguage; + var scripts = document.getElementsByTagName('script'); + var data = scripts[ scripts.length - 1].dataset; + if( ! data["langs"] ) { + return; + } + var langs = data["langs"].split(/\s*,\s*/); + var script0 = scripts[0]; + function install( lang ) { + var s = document.createElement("script"); + s.src = data["basedir"] + "/" + lang + '_strings.js'; + s.async = false; + script0.parentNode.appendChild(s); + script0 = s; + } + + install( langs.shift() ); // always install primary language + userLang && langs + .filter( function( lang ) { return userLang.indexOf( lang ) === 0; } ) + .forEach( install ); +}()); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/index.html b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/index.html new file mode 100644 index 000000000..4e07bab0b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/index.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> + +<html> + <head> + <meta charset="UTF-8"> + <title>elasticsearch-head</title> + <link rel="stylesheet" href="base/reset.css"> + <link rel="stylesheet" href="vendor.css"> + <link rel="stylesheet" href="app.css"> + <script src="i18n.js" data-baseDir="lang" data-langs="en,fr,pt,zh,tr"></script> + <script src="vendor.js"></script> + <script src="app.js"></script> + <script> + window.onload = function() { + if(location.href.contains("/_plugin/")) { + var base_uri = location.href.replace(/_plugin\/.*/, ''); + } + var args = location.search.substring(1).split("&").reduce(function(r, p) { + r[decodeURIComponent(p.split("=")[0])] = decodeURIComponent(p.split("=")[1]); return r; + }, {}); + new app.App("body", { + id: "es", + base_uri: args["base_uri"] || base_uri, + auth_user : args["auth_user"] || "", + auth_password : args["auth_password"], + dashboard: args["dashboard"] + }); + }; + </script> + <link rel="icon" href="base/favicon.png" type="image/png"> + </head> + <body></body> +</html> diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/en_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/en_strings.js new file mode 100644 index 000000000..3679dfbbc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/en_strings.js @@ -0,0 +1,177 @@ +i18n.setKeys({ + "General.Elasticsearch": "Elasticsearch", + "General.LoadingAggs": "Loading Aggregations...", + "General.Searching": "Searching...", + "General.Search": "Search", + "General.Help": "Help", + "General.HelpGlyph": "?", + "General.CloseGlyph": "X", + "General.RefreshResults": "Refresh", + "General.ManualRefresh": "Manual Refresh", + "General.RefreshQuickly": "Refresh quickly", + "General.Refresh5seconds": "Refresh every 5 seconds", + "General.Refresh1minute": "Refresh every minute", + "AliasForm.AliasName": "Alias Name", + "AliasForm.NewAliasForIndex": "New Alias for {0}", + "AliasForm.DeleteAliasMessage": "type ''{0}'' to delete {1}. There is no undo", + "AnyRequest.DisplayOptions" : "Display Options", + "AnyRequest.AsGraph" : "Graph Results", + "AnyRequest.AsJson" : "Show Raw JSON", + "AnyRequest.AsTable" : "Show Search Results Table", + "AnyRequest.History" : "History", + "AnyRequest.RepeatRequest" : "Repeat Request", + "AnyRequest.RepeatRequestSelect" : "Repeat request every ", + "AnyRequest.Transformer" : "Result Transformer", + "AnyRequest.Pretty": "Pretty", + "AnyRequest.Query" : "Query", + "AnyRequest.Request": "Request", + "AnyRequest.Requesting": "Requesting...", + "AnyRequest.ValidateJSON": "Validate JSON", + "Browser.Title": "Browser", + "Browser.ResultSourcePanelTitle": "Result Source", + "Command.DELETE": "DELETE", + "Command.SHUTDOWN": "SHUTDOWN", + "Command.DeleteAliasMessage": "Delete Alias?", + "ClusterOverView.IndexName": "Index Name", + "ClusterOverview.NumShards": "Number of Shards", + "ClusterOverview.NumReplicas": "Number of Replicas", + "ClusterOverview.NewIndex": "New Index", + "IndexActionsMenu.Title": "Actions", + "IndexActionsMenu.NewAlias": "New Alias...", + "IndexActionsMenu.Refresh": "Refresh", + "IndexActionsMenu.Flush": "Flush", + "IndexActionsMenu.Optimize": "Optimize...", + "IndexActionsMenu.Snapshot": "Gateway Snapshot", + "IndexActionsMenu.Analyser": "Test Analyser", + "IndexActionsMenu.Open": "Open", + "IndexActionsMenu.Close": "Close", + "IndexActionsMenu.Delete": "Delete...", + "IndexInfoMenu.Title": "Info", + "IndexInfoMenu.Status": "Index Status", + "IndexInfoMenu.Metadata": "Index Metadata", + "IndexCommand.TextToAnalyze": "Text to Analyse", + "IndexCommand.ShutdownMessage": "type ''{0}'' to shutdown {1}. Node can NOT be restarted from this interface", + "IndexOverview.PageTitle": "Indices Overview", + "IndexSelector.NameWithDocs": "{0} ({1} docs)", + "IndexSelector.SearchIndexForDocs": "Search {0} for documents where:", + "FilterBrowser.OutputType": "Output Results: {0}", + "FilterBrowser.OutputSize": "Number of Results: {0}", + "Header.ClusterHealth": "cluster health: {0} ({1} of {2})", + "Header.ClusterNotConnected": "cluster health: not connected", + "Header.Connect": "Connect", + "Nav.AnyRequest": "Any Request", + "Nav.Browser": "Browser", + "Nav.ClusterHealth": "Cluster Health", + "Nav.ClusterState": "Cluster State", + "Nav.ClusterNodes": "Nodes Info", + "Nav.Info": "Info", + "Nav.NodeStats": "Nodes Stats", + "Nav.Overview": "Overview", + "Nav.Indices": "Indices", + "Nav.Plugins": "Plugins", + "Nav.Status": "Indices Stats", + "Nav.Templates": "Templates", + "Nav.StructuredQuery": "Structured Query", + "NodeActionsMenu.Title": "Actions", + "NodeActionsMenu.Shutdown": "Shutdown...", + "NodeInfoMenu.Title": "Info", + "NodeInfoMenu.ClusterNodeInfo": "Cluster Node Info", + "NodeInfoMenu.NodeStats": "Node Stats", + "NodeType.Client": "Client Node", + "NodeType.Coord": "Coordinator", + "NodeType.Master": "Master Node", + "NodeType.Tribe": "Tribe Node", + "NodeType.Worker": "Worker Node", + "NodeType.Unassigned": "Unassigned", + "OptimizeForm.OptimizeIndex": "Optimize {0}", + "OptimizeForm.MaxSegments": "Maximum # Of Segments", + "OptimizeForm.ExpungeDeletes": "Only Expunge Deletes", + "OptimizeForm.FlushAfter": "Flush After Optimize", + "OptimizeForm.WaitForMerge": "Wait For Merge", + "Overview.PageTitle" : "Cluster Overview", + "Output.JSON": "JSON", + "Output.Table": "Table", + "Output.CSV": "CSV", + "Output.ShowSource": "Show query source", + "Preference.SortCluster": "Sort Cluster", + "Sort.ByName": "By Name", + "Sort.ByAddress": "By Address", + "Sort.ByType": "By Type", + "Preference.SortIndices": "Sort Indices", + "SortIndices.Descending": "Descending", + "SortIndices.Ascending": "Ascending", + "Preference.ViewAliases": "View Aliases", + "ViewAliases.Grouped": "Grouped", + "ViewAliases.List": "List", + "ViewAliases.None": "None", + "Overview.IndexFilter": "Index Filter", + "TableResults.Summary": "Searched {0} of {1} shards. {2} hits. {3} seconds", + "QueryFilter.AllIndices": "All Indices", + "QueryFilter.AnyValue": "any", + "QueryFilter-Header-Indices": "Indices", + "QueryFilter-Header-Types": "Types", + "QueryFilter-Header-Fields": "Fields", + "QueryFilter.DateRangeHint.from": "From : {0}", + "QueryFilter.DateRangeHint.to": " To : {0}", + "Query.FailAndUndo": "Query Failed. Undoing last changes", + "StructuredQuery.ShowRawJson": "Show Raw JSON" +}); + +i18n.setKeys({ + "AnyRequest.TransformerHelp" : "\ + <p>The Result Transformer can be used to post process the raw json results from a request into a more useful format.</p>\ + <p>The transformer should contain the body of a javascript function. The return value from the function becomes the new value passed to the json printer</p>\ + <p>Example:<br>\ + <code>return root.hits.hits[0];</code> would traverse a result set to show just the first match<br>\ + <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> would return the total memory used across an entire cluster<br></p>\ + <p>The following functions are available and can be useful processing arrays and objects<br>\ + <ul>\ + <li><i>Object.keys</i>(object) := array</li>\ + <li>array.<i>forEach</i>(function(prop, index))</li>\ + <li>array.<i>map</i>(function(prop, index)) := array</li>\ + <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\ + </ul>\ + <p>When Repeat Request is running, an extra parameter called prev is passed to the transformation function. This allows comparisons, and cumulative graphing</p>\ + <p>Example:<br>\ + <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> would return the load average on the first cluster node over the last minute\ + This could be fed into the Graph to produce a load graph for the node\ + " +}); + +i18n.setKeys({ + "AnyRequest.DisplayOptionsHelp" : "\ + <p>Raw Json: shows complete results of the query and transformation in raw JSON format </p>\ + <p>Graph Results: To produce a graph of your results, use the result transformer to produce an array of values</p>\ + <p>Search Results Table: If your query is a search, you can display the results of the search in a table.</p>\ + " +}); + +i18n.setKeys({ + "QueryFilter.DateRangeHelp" : "\ + <p>Date fields accept a natural language query to produce a From and To date that form a range that the results are queried over.</p>\ + <p>The following formats are supported:</p>\ + <ul>\ + <li><b>Keywords / Key Phrases</b><br>\ + <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\ + searches for dates matching the keyword. <code>last year</code> would search all of last year.</li>\ + <li><b>Ranges</b><br>\ + <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (spaces optional, many synonyms for range qualifiers)<br>\ + Create a search range centered on <code>now</code> extending into the past and future by the amount specified.</li>\ + <li><b>DateTime and Partial DateTime</b><br>\ + <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\ + these formats specify a specific date range. <code>2011</code> would search the whole of 2011, while <code>2011-01-18 12:32:45</code> would only search for results in that 1 second range</li>\ + <li><b>Time and Time Partials</b><br>\ + <code>12<br> 12:32<br> 12:32:45</code><br>\ + these formats search for a particular time during the current day. <code>12:32</code> would search that minute during today</li>\ + <li><b>Date Ranges</b><br>\ + <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\ + A Date Range is created by specifying two dates in any format (Keyword / DateTime / Time) separated by < or -> (both do the same thing). If either end of the date range is missing, it is the same as having no constraint in that direction.</li>\ + <li><b>Date Range using Offset</b><br>\ + <code>2010 -> 1yr<br> 3mins < now</code>\ + Searches the specified date including the range in the direction specified.</li>\ + <li><b>Anchored Ranges</b><br>\ + <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\ + Similar to above except the range is extend in both directions from the anchor date</li>\ + </ul>\ + " +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/fr_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/fr_strings.js new file mode 100644 index 000000000..2cc9bbb0c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/fr_strings.js @@ -0,0 +1,164 @@ +i18n.setKeys({ +// "General.Elasticsearch": "Elasticsearch", + "General.LoadingAggs" : "Chargement des facettes...", + "General.Searching": "Recherche en cours...", + "General.Search": "Recherche", + "General.Help": "Aide", +// "General.HelpGlyph": "?", +// "General.CloseGlyph": "X", + "General.RefreshResults": "Rafraîchir", + "General.ManualRefresh": "Rafraîchissement manuel", + "General.RefreshQuickly": "Rafraîchissement rapide", + "General.Refresh5seconds": "Rafraîchissement toutes les 5 secondes", + "General.Refresh1minute": "Rafraîchissement toutes les minutes", + "AliasForm.AliasName": "Alias", + "AliasForm.NewAliasForIndex": "Nouvel Alias pour {0}", + "AliasForm.DeleteAliasMessage": "Entrez ''{0}'' pour effacer {1}. Attention, action irréversible.", + "AnyRequest.DisplayOptions" : "Options d'affichage", + "AnyRequest.AsGraph" : "En graphe", + "AnyRequest.AsJson" : "En JSON brut", + "AnyRequest.AsTable" : "En tableau", + "AnyRequest.History" : "Historique", + "AnyRequest.RepeatRequest" : "Répétition automatique de la requête", + "AnyRequest.RepeatRequestSelect" : "Répéter la requête toutes les ", + "AnyRequest.Transformer" : "Transformation des résultats", +// "AnyRequest.Pretty": "Pretty", + "AnyRequest.Query" : "Recherche", + "AnyRequest.Request": "Requête", + "AnyRequest.Requesting": "Requête en cours...", + "AnyRequest.ValidateJSON": "Valider le JSON", + "Browser.Title": "Navigateur", + "Browser.ResultSourcePanelTitle": "Résultat au format JSON", + "Command.DELETE": "SUPPRIMER", + "Command.SHUTDOWN": "ETEINDRE", + "Command.DeleteAliasMessage": "Supprimer l'Alias?", + "ClusterOverView.IndexName": "Index", + "ClusterOverview.NumShards": "Nombre de shards", + "ClusterOverview.NumReplicas": "Nombre de replica", + "ClusterOverview.NewIndex": "Nouvel Index", +// "IndexActionsMenu.Title": "Actions", + "IndexActionsMenu.NewAlias": "Nouvel Alias...", + "IndexActionsMenu.Refresh": "Rafraîchir", + "IndexActionsMenu.Flush": "Flusher", + "IndexActionsMenu.Optimize": "Optimiser...", + "IndexActionsMenu.Snapshot": "Dupliquer l'index (Snapshot)", + "IndexActionsMenu.Analyser": "Tester un analyseur", + "IndexActionsMenu.Open": "Ouvrir", + "IndexActionsMenu.Close": "Fermer", + "IndexActionsMenu.Delete": "Effacer...", +// "IndexInfoMenu.Title": "Info", + "IndexInfoMenu.Status": "Etat de l'Index", + "IndexInfoMenu.Metadata": "Métadonnées de l'Index", + "IndexCommand.TextToAnalyze": "Texte à analyser", + "IndexCommand.ShutdownMessage": "Entrez ''{0}'' pour éteindre {1}. Le noeud NE PEUT PAS être redémarré depuis cette interface.", +// "IndexSelector.NameWithDocs": "{0} ({1} docs)", + "IndexSelector.SearchIndexForDocs": "Chercher dans {0} les documents correspondant à", + "FilterBrowser.OutputType": "Format d'affichage des résultats {0}", + "FilterBrowser.OutputSize": "Nombre de Résultats: {0}", + "Header.ClusterHealth": "Santé du cluster: {0} ({1} {2})", + "Header.ClusterNotConnected": "Santé du cluster: non connecté", + "Header.Connect": "Se connecter", + "Nav.AnyRequest": "Autres requêtes", + "Nav.StructuredQuery": "Requêtes structurées", + "Nav.Browser": "Navigateur", + "Nav.ClusterHealth": "Santé du cluster", + "Nav.ClusterState": "Etat du cluster", + "Nav.ClusterNodes": "Noeuds du cluster", +// "Nav.Info": "Info", + "Nav.NodeStats": "Statistiques sur les noeuds", + "Nav.Overview": "Aperçu", + "Nav.Indices": "Index", + "Nav.Plugins": "Plugins", + "Nav.Status": "Etat", + "Nav.Templates": "Templates", + "Nav.StructuredQuery": "Recherche Structurée", +// "NodeActionsMenu.Title": "Actions", + "NodeActionsMenu.Shutdown": "Eteindre...", +// "NodeInfoMenu.Title": "Info", + "NodeInfoMenu.ClusterNodeInfo": "Infos sur le noeud du cluster", + "NodeInfoMenu.NodeStats": "Statistiques du noeud", + "NodeType.Client": "Noeud Client", + "NodeType.Coord": "Coordinateur", + "NodeType.Master": "Noeud Master", + "NodeType.Tribe": "Noeud Tribe", + "NodeType.Worker": "Noeud Worker", + "NodeType.Unassigned": "Non assigné", + "OptimizeForm.OptimizeIndex": "Optimiser {0}", + "OptimizeForm.MaxSegments": "Nombre maximum de segments", + "OptimizeForm.ExpungeDeletes": "Seulement purger les suppressions", + "OptimizeForm.FlushAfter": "Flusher après l'optimisation", + "OptimizeForm.WaitForMerge": "Attendre la fin de la fusion", + "Overview.PageTitle" : "Aperçu du cluster", +// "Output.JSON": "JSON", + "Output.Table": "Tableau", + "Output.ShowSource": "Voir la requête source", + "TableResults.Summary": "Recherche sur {0} des {1} shards. {2} résultats. {3} secondes", + "QueryFilter.AllIndices": "Tous les index", + "QueryFilter.AnyValue": "Tout", + "QueryFilter-Header-Indices": "Index", +// "QueryFilter-Header-Types": "Types", + "QueryFilter-Header-Fields": "Champs", + "QueryFilter.DateRangeHint.from": "De : {0}", + "QueryFilter.DateRangeHint.to": " A : {0}", + "Query.FailAndUndo": "Requête en échec. Annulation des dernières modifications.", + "StructuredQuery.ShowRawJson": "Voir le JSON brut" +}); + +i18n.setKeys({ + "AnyRequest.TransformerHelp" : "\ + <p>Le transformateur de résultats peut être utilisé pour modifier a posteriori les résultats JSON bruts dans un format plus utile.</p>\ + <p>Le transformateur devrait contenir le corps d'une fonction javascript. La valeur de retour de la fonction devient la nouvelle valeur qui sera passée à l'afficheur des documents JSON.</p>\ + <p>Exemple:<br>\ + <code>return root.hits.hits[0];</code> ne renverra que le premier élément de l'ensemble des résultats.<br>\ + <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> retournera la mémoire totale utilisée dans l'ensemble du cluster.<br></p>\ + <p>Les fonctions suivantes sont disponibles et peuvent vous être utiles pour travailler sur les tableaux et les objets:<br>\ + <ul>\ + <li><i>Object.keys</i>(object) := array</li>\ + <li>array.<i>forEach</i>(function(prop, index))</li>\ + <li>array.<i>map</i>(function(prop, index)) := array</li>\ + <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\ + </ul>\ + <p>Lorsque vous activez la répétition automatique de la requête, un paramètre supplémentaire nommé prev est passé à la fonction de transformation. Cela permet les comparaisons et les graphes cumulatifs.</p>\ + <p>Exemple:<br>\ + <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> retournera la charge moyenne du premier noeud du cluster pour la dernière minute écoulée.\ + Cela peut alimenter ensuite le graphe pour produire un graphe de charge du noeud.\ + " +}); + +i18n.setKeys({ + "AnyRequest.DisplayOptionsHelp" : "\ + <p>En JSON brut: affiche les résultats complets de la recherche éventuellement transformée au format JSON brut.</p>\ + <p>En graphe: pour fabriquer un graphe de vos résultats, utilsez la transformation de résultats pour générer un tableau de valeurs.</p>\ + <p>En tableau: si votre requête est une recherche, vous pouvez alors afficher les résultats dans un tableau.</p>\ + " +}); + +i18n.setKeys({ + "QueryFilter.DateRangeHelp" : "\ + <p>Les champs Date acceptent une requête en langage naturel pour produire un écart de date (from/to) correspondant.</p>\ + <p>Les formats suivants sont acceptés :</p>\ + <ul>\ + <li><b>Mots clés</b><br>\ + <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\ + Cherchera pour des dates correspondant au mot clé. <code>last year</code> cherchera sur toute l'année précédente.</li>\ + <li><b>Ecarts</b><br>\ + <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (les espaces sont optionnels et il existe beaucoup de synonymes pour qualifier les écarts)<br>\ + Créé un écart de date basé sur l'heure courante (maintenant) avec plus ou moins l'écart indiqué.</li>\ + <li><b>Dates et Dates partielles</b><br>\ + <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\ + Ces formats indiquent un écart de date spécifique. <code>2011</code> cherchera sur toute l'année 2011, alors que <code>2011-01-18 12:32:45</code> ne cherchera que pour la date précise à la seconde près.</li>\ + <li><b>Heures et heures partielles</b><br>\ + <code>12<br> 12:32<br> 12:32:45</code><br>\ + Ces formats indiquent un espace de temps pour la date du jour. <code>12:32</code> cherchera les éléments d'aujourd'hui à cette minute précise.</li>\ + <li><b>Ecart de Date</b><br>\ + <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\ + Un écart de date est créé en spécifiant deux dates dans n'importe lequel des formats précédents (Mot clé / Dates / Heures) séparées par < ou -> (les deux produisent le même effet). Si la date de fin n'est pas indiquée, alors il n'y aura aucune contrainte de fin.</li>\ + <li><b>Ecart de date avec décalage</b><br>\ + <code>2010 -> 1yr<br> 3mins < now</code>\ + Cherche en incluant un décalage de la date dans la direction indiquée.</li>\ + <li><b>Ecart de date avec bornes</b><br>\ + <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\ + Similaire à ci-dessus excepté que le décalage est appliqué dans les deux sens à partir de la date indiquée.</li>\ + </ul>\ + " +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/pt_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/pt_strings.js new file mode 100644 index 000000000..d4b6abff5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/pt_strings.js @@ -0,0 +1,174 @@ +i18n.setKeys({ + "General.Elasticsearch": "Elasticsearch", + "General.LoadingAggs": "Carregando Facetas...", + "General.Searching": "Buscando...", + "General.Search": "Busca", + "General.Help": "Ajuda", + "General.HelpGlyph": "?", + "General.CloseGlyph": "X", + "General.RefreshResults": "Atualizar", + "General.ManualRefresh": "Atualização Manual", + "General.RefreshQuickly": "Atualização rápida", + "General.Refresh5seconds": "Atualização a cada 5 segundos", + "General.Refresh1minute": "Atualização a cada minuto", + "AliasForm.AliasName": "Apelido", + "AliasForm.NewAliasForIndex": "Novo apelido para {0}", + "AliasForm.DeleteAliasMessage": "digite ''{0}'' para deletar {1}. Não há como voltar atrás", + "AnyRequest.DisplayOptions" : "Mostrar Opções", + "AnyRequest.AsGraph" : "Mostrar como gráfico", + "AnyRequest.AsJson" : "Mostrar JSON bruto", + "AnyRequest.AsTable" : "Mostrar tabela de resultados da consulta", + "AnyRequest.History" : "Histórico", + "AnyRequest.RepeatRequest" : "Refazer requisição", + "AnyRequest.RepeatRequestSelect" : "Repetir requisição a cada ", + "AnyRequest.Transformer" : "Transformador de resultado", + "AnyRequest.Pretty": "Amigável", + "AnyRequest.Query" : "Consulta", + "AnyRequest.Request": "Requisição", + "AnyRequest.Requesting": "Realizando requisição...", + "AnyRequest.ValidateJSON": "Validar JSON", + "Browser.Title": "Navegador", + "Browser.ResultSourcePanelTitle": "Resultado", + "Command.DELETE": "DELETAR", + "Command.SHUTDOWN": "DESLIGAR", + "Command.DeleteAliasMessage": "Remover apelido?", + "ClusterOverView.IndexName": "Nome do índice", + "ClusterOverview.NumShards": "Número de Shards", + "ClusterOverview.NumReplicas": "Número de Réplicas", + "ClusterOverview.NewIndex": "Novo índice", + "IndexActionsMenu.Title": "Ações", + "IndexActionsMenu.NewAlias": "Novo apelido...", + "IndexActionsMenu.Refresh": "Atualizar", + "IndexActionsMenu.Flush": "Flush", + "IndexActionsMenu.Optimize": "Otimizar...", + "IndexActionsMenu.Snapshot": "Snapshot do Gateway", + "IndexActionsMenu.Analyser": "Analizador de teste", + "IndexActionsMenu.Open": "Abrir", + "IndexActionsMenu.Close": "Fechar", + "IndexActionsMenu.Delete": "Deletar...", + "IndexInfoMenu.Title": "Info", + "IndexInfoMenu.Status": "Status do índice", + "IndexInfoMenu.Metadata": "Metadados do índice", + "IndexCommand.TextToAnalyze": "Texto para analizar", + "IndexCommand.ShutdownMessage": "digite ''{0}'' para desligar {1}. Nó NÃO PODE ser reiniciado à partir dessa interface", + "IndexOverview.PageTitle": "Visão geral dos índices", + "IndexSelector.NameWithDocs": "{0} ({1} documentoss)", + "IndexSelector.SearchIndexForDocs": "Busca {0} por documentos onde:", + "FilterBrowser.OutputType": "Resultados: {0}", + "FilterBrowser.OutputSize": "Número de Resultados: {0}", + "Header.ClusterHealth": "saúde do cluster: {0} ({1} {2})", + "Header.ClusterNotConnected": "saúde do cluster: não conectado", + "Header.Connect": "Conectar", + "Nav.AnyRequest": "Qualquer requisição", + "Nav.Browser": "Navegador", + "Nav.ClusterHealth": "Saúde do Cluster", + "Nav.ClusterState": "Estado do Cluster", + "Nav.ClusterNodes": "Nós do Cluster", + "Nav.Info": "Informações", + "Nav.NodeStats": "Estatísticas do nó", + "Nav.Overview": "Visão Geral", + "Nav.Indices": "Índices", + "Nav.Plugins": "Plugins", + "Nav.Status": "Status", + "Nav.Templates": "Modelos", + "Nav.StructuredQuery": "Consulta Estruturada", + "NodeActionsMenu.Title": "Ações", + "NodeActionsMenu.Shutdown": "Desligar...", + "NodeInfoMenu.Title": "Informações", + "NodeInfoMenu.ClusterNodeInfo": "Informações do Nó do Cluster", + "NodeInfoMenu.NodeStats": "Estatísticas do Nó", + "NodeType.Client": "Nó cliente", + "NodeType.Coord": "Coordenador", + "NodeType.Master": "Nó mestre", + "NodeType.Tribe": "Nó tribo", + "NodeType.Worker": "Nó trabalhador", + "NodeType.Unassigned": "Não atribuido", + "OptimizeForm.OptimizeIndex": "Otimizar {0}", + "OptimizeForm.MaxSegments": "# Máximo De Segmentos", + "OptimizeForm.ExpungeDeletes": "Apenas Expurgar Exclusões", + "OptimizeForm.FlushAfter": "Flush após Otimizar", + "OptimizeForm.WaitForMerge": "Esperar Por Merge", + "Overview.PageTitle": "Visão geral do Cluster", + "Output.JSON": "JSON", + "Output.Table": "Tabela", + "Output.CSV": "CSV", + "Output.ShowSource": "Mostrar consulta original", + "Preference.SortCluster": "Ordenar Cluster", + "Sort.ByName": "Por nome", + "Sort.ByAddress": "Por endereço", + "Sort.ByType": "Por tipo", + "Preference.ViewAliases": "Ver Alias", + "ViewAliases.Grouped": "Agrupado", + "ViewAliases.List": "Lista", + "ViewAliases.None": "Nenhum", + "Overview.IndexFilter": "Filtar Índice", + "TableResults.Summary": "Buscado {0} de {1} shards. {2} resultados. {3} segundos", + "QueryFilter.AllIndices": "Todos os Índices", + "QueryFilter.AnyValue": "qualquer", + "QueryFilter-Header-Indices": "Índices", + "QueryFilter-Header-Types": "Tipos", + "QueryFilter-Header-Fields": "Campos", + "QueryFilter.DateRangeHint.from": "De : {0}", + "QueryFilter.DateRangeHint.to": " A : {0}", + "Query.FailAndUndo": "Consulta falhou. Desfazendo últimas alterações", + "StructuredQuery.ShowRawJson": "Mostrar JSON bruto" +}); + +i18n.setKeys({ + "AnyRequest.TransformerHelp" : "\ + <p>O Transformador de Resultados pode ser usado para transformar os resultados de uma consulta de json bruto para um formato mais útil.</p>\ + <p>O transformador deve possuir o corpo de uma função javascript. O retorno da função se torna o novo valor passado para o json printer</p>\ + <p>Exemplo:<br>\ + <code>return root.hits.hits[0];</code> irá alterar a resposta para mostrar apenas o primeiro resultado<br>\ + <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> irá retornar o total de memória utilizada pelo cluster<br></p>\ + <p>As seguintes funções estão disponíveis e podem ser úteis no processamento de vetores e objetos<br>\ + <ul>\ + <li><i>Object.keys</i>(object) := array</li>\ + <li>array.<i>forEach</i>(function(prop, index))</li>\ + <li>array.<i>map</i>(function(prop, index)) := array</li>\ + <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\ + </ul>\ + <p>Durante a execução da opção Refazer Requisição, um parâmetro extra chamado prev é passado para a função de transformação. Isso permite fazer comparações e marcações cumulativas</p>\ + <p>Exemplo:<br>\ + <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> irá retornar a carga média no primeiro nó do cluster no último minuto\ + Essa informação pode ser inserida no Gráfico para fazer um gráfico de carga do nó\ + " +}); + +i18n.setKeys({ + "AnyRequest.DisplayOptionsHelp" : "\ + <p>Json Bruto: Exibe o resultado completo da consulta e da transformação no formato de JSON bruto</p>\ + <p>Gráfico de Resultados: Para gerar um gráfico com seus resultados, utilize o tranformador de resultados para produzir um vetor de valores</p>\ + <p>Tabela de Resultados da Consulta: Se sua consulta for uma busca, você pode exibir seus resultados no formato de uma tabela.</p>\ + " +}); + +i18n.setKeys({ + "QueryFilter.DateRangeHelp" : "\ + <p>Campos do tipo Data aceitam consultas em linguagem natural (em inglês) para produzir um <i>From</i> e um <i>To</i> de modo a formar um intervalo dentro do qual os resultados são filtrados.</p>\ + <p>Os seguintes formatos são suportados:</p>\ + <ul>\ + <li><b>Palavras-chave</b><br>\ + <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\ + buscam por datas de acordo com a palavra-chave. <code>last year</code> irá buscar tudo do último ano.</li>\ + <li><b>Intervalos</b><br>\ + <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (espaços são opcionais, diversos sinônimos para qualificadores de intervalo)<br>\ + Cria um intervalo de busca a partir de agora (<code>now</code>), extendendo este intervalo no passado e no futuro de acordo com intervalo especificado.</li>\ + <li><b>Data/Hora (<i>DateTime</i>) e Data/Hora parcial</b><br>\ + <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\ + esses formatos especificam um intervalo especifico. <code>2011</code> irá buscar todo o ano de 2011, enquanto <code>2011-01-18 12:32:45</code> irá buscar apenas por resultados dentro deste intervalo de 1 segundo</li>\ + <li><b>Tempo (<i>Time</i>) e Tempo parcial</b><br>\ + <code>12<br> 12:32<br> 12:32:45</code><br>\ + esses formatos buscam por um horário específico no dia atual. <code>12:32</code> irá buscar este minuto específico do dia</li>\ + <li><b>Intervalos de Data</b><br>\ + <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\ + Um intervalo de data é criado especificando-se duas datas em qualquer formato (Palavras-chave, Data/Hora ou Tempo) separados por < ou -> (ambos fazem a mesma coisa). Se a data de início ou fim do intervalo não for especificada é a mesma coisa que não impor limites na busca nesta direção.</li>\ + <li><b>Intervalo de Data com Deslocamento</b><br>\ + <code>2010 -> 1yr<br> 3mins < now</code>\ + Busca a data especificada incluindo o intervalo na direção determinada pelo deslocamento</li>\ + <li><b>Intervalos Bidirecionais</b><br>\ + <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\ + Idêntico ao exemplo anterior porém o intervalo é extendido em ambas as direções a partir da data especificada</li>\ + </ul>\ + " +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/tr_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/tr_strings.js new file mode 100644 index 000000000..f61195616 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/tr_strings.js @@ -0,0 +1,177 @@ +i18n.setKeys({
+ "General.Elasticsearch": "Elasticsearch",
+ "General.LoadingAggs": "Gruplar Yükleniyor...",
+ "General.Searching": "Aranıyor...",
+ "General.Search": "Ara",
+ "General.Help": "Yardım",
+ "General.HelpGlyph": "?",
+ "General.CloseGlyph": "X",
+ "General.RefreshResults": "Yenile",
+ "General.ManualRefresh": "Manuel Yenileme",
+ "General.RefreshQuickly": "Hızlı yenile",
+ "General.Refresh5seconds": "5 saniyede bir yenile",
+ "General.Refresh1minute": "Her dakika yenile",
+ "AliasForm.AliasName": "Alternatif İsim",
+ "AliasForm.NewAliasForIndex": "{0} için yeni alternatif isim",
+ "AliasForm.DeleteAliasMessage": "{1} silmek için ''{0}'' . Geriye dönüş yoktur.",
+ "AnyRequest.DisplayOptions" : "Seçenekleri Göster",
+ "AnyRequest.AsGraph" : "Sonuçları Çizdir",
+ "AnyRequest.AsJson" : "JSON formatında göster",
+ "AnyRequest.AsTable" : "Arama sonuçlarını tablo halinde göster",
+ "AnyRequest.History" : "Geçmiş",
+ "AnyRequest.RepeatRequest" : "İsteği Tekrarla",
+ "AnyRequest.RepeatRequestSelect" : "İsteği sürekli tekrarla ",
+ "AnyRequest.Transformer" : "Sonuç Dönüştürücü",
+ "AnyRequest.Pretty": "Düzenli",
+ "AnyRequest.Query" : "Sorgu",
+ "AnyRequest.Request": "Gönder",
+ "AnyRequest.Requesting": "İsteniyor...",
+ "AnyRequest.ValidateJSON": "JSON Doğrula",
+ "Browser.Title": "Browser",
+ "Browser.ResultSourcePanelTitle": "Sonuç Kaynağı",
+ "Command.DELETE": "SİL",
+ "Command.SHUTDOWN": "KAPA",
+ "Command.DeleteAliasMessage": "Alternatif ismi sil?",
+ "ClusterOverView.IndexName": "Indeks İsmi",
+ "ClusterOverview.NumShards": "Sektör Sayısı",
+ "ClusterOverview.NumReplicas": "Yedek Sayısı",
+ "ClusterOverview.NewIndex": "Yeni Indeks",
+ "IndexActionsMenu.Title": "İşlemler",
+ "IndexActionsMenu.NewAlias": "Yeni Alternatif İsim...",
+ "IndexActionsMenu.Refresh": "Yenile",
+ "IndexActionsMenu.Flush": "Boşalt",
+ "IndexActionsMenu.Optimize": "Optimize et...",
+ "IndexActionsMenu.Snapshot": "Gateway Snapshot (Kopya Al)",
+ "IndexActionsMenu.Analyser": "Analizi test et",
+ "IndexActionsMenu.Open": "Aç",
+ "IndexActionsMenu.Close": "Kapa",
+ "IndexActionsMenu.Delete": "Sil...",
+ "IndexInfoMenu.Title": "Bilgi",
+ "IndexInfoMenu.Status": "Indeks Durumu",
+ "IndexInfoMenu.Metadata": "Indeks Metaveri",
+ "IndexCommand.TextToAnalyze": "Analiz edilecek metin",
+ "IndexCommand.ShutdownMessage": "{1} kapatmak için ''{0}'' yazın . Nod bu arayüzden tekrar BAŞLATILAMAZ",
+ "IndexOverview.PageTitle": "Indeksler Genel Bakış",
+ "IndexSelector.NameWithDocs": "{0} ({1} döküman)",
+ "IndexSelector.SearchIndexForDocs": "{0} indeksinde ara:",
+ "FilterBrowser.OutputType": "Sonuç Formatı: {0}",
+ "FilterBrowser.OutputSize": "Sonuç Sayısı: {0}",
+ "Header.ClusterHealth": "Küme Durumu: {0} ({1} de {2})",
+ "Header.ClusterNotConnected": "Küme Durumu: Bağlı Değil",
+ "Header.Connect": "Bağlan",
+ "Nav.AnyRequest": "Özel Sorgu",
+ "Nav.Browser": "Görüntüle",
+ "Nav.ClusterHealth": "Küme Durumu",
+ "Nav.ClusterState": "Küme Statüsü",
+ "Nav.ClusterNodes": "Nod Bilgileri",
+ "Nav.Info": "Bilgi",
+ "Nav.NodeStats": "Nod İstatistikleri",
+ "Nav.Overview": "Genel Bakış",
+ "Nav.Indices": "Indeksler",
+ "Nav.Plugins": "Eklentiler",
+ "Nav.Status": "Indeks İstatistikleri",
+ "Nav.Templates": "Şablonlar",
+ "Nav.StructuredQuery": "Yapılandırılmış Sorgu",
+ "NodeActionsMenu.Title": "İşlemler",
+ "NodeActionsMenu.Shutdown": "Kapat...",
+ "NodeInfoMenu.Title": "Bilgi",
+ "NodeInfoMenu.ClusterNodeInfo": "Küme Nod Bilgileri",
+ "NodeInfoMenu.NodeStats": "Nod İstatistikleri",
+ "NodeType.Client": "Client Nod",
+ "NodeType.Coord": "Coordinator",
+ "NodeType.Master": "Master Nod",
+ "NodeType.Tribe": "Tribe Nod",
+ "NodeType.Worker": "Worker Nod",
+ "NodeType.Unassigned": "Sahipsiz",
+ "OptimizeForm.OptimizeIndex": "{0} Optimize Et",
+ "OptimizeForm.MaxSegments": "Maksimum Segment Sayısı",
+ "OptimizeForm.ExpungeDeletes": "Silme İşlemi Artıklarını Temizle",
+ "OptimizeForm.FlushAfter": "Optimize Ettikten Sonra Boşalt",
+ "OptimizeForm.WaitForMerge": "Birleştirme İçin Bekle",
+ "Overview.PageTitle" : "Kümeler Genelbakış",
+ "Output.JSON": "JSON",
+ "Output.Table": "Tablo",
+ "Output.CSV": "CSV",
+ "Output.ShowSource": "Sorgu kaynağını göster",
+ "Preference.SortCluster": "Kümeyi Sırala",
+ "Sort.ByName": "İsme göre",
+ "Sort.ByAddress": "Adrese göre",
+ "Sort.ByType": "Tipe göre",
+ "Preference.SortIndices": "Indeksleri sırala",
+ "SortIndices.Descending": "Azalan",
+ "SortIndices.Ascending": "Artan",
+ "Preference.ViewAliases": "Alternatif isimleri görüntüle",
+ "ViewAliases.Grouped": "Gruplanmış",
+ "ViewAliases.List": "Liste",
+ "ViewAliases.None": "Karışık",
+ "Overview.IndexFilter": "Indeks Filtresi",
+ "TableResults.Summary": "{0} parçanın {1} tanesi arandı. {2} sonuç. {3} saniye",
+ "QueryFilter.AllIndices": "Tüm Indeksler",
+ "QueryFilter.AnyValue": "herhangi",
+ "QueryFilter-Header-Indices": "Indeksler",
+ "QueryFilter-Header-Types": "Tipler",
+ "QueryFilter-Header-Fields": "Alanlar",
+ "QueryFilter.DateRangeHint.from": "{0}'dan",
+ "QueryFilter.DateRangeHint.to": " {0}'a",
+ "Query.FailAndUndo": "Sorgu Başarısız. Son değişiklikler geri alınıyor.",
+ "StructuredQuery.ShowRawJson": "Formatsız JSON göster"
+});
+
+i18n.setKeys({
+ "AnyRequest.TransformerHelp" : "\
+ <p>Sonuç Dönüştürücü sorgudan dönen JSON sonuçlarını işleyip daha kullanışlı bir formata dönüştürmek için kullanılabilir.</p>\
+ <p>Dönüştürücü içierisinde javascript fonksiyonu tanımlanmalıdır. Bu fonksiyondan dönen yeni sonuç çıktı kısmına yazdırılır.</p>\
+ <p>Örnek:<br>\
+ <code>return root.hits.hits[0];</code> sonucu dolaşarak ilk eşleşmeyi göster<br>\
+ <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> tüm kümede kullanılan toplam belleği gösterir<br></p>\
+ <p>Aşağıdaki fonksiyonlar dizi ve objelerin işlenmesinde yardımcı olması için kullanılabilir<br>\
+ <ul>\
+ <li><i>Object.keys</i>(object) := array</li>\
+ <li>array.<i>forEach</i>(function(prop, index))</li>\
+ <li>array.<i>map</i>(function(prop, index)) := array</li>\
+ <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\
+ </ul>\
+ <p>Sorgu tekrarlama çalışırken, prev isimli ekstra bir parametre dönüştürücü fonksiyonuna verilir. Bu sayede karşılaştırmalar ve toplu grafik gösterimleri yapılabilir.</p>\
+ <p>Örnek:<br>\
+ <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> önceki dakika boyunca kümede bulunan ilk nod üzerindeki averaj yükü verir.\
+ Bu sonuç nod için yük grafiği yaratılmasında kullanılabilir.\
+ "
+});
+
+i18n.setKeys({
+ "AnyRequest.DisplayOptionsHelp" : "\
+ <p>Sade Json: Sorgunun tüm sonuçlarını ve (yapıldıysa) dönüştürüldükten sonraki halini sade JSON formatında gösterir </p>\
+ <p>Sonuçları Çizdir: Sonuçları grafiksel olarak görüntülemek için sonuç dörücüyü kullanarak değerleri dizi haline getirin.</p>\
+ <p>Arama Sonuçları Tablosu: Eğer sorgunuz bir arama ise, sonuçları bir tabloda görüntüleyebilirsiniz.</p>\
+ "
+});
+
+i18n.setKeys({
+ "QueryFilter.DateRangeHelp" : "\
+ <p>Tarih alanları ana dile yakın kelimeler kullanarak iki tarih aralığında sorgu yapılabilmesini sağlar.</p>\
+ <p>Aşağıdaki tanımlar kullanılabilir:</p>\
+ <ul>\
+ <li><b>Anahtar Kelimeler</b><br>\
+ <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\
+ kelimeleri eşleşen tarihleri verir. Örneğin <code>last year</code> geçen yıl tarihli bütün verileri döndürür.</li>\
+ <li><b>Aralıklar</b><br>\
+ <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (boşluklar isteğe bağlıdır, ayni kelime için farklı yazım şekilleri kullanılabilir)<br>\
+ Şu anki tarihi (<code>now</code>) baz alarak geçmiş veya ileriki bir tarih aralığındaki kayıtları verir.</li>\
+ <li><b>Tarih ve Kısmi Tarihler</b><br>\
+ <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\
+ bu formatlar spesifik bir tarihi tanımlarlar. <code>2011</code> tüm 2011 yılını ararken, <code>2011-01-18 12:32:45</code> şeklinde bir sorgu sadece o saniyedeki sonuçları verir.</li>\
+ <li><b>Zaman ve Kısmi Zamanlar</b><br>\
+ <code>12<br> 12:32<br> 12:32:45</code><br>\
+ bu formatlar gün içerisinde spesifik bir zamanı tanımlarlar. Örneğin <code>12:32</code> sadece bu saat ve dakikadaki kayıtları verir.</li>\
+ <li><b>Tarih Aralıkları</b><br>\
+ <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\
+ Tarih aralıkları yukarda belirtilen herhangi bir formatı < or -> ile ayırarak yapılabilir. Eğer aralığın bir tarafı eksikse, sorgu ucu açıkmış gibi davranır.</li>\
+ <li><b>Ofsetli Tarih Aralığı</b><br>\
+ <code>2010 -> 1yr<br> 3mins < now</code>\
+ Verilen yöndeki tarih aralığına bakar.</li>\
+ <li><b>Çakılı Aralıklar</b><br>\
+ <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\
+ Yukarıdakiyle ayni fakat belirtilen tarihten her iki yöne de bakılır.</li>\
+ </ul>\
+ "
+});
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/zh_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/zh_strings.js new file mode 100644 index 000000000..0038de173 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/lang/zh_strings.js @@ -0,0 +1,172 @@ +i18n.setKeys({ + "General.Elasticsearch": "Elasticsearch", + "General.LoadingAggs": "加载聚合查询...", + "General.Searching": "搜索中...", + "General.Search": "搜索", + "General.Help": "帮助", + "General.HelpGlyph": "?", + "General.CloseGlyph": "X", + "General.RefreshResults": "刷新", + "General.ManualRefresh": "手动刷新", + "General.RefreshQuickly": "快速刷新", + "General.Refresh5seconds": "每5秒刷新", + "General.Refresh1minute": "每1分钟刷新", + "AliasForm.AliasName": "别名", + "AliasForm.NewAliasForIndex": "为 {0} 创建新别名", + "AliasForm.DeleteAliasMessage": "输入 ''{0}'' 删除 {1}. 此操作无法恢复", + "AnyRequest.DisplayOptions" : "显示选项", + "AnyRequest.AsGraph" : "图形视图", + "AnyRequest.AsJson" : "原始 JSON", + "AnyRequest.AsTable" : "表格视图", + "AnyRequest.History" : "历史记录", + "AnyRequest.RepeatRequest" : "重复请求", + "AnyRequest.RepeatRequestSelect" : "重复周期 ", + "AnyRequest.Transformer" : "结果转换器", + "AnyRequest.Pretty": "易读", + "AnyRequest.Query" : "查询", + "AnyRequest.Request": "提交请求", + "AnyRequest.Requesting": "请求中...", + "AnyRequest.ValidateJSON": "验证 JSON", + "Browser.Title": "数据浏览", + "Browser.ResultSourcePanelTitle": "原始数据", + "Command.DELETE": "删除", + "Command.SHUTDOWN": "关闭", + "Command.DeleteAliasMessage": "删除别名?", + "ClusterOverView.IndexName": "索引名称", + "ClusterOverview.NumShards": "分片数", + "ClusterOverview.NumReplicas": "副本数", + "ClusterOverview.NewIndex": "新建索引", + "IndexActionsMenu.Title": "动作", + "IndexActionsMenu.NewAlias": "新建别名...", + "IndexActionsMenu.Refresh": "刷新", + "IndexActionsMenu.Flush": "Flush刷新", + "IndexActionsMenu.Optimize": "优化...", + "IndexActionsMenu.Snapshot": "网关快照", + "IndexActionsMenu.Analyser": "测试分析器", + "IndexActionsMenu.Open": "开启", + "IndexActionsMenu.Close": "关闭", + "IndexActionsMenu.Delete": "删除...", + "IndexInfoMenu.Title": "信息", + "IndexInfoMenu.Status": "索引状态", + "IndexInfoMenu.Metadata": "索引信息", + "IndexCommand.TextToAnalyze": "文本分析", + "IndexCommand.ShutdownMessage": "输入 ''{0}'' 以关闭 {1} 节点. 关闭的节点无法从此界面重新启动", + "IndexOverview.PageTitle": "索引概览", + "IndexSelector.NameWithDocs": "{0} ({1} 个文档)", + "IndexSelector.SearchIndexForDocs": "搜索 {0} 的文档, 查询条件:", + "FilterBrowser.OutputType": "返回格式: {0}", + "FilterBrowser.OutputSize": "显示数量: {0}", + "Header.ClusterHealth": "集群健康值: {0} ({1} of {2})", + "Header.ClusterNotConnected": "集群健康值: 未连接", + "Header.Connect": "连接", + "Nav.AnyRequest": "复合查询", + "Nav.Browser": "数据浏览", + "Nav.ClusterHealth": "集群健康值", + "Nav.ClusterState": "群集状态", + "Nav.ClusterNodes": "集群节点", + "Nav.Info": "信息", + "Nav.NodeStats": "节点状态", + "Nav.Overview": "概览", + "Nav.Indices": "索引", + "Nav.Plugins": "插件", + "Nav.Status": "状态", + "Nav.Templates": "模板", + "Nav.StructuredQuery": "基本查询", + "NodeActionsMenu.Title": "动作", + "NodeActionsMenu.Shutdown": "关停...", + "NodeInfoMenu.Title": "信息", + "NodeInfoMenu.ClusterNodeInfo": "集群节点信息", + "NodeInfoMenu.NodeStats": "节点状态", + "NodeType.Client": "节点客户端", + "NodeType.Coord": "协调器", + "NodeType.Master": "主节点", + "NodeType.Tribe": "分支结点", + "NodeType.Worker": "工作节点", + "NodeType.Unassigned": "未分配", + "OptimizeForm.OptimizeIndex": "优化 {0}", + "OptimizeForm.MaxSegments": "最大索引段数", + "OptimizeForm.ExpungeDeletes": "只删除被标记为删除的", + "OptimizeForm.FlushAfter": "优化后刷新", + "OptimizeForm.WaitForMerge": "等待合并", + "Overview.PageTitle" : "集群概览", + "Output.JSON": "JSON", + "Output.Table": "Table", + "Output.CSV": "CSV", + "Output.ShowSource": "显示查询语句", + "Preference.SortCluster": "集群排序", + "Sort.ByName": "按名称", + "Sort.ByAddress": "按地址", + "Sort.ByType": "按类型", + "TableResults.Summary": "查询 {1} 个分片中用的 {0} 个. {2} 命中. 耗时 {3} 秒", + "QueryFilter.AllIndices": "所有索引", + "QueryFilter.AnyValue": "任意", + "QueryFilter-Header-Indices": "索引", + "QueryFilter-Header-Types": "类型", + "QueryFilter-Header-Fields": "字段", + "QueryFilter.DateRangeHint.from": "从 : {0}", + "QueryFilter.DateRangeHint.to": " 到 : {0}", + "Query.FailAndUndo": "查询失败. 撤消最近的更改", + "StructuredQuery.ShowRawJson": "显示原始 JSON" +}); + +i18n.setKeys({ + "AnyRequest.TransformerHelp" : "\ + <p>结果转换器用于返回结果原始JSON的后续处理, 将结果转换为更有用的格式.</p>\ + <p>转换器应当包含javascript函数体. 函数的返回值将传递给json分析器</p>\ + <p>Example:<br>\ + <code>return root.hits.hits[0];</code><br>\ + 遍历结果并只显示第一个元素<br>\ + <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code><br>\ + 将返回整个集群使用的总内存<br></p>\ + <p>以下函数可以方便的处理数组与对象<br>\ + <ul>\ + <li><i>Object.keys</i>(object) := array</li>\ + <li>array.<i>forEach</i>(function(prop, index))</li>\ + <li>array.<i>map</i>(function(prop, index)) := array</li>\ + <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\ + </ul>\ + <p>当启用重复请求时, prev 参数将会传递给转换器函数. 这将用于比较并累加图形</p>\ + <p>Example:<br>\ + <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code><br>\ + 将返回第一个集群节点最近一分钟内的平均负载\ + 将会把结果送人图表以产生一个负载曲线图\ + " +}); + +i18n.setKeys({ + "AnyRequest.DisplayOptionsHelp" : "\ + <p>原始 Json: 将完整的查询结果转换为原始JSON格式 </p>\ + <p>图形视图: 将查询结果图形化, 将查询结果转换为数组值的形式</p>\ + <p>表格视图: 如果查询是一个搜索, 可以将搜索结果以表格形式显示.</p>\ + " +}); + +i18n.setKeys({ + "QueryFilter.DateRangeHelp" : "\ + <p>Date 字段接受日期范围的形式查询.</p>\ + <p>一下格式被支持:</p>\ + <ul>\ + <li><b>关键词 / 关键短语</b><br>\ + <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\ + 搜索关键字匹配的日期. <code>last year</code> 将搜索过去全年.</li>\ + <li><b>范围</b><br>\ + <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (空格可选, 同等于多个范围修饰词)<br>\ + 创建一个指定时间范围的搜索, 将围绕<code>现在</code> 并延伸至过去与未来时间段.</li>\ + <li><b>DateTime 与 DateTime局部</b><br>\ + <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\ + 指定一个特定的日期范围. <code>2011</code>会搜索整个 2011年, 而 <code>2011-01-18 12:32:45</code> 将只搜索1秒范围内</li>\ + <li><b>Time 与 Time局部</b><br>\ + <code>12<br> 12:32<br> 12:32:45</code><br>\ + 这些格式只搜索当天的特定时间. <code>12:32</code> 将搜索当天的那一分钟</li>\ + <li><b>日期范围</b><br>\ + <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\ + 日期范围是将两个日期格式串 (日期关键字 / DateTime / Time) 用 < 或 -> (效果相同) 分隔. 如果缺少任意一端,那么在这个方向上时间将没有限制.</li>\ + <li><b>偏移日期范围</b><br>\ + <code>2010 -> 1yr<br> 3mins < now</code>\ + 搜索包括指定方向上偏移的日期.</li>\ + <li><b>锚定范围</b><br>\ + <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\ + 类似于上面的便宜日期,在两个方向上将锚定的日期延长</li>\ + </ul>\ + " +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/vendor.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/vendor.css new file mode 100644 index 000000000..be7e15cb3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/vendor.css @@ -0,0 +1,1338 @@ +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('fonts/fontawesome-webfont.eot?v=4.0.3'); + src: url('fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.2857142857142858em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.142857142857143em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + top: 0.14285714285714285em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571428572em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-asc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-desc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-reply-all:before { + content: "\f122"; +} +.fa-mail-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/vendor.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/vendor.js new file mode 100644 index 000000000..bf75939d6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/_site/vendor.js @@ -0,0 +1,14500 @@ +/*! + * jQuery JavaScript Library v1.6.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu May 12 15:04:36 2011 -0400 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.6.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // 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 && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery._Deferred(); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return (new Function( "return " + data ))(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + + if ( indexOf ) { + return indexOf.call( array, elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can be optionally by executed if its a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery to the global object +return jQuery; + +})(); + + +var // Promise methods + promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), + // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + always: function() { + return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + pipe: function( fnDone, fnFail ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject ); + } else { + newDefer[ action ]( returned ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + }); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + +jQuery.support = (function() { + + var div = document.createElement( "div" ), + documentElement = document.documentElement, + all, + a, + select, + opt, + input, + marginDiv, + support, + fragment, + body, + bodyStyle, + tds, + events, + eventName, + i, + isSupported; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName( "tbody" ).length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName( "link" ).length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + div.detachEvent( "onclick", click ); + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains it's value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + div.innerHTML = ""; + + // Figure out if the W3C box model works as expected + div.style.width = div.style.paddingLeft = "1px"; + + // We use our own, invisible, body + body = document.createElement( "body" ); + bodyStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + // Set background to avoid IE crashes when removing (#9028) + background: "none" + }; + for ( i in bodyStyle ) { + body.style[ i ] = bodyStyle[ i ]; + } + body.appendChild( div ); + documentElement.insertBefore( body, documentElement.firstChild ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "<div style='width:4px;'></div>"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>"; + tds = div.getElementsByTagName( "td" ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Remove the body element we added + body.innerHTML = ""; + documentElement.removeChild( body ); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + } ) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + return support; +})(); + +// Keep track of boxModel +jQuery.boxModel = jQuery.support.boxModel; + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([a-z])([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ jQuery.camelCase( name ) ] : thisCache; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery.data( elem, deferDataKey, undefined, true ); + if ( defer && + ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && + ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery.data( elem, queueDataKey, undefined, true ) && + !jQuery.data( elem, markDataKey, undefined, true ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.resolve(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = (type || "fx") + "mark"; + jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); + if ( count ) { + jQuery.data( elem, key, count, true ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + if ( elem ) { + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type, undefined, true ); + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data), true ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + defer; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { + count++; + tmp.done( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + rinvalidChar = /\:/, + formHook, boolHook; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class") || "") ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", + setClass = elem.className; + + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + return (elem.value || "").replace(rreturn, ""); + } + + return undefined; + } + + var isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attrFix: { + // Always normalize to ensure hook usage + tabindex: "tabIndex" + }, + + attr: function( elem, name, value, pass ) { + var nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( !("getAttribute" in elem) ) { + return jQuery.prop( elem, name, value ); + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Normalize the name if needed + name = notxml && jQuery.attrFix[ name ] || name; + + hooks = jQuery.attrHooks[ name ]; + + if ( !hooks ) { + // Use boolHook for boolean attributes + if ( rboolean.test( name ) && + (typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) { + + hooks = boolHook; + + // Use formHook for forms and if the name contains certain characters + } else if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) { + hooks = formHook; + } + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return undefined; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml ) { + return hooks.get( elem, name ); + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, name ) { + var propName; + if ( elem.nodeType === 1 ) { + name = jQuery.attrFix[ name ] || name; + + if ( jQuery.support.getSetAttribute ) { + // Use removeAttribute in browsers that support it + elem.removeAttribute( name ); + } else { + jQuery.attr( elem, name, "" ); + elem.removeAttributeNode( elem.getAttributeNode( name ) ); + } + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { + elem[ propName ] = false; + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabIndex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Try to normalize/fix the name + name = notxml && jQuery.propFix[ name ] || name; + + hooks = jQuery.propHooks[ name ]; + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return (elem[ name ] = value); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: {} +}); + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + return elem[ jQuery.propFix[ name ] || name ] ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = value; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// Use the value property for back compat +// Use the formHook for button elements in IE6/7 (#1954) +jQuery.attrHooks.value = { + get: function( elem, name ) { + if ( formHook && jQuery.nodeName( elem, "button" ) ) { + return formHook.get( elem, name ); + } + return elem.value; + }, + set: function( elem, value, name ) { + if ( formHook && jQuery.nodeName( elem, "button" ) ) { + return formHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !jQuery.support.getSetAttribute ) { + + // propFix is more comprehensive and contains all fixes + jQuery.attrFix = jQuery.propFix; + + // Use this for any attribute on a form in IE6/7 + formHook = jQuery.attrHooks.name = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + // Return undefined if nodeValue is empty string + return ret && ret.nodeValue !== "" ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Check form objects in IE (multiple bugs related) + // Only use nodeValue if the attribute node exists on the form + var ret = elem.getAttributeNode( name ); + if ( ret ) { + ret.nodeValue = value; + return value; + } + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return (elem.style.cssText = "" + value); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }); +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); + } + } + }); +}); + + + + +var hasOwn = Object.prototype.hasOwnProperty, + rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspaces = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Event object or event type + var type = event.type || event, + namespaces = [], + exclusive; + + if ( type.indexOf("!") >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.exclusive = exclusive; + event.namespace = namespaces.join("."); + event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + // triggerHandler() and global events don't bubble or run the default action + if ( onlyHandlers || !elem ) { + event.preventDefault(); + event.stopPropagation(); + } + + // Handle a global trigger + if ( !elem ) { + // TODO: Stop taunting the data cache; remove global events and always attach to document + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + return; + } + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + event.target = elem; + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + var cur = elem, + // IE doesn't like method names with a colon (#3533, #8272) + ontype = type.indexOf(":") < 0 ? "on" + type : ""; + + // Fire event on the current element, then bubble up the DOM tree + do { + var handle = jQuery._data( cur, "handle" ); + + event.currentTarget = cur; + if ( handle ) { + handle.apply( cur, data ); + } + + // Trigger an inline bound script + if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { + event.result = false; + event.preventDefault(); + } + + // Bubble up to document, then to window + cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; + } while ( cur && !event.isPropagationStopped() ); + + // If nobody prevented the default action, do it now + if ( !event.isDefaultPrevented() ) { + var old, + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction)() check here because IE6/7 fails that test. + // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. + try { + if ( ontype && elem[ type ] ) { + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + jQuery.event.triggered = type; + elem[ type ](); + } + } catch ( ieError ) {} + + if ( old ) { + elem[ ontype ] = old; + } + + jQuery.event.triggered = undefined; + } + } + + return event.result; + }, + + handle: function( event ) { + event = jQuery.event.fix( event || window.event ); + // Snapshot the handlers list since a called handler may add/remove events. + var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), + run_all = !event.exclusive && !event.namespace, + args = Array.prototype.slice.call( arguments, 0 ); + + // Use the fix-ed Event rather than the (read-only) native event + args[0] = event; + event.currentTarget = this; + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Triggered event must 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event. + if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var eventDocument = event.target.ownerDocument || document, + doc = eventDocument.documentElement, + body = eventDocument.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // set the correct event type + event.type = event.data; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent && parent !== document && !parent.parentNode ) { + return; + } + + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( !jQuery.nodeName( this, "form" ) ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( jQuery.nodeName( elem, "select" ) ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); + e.type = fix; + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + var handler; + + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( arguments.length === 2 || data === false ) { + fn = data; + data = undefined; + } + + if ( name === "one" ) { + handler = function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }; + handler.guid = fn.guid || jQuery.guid++; + } else { + handler = fn; + } + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( name === "die" && !types && + origSelector && origSelector.charAt(0) === "." ) { + + context.unbind( origSelector ); + + return this; + } + + if ( data === false || jQuery.isFunction( data ) ) { + fn = data || returnFalse; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( liveMap[ type ] ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + + // Make sure not to accidentally match a child element with the same selector + if ( related && jQuery.contains( elem, related ) ) { + related = elem; + } + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = "<a name='" + id + "'/>"; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = "<a href='#'></a>"; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "<p class='TEST'></p>"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "<div class='test e'></div><div class='test'></div>"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( typeof selector === "string" ? + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[ selector ] ) { + matches[ selector ] = POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[ selector ]; + + if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnocache = /<(?:script|object|embed|option|style)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/, + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + area: [ 1, "<map>", "</map>" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize <link> and <script> tags normally +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "div<div>", "</div>" ]; +} + +jQuery.fn.extend({ + text: function( text ) { + if ( jQuery.isFunction(text) ) { + return this.each(function(i) { + var self = jQuery( this ); + + self.text( text.call(this, i, self.text()) ); + }); + } + + if ( typeof text !== "object" && text !== undefined ) { + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + } + + return jQuery.text( this ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + return this.each(function() { + jQuery( this ).wrapAll( html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } else if ( arguments.length ) { + var set = jQuery(arguments[0]); + set.push.apply( set, this.toArray() ); + return this.pushStack( set, "before", arguments ); + } + }, + + after: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } else if ( arguments.length ) { + var set = this.pushStack( this, "after", arguments ); + set.push.apply( set, jQuery(arguments[0]).toArray() ); + return set; + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + if ( value === undefined ) { + return this[0] && this[0].nodeType === 1 ? + this[0].innerHTML.replace(rinlinejQuery, "") : + null; + + // See if we can take a shortcut and just use innerHTML + } else if ( typeof value === "string" && !rnocache.test( value ) && + (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && + !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { + + value = value.replace(rxhtmlTag, "<$1></$2>"); + + try { + for ( var i = 0, l = this.length; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + if ( this[i].nodeType === 1 ) { + jQuery.cleanData( this[i].getElementsByTagName("*") ); + this[i].innerHTML = value; + } + } + + // If using innerHTML throws an exception, use the fallback method + } catch(e) { + this.empty().append( value ); + } + + } else if ( jQuery.isFunction( value ) ) { + this.each(function(i){ + var self = jQuery( this ); + + self.html( value.call(this, i, self.html()) ); + }); + + } else { + this.empty().append( value ); + } + + return this; + }, + + replaceWith: function( value ) { + if ( this[0] && this[0].parentNode ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery( value ).detach(); + } + + return this.each(function() { + var next = this.nextSibling, + parent = this.parentNode; + + jQuery( this ).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } else { + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; + } + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + var results, first, fragment, parent, + value = args[0], + scripts = []; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback, true ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call(this, i, table ? self.html() : undefined); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + parent = value && value.parentNode; + + // If we're in a fragment, just use that instead of building a new one + if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { + results = { fragment: parent }; + + } else { + results = jQuery.buildFragment( args, this, scripts ); + } + + fragment = results.fragment; + + if ( fragment.childNodes.length === 1 ) { + first = fragment = fragment.firstChild; + } else { + first = fragment.firstChild; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) { + callback.call( + table ? + root(this[i], first) : + this[i], + // Make sure that we do not leak memory by inadvertently discarding + // the original fragment (which might have attached data) instead of + // using it; in addition, use the original fragment object for the last + // item instead of first because it can end up being emptied incorrectly + // in certain situations (Bug #8070). + // Fragments from the fragment cache must always be cloned and never used + // in place. + results.cacheable || (l > 1 && i < lastIndex) ? + jQuery.clone( fragment, true, true ) : + fragment + ); + } + } + + if ( scripts.length ) { + jQuery.each( scripts, evalScript ); + } + } + + return this; + } +}); + +function root( elem, cur ) { + return jQuery.nodeName(elem, "table") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var internalKey = jQuery.expando, + oldData = jQuery.data( src ), + curData = jQuery.data( dest, oldData ); + + // Switch to use the internal data object, if it exists, for the next + // stage of data copying + if ( (oldData = oldData[ internalKey ]) ) { + var events = oldData.events; + curData = curData[ internalKey ] = jQuery.extend({}, oldData); + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( var type in events ) { + for ( var i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data ); + } + } + } + } +} + +function cloneFixAttributes( src, dest ) { + var nodeName; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + if ( dest.clearAttributes ) { + dest.clearAttributes(); + } + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + if ( dest.mergeAttributes ) { + dest.mergeAttributes( src ); + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 fail to clone children inside object elements that use + // the proprietary classid attribute value (rather than the type + // attribute) to identify the type of content to display + if ( nodeName === "object" ) { + dest.outerHTML = src.outerHTML; + + } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + if ( src.checked ) { + dest.defaultChecked = dest.checked = src.checked; + } + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); +} + +jQuery.buildFragment = function( args, nodes, scripts ) { + var fragment, cacheable, cacheresults, + doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); + + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && + args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { + + cacheable = true; + + cacheresults = jQuery.fragments[ args[0] ]; + if ( cacheresults && cacheresults !== 1 ) { + fragment = cacheresults; + } + } + + if ( !fragment ) { + fragment = doc.createDocumentFragment(); + jQuery.clean( args, doc, fragment, scripts ); + } + + if ( cacheable ) { + jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1; + } + + return { fragment: fragment, cacheable: cacheable }; +}; + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var ret = [], + insert = jQuery( selector ), + parent = this.length === 1 && this[0].parentNode; + + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { + insert[ original ]( this[0] ); + return this; + + } else { + for ( var i = 0, l = insert.length; i < l; i++ ) { + var elems = (i > 0 ? this.clone(true) : this).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +function getAll( elem ) { + if ( "getElementsByTagName" in elem ) { + return elem.getElementsByTagName( "*" ); + + } else if ( "querySelectorAll" in elem ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +// Used in clean, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( elem.type === "checkbox" || elem.type === "radio" ) { + elem.defaultChecked = elem.checked; + } +} +// Finds all inputs and passes them to fixDefaultChecked +function findInputs( elem ) { + if ( jQuery.nodeName( elem, "input" ) ) { + fixDefaultChecked( elem ); + } else if ( elem.getElementsByTagName ) { + jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var clone = elem.cloneNode(true), + srcElements, + destElements, + i; + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName + // instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + // Return the cloned set + return clone; + }, + + clean: function( elems, context, fragment, scripts ) { + var checkScriptType; + + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) { + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + } + + var ret = [], j; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + if ( !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + } else { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1></$2>"); + + // Trim whitespace, otherwise indexOf won't work as expected + var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), + wrap = wrapMap[ tag ] || wrapMap._default, + depth = wrap[0], + div = context.createElement("div"); + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + var hasBody = rtbody.test(elem), + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !hasBody ? + div.childNodes : + []; + + for ( j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + } + } + + // Resets defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + var len; + if ( !jQuery.support.appendChecked ) { + if ( elem[0] && typeof (len = elem.length) === "number" ) { + for ( j = 0; j < len; j++ ) { + findInputs( elem[j] ); + } + } else { + findInputs( elem ); + } + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + ret = jQuery.merge( ret, elem ); + } + } + + if ( fragment ) { + checkScriptType = function( elem ) { + return !elem.type || rscriptType.test( elem.type ); + }; + for ( i = 0; ret[i]; i++ ) { + if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { + scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); + + } else { + if ( ret[i].nodeType === 1 ) { + var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType ); + + ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); + } + fragment.appendChild( ret[i] ); + } + } + } + + return ret; + }, + + cleanData: function( elems ) { + var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special, + deleteExpando = jQuery.support.deleteExpando; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + continue; + } + + id = elem[ jQuery.expando ]; + + if ( id ) { + data = cache[ id ] && cache[ id ][ internalKey ]; + + if ( data && data.events ) { + for ( var type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + + // Null the DOM reference to avoid IE6/7/8 leak (#7054) + if ( data.handle ) { + data.handle.elem = null; + } + } + + if ( deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + delete cache[ id ]; + } + } + } +}); + +function evalScript( i, elem ) { + if ( elem.src ) { + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + } else { + jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } +} + + + + +var ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity=([^)]*)/, + rdashAlpha = /-([a-z])/ig, + // fixed for IE9, see #8346 + rupper = /([A-Z]|^ms)/g, + rnumpx = /^-?\d+(?:px)?$/i, + rnum = /^-?\d/, + rrelNum = /^[+\-]=/, + rrelNumFilter = /[^+\-\.\de]+/g, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssWidth = [ "Left", "Right" ], + cssHeight = [ "Top", "Bottom" ], + curCSS, + + getComputedStyle, + currentStyle, + + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn.css = function( name, value ) { + // Setting 'undefined' is a no-op + if ( arguments.length === 2 && value === undefined ) { + return this; + } + + return jQuery.access( this, name, value, true, function( elem, name, value ) { + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }); +}; + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity", "opacity" ); + return ret === "" ? "1" : ret; + + } else { + return elem.style.opacity; + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "zIndex": true, + "fontWeight": true, + "opacity": true, + "zoom": true, + "lineHeight": true, + "widows": true, + "orphans": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, origName = jQuery.camelCase( name ), + style = elem.style, hooks = jQuery.cssHooks[ origName ]; + + name = jQuery.cssProps[ origName ] || origName; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Make sure that NaN and null values aren't set. See: #7116 + if ( type === "number" && isNaN( value ) || value == null ) { + return; + } + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && rrelNum.test( value ) ) { + value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) ); + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) { + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra ) { + var ret, hooks; + + // Make sure that we're working with the right name + name = jQuery.camelCase( name ); + hooks = jQuery.cssHooks[ name ]; + name = jQuery.cssProps[ name ] || name; + + // cssFloat needs a special treatment + if ( name === "cssFloat" ) { + name = "float"; + } + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) { + return ret; + + // Otherwise, if a way to get the computed value exists, use that + } else if ( curCSS ) { + return curCSS( elem, name ); + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + }, + + camelCase: function( string ) { + return string.replace( rdashAlpha, fcamelCase ); + } +}); + +// DEPRECATED, Use jQuery.css() instead +jQuery.curCSS = jQuery.css; + +jQuery.each(["height", "width"], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + var val; + + if ( computed ) { + if ( elem.offsetWidth !== 0 ) { + val = getWH( elem, name, extra ); + + } else { + jQuery.swap( elem, cssShow, function() { + val = getWH( elem, name, extra ); + }); + } + + if ( val <= 0 ) { + val = curCSS( elem, name, name ); + + if ( val === "0px" && currentStyle ) { + val = currentStyle( elem, name, name ); + } + + if ( val != null ) { + // Should return "auto" instead of 0, use 0 for + // temporary backwards-compat + return val === "" || val === "auto" ? "0px" : val; + } + } + + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + + // Should return "auto" instead of 0, use 0 for + // temporary backwards-compat + return val === "" || val === "auto" ? "0px" : val; + } + + return typeof val === "string" ? val : val + "px"; + } + }, + + set: function( elem, value ) { + if ( rnumpx.test( value ) ) { + // ignore negative width and height values #1599 + value = parseFloat(value); + + if ( value >= 0 ) { + return value + "px"; + } + + } else { + return value; + } + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( parseFloat( RegExp.$1 ) / 100 ) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style, + currentStyle = elem.currentStyle; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // Set the alpha filter to set the opacity + var opacity = jQuery.isNaN( value ) ? + "" : + "alpha(opacity=" + value * 100 + ")", + filter = currentStyle && currentStyle.filter || style.filter || ""; + + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; + } + }; +} + +jQuery(function() { + // This hook cannot be added until DOM ready because the support test + // for it is not run until after DOM ready + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + var ret; + jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + ret = curCSS( elem, "margin-right", "marginRight" ); + } else { + ret = elem.style.marginRight; + } + }); + return ret; + } + }; + } +}); + +if ( document.defaultView && document.defaultView.getComputedStyle ) { + getComputedStyle = function( elem, name ) { + var ret, defaultView, computedStyle; + + name = name.replace( rupper, "-$1" ).toLowerCase(); + + if ( !(defaultView = elem.ownerDocument.defaultView) ) { + return undefined; + } + + if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) { + ret = computedStyle.getPropertyValue( name ); + if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) { + ret = jQuery.style( elem, name ); + } + } + + return ret; + }; +} + +if ( document.documentElement.currentStyle ) { + currentStyle = function( elem, name ) { + var left, + ret = elem.currentStyle && elem.currentStyle[ name ], + rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ], + style = elem.style; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { + // Remember the original values + left = style.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : (ret || 0); + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +curCSS = getComputedStyle || currentStyle; + +function getWH( elem, name, extra ) { + var which = name === "width" ? cssWidth : cssHeight, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) { + return val; + } + + jQuery.each( which, function() { + if ( !extra ) { + val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0; + } + + if ( extra === "margin" ) { + val += parseFloat(jQuery.css( elem, "margin" + this )) || 0; + + } else { + val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0; + } + }); + + return val; +} + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + var width = elem.offsetWidth, + height = elem.offsetHeight; + + return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + + + + +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, + rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, + rselectTextarea = /^(?:select|textarea)/i, + rspacesAjax = /\s+/, + rts = /([?&])_=[^&]*/, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Document location + ajaxLocation, + + // Document location segments + ajaxLocParts; + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + if ( jQuery.isFunction( func ) ) { + var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ), + i = 0, + length = dataTypes.length, + dataType, + list, + placeBefore; + + // For each dataType in the dataTypeExpression + for(; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ), + selection; + + for(; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} + +jQuery.fn.extend({ + load: function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + + // Don't do a request if no elements are being requested + } else if ( !this.length ) { + return this; + } + + var off = url.indexOf( " " ); + if ( off >= 0 ) { + var selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) { + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( typeof params === "object" ) { + params = jQuery.param( params, jQuery.ajaxSettings.traditional ); + type = "POST"; + } + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + dataType: "html", + data: params, + // Complete callback (responseText is used internally) + complete: function( jqXHR, status, responseText ) { + // Store the response as specified by the jqXHR object + responseText = jqXHR.responseText; + // If successful, inject the HTML into all the matched elements + if ( jqXHR.isResolved() ) { + // #4825: Get the actual response in case + // a dataFilter is present in ajaxSettings + jqXHR.done(function( r ) { + responseText = r; + }); + // See if a selector was specified + self.html( selector ? + // Create a dummy div to hold the results + jQuery("<div>") + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append(responseText.replace(rscript, "")) + + // Locate the specified elements + .find(selector) : + + // If not, just inject the full result + responseText ); + } + + if ( callback ) { + self.each( callback, [ responseText, status, jqXHR ] ); + } + } + }); + + return this; + }, + + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + + serializeArray: function() { + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.bind( o, f ); + }; +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); + }; +}); + +jQuery.extend({ + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function ( target, settings ) { + if ( !settings ) { + // Only one parameter, we extend ajaxSettings + settings = target; + target = jQuery.extend( true, jQuery.ajaxSettings, settings ); + } else { + // target was provided, we extend into it + jQuery.extend( true, target, jQuery.ajaxSettings, settings ); + } + // Flatten fields we don't want deep extended + for( var field in { context: 1, url: 1 } ) { + if ( field in settings ) { + target[ field ] = settings[ field ]; + } else if( field in jQuery.ajaxSettings ) { + target[ field ] = jQuery.ajaxSettings[ field ]; + } + } + return target; + }, + + ajaxSettings: { + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded", + processData: true, + async: true, + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + traditional: false, + headers: {}, + */ + + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": "*/*" + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + } + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery._Deferred(), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // ifModified key + ifModifiedKey, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // The jqXHR state + state = 0, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + var lname = name.toLowerCase(); + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || "abort"; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, statusText, responses, headers ) { + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status ? 4 : 0; + + var isSuccess, + success, + error, + response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, + lastModified, + etag; + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { + jQuery.lastModified[ ifModifiedKey ] = lastModified; + } + if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { + jQuery.etag[ ifModifiedKey ] = etag; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + try { + success = ajaxConvert( s, response ); + statusText = "success"; + isSuccess = true; + } catch(e) { + // We have a parsererror + statusText = "parsererror"; + error = e; + } + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = statusText; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.done; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.then( tmp, tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); + + // Determine if a cross-domain request is in order + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefiler, stop there + if ( state === 2 ) { + return false; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + } + + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + + // Add anti-cache in url if needed + if ( s.cache === false ) { + + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); + } + if ( jQuery.etag[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); + } + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already + jqXHR.abort(); + return false; + + } + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( status < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + jQuery.error( e ); + } + } + } + + return jqXHR; + }, + + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a, traditional ) { + var s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : value; + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( var prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); + } +}); + +function buildParams( prefix, obj, traditional, add ) { + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && obj != null && typeof obj === "object" ) { + // Serialize object item. + for ( var name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} + +// This is still on the jQuery object... for now +// Want to move this to jQuery.ajax some day +jQuery.extend({ + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {} + +}); + +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields, + ct, + type, + finalDataType, + firstDataType; + + // Fill responseXXX fields + for( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + var dataTypes = s.dataTypes, + converters = {}, + i, + key, + length = dataTypes.length, + tmp, + // Current and previous dataTypes + current = dataTypes[ 0 ], + prev, + // Conversion expression + conversion, + // Conversion function + conv, + // Conversion functions (transitive conversion) + conv1, + conv2; + + // For each dataType in the chain + for( i = 1; i < length; i++ ) { + + // Create converters map + // with lowercased keys + if ( i === 1 ) { + for( key in s.converters ) { + if( typeof key === "string" ) { + converters[ key.toLowerCase() ] = s.converters[ key ]; + } + } + } + + // Get the dataTypes + prev = current; + current = dataTypes[ i ]; + + // If current is auto dataType, update it to prev + if( current === "*" ) { + current = prev; + // If no auto and dataTypes are actually different + } else if ( prev !== "*" && prev !== current ) { + + // Get the converter + conversion = prev + " " + current; + conv = converters[ conversion ] || converters[ "* " + current ]; + + // If there is no direct converter, search transitively + if ( !conv ) { + conv2 = undefined; + for( conv1 in converters ) { + tmp = conv1.split( " " ); + if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { + conv2 = converters[ tmp[1] + " " + current ]; + if ( conv2 ) { + conv1 = converters[ conv1 ]; + if ( conv1 === true ) { + conv = conv2; + } else if ( conv2 === true ) { + conv = conv1; + } + break; + } + } + } + } + // If we found no converter, dispatch an error + if ( !( conv || conv2 ) ) { + jQuery.error( "No conversion from " + conversion.replace(" "," to ") ); + } + // If found converter is not an equivalence + if ( conv !== true ) { + // Convert with 1 or 2 converters accordingly + response = conv ? conv( response ) : conv2( conv1(response) ); + } + } + } + return response; +} + + + + +var jsc = jQuery.now(), + jsre = /(\=)\?(&|$)|\?\?/i; + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + return jQuery.expando + "_" + ( jsc++ ); + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var inspectData = s.contentType === "application/x-www-form-urlencoded" && + ( typeof s.data === "string" ); + + if ( s.dataTypes[ 0 ] === "jsonp" || + s.jsonp !== false && ( jsre.test( s.url ) || + inspectData && jsre.test( s.data ) ) ) { + + var responseContainer, + jsonpCallback = s.jsonpCallback = + jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, + previous = window[ jsonpCallback ], + url = s.url, + data = s.data, + replace = "$1" + jsonpCallback + "$2"; + + if ( s.jsonp !== false ) { + url = url.replace( jsre, replace ); + if ( s.url === url ) { + if ( inspectData ) { + data = data.replace( jsre, replace ); + } + if ( s.data === data ) { + // Add callback manually + url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; + } + } + } + + s.url = url; + s.data = data; + + // Install callback + window[ jsonpCallback ] = function( response ) { + responseContainer = [ response ]; + }; + + // Clean-up function + jqXHR.always(function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( previous ) ) { + window[ jsonpCallback ]( responseContainer[ 0 ] ); + } + }); + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( jsonpCallback + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Delegate to script + return "script"; + } +}); + + + + +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +}); + + + + +var // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject ? function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + } : false, + xhrId = 0, + xhrCallbacks; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +(function( xhr ) { + jQuery.extend( jQuery.support, { + ajax: !!xhr, + cors: !!xhr && ( "withCredentials" in xhr ) + }); +})( jQuery.ajaxSettings.xhr() ); + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var xhr = s.xhr(), + handle, + i; + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occured + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + responses.text = xhr.responseText; + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + // if we're in sync mode or it's in cache + // and has been retrieved directly (IE6 & IE7) + // we need to manually fire the callback + if ( !s.async || xhr.readyState === 4 ) { + callback(); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} + + + + +var elemdisplay = {}, + iframe, iframeDoc, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, + timerId, + fxAttrs = [ + // height animations + [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], + // width animations + [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], + // opacity animations + [ "opacity" ] + ], + fxNow, + requestAnimationFrame = window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame; + +jQuery.fn.extend({ + show: function( speed, easing, callback ) { + var elem, display; + + if ( speed || speed === 0 ) { + return this.animate( genFx("show", 3), speed, easing, callback); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + elem = this[i]; + + if ( elem.style ) { + display = elem.style.display; + + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { + display = elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( display === "" && jQuery.css( elem, "display" ) === "none" ) { + jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + elem = this[i]; + + if ( elem.style ) { + display = elem.style.display; + + if ( display === "" || display === "none" ) { + elem.style.display = jQuery._data(elem, "olddisplay") || ""; + } + } + } + + return this; + } + }, + + hide: function( speed, easing, callback ) { + if ( speed || speed === 0 ) { + return this.animate( genFx("hide", 3), speed, easing, callback); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + if ( this[i].style ) { + var display = jQuery.css( this[i], "display" ); + + if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) { + jQuery._data( this[i], "olddisplay", display ); + } + } + } + + // Set the display of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + if ( this[i].style ) { + this[i].style.display = "none"; + } + } + + return this; + } + }, + + // Save the old toggle function + _toggle: jQuery.fn.toggle, + + toggle: function( fn, fn2, callback ) { + var bool = typeof fn === "boolean"; + + if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { + this._toggle.apply( this, arguments ); + + } else if ( fn == null || bool ) { + this.each(function() { + var state = bool ? fn : jQuery(this).is(":hidden"); + jQuery(this)[ state ? "show" : "hide" ](); + }); + + } else { + this.animate(genFx("toggle", 3), fn, fn2, callback); + } + + return this; + }, + + fadeTo: function( speed, to, easing, callback ) { + return this.filter(":hidden").css("opacity", 0).show().end() + .animate({opacity: to}, speed, easing, callback); + }, + + animate: function( prop, speed, easing, callback ) { + var optall = jQuery.speed(speed, easing, callback); + + if ( jQuery.isEmptyObject( prop ) ) { + return this.each( optall.complete, [ false ] ); + } + + // Do not change referenced properties as per-property easing will be lost + prop = jQuery.extend( {}, prop ); + + return this[ optall.queue === false ? "each" : "queue" ](function() { + // XXX 'this' does not always have a nodeName when running the + // test suite + + if ( optall.queue === false ) { + jQuery._mark( this ); + } + + var opt = jQuery.extend( {}, optall ), + isElement = this.nodeType === 1, + hidden = isElement && jQuery(this).is(":hidden"), + name, val, p, + display, e, + parts, start, end, unit; + + // will store per property easing and be used to determine when an animation is complete + opt.animatedProperties = {}; + + for ( p in prop ) { + + // property name normalization + name = jQuery.camelCase( p ); + if ( p !== name ) { + prop[ name ] = prop[ p ]; + delete prop[ p ]; + } + + val = prop[ name ]; + + // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default) + if ( jQuery.isArray( val ) ) { + opt.animatedProperties[ name ] = val[ 1 ]; + val = prop[ name ] = val[ 0 ]; + } else { + opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing'; + } + + if ( val === "hide" && hidden || val === "show" && !hidden ) { + return opt.complete.call( this ); + } + + if ( isElement && ( name === "height" || name === "width" ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height + // animated + if ( jQuery.css( this, "display" ) === "inline" && + jQuery.css( this, "float" ) === "none" ) { + if ( !jQuery.support.inlineBlockNeedsLayout ) { + this.style.display = "inline-block"; + + } else { + display = defaultDisplay( this.nodeName ); + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( display === "inline" ) { + this.style.display = "inline-block"; + + } else { + this.style.display = "inline"; + this.style.zoom = 1; + } + } + } + } + } + + if ( opt.overflow != null ) { + this.style.overflow = "hidden"; + } + + for ( p in prop ) { + e = new jQuery.fx( this, opt, p ); + val = prop[ p ]; + + if ( rfxtypes.test(val) ) { + e[ val === "toggle" ? hidden ? "show" : "hide" : val ](); + + } else { + parts = rfxnum.exec( val ); + start = e.cur(); + + if ( parts ) { + end = parseFloat( parts[2] ); + unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" ); + + // We need to compute starting value + if ( unit !== "px" ) { + jQuery.style( this, p, (end || 1) + unit); + start = ((end || 1) / e.cur()) * start; + jQuery.style( this, p, start + unit); + } + + // If a +=/-= token was provided, we're doing a relative animation + if ( parts[1] ) { + end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start; + } + + e.custom( start, end, unit ); + + } else { + e.custom( start, val, "" ); + } + } + } + + // For JS strict compliance + return true; + }); + }, + + stop: function( clearQueue, gotoEnd ) { + if ( clearQueue ) { + this.queue([]); + } + + this.each(function() { + var timers = jQuery.timers, + i = timers.length; + // clear marker counters if we know they won't be + if ( !gotoEnd ) { + jQuery._unmark( true, this ); + } + while ( i-- ) { + if ( timers[i].elem === this ) { + if (gotoEnd) { + // force the next step to be the last + timers[i](true); + } + + timers.splice(i, 1); + } + } + }); + + // start the next in the queue if the last step wasn't forced + if ( !gotoEnd ) { + this.dequeue(); + } + + return this; + } + +}); + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout( clearFxNow, 0 ); + return ( fxNow = jQuery.now() ); +} + +function clearFxNow() { + fxNow = undefined; +} + +// Generate parameters to create a standard animation +function genFx( type, num ) { + var obj = {}; + + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { + obj[ this ] = type; + }); + + return obj; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show", 1), + slideUp: genFx("hide", 1), + slideToggle: genFx("toggle", 1), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.extend({ + speed: function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction(easing) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default; + + // Queueing + opt.old = opt.complete; + opt.complete = function( noUnmark ) { + if ( opt.queue !== false ) { + jQuery.dequeue( this ); + } else if ( noUnmark !== false ) { + jQuery._unmark( this ); + } + + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + }; + + return opt; + }, + + easing: { + linear: function( p, n, firstNum, diff ) { + return firstNum + diff * p; + }, + swing: function( p, n, firstNum, diff ) { + return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; + } + }, + + timers: [], + + fx: function( elem, options, prop ) { + this.options = options; + this.elem = elem; + this.prop = prop; + + options.orig = options.orig || {}; + } + +}); + +jQuery.fx.prototype = { + // Simple function for setting a style value + update: function() { + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); + }, + + // Get the current size + cur: function() { + if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) { + return this.elem[ this.prop ]; + } + + var parsed, + r = jQuery.css( this.elem, this.prop ); + // Empty strings, null, undefined and "auto" are converted to 0, + // complex values such as "rotate(1rad)" are returned as is, + // simple values such as "10px" are parsed to Float. + return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; + }, + + // Start an animation from one number to another + custom: function( from, to, unit ) { + var self = this, + fx = jQuery.fx, + raf; + + this.startTime = fxNow || createFxNow(); + this.start = from; + this.end = to; + this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); + this.now = this.start; + this.pos = this.state = 0; + + function t( gotoEnd ) { + return self.step(gotoEnd); + } + + t.elem = this.elem; + + if ( t() && jQuery.timers.push(t) && !timerId ) { + // Use requestAnimationFrame instead of setInterval if available + if ( requestAnimationFrame ) { + timerId = 1; + raf = function() { + // When timerId gets set to null at any point, this stops + if ( timerId ) { + requestAnimationFrame( raf ); + fx.tick(); + } + }; + requestAnimationFrame( raf ); + } else { + timerId = setInterval( fx.tick, fx.interval ); + } + } + }, + + // Simple 'show' function + show: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.show = true; + + // Begin the animation + // Make sure that we start at a small width/height to avoid any + // flash of content + this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); + + // Start by showing the element + jQuery( this.elem ).show(); + }, + + // Simple 'hide' function + hide: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.hide = true; + + // Begin the animation + this.custom(this.cur(), 0); + }, + + // Each step of an animation + step: function( gotoEnd ) { + var t = fxNow || createFxNow(), + done = true, + elem = this.elem, + options = this.options, + i, n; + + if ( gotoEnd || t >= options.duration + this.startTime ) { + this.now = this.end; + this.pos = this.state = 1; + this.update(); + + options.animatedProperties[ this.prop ] = true; + + for ( i in options.animatedProperties ) { + if ( options.animatedProperties[i] !== true ) { + done = false; + } + } + + if ( done ) { + // Reset the overflow + if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { + + jQuery.each( [ "", "X", "Y" ], function (index, value) { + elem.style[ "overflow" + value ] = options.overflow[index]; + }); + } + + // Hide the element if the "hide" operation was done + if ( options.hide ) { + jQuery(elem).hide(); + } + + // Reset the properties, if the item has been hidden or shown + if ( options.hide || options.show ) { + for ( var p in options.animatedProperties ) { + jQuery.style( elem, p, options.orig[p] ); + } + } + + // Execute the complete function + options.complete.call( elem ); + } + + return false; + + } else { + // classical easing cannot be used with an Infinity duration + if ( options.duration == Infinity ) { + this.now = t; + } else { + n = t - this.startTime; + this.state = n / options.duration; + + // Perform the easing function, defaults to swing + this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration ); + this.now = this.start + ((this.end - this.start) * this.pos); + } + // Perform the next step of the animation + this.update(); + } + + return true; + } +}; + +jQuery.extend( jQuery.fx, { + tick: function() { + for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) { + if ( !timers[i]() ) { + timers.splice(i--, 1); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + }, + + interval: 13, + + stop: function() { + clearInterval( timerId ); + timerId = null; + }, + + speeds: { + slow: 600, + fast: 200, + // Default speed + _default: 400 + }, + + step: { + opacity: function( fx ) { + jQuery.style( fx.elem, "opacity", fx.now ); + }, + + _default: function( fx ) { + if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { + fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit; + } else { + fx.elem[ fx.prop ] = fx.now; + } + } + } +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} + +// Try to restore the default display value of an element +function defaultDisplay( nodeName ) { + + if ( !elemdisplay[ nodeName ] ) { + + var elem = jQuery( "<" + nodeName + ">" ).appendTo( "body" ), + display = elem.css( "display" ); + + elem.remove(); + + // If the simple way fails, + // get element's real default display by attaching it to a temp iframe + if ( display === "none" || display === "" ) { + // No iframe to use yet, so create it + if ( !iframe ) { + iframe = document.createElement( "iframe" ); + iframe.frameBorder = iframe.width = iframe.height = 0; + } + + document.body.appendChild( iframe ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake html + // document to it, Webkit & Firefox won't allow reusing the iframe document + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write( "<!doctype><html><body></body></html>" ); + } + + elem = iframeDoc.createElement( nodeName ); + + iframeDoc.body.appendChild( elem ); + + display = jQuery.css( elem, "display" ); + + document.body.removeChild( iframe ); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + } + + return elemdisplay[ nodeName ]; +} + + + + +var rtable = /^t(?:able|d|h)$/i, + rroot = /^(?:body|html)$/i; + +if ( "getBoundingClientRect" in document.documentElement ) { + jQuery.fn.offset = function( options ) { + var elem = this[0], box; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + try { + box = elem.getBoundingClientRect(); + } catch(e) {} + + var doc = elem.ownerDocument, + docElem = doc.documentElement; + + // Make sure we're not dealing with a disconnected DOM node + if ( !box || !jQuery.contains( docElem, elem ) ) { + return box ? { top: box.top, left: box.left } : { top: 0, left: 0 }; + } + + var body = doc.body, + win = getWindow(doc), + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, + scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: top, left: left }; + }; + +} else { + jQuery.fn.offset = function( options ) { + var elem = this[0]; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + jQuery.offset.initialize(); + + var computedStyle, + offsetParent = elem.offsetParent, + prevOffsetParent = elem, + doc = elem.ownerDocument, + docElem = doc.documentElement, + body = doc.body, + defaultView = doc.defaultView, + prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, + top = elem.offsetTop, + left = elem.offsetLeft; + + while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + break; + } + + computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; + top -= elem.scrollTop; + left -= elem.scrollLeft; + + if ( elem === offsetParent ) { + top += elem.offsetTop; + left += elem.offsetLeft; + + if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevOffsetParent = offsetParent; + offsetParent = elem.offsetParent; + } + + if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevComputedStyle = computedStyle; + } + + if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { + top += body.offsetTop; + left += body.offsetLeft; + } + + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + top += Math.max( docElem.scrollTop, body.scrollTop ); + left += Math.max( docElem.scrollLeft, body.scrollLeft ); + } + + return { top: top, left: left }; + }; +} + +jQuery.offset = { + initialize: function() { + var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0, + html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; + + jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } ); + + container.innerHTML = html; + body.insertBefore( container, body.firstChild ); + innerDiv = container.firstChild; + checkDiv = innerDiv.firstChild; + td = innerDiv.nextSibling.firstChild.firstChild; + + this.doesNotAddBorder = (checkDiv.offsetTop !== 5); + this.doesAddBorderForTableAndCells = (td.offsetTop === 5); + + checkDiv.style.position = "fixed"; + checkDiv.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15); + checkDiv.style.position = checkDiv.style.top = ""; + + innerDiv.style.overflow = "hidden"; + innerDiv.style.position = "relative"; + + this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); + + this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); + + body.removeChild( container ); + jQuery.offset.initialize = jQuery.noop; + }, + + bodyOffset: function( body ) { + var top = body.offsetTop, + left = body.offsetLeft; + + jQuery.offset.initialize(); + + if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.css(body, "marginTop") ) || 0; + left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if (options.top != null) { + props.top = (options.top - curOffset.top) + curTop; + } + if (options.left != null) { + props.left = (options.left - curOffset.left) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + position: function() { + if ( !this[0] ) { + return null; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; + offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; + parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( ["Left", "Top"], function( i, name ) { + var method = "scroll" + name; + + jQuery.fn[ method ] = function( val ) { + var elem, win; + + if ( val === undefined ) { + elem = this[ 0 ]; + + if ( !elem ) { + return null; + } + + win = getWindow( elem ); + + // Return the scroll offset + return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : + jQuery.support.boxModel && win.document.documentElement[ method ] || + win.document.body[ method ] : + elem[ method ]; + } + + // Set the scroll offset + return this.each(function() { + win = getWindow( this ); + + if ( win ) { + win.scrollTo( + !i ? val : jQuery( win ).scrollLeft(), + i ? val : jQuery( win ).scrollTop() + ); + + } else { + this[ method ] = val; + } + }); + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} + + + + +// Create innerHeight, innerWidth, outerHeight and outerWidth methods +jQuery.each([ "Height", "Width" ], function( i, name ) { + + var type = name.toLowerCase(); + + // innerHeight and innerWidth + jQuery.fn["inner" + name] = function() { + return this[0] ? + parseFloat( jQuery.css( this[0], type, "padding" ) ) : + null; + }; + + // outerHeight and outerWidth + jQuery.fn["outer" + name] = function( margin ) { + return this[0] ? + parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) : + null; + }; + + jQuery.fn[ type ] = function( size ) { + // Get window width or height + var elem = this[0]; + if ( !elem ) { + return size == null ? null : this; + } + + if ( jQuery.isFunction( size ) ) { + return this.each(function( i ) { + var self = jQuery( this ); + self[ type ]( size.call( this, i, self[ type ]() ) ); + }); + } + + if ( jQuery.isWindow( elem ) ) { + // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode + // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat + var docElemProp = elem.document.documentElement[ "client" + name ]; + return elem.document.compatMode === "CSS1Compat" && docElemProp || + elem.document.body[ "client" + name ] || docElemProp; + + // Get document width or height + } else if ( elem.nodeType === 9 ) { + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater + return Math.max( + elem.documentElement["client" + name], + elem.body["scroll" + name], elem.documentElement["scroll" + name], + elem.body["offset" + name], elem.documentElement["offset" + name] + ); + + // Get or set width or height on the element + } else if ( size === undefined ) { + var orig = jQuery.css( elem, type ), + ret = parseFloat( orig ); + + return jQuery.isNaN( ret ) ? orig : ret; + + // Set the width or height on the element (default to pixels if value is unitless) + } else { + return this.css( type, typeof size === "string" ? size : size + "px" ); + } + }; + +}); + + +window.jQuery = window.$ = jQuery; +})(window); +(function() { + + var joey = this.joey = function joey(elementDef, parentNode) { + return createNode( elementDef, parentNode, parentNode ? parentNode.ownerDocument : this.document ); + }; + + var shortcuts = joey.shortcuts = { + "text" : "textContent", + "cls" : "className" + }; + + var plugins = joey.plugins = [ + function( obj, context ) { + if( typeof obj === 'string' ) { + return context.createTextNode( obj ); + } + }, + function( obj, context ) { + if( "tag" in obj ) { + var el = context.createElement( obj.tag ); + for( var attr in obj ) { + addAttr( el, attr, obj[ attr ], context ); + } + return el; + } + } + ]; + + function addAttr( el, attr, value, context ) { + attr = shortcuts[attr] || attr; + if( attr === 'children' ) { + for( var i = 0; i < value.length; i++) { + createNode( value[i], el, context ); + } + } else if( attr === 'style' || attr === 'dataset' ) { + for( var prop in value ) { + el[ attr ][ prop ] = value[ prop ]; + } + } else if( attr.indexOf("on") === 0 ) { + el.addEventListener( attr.substr(2), value, false ); + } else if( value !== undefined ) { + el[ attr ] = value; + } + } + + function createNode( obj, parent, context ) { + var el; + if( obj != null ) { + plugins.some( function( plug ) { + return ( el = plug( obj, context ) ); + }); + parent && parent.appendChild( el ); + return el; + } + } + +}()); + +(function($, document) { + + var create = $.create = (function() { + + function addAttrs( el, obj, context ) { + for( var attr in obj ){ + switch( attr ) { + case 'tag' : + break; + case 'html' : + el.innerHTML = obj[ attr ]; + break; + case 'css' : + for( var style in obj.css ) { + $.attr( el.style, style, obj.css[ style ] ); + } + break; + case 'text' : case 'child' : case 'children' : + createNode( obj[attr], el, context ); + break; + case 'cls' : + el.className = obj[attr]; + break; + case 'data' : + for( var data in obj.data ) { + $.data( el, data, obj.data[data] ); + } + break; + default : + if( attr.indexOf("on") === 0 && $.isFunction(obj[attr]) ) { + $.event.add( el, attr.substr(2).replace(/^[A-Z]/, function(a) { return a.toLowerCase(); }), obj[attr] ); + } else { + $.attr( el, attr, obj[attr] ); + } + } + } + } + + function createNode(obj, parent, context) { + if(obj && ($.isArray(obj) || obj instanceof $)) { + for(var ret = [], i = 0; i < obj.length; i++) { + var newNode = createNode(obj[i], parent, context); + if(newNode) { + ret.push(newNode); + } + } + return ret; + } + var el; + if(typeof(obj) === 'string') { + el = context.createTextNode( obj ); + } else if(!obj) { + return undefined; + } else if(obj.nodeType === 1) { + el = obj; + } else if( obj instanceof app.ui.AbstractWidget ) { + el = obj.el[0]; + } else { + el = context.createElement( obj.tag || 'DIV' ); + addAttrs(el, obj, context); + } + if(parent){ parent.appendChild(el); } + return el; + } + + return function(elementDef, parentNode) { + return createNode(elementDef, parentNode, (parentNode && parentNode.ownerDocument) || document); + }; + + })(); + + + // inject create into jquery internals so object definitions are treated as first class constructors (overrides non-public methods) + var clean = $.clean, + init = $.fn.init; + + $.clean = function( elems, context, fragment, scripts ) { + for(var i = 0; i < elems.length; i++) { + if( elems[i].tag || elems[i] instanceof app.ui.AbstractWidget ) { + elems[i] = create( elems[i], null, context ); + } + } + return clean( elems, context, fragment, scripts ); + }; + + $.fn.init = function( selector, context, rootjQuery ) { + if ( selector && ( selector.tag || selector instanceof app.ui.AbstractWidget )) { + selector = create( selector, null, context ); + } + return init.call( this, selector, context, rootjQuery ); + }; + + $.fn.init.prototype = $.fn; + +})(jQuery, window.document); + + +/*! + * Raphael 1.5.2 - JavaScript Vector Library + * + * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com) + * Licensed under the MIT (http://raphaeljs.com/license.html) license. + * from fork at git@github.com:mobz/g.raphael.git + */ +(function () { + function R() { + if (R.is(arguments[0], array)) { + var a = arguments[0], + cnv = create[apply](R, a.splice(0, 3 + R.is(a[0], nu))), + res = cnv.set(); + for (var i = 0, ii = a[length]; i < ii; i++) { + var j = a[i] || {}; + elements[has](j.type) && res[push](cnv[j.type]().attr(j)); + } + return res; + } + return create[apply](R, arguments); + } + R.version = "1.5.2"; + var separator = /[, ]+/, + elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1}, + formatrg = /\{(\d+)\}/g, + proto = "prototype", + has = "hasOwnProperty", + doc = document, + win = window, + oldRaphael = { + was: Object[proto][has].call(win, "Raphael"), + is: win.Raphael + }, + Paper = function () { + this.customAttributes = {}; + }, + paperproto, + appendChild = "appendChild", + apply = "apply", + concat = "concat", + supportsTouch = "createTouch" in doc, + E = "", + S = " ", + Str = String, + split = "split", + events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[split](S), + touchMap = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + join = "join", + length = "length", + lowerCase = Str[proto].toLowerCase, + math = Math, + mmax = math.max, + mmin = math.min, + abs = math.abs, + pow = math.pow, + PI = math.PI, + nu = "number", + string = "string", + array = "array", + toString = "toString", + fillString = "fill", + objectToString = Object[proto][toString], + paper = {}, + push = "push", + ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i, + colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i, + isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1}, + bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + round = math.round, + setAttribute = "setAttribute", + toFloat = parseFloat, + toInt = parseInt, + ms = " progid:DXImageTransform.Microsoft", + upperCase = Str[proto].toUpperCase, + availableAttrs = {blur: 0, "clip-rect": "0 0 1e9 1e9", cursor: "default", cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: '10px "Arial"', "font-family": '"Arial"', "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0}, + availableAnimAttrs = {along: "along", blur: nu, "clip-rect": "csv", cx: nu, cy: nu, fill: "colour", "fill-opacity": nu, "font-size": nu, height: nu, opacity: nu, path: "path", r: nu, rotation: "csv", rx: nu, ry: nu, scale: "csv", stroke: "colour", "stroke-opacity": nu, "stroke-width": nu, translation: "csv", width: nu, x: nu, y: nu}, + rp = "replace", + animKeyFrames= /^(from|to|\d+%?)$/, + commaSpaces = /\s*,\s*/, + hsrg = {hs: 1, rg: 1}, + p2s = /,?([achlmqrstvxz]),?/gi, + pathCommand = /([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig, + pathValues = /(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig, + radial_gradient = /^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, + sortByKey = function (a, b) { + return a.key - b.key; + }; + + R.type = (win.SVGAngle || doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML"); + if (R.type == "VML") { + var d = doc.createElement("div"), + b; + d.innerHTML = '<v:shape adj="1"/>'; + b = d.firstChild; + b.style.behavior = "url(#default#VML)"; + if (!(b && typeof b.adj == "object")) { + return R.type = null; + } + d = null; + } + R.svg = !(R.vml = R.type == "VML"); + Paper[proto] = R[proto]; + paperproto = Paper[proto]; + R._id = 0; + R._oid = 0; + R.fn = {}; + R.is = function (o, type) { + type = lowerCase.call(type); + if (type == "finite") { + return !isnan[has](+o); + } + return (type == "null" && o === null) || + (type == typeof o) || + (type == "object" && o === Object(o)) || + (type == "array" && Array.isArray && Array.isArray(o)) || + objectToString.call(o).slice(8, -1).toLowerCase() == type; + }; + R.angle = function (x1, y1, x2, y2, x3, y3) { + if (x3 == null) { + var x = x1 - x2, + y = y1 - y2; + if (!x && !y) { + return 0; + } + return ((x < 0) * 180 + math.atan(-y / -x) * 180 / PI + 360) % 360; + } else { + return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3); + } + }; + R.rad = function (deg) { + return deg % 360 * PI / 180; + }; + R.deg = function (rad) { + return rad * 180 / PI % 360; + }; + R.snapTo = function (values, value, tolerance) { + tolerance = R.is(tolerance, "finite") ? tolerance : 10; + if (R.is(values, array)) { + var i = values.length; + while (i--) if (abs(values[i] - value) <= tolerance) { + return values[i]; + } + } else { + values = +values; + var rem = value % values; + if (rem < tolerance) { + return value - rem; + } + if (rem > values - tolerance) { + return value - rem + values; + } + } + return value; + }; + function createUUID() { + // http://www.ietf.org/rfc/rfc4122.txt + var s = [], + i = 0; + for (; i < 32; i++) { + s[i] = (~~(math.random() * 16))[toString](16); + } + s[12] = 4; // bits 12-15 of the time_hi_and_version field to 0010 + s[16] = ((s[16] & 3) | 8)[toString](16); // bits 6-7 of the clock_seq_hi_and_reserved to 01 + return "r-" + s[join](""); + } + + R.setWindow = function (newwin) { + win = newwin; + doc = win.document; + }; + // colour utilities + var toHex = function (color) { + if (R.vml) { + // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/ + var trim = /^\s+|\s+$/g; + var bod; + try { + var docum = new ActiveXObject("htmlfile"); + docum.write("<body>"); + docum.close(); + bod = docum.body; + } catch(e) { + bod = createPopup().document.body; + } + var range = bod.createTextRange(); + toHex = cacher(function (color) { + try { + bod.style.color = Str(color)[rp](trim, E); + var value = range.queryCommandValue("ForeColor"); + value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16); + return "#" + ("000000" + value[toString](16)).slice(-6); + } catch(e) { + return "none"; + } + }); + } else { + var i = doc.createElement("i"); + i.title = "Rapha\xebl Colour Picker"; + i.style.display = "none"; + doc.body[appendChild](i); + toHex = cacher(function (color) { + i.style.color = color; + return doc.defaultView.getComputedStyle(i, E).getPropertyValue("color"); + }); + } + return toHex(color); + }, + hsbtoString = function () { + return "hsb(" + [this.h, this.s, this.b] + ")"; + }, + hsltoString = function () { + return "hsl(" + [this.h, this.s, this.l] + ")"; + }, + rgbtoString = function () { + return this.hex; + }; + R.hsb2rgb = function (h, s, b, o) { + if (R.is(h, "object") && "h" in h && "s" in h && "b" in h) { + b = h.b; + s = h.s; + h = h.h; + o = h.o; + } + return R.hsl2rgb(h, s, b / 2, o); + }; + R.hsl2rgb = function (h, s, l, o) { + if (R.is(h, "object") && "h" in h && "s" in h && "l" in h) { + l = h.l; + s = h.s; + h = h.h; + } + if (h > 1 || s > 1 || l > 1) { + h /= 360; + s /= 100; + l /= 100; + } + var rgb = {}, + channels = ["r", "g", "b"], + t2, t1, t3, r, g, b; + if (!s) { + rgb = { + r: l, + g: l, + b: l + }; + } else { + if (l < .5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + t1 = 2 * l - t2; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + if (t3 * 6 < 1) { + rgb[channels[i]] = t1 + (t2 - t1) * 6 * t3; + } else if (t3 * 2 < 1) { + rgb[channels[i]] = t2; + } else if (t3 * 3 < 2) { + rgb[channels[i]] = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + rgb[channels[i]] = t1; + } + } + } + rgb.r *= 255; + rgb.g *= 255; + rgb.b *= 255; + rgb.hex = "#" + (16777216 | rgb.b | (rgb.g << 8) | (rgb.r << 16)).toString(16).slice(1); + R.is(o, "finite") && (rgb.opacity = o); + rgb.toString = rgbtoString; + return rgb; + }; + R.rgb2hsb = function (red, green, blue) { + if (green == null && R.is(red, "object") && "r" in red && "g" in red && "b" in red) { + blue = red.b; + green = red.g; + red = red.r; + } + if (green == null && R.is(red, string)) { + var clr = R.getRGB(red); + red = clr.r; + green = clr.g; + blue = clr.b; + } + if (red > 1 || green > 1 || blue > 1) { + red /= 255; + green /= 255; + blue /= 255; + } + var max = mmax(red, green, blue), + min = mmin(red, green, blue), + hue, + saturation, + brightness = max; + if (min == max) { + return {h: 0, s: 0, b: max, toString: hsbtoString}; + } else { + var delta = (max - min); + saturation = delta / max; + if (red == max) { + hue = (green - blue) / delta; + } else if (green == max) { + hue = 2 + ((blue - red) / delta); + } else { + hue = 4 + ((red - green) / delta); + } + hue /= 6; + hue < 0 && hue++; + hue > 1 && hue--; + } + return {h: hue, s: saturation, b: brightness, toString: hsbtoString}; + }; + R.rgb2hsl = function (red, green, blue) { + if (green == null && R.is(red, "object") && "r" in red && "g" in red && "b" in red) { + blue = red.b; + green = red.g; + red = red.r; + } + if (green == null && R.is(red, string)) { + var clr = R.getRGB(red); + red = clr.r; + green = clr.g; + blue = clr.b; + } + if (red > 1 || green > 1 || blue > 1) { + red /= 255; + green /= 255; + blue /= 255; + } + var max = mmax(red, green, blue), + min = mmin(red, green, blue), + h, + s, + l = (max + min) / 2, + hsl; + if (min == max) { + hsl = {h: 0, s: 0, l: l}; + } else { + var delta = max - min; + s = l < .5 ? delta / (max + min) : delta / (2 - max - min); + if (red == max) { + h = (green - blue) / delta; + } else if (green == max) { + h = 2 + (blue - red) / delta; + } else { + h = 4 + (red - green) / delta; + } + h /= 6; + h < 0 && h++; + h > 1 && h--; + hsl = {h: h, s: s, l: l}; + } + hsl.toString = hsltoString; + return hsl; + }; + R._path2string = function () { + return this.join(",")[rp](p2s, "$1"); + }; + function cacher(f, scope, postprocessor) { + function newf() { + var arg = Array[proto].slice.call(arguments, 0), + args = arg[join]("\u25ba"), + cache = newf.cache = newf.cache || {}, + count = newf.count = newf.count || []; + if (cache[has](args)) { + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + count[length] >= 1e3 && delete cache[count.shift()]; + count[push](args); + cache[args] = f[apply](scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; + } + + R.getRGB = cacher(function (colour) { + if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1}; + } + if (colour == "none") { + return {r: -1, g: -1, b: -1, hex: "none"}; + } + !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour)); + var res, + red, + green, + blue, + opacity, + t, + values, + rgb = colour.match(colourRegExp); + if (rgb) { + if (rgb[2]) { + blue = toInt(rgb[2].substring(5), 16); + green = toInt(rgb[2].substring(3, 5), 16); + red = toInt(rgb[2].substring(1, 3), 16); + } + if (rgb[3]) { + blue = toInt((t = rgb[3].charAt(3)) + t, 16); + green = toInt((t = rgb[3].charAt(2)) + t, 16); + red = toInt((t = rgb[3].charAt(1)) + t, 16); + } + if (rgb[4]) { + values = rgb[4][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + } + if (rgb[5]) { + values = rgb[5][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsb2rgb(red, green, blue, opacity); + } + if (rgb[6]) { + values = rgb[6][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsl2rgb(red, green, blue, opacity); + } + rgb = {r: red, g: green, b: blue}; + rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1); + R.is(opacity, "finite") && (rgb.opacity = opacity); + return rgb; + } + return {r: -1, g: -1, b: -1, hex: "none", error: 1}; + }, R); + R.getColor = function (value) { + var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75}, + rgb = this.hsb2rgb(start.h, start.s, start.b); + start.h += .075; + if (start.h > 1) { + start.h = 0; + start.s -= .2; + start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b}); + } + return rgb.hex; + }; + R.getColor.reset = function () { + delete this.start; + }; + // path utilities + R.parsePathString = cacher(function (pathString) { + if (!pathString) { + return null; + } + var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0}, + data = []; + if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption + data = pathClone(pathString); + } + if (!data[length]) { + Str(pathString)[rp](pathCommand, function (a, b, c) { + var params = [], + name = lowerCase.call(b); + c[rp](pathValues, function (a, b) { + b && params[push](+b); + }); + if (name == "m" && params[length] > 2) { + data[push]([b][concat](params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + while (params[length] >= paramCounts[name]) { + data[push]([b][concat](params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + }); + } + data[toString] = R._path2string; + return data; + }); + R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t, + x = pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y = pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t * t * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t * t * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t * t * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t * t * (p2y - 2 * c2y + c1y), + ax = (1 - t) * p1x + t * c1x, + ay = (1 - t) * p1y + t * c1y, + cx = (1 - t) * c2x + t * p2x, + cy = (1 - t) * c2y + t * p2y, + alpha = (90 - math.atan((mx - nx) / (my - ny)) * 180 / PI); + (mx > nx || my < ny) && (alpha += 180); + return {x: x, y: y, m: {x: mx, y: my}, n: {x: nx, y: ny}, start: {x: ax, y: ay}, end: {x: cx, y: cy}, alpha: alpha}; + }; + var pathDimensions = cacher(function (path) { + if (!path) { + return {x: 0, y: 0, width: 0, height: 0}; + } + path = path2curve(path); + var x = 0, + y = 0, + X = [], + Y = [], + p; + for (var i = 0, ii = path[length]; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = p[1]; + y = p[2]; + X[push](x); + Y[push](y); + } else { + var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + X = X[concat](dim.min.x, dim.max.x); + Y = Y[concat](dim.min.y, dim.max.y); + x = p[5]; + y = p[6]; + } + } + var xmin = mmin[apply](0, X), + ymin = mmin[apply](0, Y); + return { + x: xmin, + y: ymin, + width: mmax[apply](0, X) - xmin, + height: mmax[apply](0, Y) - ymin + }; + }), + pathClone = function (pathArray) { + var res = []; + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + for (var i = 0, ii = pathArray[length]; i < ii; i++) { + res[i] = []; + for (var j = 0, jj = pathArray[i][length]; j < jj; j++) { + res[i][j] = pathArray[i][j]; + } + } + res[toString] = R._path2string; + return res; + }, + pathToRelative = cacher(function (pathArray) { + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = pathArray[0][1]; + y = pathArray[0][2]; + mx = x; + my = y; + start++; + res[push](["M", x, y]); + } + for (var i = start, ii = pathArray[length]; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != lowerCase.call(pa[0])) { + r[0] = lowerCase.call(pa[0]); + switch (r[0]) { + case "a": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] - x).toFixed(3); + r[7] = +(pa[7] - y).toFixed(3); + break; + case "v": + r[1] = +(pa[1] - y).toFixed(3); + break; + case "m": + mx = pa[1]; + my = pa[2]; + default: + for (var j = 1, jj = pa[length]; j < jj; j++) { + r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3); + } + } + } else { + r = res[i] = []; + if (pa[0] == "m") { + mx = pa[1] + x; + my = pa[2] + y; + } + for (var k = 0, kk = pa[length]; k < kk; k++) { + res[i][k] = pa[k]; + } + } + var len = res[i][length]; + switch (res[i][0]) { + case "z": + x = mx; + y = my; + break; + case "h": + x += +res[i][len - 1]; + break; + case "v": + y += +res[i][len - 1]; + break; + default: + x += +res[i][len - 2]; + y += +res[i][len - 1]; + } + } + res[toString] = R._path2string; + return res; + }, 0, pathClone), + pathToAbsolute = cacher(function (pathArray) { + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = ["M", x, y]; + } + for (var i = start, ii = pathArray[length]; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != upperCase.call(pa[0])) { + r[0] = upperCase.call(pa[0]); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] + x); + r[7] = +(pa[7] + y); + break; + case "V": + r[1] = +pa[1] + y; + break; + case "H": + r[1] = +pa[1] + x; + break; + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + default: + for (var j = 1, jj = pa[length]; j < jj; j++) { + r[j] = +pa[j] + ((j % 2) ? x : y); + } + } + } else { + for (var k = 0, kk = pa[length]; k < kk; k++) { + res[i][k] = pa[k]; + } + } + switch (r[0]) { + case "Z": + x = mx; + y = my; + break; + case "H": + x = r[1]; + break; + case "V": + y = r[1]; + break; + case "M": + mx = res[i][res[i][length] - 2]; + my = res[i][res[i][length] - 1]; + default: + x = res[i][res[i][length] - 2]; + y = res[i][res[i][length] - 1]; + } + } + res[toString] = R._path2string; + return res; + }, null, pathClone), + l2c = function (x1, y1, x2, y2) { + return [x1, y1, x2, y2, x2, y2]; + }, + q2c = function (x1, y1, ax, ay, x2, y2) { + var _13 = 1 / 3, + _23 = 2 / 3; + return [ + _13 * x1 + _23 * ax, + _13 * y1 + _23 * ay, + _13 * x2 + _23 * ax, + _13 * y2 + _23 * ay, + x2, + y2 + ]; + }, + a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var _120 = PI * 120 / 180, + rad = PI / 180 * (+angle || 0), + res = [], + xy, + rotate = cacher(function (x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), + Y = x * math.sin(rad) + y * math.cos(rad); + return {x: X, y: Y}; + }); + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var cos = math.cos(PI / 180 * angle), + sin = math.sin(PI / 180 * angle), + x = (x1 - x2) / 2, + y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + var rx2 = rx * rx, + ry2 = ry * ry, + k = (large_arc_flag == sweep_flag ? -1 : 1) * + math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))), + cx = k * rx * y / ry + (x1 + x2) / 2, + cy = k * -ry * x / rx + (y1 + y2) / 2, + f1 = math.asin(((y1 - cy) / ry).toFixed(9)), + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + f1 < 0 && (f1 = PI * 2 + f1); + f2 < 0 && (f2 = PI * 2 + f2); + if (sweep_flag && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sweep_flag && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + var df = f2 - f1; + if (abs(df) > _120) { + var f2old = f2, + x2old = x2, + y2old = y2; + f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = math.cos(f1), + s1 = math.sin(f1), + c2 = math.cos(f2), + s2 = math.sin(f2), + t = math.tan(df / 4), + hx = 4 / 3 * rx * t, + hy = 4 / 3 * ry * t, + m1 = [x1, y1], + m2 = [x1 + hx * s1, y1 - hy * c1], + m3 = [x2 + hx * s2, y2 - hy * c2], + m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [m2, m3, m4][concat](res); + } else { + res = [m2, m3, m4][concat](res)[join]()[split](","); + var newres = []; + for (var i = 0, ii = res[length]; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + }, + findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t; + return { + x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y + }; + }, + curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x), + b = 2 * (c1x - p1x) - 2 * (c2x - c1x), + c = p1x - c1x, + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a, + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a, + y = [p1y, p2y], + x = [p1x, p2x], + dot; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x[push](dot.x); + y[push](dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x[push](dot.x); + y[push](dot.y); + } + a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y); + b = 2 * (c1y - p1y) - 2 * (c2y - c1y); + c = p1y - c1y; + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a; + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x[push](dot.x); + y[push](dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x[push](dot.x); + y[push](dot.y); + } + return { + min: {x: mmin[apply](0, x), y: mmin[apply](0, y)}, + max: {x: mmax[apply](0, x), y: mmax[apply](0, y)} + }; + }), + path2curve = cacher(function (path, path2) { + var p = pathToAbsolute(path), + p2 = path2 && pathToAbsolute(path2), + attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + processPath = function (path, d) { + var nx, ny; + if (!path) { + return ["C", d.x, d.y, d.x, d.y, d.x, d.y]; + } + !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null); + switch (path[0]) { + case "M": + d.X = path[1]; + d.Y = path[2]; + break; + case "A": + path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1)))); + break; + case "S": + nx = d.x + (d.x - (d.bx || d.x)); + ny = d.y + (d.y - (d.by || d.y)); + path = ["C", nx, ny][concat](path.slice(1)); + break; + case "T": + d.qx = d.x + (d.x - (d.qx || d.x)); + d.qy = d.y + (d.y - (d.qy || d.y)); + path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); + break; + case "Q": + d.qx = path[1]; + d.qy = path[2]; + path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4])); + break; + case "L": + path = ["C"][concat](l2c(d.x, d.y, path[1], path[2])); + break; + case "H": + path = ["C"][concat](l2c(d.x, d.y, path[1], d.y)); + break; + case "V": + path = ["C"][concat](l2c(d.x, d.y, d.x, path[1])); + break; + case "Z": + path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y)); + break; + } + return path; + }, + fixArc = function (pp, i) { + if (pp[i][length] > 7) { + pp[i].shift(); + var pi = pp[i]; + while (pi[length]) { + pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6))); + } + pp.splice(i, 1); + ii = mmax(p[length], p2 && p2[length] || 0); + } + }, + fixM = function (path1, path2, a1, a2, i) { + if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { + path2.splice(i, 0, ["M", a2.x, a2.y]); + a1.bx = 0; + a1.by = 0; + a1.x = path1[i][1]; + a1.y = path1[i][2]; + ii = mmax(p[length], p2 && p2[length] || 0); + } + }; + for (var i = 0, ii = mmax(p[length], p2 && p2[length] || 0); i < ii; i++) { + p[i] = processPath(p[i], attrs); + fixArc(p, i); + p2 && (p2[i] = processPath(p2[i], attrs2)); + p2 && fixArc(p2, i); + fixM(p, p2, attrs, attrs2, i); + fixM(p2, p, attrs2, attrs, i); + var seg = p[i], + seg2 = p2 && p2[i], + seglen = seg[length], + seg2len = p2 && seg2[length]; + attrs.x = seg[seglen - 2]; + attrs.y = seg[seglen - 1]; + attrs.bx = toFloat(seg[seglen - 4]) || attrs.x; + attrs.by = toFloat(seg[seglen - 3]) || attrs.y; + attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x); + attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y); + attrs2.x = p2 && seg2[seg2len - 2]; + attrs2.y = p2 && seg2[seg2len - 1]; + } + return p2 ? [p, p2] : p; + }, null, pathClone), + parseDots = cacher(function (gradient) { + var dots = []; + for (var i = 0, ii = gradient[length]; i < ii; i++) { + var dot = {}, + par = gradient[i].match(/^([^:]*):?([\d\.]*)/); + dot.color = R.getRGB(par[1]); + if (dot.color.error) { + return null; + } + dot.color = dot.color.hex; + par[2] && (dot.offset = par[2] + "%"); + dots[push](dot); + } + for (i = 1, ii = dots[length] - 1; i < ii; i++) { + if (!dots[i].offset) { + var start = toFloat(dots[i - 1].offset || 0), + end = 0; + for (var j = i + 1; j < ii; j++) { + if (dots[j].offset) { + end = dots[j].offset; + break; + } + } + if (!end) { + end = 100; + j = ii; + } + end = toFloat(end); + var d = (end - start) / (j - i + 1); + for (; i < j; i++) { + start += d; + dots[i].offset = start + "%"; + } + } + } + return dots; + }), + getContainer = function (x, y, w, h) { + var container; + if (R.is(x, string) || R.is(x, "object")) { + container = R.is(x, string) ? doc.getElementById(x) : x; + if (container.tagName) { + if (y == null) { + return { + container: container, + width: container.style.pixelWidth || container.offsetWidth, + height: container.style.pixelHeight || container.offsetHeight + }; + } else { + return {container: container, width: y, height: w}; + } + } + } else { + return {container: 1, x: x, y: y, width: w, height: h}; + } + }, + plugins = function (con, add) { + var that = this; + for (var prop in add) { + if (add[has](prop) && !(prop in con)) { + switch (typeof add[prop]) { + case "function": + (function (f) { + con[prop] = con === that ? f : function () { return f[apply](that, arguments); }; + })(add[prop]); + break; + case "object": + con[prop] = con[prop] || {}; + plugins.call(this, con[prop], add[prop]); + break; + default: + con[prop] = add[prop]; + break; + } + } + } + }, + tear = function (el, paper) { + el == paper.top && (paper.top = el.prev); + el == paper.bottom && (paper.bottom = el.next); + el.next && (el.next.prev = el.prev); + el.prev && (el.prev.next = el.next); + }, + tofront = function (el, paper) { + if (paper.top === el) { + return; + } + tear(el, paper); + el.next = null; + el.prev = paper.top; + paper.top.next = el; + paper.top = el; + }, + toback = function (el, paper) { + if (paper.bottom === el) { + return; + } + tear(el, paper); + el.next = paper.bottom; + el.prev = null; + paper.bottom.prev = el; + paper.bottom = el; + }, + insertafter = function (el, el2, paper) { + tear(el, paper); + el2 == paper.top && (paper.top = el); + el2.next && (el2.next.prev = el); + el.next = el2.next; + el.prev = el2; + el2.next = el; + }, + insertbefore = function (el, el2, paper) { + tear(el, paper); + el2 == paper.bottom && (paper.bottom = el); + el2.prev && (el2.prev.next = el); + el.prev = el2.prev; + el2.prev = el; + el.next = el2; + }, + removed = function (methodname) { + return function () { + throw new Error("Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object"); + }; + }; + R.pathToRelative = pathToRelative; + // SVG + if (R.svg) { + paperproto.svgns = "http://www.w3.org/2000/svg"; + paperproto.xlink = "http://www.w3.org/1999/xlink"; + round = function (num) { + return +num + (~~num === num) * .5; + }; + var $ = function (el, attr) { + if (attr) { + for (var key in attr) { + if (attr[has](key)) { + el[setAttribute](key, Str(attr[key])); + } + } + } else { + el = doc.createElementNS(paperproto.svgns, el); + el.style.webkitTapHighlightColor = "rgba(0,0,0,0)"; + return el; + } + }; + R[toString] = function () { + return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version; + }; + var thePath = function (pathString, SVG) { + var el = $("path"); + SVG.canvas && SVG.canvas[appendChild](el); + var p = new Element(el, SVG); + p.type = "path"; + setFillAndStroke(p, {fill: "none", stroke: "#000", path: pathString}); + return p; + }; + var addGradientFill = function (o, gradient, SVG) { + var type = "linear", + fx = .5, fy = .5, + s = o.style; + gradient = Str(gradient)[rp](radial_gradient, function (all, _fx, _fy) { + type = "radial"; + if (_fx && _fy) { + fx = toFloat(_fx); + fy = toFloat(_fy); + var dir = ((fy > .5) * 2 - 1); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && + (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) && + fy != .5 && + (fy = fy.toFixed(5) - 1e-5 * dir); + } + return E; + }); + gradient = gradient[split](/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + var vector = [0, 0, math.cos(angle * PI / 180), math.sin(angle * PI / 180)], + max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1); + vector[2] *= max; + vector[3] *= max; + if (vector[2] < 0) { + vector[0] = -vector[2]; + vector[2] = 0; + } + if (vector[3] < 0) { + vector[1] = -vector[3]; + vector[3] = 0; + } + } + var dots = parseDots(gradient); + if (!dots) { + return null; + } + var id = o.getAttribute(fillString); + id = id.match(/^url\(#(.*)\)$/); + id && SVG.defs.removeChild(doc.getElementById(id[1])); + + var el = $(type + "Gradient"); + el.id = createUUID(); + $(el, type == "radial" ? {fx: fx, fy: fy} : {x1: vector[0], y1: vector[1], x2: vector[2], y2: vector[3]}); + SVG.defs[appendChild](el); + for (var i = 0, ii = dots[length]; i < ii; i++) { + var stop = $("stop"); + $(stop, { + offset: dots[i].offset ? dots[i].offset : !i ? "0%" : "100%", + "stop-color": dots[i].color || "#fff" + }); + el[appendChild](stop); + } + $(o, { + fill: "url(#" + el.id + ")", + opacity: 1, + "fill-opacity": 1 + }); + s.fill = E; + s.opacity = 1; + s.fillOpacity = 1; + return 1; + }; + var updatePosition = function (o) { + var bbox = o.getBBox(); + $(o.pattern, {patternTransform: R.format("translate({0},{1})", bbox.x, bbox.y)}); + }; + var setFillAndStroke = function (o, params) { + var dasharray = { + "": [0], + "none": [0], + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + node = o.node, + attrs = o.attrs, + rot = o.rotate(), + addDashes = function (o, value) { + value = dasharray[lowerCase.call(value)]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = []; + var i = value[length]; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(node, {"stroke-dasharray": dashes[join](",")}); + } + }; + params[has]("rotation") && (rot = params.rotation); + var rotxy = Str(rot)[split](separator); + if (!(rotxy.length - 1)) { + rotxy = null; + } else { + rotxy[1] = +rotxy[1]; + rotxy[2] = +rotxy[2]; + } + toFloat(rot) && o.rotate(0, true); + for (var att in params) { + if (params[has](att)) { + if (!availableAttrs[has](att)) { + continue; + } + var value = params[att]; + attrs[att] = value; + switch (att) { + case "blur": + o.blur(value); + break; + case "rotation": + o.rotate(value, true); + break; + case "href": + case "title": + case "target": + var pn = node.parentNode; + if (lowerCase.call(pn.tagName) != "a") { + var hl = $("a"); + pn.insertBefore(hl, node); + hl[appendChild](node); + pn = hl; + } + if (att == "target" && value == "blank") { + pn.setAttributeNS(o.paper.xlink, "show", "new"); + } else { + pn.setAttributeNS(o.paper.xlink, att, value); + } + break; + case "cursor": + node.style.cursor = value; + break; + case "clip-rect": + var rect = Str(value)[split](separator); + if (rect[length] == 4) { + o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode); + var el = $("clipPath"), + rc = $("rect"); + el.id = createUUID(); + $(rc, { + x: rect[0], + y: rect[1], + width: rect[2], + height: rect[3] + }); + el[appendChild](rc); + o.paper.defs[appendChild](el); + $(node, {"clip-path": "url(#" + el.id + ")"}); + o.clip = rc; + } + if (!value) { + var clip = doc.getElementById(node.getAttribute("clip-path")[rp](/(^url\(#|\)$)/g, E)); + clip && clip.parentNode.removeChild(clip); + $(node, {"clip-path": E}); + delete o.clip; + } + break; + case "path": + if (o.type == "path") { + $(node, {d: value ? attrs.path = pathToAbsolute(value) : "M0,0"}); + } + break; + case "width": + node[setAttribute](att, value); + if (attrs.fx) { + att = "x"; + value = attrs.x; + } else { + break; + } + case "x": + if (attrs.fx) { + value = -attrs.x - (attrs.width || 0); + } + case "rx": + if (att == "rx" && o.type == "rect") { + break; + } + case "cx": + rotxy && (att == "x" || att == "cx") && (rotxy[1] += value - attrs[att]); + node[setAttribute](att, value); + o.pattern && updatePosition(o); + break; + case "height": + node[setAttribute](att, value); + if (attrs.fy) { + att = "y"; + value = attrs.y; + } else { + break; + } + case "y": + if (attrs.fy) { + value = -attrs.y - (attrs.height || 0); + } + case "ry": + if (att == "ry" && o.type == "rect") { + break; + } + case "cy": + rotxy && (att == "y" || att == "cy") && (rotxy[2] += value - attrs[att]); + node[setAttribute](att, value); + o.pattern && updatePosition(o); + break; + case "r": + if (o.type == "rect") { + $(node, {rx: value, ry: value}); + } else { + node[setAttribute](att, value); + } + break; + case "src": + if (o.type == "image") { + node.setAttributeNS(o.paper.xlink, "href", value); + } + break; + case "stroke-width": + node.style.strokeWidth = value; + // Need following line for Firefox + node[setAttribute](att, value); + if (attrs["stroke-dasharray"]) { + addDashes(o, attrs["stroke-dasharray"]); + } + break; + case "stroke-dasharray": + addDashes(o, value); + break; + case "translation": + var xy = Str(value)[split](separator); + xy[0] = +xy[0] || 0; + xy[1] = +xy[1] || 0; + if (rotxy) { + rotxy[1] += xy[0]; + rotxy[2] += xy[1]; + } + translate.call(o, xy[0], xy[1]); + break; + case "scale": + xy = Str(value)[split](separator); + o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, isNaN(toFloat(xy[2])) ? null : +xy[2], isNaN(toFloat(xy[3])) ? null : +xy[3]); + break; + case fillString: + var isURL = Str(value).match(ISURL); + if (isURL) { + el = $("pattern"); + var ig = $("image"); + el.id = createUUID(); + $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1}); + $(ig, {x: 0, y: 0}); + ig.setAttributeNS(o.paper.xlink, "href", isURL[1]); + el[appendChild](ig); + + var img = doc.createElement("img"); + img.style.cssText = "position:absolute;left:-9999em;top-9999em"; + img.onload = function () { + $(el, {width: this.offsetWidth, height: this.offsetHeight}); + $(ig, {width: this.offsetWidth, height: this.offsetHeight}); + doc.body.removeChild(this); + o.paper.safari(); + }; + doc.body[appendChild](img); + img.src = isURL[1]; + o.paper.defs[appendChild](el); + node.style.fill = "url(#" + el.id + ")"; + $(node, {fill: "url(#" + el.id + ")"}); + o.pattern = el; + o.pattern && updatePosition(o); + break; + } + var clr = R.getRGB(value); + if (!clr.error) { + delete params.gradient; + delete attrs.gradient; + !R.is(attrs.opacity, "undefined") && + R.is(params.opacity, "undefined") && + $(node, {opacity: attrs.opacity}); + !R.is(attrs["fill-opacity"], "undefined") && + R.is(params["fill-opacity"], "undefined") && + $(node, {"fill-opacity": attrs["fill-opacity"]}); + } else if ((({circle: 1, ellipse: 1})[has](o.type) || Str(value).charAt() != "r") && addGradientFill(node, value, o.paper)) { + attrs.gradient = value; + attrs.fill = "none"; + break; + } + clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + case "stroke": + clr = R.getRGB(value); + node[setAttribute](att, clr.hex); + att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + break; + case "gradient": + (({circle: 1, ellipse: 1})[has](o.type) || Str(value).charAt() != "r") && addGradientFill(node, value, o.paper); + break; + case "opacity": + if (attrs.gradient && !attrs[has]("stroke-opacity")) { + $(node, {"stroke-opacity": value > 1 ? value / 100 : value}); + } + // fall + case "fill-opacity": + if (attrs.gradient) { + var gradient = doc.getElementById(node.getAttribute(fillString)[rp](/^url\(#|\)$/g, E)); + if (gradient) { + var stops = gradient.getElementsByTagName("stop"); + stops[stops[length] - 1][setAttribute]("stop-opacity", value); + } + break; + } + default: + att == "font-size" && (value = toInt(value, 10) + "px"); + var cssrule = att[rp](/(\-.)/g, function (w) { + return upperCase.call(w.substring(1)); + }); + node.style[cssrule] = value; + // Need following line for Firefox + node[setAttribute](att, value); + break; + } + } + } + + tuneText(o, params); + if (rotxy) { + o.rotate(rotxy.join(S)); + } else { + toFloat(rot) && o.rotate(rot, true); + } + }; + var leading = 1.2, + tuneText = function (el, params) { + if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) { + return; + } + var a = el.attrs, + node = el.node, + fontSize = node.firstChild ? toInt(doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10; + + if (params[has]("text")) { + a.text = params.text; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var texts = Str(params.text)[split]("\n"); + for (var i = 0, ii = texts[length]; i < ii; i++) if (texts[i]) { + var tspan = $("tspan"); + i && $(tspan, {dy: fontSize * leading, x: a.x}); + tspan[appendChild](doc.createTextNode(texts[i])); + node[appendChild](tspan); + } + } else { + texts = node.getElementsByTagName("tspan"); + for (i = 0, ii = texts[length]; i < ii; i++) { + i && $(texts[i], {dy: fontSize * leading, x: a.x}); + } + } + $(node, {y: a.y}); + var bb = el.getBBox(), + dif = a.y - (bb.y + bb.height / 2); + dif && R.is(dif, "finite") && $(node, {y: a.y + dif}); + }, + Element = function (node, svg) { + var X = 0, + Y = 0; + this[0] = node; + this.id = R._oid++; + this.node = node; + node.raphael = this; + this.paper = svg; + this.attrs = this.attrs || {}; + this.transformations = []; // rotate, translate, scale + this._ = { + tx: 0, + ty: 0, + rt: {deg: 0, cx: 0, cy: 0}, + sx: 1, + sy: 1 + }; + !svg.bottom && (svg.bottom = this); + this.prev = svg.top; + svg.top && (svg.top.next = this); + svg.top = this; + this.next = null; + }; + var elproto = Element[proto]; + Element[proto].rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + if (this._.rt.cx) { + return [this._.rt.deg, this._.rt.cx, this._.rt.cy][join](S); + } + return this._.rt.deg; + } + var bbox = this.getBBox(); + deg = Str(deg)[split](separator); + if (deg[length] - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + if (cx != null && cx !== false) { + this._.rt.deg = deg; + } else { + this._.rt.deg += deg; + } + (cy == null) && (cx = null); + this._.rt.cx = cx; + this._.rt.cy = cy; + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + if (this._.rt.deg) { + this.transformations[0] = R.format("rotate({0} {1} {2})", this._.rt.deg, cx, cy); + this.clip && $(this.clip, {transform: R.format("rotate({0} {1} {2})", -this._.rt.deg, cx, cy)}); + } else { + this.transformations[0] = E; + this.clip && $(this.clip, {transform: E}); + } + $(this.node, {transform: this.transformations[join](S)}); + return this; + }; + Element[proto].hide = function () { + !this.removed && (this.node.style.display = "none"); + return this; + }; + Element[proto].show = function () { + !this.removed && (this.node.style.display = ""); + return this; + }; + Element[proto].remove = function () { + if (this.removed) { + return; + } + tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + for (var i in this) { + delete this[i]; + } + this.removed = true; + }; + Element[proto].getBBox = function () { + if (this.removed) { + return this; + } + if (this.type == "path") { + return pathDimensions(this.attrs.path); + } + if (this.node.style.display == "none") { + this.show(); + var hide = true; + } + var bbox = {}; + try { + bbox = this.node.getBBox(); + } catch(e) { + // Firefox 3.0.x plays badly here + } finally { + bbox = bbox || {}; + } + if (this.type == "text") { + bbox = {x: bbox.x, y: Infinity, width: 0, height: 0}; + for (var i = 0, ii = this.node.getNumberOfChars(); i < ii; i++) { + var bb = this.node.getExtentOfChar(i); + (bb.y < bbox.y) && (bbox.y = bb.y); + (bb.y + bb.height - bbox.y > bbox.height) && (bbox.height = bb.y + bb.height - bbox.y); + (bb.x + bb.width - bbox.x > bbox.width) && (bbox.width = bb.x + bb.width - bbox.x); + } + } + hide && this.hide(); + return bbox; + }; + Element[proto].attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var i in this.attrs) if (this.attrs[has](i)) { + res[i] = this.attrs[i]; + } + this._.rt.deg && (res.rotation = this.rotate()); + (this._.sx != 1 || this._.sy != 1) && (res.scale = this.scale()); + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + return res; + } + if (value == null && R.is(name, string)) { + if (name == "translation") { + return translate.call(this); + } + if (name == "rotation") { + return this.rotate(); + } + if (name == "scale") { + return this.scale(); + } + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + return this.attrs[name]; + } + if (value == null && R.is(name, array)) { + var values = {}; + for (var j = 0, jj = name.length; j < jj; j++) { + values[name[j]] = this.attr(name[j]); + } + return values; + } + if (value != null) { + var params = {}; + params[name] = value; + } else if (name != null && R.is(name, "object")) { + params = name; + } + for (var key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [][concat](params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + setFillAndStroke(this, params); + return this; + }; + Element[proto].toFront = function () { + if (this.removed) { + return this; + } + this.node.parentNode[appendChild](this.node); + var svg = this.paper; + svg.top != this && tofront(this, svg); + return this; + }; + Element[proto].toBack = function () { + if (this.removed) { + return this; + } + if (this.node.parentNode.firstChild != this.node) { + this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild); + toback(this, this.paper); + var svg = this.paper; + } + return this; + }; + Element[proto].insertAfter = function (element) { + if (this.removed) { + return this; + } + var node = element.node || element[element.length - 1].node; + if (node.nextSibling) { + node.parentNode.insertBefore(this.node, node.nextSibling); + } else { + node.parentNode[appendChild](this.node); + } + insertafter(this, element, this.paper); + return this; + }; + Element[proto].insertBefore = function (element) { + if (this.removed) { + return this; + } + var node = element.node || element[0].node; + node.parentNode.insertBefore(this.node, node); + insertbefore(this, element, this.paper); + return this; + }; + Element[proto].blur = function (size) { + // Experimental. No Safari support. Use it on your own risk. + var t = this; + if (+size !== 0) { + var fltr = $("filter"), + blur = $("feGaussianBlur"); + t.attrs.blur = size; + fltr.id = createUUID(); + $(blur, {stdDeviation: +size || 1.5}); + fltr.appendChild(blur); + t.paper.defs.appendChild(fltr); + t._blur = fltr; + $(t.node, {filter: "url(#" + fltr.id + ")"}); + } else { + if (t._blur) { + t._blur.parentNode.removeChild(t._blur); + delete t._blur; + delete t.attrs.blur; + } + t.node.removeAttribute("filter"); + } + }; + var theCircle = function (svg, x, y, r) { + var el = $("circle"); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"}; + res.type = "circle"; + $(el, res.attrs); + return res; + }, + theRect = function (svg, x, y, w, h, r) { + var el = $("rect"); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, r: r || 0, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"}; + res.type = "rect"; + $(el, res.attrs); + return res; + }, + theEllipse = function (svg, x, y, rx, ry) { + var el = $("ellipse"); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"}; + res.type = "ellipse"; + $(el, res.attrs); + return res; + }, + theImage = function (svg, src, x, y, w, h) { + var el = $("image"); + $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"}); + el.setAttributeNS(svg.xlink, "href", src); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, src: src}; + res.type = "image"; + return res; + }, + theText = function (svg, x, y, text) { + var el = $("text"); + $(el, {x: x, y: y, "text-anchor": "middle"}); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, "text-anchor": "middle", text: text, font: availableAttrs.font, stroke: "none", fill: "#000"}; + res.type = "text"; + setFillAndStroke(res, res.attrs); + return res; + }, + setSize = function (width, height) { + this.width = width || this.width; + this.height = height || this.height; + this.canvas[setAttribute]("width", this.width); + this.canvas[setAttribute]("height", this.height); + return this; + }, + create = function () { + var con = getContainer[apply](0, arguments), + container = con && con.container, + x = con.x, + y = con.y, + width = con.width, + height = con.height; + if (!container) { + throw new Error("SVG container not found."); + } + var cnvs = $("svg"); + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + $(cnvs, { + xmlns: "http://www.w3.org/2000/svg", + version: 1.1, + width: width, + height: height + }); + if (container == 1) { + cnvs.style.cssText = "position:absolute;left:" + x + "px;top:" + y + "px"; + doc.body[appendChild](cnvs); + } else { + if (container.firstChild) { + container.insertBefore(cnvs, container.firstChild); + } else { + container[appendChild](cnvs); + } + } + container = new Paper; + container.width = width; + container.height = height; + container.canvas = cnvs; + plugins.call(container, container, R.fn); + container.clear(); + return container; + }; + paperproto.clear = function () { + var c = this.canvas; + while (c.firstChild) { + c.removeChild(c.firstChild); + } + this.bottom = this.top = null; + (this.desc = $("desc"))[appendChild](doc.createTextNode("Created with Rapha\xebl")); + c[appendChild](this.desc); + c[appendChild](this.defs = $("defs")); + }; + paperproto.remove = function () { + this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = removed(i); + } + }; + } + + // VML + if (R.vml) { + var map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"}, + bites = /([clmz]),?([^clmz]*)/gi, + blurregexp = / progid:\S+Blur\([^\)]+\)/g, + val = /-?[^,\s-]+/g, + coordsize = 1e3 + S + 1e3, + zoom = 10, + pathlike = {path: 1, rect: 1}, + path2vml = function (path) { + var total = /[ahqstv]/ig, + command = pathToAbsolute; + Str(path).match(total) && (command = path2curve); + total = /[clmz]/g; + if (command == pathToAbsolute && !Str(path).match(total)) { + var res = Str(path)[rp](bites, function (all, command, args) { + var vals = [], + isMove = lowerCase.call(command) == "m", + res = map[command]; + args[rp](val, function (value) { + if (isMove && vals[length] == 2) { + res += vals + map[command == "m" ? "l" : "L"]; + vals = []; + } + vals[push](round(value * zoom)); + }); + return res + vals; + }); + return res; + } + var pa = command(path), p, r; + res = []; + for (var i = 0, ii = pa[length]; i < ii; i++) { + p = pa[i]; + r = lowerCase.call(pa[i][0]); + r == "z" && (r = "x"); + for (var j = 1, jj = p[length]; j < jj; j++) { + r += round(p[j] * zoom) + (j != jj - 1 ? "," : E); + } + res[push](r); + } + return res[join](S); + }; + + R[toString] = function () { + return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version; + }; + thePath = function (pathString, vml) { + var g = createNode("group"); + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = vml.coordsize; + g.coordorigin = vml.coordorigin; + var el = createNode("shape"), ol = el.style; + ol.width = vml.width + "px"; + ol.height = vml.height + "px"; + el.coordsize = coordsize; + el.coordorigin = vml.coordorigin; + g[appendChild](el); + var p = new Element(el, g, vml), + attr = {fill: "none", stroke: "#000"}; + pathString && (attr.path = pathString); + p.type = "path"; + p.path = []; + p.Path = E; + setFillAndStroke(p, attr); + vml.canvas[appendChild](g); + return p; + }; + setFillAndStroke = function (o, params) { + o.attrs = o.attrs || {}; + var node = o.node, + a = o.attrs, + s = node.style, + xy, + newpath = (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.r != a.r) && o.type == "rect", + res = o; + + for (var par in params) if (params[has](par)) { + a[par] = params[par]; + } + if (newpath) { + a.path = rectPath(a.x, a.y, a.width, a.height, a.r); + o.X = a.x; + o.Y = a.y; + o.W = a.width; + o.H = a.height; + } + params.href && (node.href = params.href); + params.title && (node.title = params.title); + params.target && (node.target = params.target); + params.cursor && (s.cursor = params.cursor); + "blur" in params && o.blur(params.blur); + if (params.path && o.type == "path" || newpath) { + node.path = path2vml(a.path); + } + if (params.rotation != null) { + o.rotate(params.rotation, true); + } + if (params.translation) { + xy = Str(params.translation)[split](separator); + translate.call(o, xy[0], xy[1]); + if (o._.rt.cx != null) { + o._.rt.cx +=+ xy[0]; + o._.rt.cy +=+ xy[1]; + o.setBox(o.attrs, xy[0], xy[1]); + } + } + if (params.scale) { + xy = Str(params.scale)[split](separator); + o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, +xy[2] || null, +xy[3] || null); + } + if ("clip-rect" in params) { + var rect = Str(params["clip-rect"])[split](separator); + if (rect[length] == 4) { + rect[2] = +rect[2] + (+rect[0]); + rect[3] = +rect[3] + (+rect[1]); + var div = node.clipRect || doc.createElement("div"), + dstyle = div.style, + group = node.parentNode; + dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect); + if (!node.clipRect) { + dstyle.position = "absolute"; + dstyle.top = 0; + dstyle.left = 0; + dstyle.width = o.paper.width + "px"; + dstyle.height = o.paper.height + "px"; + group.parentNode.insertBefore(div, group); + div[appendChild](group); + node.clipRect = div; + } + } + if (!params["clip-rect"]) { + node.clipRect && (node.clipRect.style.clip = E); + } + } + if (o.type == "image" && params.src) { + node.src = params.src; + } + if (o.type == "image" && params.opacity) { + node.filterOpacity = ms + ".Alpha(opacity=" + (params.opacity * 100) + ")"; + s.filter = (node.filterMatrix || E) + (node.filterOpacity || E); + } + params.font && (s.font = params.font); + params["font-family"] && (s.fontFamily = '"' + params["font-family"][split](",")[0][rp](/^['"]+|['"]+$/g, E) + '"'); + params["font-size"] && (s.fontSize = params["font-size"]); + params["font-weight"] && (s.fontWeight = params["font-weight"]); + params["font-style"] && (s.fontStyle = params["font-style"]); + if (params.opacity != null || + params["stroke-width"] != null || + params.fill != null || + params.stroke != null || + params["stroke-width"] != null || + params["stroke-opacity"] != null || + params["fill-opacity"] != null || + params["stroke-dasharray"] != null || + params["stroke-miterlimit"] != null || + params["stroke-linejoin"] != null || + params["stroke-linecap"] != null) { + node = o.shape || node; + var fill = (node.getElementsByTagName(fillString) && node.getElementsByTagName(fillString)[0]), + newfill = false; + !fill && (newfill = fill = createNode(fillString)); + if ("fill-opacity" in params || "opacity" in params) { + var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1); + opacity = mmin(mmax(opacity, 0), 1); + fill.opacity = opacity; + } + params.fill && (fill.on = true); + if (fill.on == null || params.fill == "none") { + fill.on = false; + } + if (fill.on && params.fill) { + var isURL = params.fill.match(ISURL); + if (isURL) { + fill.src = isURL[1]; + fill.type = "tile"; + } else { + fill.color = R.getRGB(params.fill).hex; + fill.src = E; + fill.type = "solid"; + if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill)) { + a.fill = "none"; + a.gradient = params.fill; + } + } + } + newfill && node[appendChild](fill); + var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]), + newstroke = false; + !stroke && (newstroke = stroke = createNode("stroke")); + if ((params.stroke && params.stroke != "none") || + params["stroke-width"] || + params["stroke-opacity"] != null || + params["stroke-dasharray"] || + params["stroke-miterlimit"] || + params["stroke-linejoin"] || + params["stroke-linecap"]) { + stroke.on = true; + } + (params.stroke == "none" || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false); + var strokeColor = R.getRGB(params.stroke); + stroke.on && params.stroke && (stroke.color = strokeColor.hex); + opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1); + var width = (toFloat(params["stroke-width"]) || 1) * .75; + opacity = mmin(mmax(opacity, 0), 1); + params["stroke-width"] == null && (width = a["stroke-width"]); + params["stroke-width"] && (stroke.weight = width); + width && width < 1 && (opacity *= width) && (stroke.weight = 1); + stroke.opacity = opacity; + + params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter"); + stroke.miterlimit = params["stroke-miterlimit"] || 8; + params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round"); + if (params["stroke-dasharray"]) { + var dasharray = { + "-": "shortdash", + ".": "shortdot", + "-.": "shortdashdot", + "-..": "shortdashdotdot", + ". ": "dot", + "- ": "dash", + "--": "longdash", + "- .": "dashdot", + "--.": "longdashdot", + "--..": "longdashdotdot" + }; + stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E; + } + newstroke && node[appendChild](stroke); + } + if (res.type == "text") { + s = res.paper.span.style; + a.font && (s.font = a.font); + a["font-family"] && (s.fontFamily = a["font-family"]); + a["font-size"] && (s.fontSize = a["font-size"]); + a["font-weight"] && (s.fontWeight = a["font-weight"]); + a["font-style"] && (s.fontStyle = a["font-style"]); + res.node.string && (res.paper.span.innerHTML = Str(res.node.string)[rp](/</g, "<")[rp](/&/g, "&")[rp](/\n/g, "<br>")); + res.W = a.w = res.paper.span.offsetWidth; + res.H = a.h = res.paper.span.offsetHeight; + res.X = a.x; + res.Y = a.y + round(res.H / 2); + + // text-anchor emulationm + switch (a["text-anchor"]) { + case "start": + res.node.style["v-text-align"] = "left"; + res.bbx = round(res.W / 2); + break; + case "end": + res.node.style["v-text-align"] = "right"; + res.bbx = -round(res.W / 2); + break; + default: + res.node.style["v-text-align"] = "center"; + break; + } + } + }; + addGradientFill = function (o, gradient) { + o.attrs = o.attrs || {}; + var attrs = o.attrs, + fill, + type = "linear", + fxfy = ".5 .5"; + o.attrs.gradient = gradient; + gradient = Str(gradient)[rp](radial_gradient, function (all, fx, fy) { + type = "radial"; + if (fx && fy) { + fx = toFloat(fx); + fy = toFloat(fy); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5); + fxfy = fx + S + fy; + } + return E; + }); + gradient = gradient[split](/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + } + var dots = parseDots(gradient); + if (!dots) { + return null; + } + o = o.shape || o.node; + fill = o.getElementsByTagName(fillString)[0] || createNode(fillString); + !fill.parentNode && o.appendChild(fill); + if (dots[length]) { + fill.on = true; + fill.method = "none"; + fill.color = dots[0].color; + fill.color2 = dots[dots[length] - 1].color; + var clrs = []; + for (var i = 0, ii = dots[length]; i < ii; i++) { + dots[i].offset && clrs[push](dots[i].offset + S + dots[i].color); + } + fill.colors && (fill.colors.value = clrs[length] ? clrs[join]() : "0% " + fill.color); + if (type == "radial") { + fill.type = "gradientradial"; + fill.focus = "100%"; + fill.focussize = fxfy; + fill.focusposition = fxfy; + } else { + fill.type = "gradient"; + fill.angle = (270 - angle) % 360; + } + } + return 1; + }; + Element = function (node, group, vml) { + var Rotation = 0, + RotX = 0, + RotY = 0, + Scale = 1; + this[0] = node; + this.id = R._oid++; + this.node = node; + node.raphael = this; + this.X = 0; + this.Y = 0; + this.attrs = {}; + this.Group = group; + this.paper = vml; + this._ = { + tx: 0, + ty: 0, + rt: {deg:0}, + sx: 1, + sy: 1 + }; + !vml.bottom && (vml.bottom = this); + this.prev = vml.top; + vml.top && (vml.top.next = this); + vml.top = this; + this.next = null; + }; + elproto = Element[proto]; + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + if (this._.rt.cx) { + return [this._.rt.deg, this._.rt.cx, this._.rt.cy][join](S); + } + return this._.rt.deg; + } + deg = Str(deg)[split](separator); + if (deg[length] - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + if (cx != null) { + this._.rt.deg = deg; + } else { + this._.rt.deg += deg; + } + cy == null && (cx = null); + this._.rt.cx = cx; + this._.rt.cy = cy; + this.setBox(this.attrs, cx, cy); + this.Group.style.rotation = this._.rt.deg; + // gradient fix for rotation. TODO + // var fill = (this.shape || this.node).getElementsByTagName(fillString); + // fill = fill[0] || {}; + // var b = ((360 - this._.rt.deg) - 270) % 360; + // !R.is(fill.angle, "undefined") && (fill.angle = b); + return this; + }; + elproto.setBox = function (params, cx, cy) { + if (this.removed) { + return this; + } + var gs = this.Group.style, + os = (this.shape && this.shape.style) || this.node.style; + params = params || {}; + for (var i in params) if (params[has](i)) { + this.attrs[i] = params[i]; + } + cx = cx || this._.rt.cx; + cy = cy || this._.rt.cy; + var attr = this.attrs, + x, + y, + w, + h; + switch (this.type) { + case "circle": + x = attr.cx - attr.r; + y = attr.cy - attr.r; + w = h = attr.r * 2; + break; + case "ellipse": + x = attr.cx - attr.rx; + y = attr.cy - attr.ry; + w = attr.rx * 2; + h = attr.ry * 2; + break; + case "image": + x = +attr.x; + y = +attr.y; + w = attr.width || 0; + h = attr.height || 0; + break; + case "text": + this.textpath.v = ["m", round(attr.x), ", ", round(attr.y - 2), "l", round(attr.x) + 1, ", ", round(attr.y - 2)][join](E); + x = attr.x - round(this.W / 2); + y = attr.y - this.H / 2; + w = this.W; + h = this.H; + break; + case "rect": + case "path": + if (!this.attrs.path) { + x = 0; + y = 0; + w = this.paper.width; + h = this.paper.height; + } else { + var dim = pathDimensions(this.attrs.path); + x = dim.x; + y = dim.y; + w = dim.width; + h = dim.height; + } + break; + default: + x = 0; + y = 0; + w = this.paper.width; + h = this.paper.height; + break; + } + cx = (cx == null) ? x + w / 2 : cx; + cy = (cy == null) ? y + h / 2 : cy; + var left = cx - this.paper.width / 2, + top = cy - this.paper.height / 2, t; + gs.left != (t = left + "px") && (gs.left = t); + gs.top != (t = top + "px") && (gs.top = t); + this.X = pathlike[has](this.type) ? -left : x; + this.Y = pathlike[has](this.type) ? -top : y; + this.W = w; + this.H = h; + if (pathlike[has](this.type)) { + os.left != (t = -left * zoom + "px") && (os.left = t); + os.top != (t = -top * zoom + "px") && (os.top = t); + } else if (this.type == "text") { + os.left != (t = -left + "px") && (os.left = t); + os.top != (t = -top + "px") && (os.top = t); + } else { + gs.width != (t = this.paper.width + "px") && (gs.width = t); + gs.height != (t = this.paper.height + "px") && (gs.height = t); + os.left != (t = x - left + "px") && (os.left = t); + os.top != (t = y - top + "px") && (os.top = t); + os.width != (t = w + "px") && (os.width = t); + os.height != (t = h + "px") && (os.height = t); + } + }; + elproto.hide = function () { + !this.removed && (this.Group.style.display = "none"); + return this; + }; + elproto.show = function () { + !this.removed && (this.Group.style.display = "block"); + return this; + }; + elproto.getBBox = function () { + if (this.removed) { + return this; + } + if (pathlike[has](this.type)) { + return pathDimensions(this.attrs.path); + } + return { + x: this.X + (this.bbx || 0), + y: this.Y, + width: this.W, + height: this.H + }; + }; + elproto.remove = function () { + if (this.removed) { + return; + } + tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + this.Group.parentNode.removeChild(this.Group); + this.shape && this.shape.parentNode.removeChild(this.shape); + for (var i in this) { + delete this[i]; + } + this.removed = true; + }; + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var i in this.attrs) if (this.attrs[has](i)) { + res[i] = this.attrs[i]; + } + this._.rt.deg && (res.rotation = this.rotate()); + (this._.sx != 1 || this._.sy != 1) && (res.scale = this.scale()); + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == "translation") { + return translate.call(this); + } + if (name == "rotation") { + return this.rotate(); + } + if (name == "scale") { + return this.scale(); + } + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + return this.attrs[name]; + } + if (this.attrs && value == null && R.is(name, array)) { + var ii, values = {}; + for (i = 0, ii = name[length]; i < ii; i++) { + values[name[i]] = this.attr(name[i]); + } + return values; + } + var params; + if (value != null) { + params = {}; + params[name] = value; + } + value == null && R.is(name, "object") && (params = name); + if (params) { + for (var key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [][concat](params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + if (params.text && this.type == "text") { + this.node.string = params.text; + } + setFillAndStroke(this, params); + if (params.gradient && (({circle: 1, ellipse: 1})[has](this.type) || Str(params.gradient).charAt() != "r")) { + addGradientFill(this, params.gradient); + } + (!pathlike[has](this.type) || this._.rt.deg) && this.setBox(this.attrs); + } + return this; + }; + elproto.toFront = function () { + !this.removed && this.Group.parentNode[appendChild](this.Group); + this.paper.top != this && tofront(this, this.paper); + return this; + }; + elproto.toBack = function () { + if (this.removed) { + return this; + } + if (this.Group.parentNode.firstChild != this.Group) { + this.Group.parentNode.insertBefore(this.Group, this.Group.parentNode.firstChild); + toback(this, this.paper); + } + return this; + }; + elproto.insertAfter = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == Set) { + element = element[element.length - 1]; + } + if (element.Group.nextSibling) { + element.Group.parentNode.insertBefore(this.Group, element.Group.nextSibling); + } else { + element.Group.parentNode[appendChild](this.Group); + } + insertafter(this, element, this.paper); + return this; + }; + elproto.insertBefore = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == Set) { + element = element[0]; + } + element.Group.parentNode.insertBefore(this.Group, element.Group); + insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + var s = this.node.runtimeStyle, + f = s.filter; + f = f.replace(blurregexp, E); + if (+size !== 0) { + this.attrs.blur = size; + s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")"; + s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5)); + } else { + s.filter = f; + s.margin = 0; + delete this.attrs.blur; + } + }; + + theCircle = function (vml, x, y, r) { + var g = createNode("group"), + o = createNode("oval"), + ol = o.style; + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = coordsize; + g.coordorigin = vml.coordorigin; + g[appendChild](o); + var res = new Element(o, g, vml); + res.type = "circle"; + setFillAndStroke(res, {stroke: "#000", fill: "none"}); + res.attrs.cx = x; + res.attrs.cy = y; + res.attrs.r = r; + res.setBox({x: x - r, y: y - r, width: r * 2, height: r * 2}); + vml.canvas[appendChild](g); + return res; + }; + function rectPath(x, y, w, h, r) { + if (r) { + return R.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z", x + r, y, w - r * 2, r, -r, h - r * 2, r * 2 - w, r * 2 - h); + } else { + return R.format("M{0},{1}l{2},0,0,{3},{4},0z", x, y, w, h, -w); + } + } + theRect = function (vml, x, y, w, h, r) { + var path = rectPath(x, y, w, h, r), + res = vml.path(path), + a = res.attrs; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.r = r; + a.path = path; + res.type = "rect"; + return res; + }; + theEllipse = function (vml, x, y, rx, ry) { + var g = createNode("group"), + o = createNode("oval"), + ol = o.style; + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = coordsize; + g.coordorigin = vml.coordorigin; + g[appendChild](o); + var res = new Element(o, g, vml); + res.type = "ellipse"; + setFillAndStroke(res, {stroke: "#000"}); + res.attrs.cx = x; + res.attrs.cy = y; + res.attrs.rx = rx; + res.attrs.ry = ry; + res.setBox({x: x - rx, y: y - ry, width: rx * 2, height: ry * 2}); + vml.canvas[appendChild](g); + return res; + }; + theImage = function (vml, src, x, y, w, h) { + var g = createNode("group"), + o = createNode("image"); + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = coordsize; + g.coordorigin = vml.coordorigin; + o.src = src; + g[appendChild](o); + var res = new Element(o, g, vml); + res.type = "image"; + res.attrs.src = src; + res.attrs.x = x; + res.attrs.y = y; + res.attrs.w = w; + res.attrs.h = h; + res.setBox({x: x, y: y, width: w, height: h}); + vml.canvas[appendChild](g); + return res; + }; + theText = function (vml, x, y, text) { + var g = createNode("group"), + el = createNode("shape"), + ol = el.style, + path = createNode("path"), + ps = path.style, + o = createNode("textpath"); + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = coordsize; + g.coordorigin = vml.coordorigin; + path.v = R.format("m{0},{1}l{2},{1}", round(x * 10), round(y * 10), round(x * 10) + 1); + path.textpathok = true; + ol.width = vml.width; + ol.height = vml.height; + o.string = Str(text); + o.on = true; + el[appendChild](o); + el[appendChild](path); + g[appendChild](el); + var res = new Element(o, g, vml); + res.shape = el; + res.textpath = path; + res.type = "text"; + res.attrs.text = text; + res.attrs.x = x; + res.attrs.y = y; + res.attrs.w = 1; + res.attrs.h = 1; + setFillAndStroke(res, {font: availableAttrs.font, stroke: "none", fill: "#000"}); + res.setBox(); + vml.canvas[appendChild](g); + return res; + }; + setSize = function (width, height) { + var cs = this.canvas.style; + width == +width && (width += "px"); + height == +height && (height += "px"); + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + return this; + }; + var createNode; + doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); + try { + !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); + createNode = function (tagName) { + return doc.createElement('<rvml:' + tagName + ' class="rvml">'); + }; + } catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + create = function () { + var con = getContainer[apply](0, arguments), + container = con.container, + height = con.height, + s, + width = con.width, + x = con.x, + y = con.y; + if (!container) { + throw new Error("VML container not found."); + } + var res = new Paper, + c = res.canvas = doc.createElement("div"), + cs = c.style; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + width == +width && (width += "px"); + height == +height && (height += "px"); + res.width = 1e3; + res.height = 1e3; + res.coordsize = zoom * 1e3 + S + zoom * 1e3; + res.coordorigin = "0 0"; + res.span = doc.createElement("span"); + res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + c[appendChild](res.span); + cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height); + if (container == 1) { + doc.body[appendChild](c); + cs.left = x + "px"; + cs.top = y + "px"; + cs.position = "absolute"; + } else { + if (container.firstChild) { + container.insertBefore(c, container.firstChild); + } else { + container[appendChild](c); + } + } + plugins.call(res, res, R.fn); + return res; + }; + paperproto.clear = function () { + this.canvas.innerHTML = E; + this.span = doc.createElement("span"); + this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + this.canvas[appendChild](this.span); + this.bottom = this.top = null; + }; + paperproto.remove = function () { + this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = removed(i); + } + return true; + }; + } + + // rest + // WebKit rendering bug workaround method + var version = navigator.userAgent.match(/Version\/(.*?)\s/); + if ((navigator.vendor == "Apple Computer, Inc.") && (version && version[1] < 4 || navigator.platform.slice(0, 2) == "iP")) { + paperproto.safari = function () { + var rect = this.rect(-99, -99, this.width + 99, this.height + 99).attr({stroke: "none"}); + win.setTimeout(function () {rect.remove();}); + }; + } else { + paperproto.safari = function () {}; + } + + // Events + var preventDefault = function () { + this.returnValue = false; + }, + preventTouch = function () { + return this.originalEvent.preventDefault(); + }, + stopPropagation = function () { + this.cancelBubble = true; + }, + stopTouch = function () { + return this.originalEvent.stopPropagation(); + }, + addEvent = (function () { + if (doc.addEventListener) { + return function (obj, type, fn, element) { + var realName = supportsTouch && touchMap[type] ? touchMap[type] : type; + var f = function (e) { + if (supportsTouch && touchMap[has](type)) { + for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) { + if (e.targetTouches[i].target == obj) { + var olde = e; + e = e.targetTouches[i]; + e.originalEvent = olde; + e.preventDefault = preventTouch; + e.stopPropagation = stopTouch; + break; + } + } + } + return fn.call(element, e); + }; + obj.addEventListener(realName, f, false); + return function () { + obj.removeEventListener(realName, f, false); + return true; + }; + }; + } else if (doc.attachEvent) { + return function (obj, type, fn, element) { + var f = function (e) { + e = e || win.event; + e.preventDefault = e.preventDefault || preventDefault; + e.stopPropagation = e.stopPropagation || stopPropagation; + return fn.call(element, e); + }; + obj.attachEvent("on" + type, f); + var detacher = function () { + obj.detachEvent("on" + type, f); + return true; + }; + return detacher; + }; + } + })(), + drag = [], + dragMove = function (e) { + var x = e.clientX, + y = e.clientY, + scrollY = doc.documentElement.scrollTop || doc.body.scrollTop, + scrollX = doc.documentElement.scrollLeft || doc.body.scrollLeft, + dragi, + j = drag.length; + while (j--) { + dragi = drag[j]; + if (supportsTouch) { + var i = e.touches.length, + touch; + while (i--) { + touch = e.touches[i]; + if (touch.identifier == dragi.el._drag.id) { + x = touch.clientX; + y = touch.clientY; + (e.originalEvent ? e.originalEvent : e).preventDefault(); + break; + } + } + } else { + e.preventDefault(); + } + x += scrollX; + y += scrollY; + dragi.move && dragi.move.call(dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e); + } + }, + dragUp = function (e) { + R.unmousemove(dragMove).unmouseup(dragUp); + var i = drag.length, + dragi; + while (i--) { + dragi = drag[i]; + dragi.el._drag = {}; + dragi.end && dragi.end.call(dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e); + } + drag = []; + }; + for (var i = events[length]; i--;) { + (function (eventName) { + R[eventName] = Element[proto][eventName] = function (fn, scope) { + if (R.is(fn, "function")) { + this.events = this.events || []; + this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || doc, eventName, fn, scope || this)}); + } + return this; + }; + R["un" + eventName] = Element[proto]["un" + eventName] = function (fn) { + var events = this.events, + l = events[length]; + while (l--) if (events[l].name == eventName && events[l].f == fn) { + events[l].unbind(); + events.splice(l, 1); + !events.length && delete this.events; + return this; + } + return this; + }; + })(events[i]); + } + elproto.hover = function (f_in, f_out, scope_in, scope_out) { + return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); + }; + elproto.unhover = function (f_in, f_out) { + return this.unmouseover(f_in).unmouseout(f_out); + }; + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { + this._drag = {}; + this.mousedown(function (e) { + (e.originalEvent || e).preventDefault(); + var scrollY = doc.documentElement.scrollTop || doc.body.scrollTop, + scrollX = doc.documentElement.scrollLeft || doc.body.scrollLeft; + this._drag.x = e.clientX + scrollX; + this._drag.y = e.clientY + scrollY; + this._drag.id = e.identifier; + onstart && onstart.call(start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e); + !drag.length && R.mousemove(dragMove).mouseup(dragUp); + drag.push({el: this, move: onmove, end: onend, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope}); + }); + return this; + }; + elproto.undrag = function (onmove, onstart, onend) { + var i = drag.length; + while (i--) { + drag[i].el == this && (drag[i].move == onmove && drag[i].end == onend) && drag.splice(i++, 1); + } + !drag.length && R.unmousemove(dragMove).unmouseup(dragUp); + }; + paperproto.circle = function (x, y, r) { + return theCircle(this, x || 0, y || 0, r || 0); + }; + paperproto.rect = function (x, y, w, h, r) { + return theRect(this, x || 0, y || 0, w || 0, h || 0, r || 0); + }; + paperproto.ellipse = function (x, y, rx, ry) { + return theEllipse(this, x || 0, y || 0, rx || 0, ry || 0); + }; + paperproto.path = function (pathString) { + pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E); + return thePath(R.format[apply](R, arguments), this); + }; + paperproto.image = function (src, x, y, w, h) { + return theImage(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0); + }; + paperproto.text = function (x, y, text) { + return theText(this, x || 0, y || 0, Str(text)); + }; + paperproto.set = function (itemsArray) { + arguments[length] > 1 && (itemsArray = Array[proto].splice.call(arguments, 0, arguments[length])); + return new Set(itemsArray); + }; + paperproto.setSize = setSize; + paperproto.top = paperproto.bottom = null; + paperproto.raphael = R; + function x_y() { + return this.x + S + this.y; + } + elproto.resetScale = function () { + if (this.removed) { + return this; + } + this._.sx = 1; + this._.sy = 1; + this.attrs.scale = "1 1"; + }; + elproto.scale = function (x, y, cx, cy) { + if (this.removed) { + return this; + } + if (x == null && y == null) { + return { + x: this._.sx, + y: this._.sy, + toString: x_y + }; + } + y = y || x; + !+y && (y = x); + var dx, + dy, + dcx, + dcy, + a = this.attrs; + if (x != 0) { + var bb = this.getBBox(), + rcx = bb.x + bb.width / 2, + rcy = bb.y + bb.height / 2, + kx = abs(x / this._.sx), + ky = abs(y / this._.sy); + cx = (+cx || cx == 0) ? cx : rcx; + cy = (+cy || cy == 0) ? cy : rcy; + var posx = this._.sx > 0, + posy = this._.sy > 0, + dirx = ~~(x / abs(x)), + diry = ~~(y / abs(y)), + dkx = kx * dirx, + dky = ky * diry, + s = this.node.style, + ncx = cx + abs(rcx - cx) * dkx * (rcx > cx == posx ? 1 : -1), + ncy = cy + abs(rcy - cy) * dky * (rcy > cy == posy ? 1 : -1), + fr = (x * dirx > y * diry ? ky : kx); + switch (this.type) { + case "rect": + case "image": + var neww = a.width * kx, + newh = a.height * ky; + this.attr({ + height: newh, + r: a.r * fr, + width: neww, + x: ncx - neww / 2, + y: ncy - newh / 2 + }); + break; + case "circle": + case "ellipse": + this.attr({ + rx: a.rx * kx, + ry: a.ry * ky, + r: a.r * fr, + cx: ncx, + cy: ncy + }); + break; + case "text": + this.attr({ + x: ncx, + y: ncy + }); + break; + case "path": + var path = pathToRelative(a.path), + skip = true, + fx = posx ? dkx : kx, + fy = posy ? dky : ky; + for (var i = 0, ii = path[length]; i < ii; i++) { + var p = path[i], + P0 = upperCase.call(p[0]); + if (P0 == "M" && skip) { + continue; + } else { + skip = false; + } + if (P0 == "A") { + p[path[i][length] - 2] *= fx; + p[path[i][length] - 1] *= fy; + p[1] *= kx; + p[2] *= ky; + p[5] = +(dirx + diry ? !!+p[5] : !+p[5]); + } else if (P0 == "H") { + for (var j = 1, jj = p[length]; j < jj; j++) { + p[j] *= fx; + } + } else if (P0 == "V") { + for (j = 1, jj = p[length]; j < jj; j++) { + p[j] *= fy; + } + } else { + for (j = 1, jj = p[length]; j < jj; j++) { + p[j] *= (j % 2) ? fx : fy; + } + } + } + var dim2 = pathDimensions(path); + dx = ncx - dim2.x - dim2.width / 2; + dy = ncy - dim2.y - dim2.height / 2; + path[0][1] += dx; + path[0][2] += dy; + this.attr({path: path}); + break; + } + if (this.type in {text: 1, image:1} && (dirx != 1 || diry != 1)) { + if (this.transformations) { + this.transformations[2] = "scale("[concat](dirx, ",", diry, ")"); + this.node[setAttribute]("transform", this.transformations[join](S)); + dx = (dirx == -1) ? -a.x - (neww || 0) : a.x; + dy = (diry == -1) ? -a.y - (newh || 0) : a.y; + this.attr({x: dx, y: dy}); + a.fx = dirx - 1; + a.fy = diry - 1; + } else { + this.node.filterMatrix = ms + ".Matrix(M11="[concat](dirx, + ", M12=0, M21=0, M22=", diry, + ", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')"); + s.filter = (this.node.filterMatrix || E) + (this.node.filterOpacity || E); + } + } else { + if (this.transformations) { + this.transformations[2] = E; + this.node[setAttribute]("transform", this.transformations[join](S)); + a.fx = 0; + a.fy = 0; + } else { + this.node.filterMatrix = E; + s.filter = (this.node.filterMatrix || E) + (this.node.filterOpacity || E); + } + } + a.scale = [x, y, cx, cy][join](S); + this._.sx = x; + this._.sy = y; + } + return this; + }; + elproto.clone = function () { + if (this.removed) { + return null; + } + var attr = this.attr(); + delete attr.scale; + delete attr.translation; + return this.paper[this.type]().attr(attr); + }; + var curveslengths = {}, + getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + var len = 0, + precision = 100, + name = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(), + cache = curveslengths[name], + old, dot; + !cache && (curveslengths[name] = cache = {data: []}); + cache.timer && clearTimeout(cache.timer); + cache.timer = setTimeout(function () {delete curveslengths[name];}, 2000); + if (length != null) { + var total = getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + precision = ~~total * 10; + } + for (var i = 0; i < precision + 1; i++) { + if (cache.data[length] > i) { + dot = cache.data[i * precision]; + } else { + dot = R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i / precision); + cache.data[i] = dot; + } + i && (len += pow(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2), .5)); + if (length != null && len >= length) { + return dot; + } + old = dot; + } + if (length == null) { + return len; + } + }, + getLengthFactory = function (istotal, subpath) { + return function (path, length, onlystart) { + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += ["C", point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = ["M", point.x, point.y + "C", point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]][join](); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return {x: point.x, y: point.y, alpha: point.alpha}; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[1], p[2], p[3], p[4], p[5], p[6], 1); + point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha}); + return point; + }; + }; + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + elproto.getTotalLength = function () { + if (this.type != "path") {return;} + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + return getTotalLength(this.attrs.path); + }; + elproto.getPointAtLength = function (length) { + if (this.type != "path") {return;} + return getPointAtLength(this.attrs.path, length); + }; + elproto.getSubpath = function (from, to) { + if (this.type != "path") {return;} + if (abs(this.getTotalLength() - to) < "1e-6") { + return getSubpathsAtLength(this.attrs.path, from).end; + } + var a = getSubpathsAtLength(this.attrs.path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + + // animation easing formulas + R.easing_formulas = { + linear: function (n) { + return n; + }, + "<": function (n) { + return pow(n, 3); + }, + ">": function (n) { + return pow(n - 1, 3) + 1; + }, + "<>": function (n) { + n = n * 2; + if (n < 1) { + return pow(n, 3) / 2; + } + n -= 2; + return (pow(n, 3) + 2) / 2; + }, + backIn: function (n) { + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }, + backOut: function (n) { + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }, + elastic: function (n) { + if (n == 0 || n == 1) { + return n; + } + var p = .3, + s = p / 4; + return pow(2, -10 * n) * math.sin((n - s) * (2 * PI) / p) + 1; + }, + bounce: function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + } + }; + + var animationElements = [], + animation = function () { + var Now = +new Date; + for (var l = 0; l < animationElements[length]; l++) { + var e = animationElements[l]; + if (e.stop || e.el.removed) { + continue; + } + var time = Now - e.start, + ms = e.ms, + easing = e.easing, + from = e.from, + diff = e.diff, + to = e.to, + t = e.t, + that = e.el, + set = {}, + now; + if (time < ms) { + var pos = easing(time / ms); + for (var attr in from) if (from[has](attr)) { + switch (availableAnimAttrs[attr]) { + case "along": + now = pos * ms * diff[attr]; + to.back && (now = to.len - now); + var point = getPointAtLength(to[attr], now); + that.translate(diff.sx - diff.x || 0, diff.sy - diff.y || 0); + diff.x = point.x; + diff.y = point.y; + that.translate(point.x - diff.sx, point.y - diff.sy); + to.rot && that.rotate(diff.r + point.alpha, point.x, point.y); + break; + case nu: + now = +from[attr] + pos * ms * diff[attr]; + break; + case "colour": + now = "rgb(" + [ + upto255(round(from[attr].r + pos * ms * diff[attr].r)), + upto255(round(from[attr].g + pos * ms * diff[attr].g)), + upto255(round(from[attr].b + pos * ms * diff[attr].b)) + ][join](",") + ")"; + break; + case "path": + now = []; + for (var i = 0, ii = from[attr][length]; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (var j = 1, jj = from[attr][i][length]; j < jj; j++) { + now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + now[i] = now[i][join](S); + } + now = now[join](S); + break; + case "csv": + switch (attr) { + case "translation": + var x = pos * ms * diff[attr][0] - t.x, + y = pos * ms * diff[attr][1] - t.y; + t.x += x; + t.y += y; + now = x + S + y; + break; + case "rotation": + now = +from[attr][0] + pos * ms * diff[attr][0]; + from[attr][1] && (now += "," + from[attr][1] + "," + from[attr][2]); + break; + case "scale": + now = [+from[attr][0] + pos * ms * diff[attr][0], +from[attr][1] + pos * ms * diff[attr][1], (2 in to[attr] ? to[attr][2] : E), (3 in to[attr] ? to[attr][3] : E)][join](S); + break; + case "clip-rect": + now = []; + i = 4; + while (i--) { + now[i] = +from[attr][i] + pos * ms * diff[attr][i]; + } + break; + } + break; + default: + var from2 = [].concat(from[attr]); + now = []; + i = that.paper.customAttributes[attr].length; + while (i--) { + now[i] = +from2[i] + pos * ms * diff[attr][i]; + } + break; + } + set[attr] = now; + } + that.attr(set); + that._run && that._run.call(that); + } else { + if (to.along) { + point = getPointAtLength(to.along, to.len * !to.back); + that.translate(diff.sx - (diff.x || 0) + point.x - diff.sx, diff.sy - (diff.y || 0) + point.y - diff.sy); + to.rot && that.rotate(diff.r + point.alpha, point.x, point.y); + } + (t.x || t.y) && that.translate(-t.x, -t.y); + to.scale && (to.scale += E); + that.attr(to); + animationElements.splice(l--, 1); + } + } + R.svg && that && that.paper && that.paper.safari(); + animationElements[length] && setTimeout(animation); + }, + keyframesRun = function (attr, element, time, prev, prevcallback) { + var dif = time - prev; + element.timeouts.push(setTimeout(function () { + R.is(prevcallback, "function") && prevcallback.call(element); + element.animate(attr, dif, attr.easing); + }, prev)); + }, + upto255 = function (color) { + return mmax(mmin(color, 255), 0); + }, + translate = function (x, y) { + if (x == null) { + return {x: this._.tx, y: this._.ty, toString: x_y}; + } + this._.tx += +x; + this._.ty += +y; + switch (this.type) { + case "circle": + case "ellipse": + this.attr({cx: +x + this.attrs.cx, cy: +y + this.attrs.cy}); + break; + case "rect": + case "image": + case "text": + this.attr({x: +x + this.attrs.x, y: +y + this.attrs.y}); + break; + case "path": + var path = pathToRelative(this.attrs.path); + path[0][1] += +x; + path[0][2] += +y; + this.attr({path: path}); + break; + } + return this; + }; + elproto.animateWith = function (element, params, ms, easing, callback) { + for (var i = 0, ii = animationElements.length; i < ii; i++) { + if (animationElements[i].el.id == element.id) { + params.start = animationElements[i].start; + } + } + return this.animate(params, ms, easing, callback); + }; + elproto.animateAlong = along(); + elproto.animateAlongBack = along(1); + function along(isBack) { + return function (path, ms, rotate, callback) { + var params = {back: isBack}; + R.is(rotate, "function") ? (callback = rotate) : (params.rot = rotate); + path && path.constructor == Element && (path = path.attrs.path); + path && (params.along = path); + return this.animate(params, ms, callback); + }; + } + function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) { + var cx = 3 * p1x, + bx = 3 * (p2x - p1x) - cx, + ax = 1 - cx - bx, + cy = 3 * p1y, + by = 3 * (p2y - p1y) - cy, + ay = 1 - cy - by; + function sampleCurveX(t) { + return ((ax * t + bx) * t + cx) * t; + } + function solve(x, epsilon) { + var t = solveCurveX(x, epsilon); + return ((ay * t + by) * t + cy) * t; + } + function solveCurveX(x, epsilon) { + var t0, t1, t2, x2, d2, i; + for(t2 = x, i = 0; i < 8; i++) { + x2 = sampleCurveX(t2) - x; + if (abs(x2) < epsilon) { + return t2; + } + d2 = (3 * ax * t2 + 2 * bx) * t2 + cx; + if (abs(d2) < 1e-6) { + break; + } + t2 = t2 - x2 / d2; + } + t0 = 0; + t1 = 1; + t2 = x; + if (t2 < t0) { + return t0; + } + if (t2 > t1) { + return t1; + } + while (t0 < t1) { + x2 = sampleCurveX(t2); + if (abs(x2 - x) < epsilon) { + return t2; + } + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + t2 = (t1 - t0) / 2 + t0; + } + return t2; + } + return solve(t, 1 / (200 * duration)); + } + elproto.onAnimation = function (f) { + this._run = f || 0; + return this; + }; + elproto.animate = function (params, ms, easing, callback) { + var element = this; + element.timeouts = element.timeouts || []; + if (R.is(easing, "function") || !easing) { + callback = easing || null; + } + if (element.removed) { + callback && callback.call(element); + return element; + } + var from = {}, + to = {}, + animateable = false, + diff = {}; + for (var attr in params) if (params[has](attr)) { + if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) { + animateable = true; + from[attr] = element.attr(attr); + (from[attr] == null) && (from[attr] = availableAttrs[attr]); + to[attr] = params[attr]; + switch (availableAnimAttrs[attr]) { + case "along": + var len = getTotalLength(params[attr]); + var point = getPointAtLength(params[attr], len * !!params.back); + var bb = element.getBBox(); + diff[attr] = len / ms; + diff.tx = bb.x; + diff.ty = bb.y; + diff.sx = point.x; + diff.sy = point.y; + to.rot = params.rot; + to.back = params.back; + to.len = len; + params.rot && (diff.r = toFloat(element.rotate()) || 0); + break; + case nu: + diff[attr] = (to[attr] - from[attr]) / ms; + break; + case "colour": + from[attr] = R.getRGB(from[attr]); + var toColour = R.getRGB(to[attr]); + diff[attr] = { + r: (toColour.r - from[attr].r) / ms, + g: (toColour.g - from[attr].g) / ms, + b: (toColour.b - from[attr].b) / ms + }; + break; + case "path": + var pathes = path2curve(from[attr], to[attr]); + from[attr] = pathes[0]; + var toPath = pathes[1]; + diff[attr] = []; + for (var i = 0, ii = from[attr][length]; i < ii; i++) { + diff[attr][i] = [0]; + for (var j = 1, jj = from[attr][i][length]; j < jj; j++) { + diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms; + } + } + break; + case "csv": + var values = Str(params[attr])[split](separator), + from2 = Str(from[attr])[split](separator); + switch (attr) { + case "translation": + from[attr] = [0, 0]; + diff[attr] = [values[0] / ms, values[1] / ms]; + break; + case "rotation": + from[attr] = (from2[1] == values[1] && from2[2] == values[2]) ? from2 : [0, values[1], values[2]]; + diff[attr] = [(values[0] - from[attr][0]) / ms, 0, 0]; + break; + case "scale": + params[attr] = values; + from[attr] = Str(from[attr])[split](separator); + diff[attr] = [(values[0] - from[attr][0]) / ms, (values[1] - from[attr][1]) / ms, 0, 0]; + break; + case "clip-rect": + from[attr] = Str(from[attr])[split](separator); + diff[attr] = []; + i = 4; + while (i--) { + diff[attr][i] = (values[i] - from[attr][i]) / ms; + } + break; + } + to[attr] = values; + break; + default: + values = [].concat(params[attr]); + from2 = [].concat(from[attr]); + diff[attr] = []; + i = element.paper.customAttributes[attr][length]; + while (i--) { + diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms; + } + break; + } + } + } + if (!animateable) { + var attrs = [], + lastcall; + for (var key in params) if (params[has](key) && animKeyFrames.test(key)) { + attr = {value: params[key]}; + key == "from" && (key = 0); + key == "to" && (key = 100); + attr.key = toInt(key, 10); + attrs.push(attr); + } + attrs.sort(sortByKey); + if (attrs[0].key) { + attrs.unshift({key: 0, value: element.attrs}); + } + for (i = 0, ii = attrs[length]; i < ii; i++) { + keyframesRun(attrs[i].value, element, ms / 100 * attrs[i].key, ms / 100 * (attrs[i - 1] && attrs[i - 1].key || 0), attrs[i - 1] && attrs[i - 1].value.callback); + } + lastcall = attrs[attrs[length] - 1].value.callback; + if (lastcall) { + element.timeouts.push(setTimeout(function () {lastcall.call(element);}, ms)); + } + } else { + var easyeasy = R.easing_formulas[easing]; + if (!easyeasy) { + easyeasy = Str(easing).match(bezierrg); + if (easyeasy && easyeasy[length] == 5) { + var curve = easyeasy; + easyeasy = function (t) { + return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms); + }; + } else { + easyeasy = function (t) { + return t; + }; + } + } + animationElements.push({ + start: params.start || +new Date, + ms: ms, + easing: easyeasy, + from: from, + diff: diff, + to: to, + el: element, + t: {x: 0, y: 0} + }); + R.is(callback, "function") && (element._ac = setTimeout(function () { + callback.call(element); + }, ms)); + animationElements[length] == 1 && setTimeout(animation); + } + return this; + }; + elproto.stop = function () { + for (var i = 0; i < animationElements.length; i++) { + animationElements[i].el.id == this.id && animationElements.splice(i--, 1); + } + for (i = 0, ii = this.timeouts && this.timeouts.length; i < ii; i++) { + clearTimeout(this.timeouts[i]); + } + this.timeouts = []; + clearTimeout(this._ac); + delete this._ac; + return this; + }; + elproto.translate = function (x, y) { + return this.attr({translation: x + " " + y}); + }; + elproto[toString] = function () { + return "Rapha\xebl\u2019s object"; + }; + R.ae = animationElements; + + // Set + var Set = function (items) { + this.items = []; + this[length] = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items[length]; i < ii; i++) { + if (items[i] && (items[i].constructor == Element || items[i].constructor == Set)) { + this[this.items[length]] = this.items[this.items[length]] = items[i]; + this[length]++; + } + } + } + }; + Set[proto][push] = function () { + var item, + len; + for (var i = 0, ii = arguments[length]; i < ii; i++) { + item = arguments[i]; + if (item && (item.constructor == Element || item.constructor == Set)) { + len = this.items[length]; + this[len] = this.items[len] = item; + this[length]++; + } + } + return this; + }; + Set[proto].pop = function () { + delete this[this[length]--]; + return this.items.pop(); + }; + for (var method in elproto) if (elproto[has](method)) { + Set[proto][method] = (function (methodname) { + return function () { + for (var i = 0, ii = this.items[length]; i < ii; i++) { + this.items[i][methodname][apply](this.items[i], arguments); + } + return this; + }; + })(method); + } + Set[proto].attr = function (name, value) { + if (name && R.is(name, array) && R.is(name[0], "object")) { + for (var j = 0, jj = name[length]; j < jj; j++) { + this.items[j].attr(name[j]); + } + } else { + for (var i = 0, ii = this.items[length]; i < ii; i++) { + this.items[i].attr(name, value); + } + } + return this; + }; + Set[proto].animate = function (params, ms, easing, callback) { + (R.is(easing, "function") || !easing) && (callback = easing || null); + var len = this.items[length], + i = len, + item, + set = this, + collector; + callback && (collector = function () { + !--len && callback.call(set); + }); + easing = R.is(easing, string) ? easing : collector; + item = this.items[--i].animate(params, ms, easing, collector); + while (i--) { + this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, params, ms, easing, collector); + } + return this; + }; + Set[proto].insertAfter = function (el) { + var i = this.items[length]; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + Set[proto].getBBox = function () { + var x = [], + y = [], + w = [], + h = []; + for (var i = this.items[length]; i--;) { + var box = this.items[i].getBBox(); + x[push](box.x); + y[push](box.y); + w[push](box.x + box.width); + h[push](box.y + box.height); + } + x = mmin[apply](0, x); + y = mmin[apply](0, y); + return { + x: x, + y: y, + width: mmax[apply](0, w) - x, + height: mmax[apply](0, h) - y + }; + }; + Set[proto].clone = function (s) { + s = new Set; + for (var i = 0, ii = this.items[length]; i < ii; i++) { + s[push](this.items[i].clone()); + } + return s; + }; + + R.registerFont = function (font) { + if (!font.face) { + return font; + } + this.fonts = this.fonts || {}; + var fontcopy = { + w: font.w, + face: {}, + glyphs: {} + }, + family = font.face["font-family"]; + for (var prop in font.face) if (font.face[has](prop)) { + fontcopy.face[prop] = font.face[prop]; + } + if (this.fonts[family]) { + this.fonts[family][push](fontcopy); + } else { + this.fonts[family] = [fontcopy]; + } + if (!font.svg) { + fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10); + for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) { + var path = font.glyphs[glyph]; + fontcopy.glyphs[glyph] = { + w: path.w, + k: {}, + d: path.d && "M" + path.d[rp](/[mlcxtrv]/g, function (command) { + return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M"; + }) + "z" + }; + if (path.k) { + for (var k in path.k) if (path[has](k)) { + fontcopy.glyphs[glyph].k[k] = path.k[k]; + } + } + } + } + return font; + }; + paperproto.getFont = function (family, weight, style, stretch) { + stretch = stretch || "normal"; + style = style || "normal"; + weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400; + if (!R.fonts) { + return; + } + var font = R.fonts[family]; + if (!font) { + var name = new RegExp("(^|\\s)" + family[rp](/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i"); + for (var fontName in R.fonts) if (R.fonts[has](fontName)) { + if (name.test(fontName)) { + font = R.fonts[fontName]; + break; + } + } + } + var thefont; + if (font) { + for (var i = 0, ii = font[length]; i < ii; i++) { + thefont = font[i]; + if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) { + break; + } + } + } + return thefont; + }; + paperproto.print = function (x, y, string, font, size, origin, letter_spacing) { + origin = origin || "middle"; // baseline|middle + letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1); + var out = this.set(), + letters = Str(string)[split](E), + shift = 0, + path = E, + scale; + R.is(font, string) && (font = this.getFont(font)); + if (font) { + scale = (size || 16) / font.face["units-per-em"]; + var bb = font.face.bbox.split(separator), + top = +bb[0], + height = +bb[1] + (origin == "baseline" ? bb[3] - bb[1] + (+font.face.descent) : (bb[3] - bb[1]) / 2); + for (var i = 0, ii = letters[length]; i < ii; i++) { + var prev = i && font.glyphs[letters[i - 1]] || {}, + curr = font.glyphs[letters[i]]; + shift += i ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0; + curr && curr.d && out[push](this.path(curr.d).attr({fill: "#000", stroke: "none", translation: [shift, 0]})); + } + out.scale(scale, scale, top, height).translate(x - top, y - height); + } + return out; + }; + + R.format = function (token, params) { + var args = R.is(params, array) ? [0][concat](params) : arguments; + token && R.is(token, string) && args[length] - 1 && (token = token[rp](formatrg, function (str, i) { + return args[++i] == null ? E : args[i]; + })); + return token || E; + }; + R.ninja = function () { + oldRaphael.was ? (win.Raphael = oldRaphael.is) : delete Raphael; + return R; + }; + R.el = elproto; + R.st = Set[proto]; + + oldRaphael.was ? (win.Raphael = R) : (Raphael = R); +})();/*! + * g.Raphael 0.4.1 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ + + +(function () { + var mmax = Math.max, + mmin = Math.min; + Raphael.fn.g = Raphael.fn.g || {}; + Raphael.fn.g.markers = { + disc: "disc", + o: "disc", + flower: "flower", + f: "flower", + diamond: "diamond", + d: "diamond", + square: "square", + s: "square", + triangle: "triangle", + t: "triangle", + star: "star", + "*": "star", + cross: "cross", + x: "cross", + plus: "plus", + "+": "plus", + arrow: "arrow", + "->": "arrow" + }; + Raphael.fn.g.shim = {stroke: "none", fill: "#000", "fill-opacity": 0}; + Raphael.fn.g.txtattr = {font: "12px Arial, sans-serif"}; + Raphael.fn.g.colors = []; + var hues = [.6, .2, .05, .1333, .75, 0]; + for (var i = 0; i < 10; i++) { + if (i < hues.length) { + Raphael.fn.g.colors.push("hsb(" + hues[i] + ", .75, .75)"); + } else { + Raphael.fn.g.colors.push("hsb(" + hues[i - hues.length] + ", 1, .5)"); + } + } + Raphael.fn.g.text = function (x, y, text) { + return this.text(x, y, text).attr(this.g.txtattr); + }; + Raphael.fn.g.labelise = function (label, val, total) { + if (label) { + return (label + "").replace(/(##+(?:\.#+)?)|(%%+(?:\.%+)?)/g, function (all, value, percent) { + if (value) { + return (+val).toFixed(value.replace(/^#+\.?/g, "").length); + } + if (percent) { + return (val * 100 / total).toFixed(percent.replace(/^%+\.?/g, "").length) + "%"; + } + }); + } else { + return (+val).toFixed(0); + } + }; + + Raphael.fn.g.finger = function (x, y, width, height, dir, ending, isPath) { + // dir 0 for horisontal and 1 for vertical + if ((dir && !height) || (!dir && !width)) { + return isPath ? "" : this.path(); + } + ending = {square: "square", sharp: "sharp", soft: "soft"}[ending] || "round"; + var path; + height = Math.round(height); + width = Math.round(width); + x = Math.round(x); + y = Math.round(y); + switch (ending) { + case "round": + if (!dir) { + var r = ~~(height / 2); + if (width < r) { + r = width; + path = ["M", x + .5, y + .5 - ~~(height / 2), "l", 0, 0, "a", r, ~~(height / 2), 0, 0, 1, 0, height, "l", 0, 0, "z"]; + } else { + path = ["M", x + .5, y + .5 - r, "l", width - r, 0, "a", r, r, 0, 1, 1, 0, height, "l", r - width, 0, "z"]; + } + } else { + r = ~~(width / 2); + if (height < r) { + r = height; + path = ["M", x - ~~(width / 2), y, "l", 0, 0, "a", ~~(width / 2), r, 0, 0, 1, width, 0, "l", 0, 0, "z"]; + } else { + path = ["M", x - r, y, "l", 0, r - height, "a", r, r, 0, 1, 1, width, 0, "l", 0, height - r, "z"]; + } + } + break; + case "sharp": + if (!dir) { + var half = ~~(height / 2); + path = ["M", x, y + half, "l", 0, -height, mmax(width - half, 0), 0, mmin(half, width), half, -mmin(half, width), half + (half * 2 < height), "z"]; + } else { + half = ~~(width / 2); + path = ["M", x + half, y, "l", -width, 0, 0, -mmax(height - half, 0), half, -mmin(half, height), half, mmin(half, height), half, "z"]; + } + break; + case "square": + if (!dir) { + path = ["M", x, y + ~~(height / 2), "l", 0, -height, width, 0, 0, height, "z"]; + } else { + path = ["M", x + ~~(width / 2), y, "l", 1 - width, 0, 0, -height, width - 1, 0, "z"]; + } + break; + case "soft": + if (!dir) { + r = mmin(width, Math.round(height / 5)); + path = ["M", x + .5, y + .5 - ~~(height / 2), "l", width - r, 0, "a", r, r, 0, 0, 1, r, r, "l", 0, height - r * 2, "a", r, r, 0, 0, 1, -r, r, "l", r - width, 0, "z"]; + } else { + r = mmin(Math.round(width / 5), height); + path = ["M", x - ~~(width / 2), y, "l", 0, r - height, "a", r, r, 0, 0, 1, r, -r, "l", width - 2 * r, 0, "a", r, r, 0, 0, 1, r, r, "l", 0, height - r, "z"]; + } + } + if (isPath) { + return path.join(","); + } else { + return this.path(path); + } + }; + + // Symbols + Raphael.fn.g.disc = function (cx, cy, r) { + return this.circle(cx, cy, r); + }; + Raphael.fn.g.line = function (cx, cy, r) { + return this.rect(cx - r, cy - r / 5, 2 * r, 2 * r / 5); + }; + Raphael.fn.g.square = function (cx, cy, r) { + r = r * .7; + return this.rect(cx - r, cy - r, 2 * r, 2 * r); + }; + Raphael.fn.g.triangle = function (cx, cy, r) { + r *= 1.75; + return this.path("M".concat(cx, ",", cy, "m0-", r * .58, "l", r * .5, ",", r * .87, "-", r, ",0z")); + }; + Raphael.fn.g.diamond = function (cx, cy, r) { + return this.path(["M", cx, cy - r, "l", r, r, -r, r, -r, -r, r, -r, "z"]); + }; + Raphael.fn.g.flower = function (cx, cy, r, n) { + r = r * 1.25; + var rout = r, + rin = rout * .5; + n = +n < 3 || !n ? 5 : n; + var points = ["M", cx, cy + rin, "Q"], + R; + for (var i = 1; i < n * 2 + 1; i++) { + R = i % 2 ? rout : rin; + points = points.concat([+(cx + R * Math.sin(i * Math.PI / n)).toFixed(3), +(cy + R * Math.cos(i * Math.PI / n)).toFixed(3)]); + } + points.push("z"); + return this.path(points.join(",")); + }; + Raphael.fn.g.star = function (cx, cy, r, r2, rays) { + r2 = r2 || r * .382; + rays = rays || 5; + var points = ["M", cx, cy + r2, "L"], + R; + for (var i = 1; i < rays * 2; i++) { + R = i % 2 ? r : r2; + points = points.concat([(cx + R * Math.sin(i * Math.PI / rays)), (cy + R * Math.cos(i * Math.PI / rays))]); + } + points.push("z"); + return this.path(points.join(",")); + }; + Raphael.fn.g.cross = function (cx, cy, r) { + r = r / 2.5; + return this.path("M".concat(cx - r, ",", cy, "l", [-r, -r, r, -r, r, r, r, -r, r, r, -r, r, r, r, -r, r, -r, -r, -r, r, -r, -r, "z"])); + }; + Raphael.fn.g.plus = function (cx, cy, r) { + r = r / 2; + return this.path("M".concat(cx - r / 2, ",", cy - r / 2, "l", [0, -r, r, 0, 0, r, r, 0, 0, r, -r, 0, 0, r, -r, 0, 0, -r, -r, 0, 0, -r, "z"])); + }; + Raphael.fn.g.arrow = function (cx, cy, r) { + return this.path("M".concat(cx - r * .7, ",", cy - r * .4, "l", [r * .6, 0, 0, -r * .4, r, r * .8, -r, r * .8, 0, -r * .4, -r * .6, 0], "z")); + }; + + // Tooltips + Raphael.fn.g.tag = function (x, y, text, angle, r) { + angle = angle || 0; + r = r == null ? 5 : r; + text = text == null ? "$9.99" : text; + var R = .5522 * r, + res = this.set(), + d = 3; + res.push(this.path().attr({fill: "#000", stroke: "#000"})); + res.push(this.text(x, y, text).attr(this.g.txtattr).attr({fill: "#fff", "font-family": "Helvetica, Arial"})); + res.update = function () { + this.rotate(0, x, y); + var bb = this[1].getBBox(); + if (bb.height >= r * 2) { + this[0].attr({path: ["M", x, y + r, "a", r, r, 0, 1, 1, 0, -r * 2, r, r, 0, 1, 1, 0, r * 2, "m", 0, -r * 2 -d, "a", r + d, r + d, 0, 1, 0, 0, (r + d) * 2, "L", x + r + d, y + bb.height / 2 + d, "l", bb.width + 2 * d, 0, 0, -bb.height - 2 * d, -bb.width - 2 * d, 0, "L", x, y - r - d].join(",")}); + } else { + var dx = Math.sqrt(Math.pow(r + d, 2) - Math.pow(bb.height / 2 + d, 2)); + this[0].attr({path: ["M", x, y + r, "c", -R, 0, -r, R - r, -r, -r, 0, -R, r - R, -r, r, -r, R, 0, r, r - R, r, r, 0, R, R - r, r, -r, r, "M", x + dx, y - bb.height / 2 - d, "a", r + d, r + d, 0, 1, 0, 0, bb.height + 2 * d, "l", r + d - dx + bb.width + 2 * d, 0, 0, -bb.height - 2 * d, "L", x + dx, y - bb.height / 2 - d].join(",")}); + } + this[1].attr({x: x + r + d + bb.width / 2, y: y}); + angle = (360 - angle) % 360; + this.rotate(angle, x, y); + angle > 90 && angle < 270 && this[1].attr({x: x - r - d - bb.width / 2, y: y, rotation: [180 + angle, x, y]}); + return this; + }; + res.update(); + return res; + }; + Raphael.fn.g.popupit = function (x, y, set, dir, size) { + dir = dir == null ? 2 : dir; + size = size || 5; + x = Math.round(x); + y = Math.round(y); + var bb = set.getBBox(), + w = Math.round(bb.width / 2), + h = Math.round(bb.height / 2), + dx = [0, w + size * 2, 0, -w - size * 2], + dy = [-h * 2 - size * 3, -h - size, 0, -h - size], + p = ["M", x - dx[dir], y - dy[dir], "l", -size, (dir == 2) * -size, -mmax(w - size, 0), 0, "a", size, size, 0, 0, 1, -size, -size, + "l", 0, -mmax(h - size, 0), (dir == 3) * -size, -size, (dir == 3) * size, -size, 0, -mmax(h - size, 0), "a", size, size, 0, 0, 1, size, -size, + "l", mmax(w - size, 0), 0, size, !dir * -size, size, !dir * size, mmax(w - size, 0), 0, "a", size, size, 0, 0, 1, size, size, + "l", 0, mmax(h - size, 0), (dir == 1) * size, size, (dir == 1) * -size, size, 0, mmax(h - size, 0), "a", size, size, 0, 0, 1, -size, size, + "l", -mmax(w - size, 0), 0, "z"].join(","), + xy = [{x: x, y: y + size * 2 + h}, {x: x - size * 2 - w, y: y}, {x: x, y: y - size * 2 - h}, {x: x + size * 2 + w, y: y}][dir]; + set.translate(xy.x - w - bb.x, xy.y - h - bb.y); + return this.path(p).attr({fill: "#000", stroke: "none"}).insertBefore(set.node ? set : set[0]); + }; + Raphael.fn.g.popup = function (x, y, text, dir, size) { + dir = dir == null ? 2 : dir > 3 ? 3 : dir; + size = size || 5; + text = text || "$9.99"; + var res = this.set(), + d = 3; + res.push(this.path().attr({fill: "#000", stroke: "#000"})); + res.push(this.text(x, y, text).attr(this.g.txtattr).attr({fill: "#fff", "font-family": "Helvetica, Arial"})); + res.update = function (X, Y, withAnimation) { + X = X || x; + Y = Y || y; + var bb = this[1].getBBox(), + w = bb.width / 2, + h = bb.height / 2, + dx = [0, w + size * 2, 0, -w - size * 2], + dy = [-h * 2 - size * 3, -h - size, 0, -h - size], + p = ["M", X - dx[dir], Y - dy[dir], "l", -size, (dir == 2) * -size, -mmax(w - size, 0), 0, "a", size, size, 0, 0, 1, -size, -size, + "l", 0, -mmax(h - size, 0), (dir == 3) * -size, -size, (dir == 3) * size, -size, 0, -mmax(h - size, 0), "a", size, size, 0, 0, 1, size, -size, + "l", mmax(w - size, 0), 0, size, !dir * -size, size, !dir * size, mmax(w - size, 0), 0, "a", size, size, 0, 0, 1, size, size, + "l", 0, mmax(h - size, 0), (dir == 1) * size, size, (dir == 1) * -size, size, 0, mmax(h - size, 0), "a", size, size, 0, 0, 1, -size, size, + "l", -mmax(w - size, 0), 0, "z"].join(","), + xy = [{x: X, y: Y + size * 2 + h}, {x: X - size * 2 - w, y: Y}, {x: X, y: Y - size * 2 - h}, {x: X + size * 2 + w, y: Y}][dir]; + xy.path = p; + if (withAnimation) { + this.animate(xy, 500, ">"); + } else { + this.attr(xy); + } + return this; + }; + return res.update(x, y); + }; + Raphael.fn.g.flag = function (x, y, text, angle) { + angle = angle || 0; + text = text || "$9.99"; + var res = this.set(), + d = 3; + res.push(this.path().attr({fill: "#000", stroke: "#000"})); + res.push(this.text(x, y, text).attr(this.g.txtattr).attr({fill: "#fff", "font-family": "Helvetica, Arial"})); + res.update = function (x, y) { + this.rotate(0, x, y); + var bb = this[1].getBBox(), + h = bb.height / 2; + this[0].attr({path: ["M", x, y, "l", h + d, -h - d, bb.width + 2 * d, 0, 0, bb.height + 2 * d, -bb.width - 2 * d, 0, "z"].join(",")}); + this[1].attr({x: x + h + d + bb.width / 2, y: y}); + angle = 360 - angle; + this.rotate(angle, x, y); + angle > 90 && angle < 270 && this[1].attr({x: x - r - d - bb.width / 2, y: y, rotation: [180 + angle, x, y]}); + return this; + }; + return res.update(x, y); + }; + Raphael.fn.g.label = function (x, y, text) { + var res = this.set(); + res.push(this.rect(x, y, 10, 10).attr({stroke: "none", fill: "#000"})); + res.push(this.text(x, y, text).attr(this.g.txtattr).attr({fill: "#fff"})); + res.update = function () { + var bb = this[1].getBBox(), + r = mmin(bb.width + 10, bb.height + 10) / 2; + this[0].attr({x: bb.x - r / 2, y: bb.y - r / 2, width: bb.width + r, height: bb.height + r, r: r}); + }; + res.update(); + return res; + }; + Raphael.fn.g.labelit = function (set) { + var bb = set.getBBox(), + r = mmin(20, bb.width + 10, bb.height + 10) / 2; + return this.rect(bb.x - r / 2, bb.y - r / 2, bb.width + r, bb.height + r, r).attr({stroke: "none", fill: "#000"}).insertBefore(set.node ? set : set[0]); + }; + Raphael.fn.g.drop = function (x, y, text, size, angle) { + size = size || 30; + angle = angle || 0; + var res = this.set(); + res.push(this.path(["M", x, y, "l", size, 0, "A", size * .4, size * .4, 0, 1, 0, x + size * .7, y - size * .7, "z"]).attr({fill: "#000", stroke: "none", rotation: [22.5 - angle, x, y]})); + angle = (angle + 90) * Math.PI / 180; + res.push(this.text(x + size * Math.sin(angle), y + size * Math.cos(angle), text).attr(this.g.txtattr).attr({"font-size": size * 12 / 30, fill: "#fff"})); + res.drop = res[0]; + res.text = res[1]; + return res; + }; + Raphael.fn.g.blob = function (x, y, text, angle, size) { + angle = (+angle + 1 ? angle : 45) + 90; + size = size || 12; + var rad = Math.PI / 180, + fontSize = size * 12 / 12; + var res = this.set(); + res.push(this.path().attr({fill: "#000", stroke: "none"})); + res.push(this.text(x + size * Math.sin((angle) * rad), y + size * Math.cos((angle) * rad) - fontSize / 2, text).attr(this.g.txtattr).attr({"font-size": fontSize, fill: "#fff"})); + res.update = function (X, Y, withAnimation) { + X = X || x; + Y = Y || y; + var bb = this[1].getBBox(), + w = mmax(bb.width + fontSize, size * 25 / 12), + h = mmax(bb.height + fontSize, size * 25 / 12), + x2 = X + size * Math.sin((angle - 22.5) * rad), + y2 = Y + size * Math.cos((angle - 22.5) * rad), + x1 = X + size * Math.sin((angle + 22.5) * rad), + y1 = Y + size * Math.cos((angle + 22.5) * rad), + dx = (x1 - x2) / 2, + dy = (y1 - y2) / 2, + rx = w / 2, + ry = h / 2, + k = -Math.sqrt(Math.abs(rx * rx * ry * ry - rx * rx * dy * dy - ry * ry * dx * dx) / (rx * rx * dy * dy + ry * ry * dx * dx)), + cx = k * rx * dy / ry + (x1 + x2) / 2, + cy = k * -ry * dx / rx + (y1 + y2) / 2; + if (withAnimation) { + this.animate({x: cx, y: cy, path: ["M", x, y, "L", x1, y1, "A", rx, ry, 0, 1, 1, x2, y2, "z"].join(",")}, 500, ">"); + } else { + this.attr({x: cx, y: cy, path: ["M", x, y, "L", x1, y1, "A", rx, ry, 0, 1, 1, x2, y2, "z"].join(",")}); + } + return this; + }; + res.update(x, y); + return res; + }; + + Raphael.fn.g.colorValue = function (value, total, s, b) { + return "hsb(" + [mmin((1 - value / total) * .4, 1), s || .75, b || .75] + ")"; + }; + + Raphael.fn.g.snapEnds = function (from, to, steps) { + var f = from, + t = to; + if (f == t) { + return {from: f, to: t, power: 0}; + } + function round(a) { + return Math.abs(a - .5) < .25 ? ~~(a) + .5 : Math.round(a); + } + var d = (t - f) / steps, + r = ~~(d), + R = r, + i = 0; + if (r) { + while (R) { + i--; + R = ~~(d * Math.pow(10, i)) / Math.pow(10, i); + } + i ++; + } else { + while (!r) { + i = i || 1; + r = ~~(d * Math.pow(10, i)) / Math.pow(10, i); + i++; + } + i && i--; + } + t = round(to * Math.pow(10, i)) / Math.pow(10, i); + if (t < to) { + t = round((to + .5) * Math.pow(10, i)) / Math.pow(10, i); + } + f = round((from - (i > 0 ? 0 : .5)) * Math.pow(10, i)) / Math.pow(10, i); + return {from: f, to: t, power: i}; + }; + Raphael.fn.g.axis = function (x, y, length, from, to, steps, orientation, labels, type, dashsize) { + dashsize = dashsize == null ? 2 : dashsize; + type = type || "t"; + steps = steps || 10; + var path = type == "|" || type == " " ? ["M", x + .5, y, "l", 0, .001] : orientation == 1 || orientation == 3 ? ["M", x + .5, y, "l", 0, -length] : ["M", x, y + .5, "l", length, 0], + ends = this.g.snapEnds(from, to, steps), + f = ends.from, + t = ends.to, + i = ends.power, + j = 0, + text = this.set(); + d = (t - f) / steps; + var label = f, + rnd = i > 0 ? i : 0; + dx = length / steps; + if (+orientation == 1 || +orientation == 3) { + var Y = y, + addon = (orientation - 1 ? 1 : -1) * (dashsize + 3 + !!(orientation - 1)); + while (Y >= y - length) { + type != "-" && type != " " && (path = path.concat(["M", x - (type == "+" || type == "|" ? dashsize : !(orientation - 1) * dashsize * 2), Y + .5, "l", dashsize * 2 + 1, 0])); + text.push(this.text(x + addon, Y, (labels && labels[j++]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(this.g.txtattr).attr({"text-anchor": orientation - 1 ? "start" : "end"})); + label += d; + Y -= dx; + } + if (Math.round(Y + dx - (y - length))) { + type != "-" && type != " " && (path = path.concat(["M", x - (type == "+" || type == "|" ? dashsize : !(orientation - 1) * dashsize * 2), y - length + .5, "l", dashsize * 2 + 1, 0])); + text.push(this.text(x + addon, y - length, (labels && labels[j]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(this.g.txtattr).attr({"text-anchor": orientation - 1 ? "start" : "end"})); + } + } else { + label = f; + rnd = (i > 0) * i; + addon = (orientation ? -1 : 1) * (dashsize + 9 + !orientation); + var X = x, + dx = length / steps, + txt = 0, + prev = 0; + while (X <= x + length) { + type != "-" && type != " " && (path = path.concat(["M", X + .5, y - (type == "+" ? dashsize : !!orientation * dashsize * 2), "l", 0, dashsize * 2 + 1])); + text.push(txt = this.text(X, y + addon, (labels && labels[j++]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(this.g.txtattr)); + var bb = txt.getBBox(); + if (prev >= bb.x - 5) { + text.pop(text.length - 1).remove(); + } else { + prev = bb.x + bb.width; + } + label += d; + X += dx; + } + if (Math.round(X - dx - x - length)) { + type != "-" && type != " " && (path = path.concat(["M", x + length + .5, y - (type == "+" ? dashsize : !!orientation * dashsize * 2), "l", 0, dashsize * 2 + 1])); + text.push(this.text(x + length, y + addon, (labels && labels[j]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(this.g.txtattr)); + } + } + var res = this.path(path); + res.text = text; + res.all = this.set([res, text]); + res.remove = function () { + this.text.remove(); + this.constructor.prototype.remove.call(this); + }; + return res; + }; + + Raphael.el.lighter = function (times) { + times = times || 2; + var fs = [this.attrs.fill, this.attrs.stroke]; + this.fs = this.fs || [fs[0], fs[1]]; + fs[0] = Raphael.rgb2hsb(Raphael.getRGB(fs[0]).hex); + fs[1] = Raphael.rgb2hsb(Raphael.getRGB(fs[1]).hex); + fs[0].b = mmin(fs[0].b * times, 1); + fs[0].s = fs[0].s / times; + fs[1].b = mmin(fs[1].b * times, 1); + fs[1].s = fs[1].s / times; + this.attr({fill: "hsb(" + [fs[0].h, fs[0].s, fs[0].b] + ")", stroke: "hsb(" + [fs[1].h, fs[1].s, fs[1].b] + ")"}); + }; + Raphael.el.darker = function (times) { + times = times || 2; + var fs = [this.attrs.fill, this.attrs.stroke]; + this.fs = this.fs || [fs[0], fs[1]]; + fs[0] = Raphael.rgb2hsb(Raphael.getRGB(fs[0]).hex); + fs[1] = Raphael.rgb2hsb(Raphael.getRGB(fs[1]).hex); + fs[0].s = mmin(fs[0].s * times, 1); + fs[0].b = fs[0].b / times; + fs[1].s = mmin(fs[1].s * times, 1); + fs[1].b = fs[1].b / times; + this.attr({fill: "hsb(" + [fs[0].h, fs[0].s, fs[0].b] + ")", stroke: "hsb(" + [fs[1].h, fs[1].s, fs[1].b] + ")"}); + }; + Raphael.el.original = function () { + if (this.fs) { + this.attr({fill: this.fs[0], stroke: this.fs[1]}); + delete this.fs; + } + }; +})();/*! + * g.Raphael 0.4.1 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael.fn.g.barchart = function (x, y, width, height, values, opts) { + opts = opts || {}; + var type = {round: "round", sharp: "sharp", soft: "soft"}[opts.type] || "square", + gutter = parseFloat(opts.gutter || "20%"), + chart = this.set(), + bars = this.set(), + covers = this.set(), + covers2 = this.set(), + total = Math.max.apply(Math, values), + stacktotal = [], + paper = this, + multi = 0, + colors = opts.colors || this.g.colors, + len = values.length; + if (this.raphael.is(values[0], "array")) { + total = []; + multi = len; + len = 0; + for (var i = values.length; i--;) { + bars.push(this.set()); + total.push(Math.max.apply(Math, values[i])); + len = Math.max(len, values[i].length); + } + if (opts.stacked) { + for (var i = len; i--;) { + var tot = 0; + for (var j = values.length; j--;) { + tot +=+ values[j][i] || 0; + } + stacktotal.push(tot); + } + } + for (var i = values.length; i--;) { + if (values[i].length < len) { + for (var j = len; j--;) { + values[i].push(0); + } + } + } + total = Math.max.apply(Math, opts.stacked ? stacktotal : total); + } + + total = (opts.to) || total; + var barwidth = width / (len * (100 + gutter) + gutter) * 100, + barhgutter = barwidth * gutter / 100, + barvgutter = opts.vgutter == null ? 20 : opts.vgutter, + stack = [], + X = x + barhgutter, + Y = (height - 2 * barvgutter) / total; + if (!opts.stretch) { + barhgutter = Math.round(barhgutter); + barwidth = Math.floor(barwidth); + } + !opts.stacked && (barwidth /= multi || 1); + for (var i = 0; i < len; i++) { + stack = []; + for (var j = 0; j < (multi || 1); j++) { + var h = Math.round((multi ? values[j][i] : values[i]) * Y), + top = y + height - barvgutter - h, + bar = this.g.finger(Math.round(X + barwidth / 2), top + h, barwidth, h, true, type).attr({stroke: "none", fill: colors[multi ? j : i]}); + if (multi) { + bars[j].push(bar); + } else { + bars.push(bar); + } + bar.y = top; + bar.x = Math.round(X + barwidth / 2); + bar.w = barwidth; + bar.h = h; + bar.index = i; + bar.value = multi ? values[j][i] : values[i]; + if (!opts.stacked) { + X += barwidth; + } else { + stack.push(bar); + } + } + if (opts.stacked) { + var cvr; + covers2.push(cvr = this.rect(stack[0].x - stack[0].w / 2, y, barwidth, height).attr(this.g.shim)); + cvr.bars = this.set(); + var size = 0; + for (var s = stack.length; s--;) { + stack[s].toFront(); + } + for (var s = 0, ss = stack.length; s < ss; s++) { + var bar = stack[s], + cover, + h = (size + bar.value) * Y, + path = this.g.finger(bar.x, y + height - barvgutter - !!size * .5, barwidth, h, true, type, 1); + cvr.bars.push(bar); + size && bar.attr({path: path}); + bar.h = h; + bar.y = y + height - barvgutter - !!size * .5 - h; + covers.push(cover = this.rect(bar.x - bar.w / 2, bar.y, barwidth, bar.value * Y).attr(this.g.shim)); + cover.bar = bar; + cover.value = bar.value; + size += bar.value; + } + X += barwidth; + } + X += barhgutter; + } + covers2.toFront(); + X = x + barhgutter; + if (!opts.stacked) { + for (var i = 0; i < len; i++) { + for (var j = 0; j < (multi || 1); j++) { + var cover; + covers.push(cover = this.rect(Math.round(X), y + barvgutter, barwidth, height - barvgutter).attr(this.g.shim)); + cover.bar = multi ? bars[j][i] : bars[i]; + cover.value = cover.bar.value; + X += barwidth; + } + X += barhgutter; + } + } + chart.label = function (labels, isBottom, rotate) { + labels = labels || []; + isBottom = isBottom == undefined ? true : isBottom; + rotate = rotate == undefined ? false : rotate; + this.labels = paper.set(); + var L, l = -Infinity; + if (opts.stacked) { + for (var i = 0; i < len; i++) { + var tot = 0; + for (var j = 0; j < (multi || 1); j++) { + tot += multi ? values[j][i] : values[i]; + if (j == 0) { + var label = paper.g.labelise(labels[j][i], tot, total); + L = paper.g.text(bars[j][i].x, isBottom ? y + height - barvgutter / 2 : bars[j][i].y - 10, label); + if (rotate) { + L.rotate(90); + } + var bb = L.getBBox(); + if (bb.x - 7 < l) { + L.remove(); + } else { + this.labels.push(L); + l = bb.x + (rotate ? bb.height : bb.width); + } + } + } + } + } else { + for (var i = 0; i < len; i++) { + for (var j = 0; j < (multi || 1); j++) { + // did not remove the loop because don't yet know whether to accept multi array input for arrays + var label = paper.g.labelise(multi ? labels[0] && labels[0][i] : labels[i], multi ? values[0][i] : values[i], total); + L = paper.g.text(bars[0][i].x, isBottom ? y + 5 + height - barvgutter / 2 : bars[0][i].y - 10, label); + if (rotate) { + L.rotate(90); + // If we rotated it, we need to move it as well. Still have to use the width + // to get the "length" of the label, divided it in two and shift down. + L.translate(0, (L.getBBox().width / 2)); + } + var bb = L.getBBox(); +// if (bb.x - 7 < l) { + if (bb.x - (this.getBBox().width) < l) { + L.remove(); + } else { + this.labels.push(L); + l = bb.x + (rotate ? bb.height : bb.width); + } + } + } + } + return this; + }; + chart.hover = function (fin, fout) { + covers2.hide(); + covers.show(); + covers.mouseover(fin).mouseout(fout); + return this; + }; + chart.hoverColumn = function (fin, fout) { + covers.hide(); + covers2.show(); + fout = fout || function () {}; + covers2.mouseover(fin).mouseout(fout); + return this; + }; + chart.click = function (f) { + covers2.hide(); + covers.show(); + covers.click(f); + return this; + }; + chart.each = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers.length; i--;) { + f.call(covers[i]); + } + return this; + }; + chart.eachColumn = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers2.length; i--;) { + f.call(covers2[i]); + } + return this; + }; + chart.clickColumn = function (f) { + covers.hide(); + covers2.show(); + covers2.click(f); + return this; + }; + chart.push(bars, covers, covers2); + chart.bars = bars; + chart.covers = covers; + return chart; +}; +Raphael.fn.g.hbarchart = function (x, y, width, height, values, opts) { + opts = opts || {}; + var type = {round: "round", sharp: "sharp", soft: "soft"}[opts.type] || "square", + gutter = parseFloat(opts.gutter || "20%"), + chart = this.set(), + bars = this.set(), + covers = this.set(), + covers2 = this.set(), + total = Math.max.apply(Math, values), + stacktotal = [], + paper = this, + multi = 0, + colors = opts.colors || this.g.colors, + len = values.length; + if (this.raphael.is(values[0], "array")) { + total = []; + multi = len; + len = 0; + for (var i = values.length; i--;) { + bars.push(this.set()); + total.push(Math.max.apply(Math, values[i])); + len = Math.max(len, values[i].length); + } + if (opts.stacked) { + for (var i = len; i--;) { + var tot = 0; + for (var j = values.length; j--;) { + tot +=+ values[j][i] || 0; + } + stacktotal.push(tot); + } + } + for (var i = values.length; i--;) { + if (values[i].length < len) { + for (var j = len; j--;) { + values[i].push(0); + } + } + } + total = Math.max.apply(Math, opts.stacked ? stacktotal : total); + } + + total = (opts.to) || total; + var barheight = Math.floor(height / (len * (100 + gutter) + gutter) * 100), + bargutter = Math.floor(barheight * gutter / 100), + stack = [], + Y = y + bargutter, + X = (width - 1) / total; + !opts.stacked && (barheight /= multi || 1); + for (var i = 0; i < len; i++) { + stack = []; + for (var j = 0; j < (multi || 1); j++) { + var val = multi ? values[j][i] : values[i], + bar = this.g.finger(x, Y + barheight / 2, Math.round(val * X), barheight - 1, false, type).attr({stroke: "none", fill: colors[multi ? j : i]}); + if (multi) { + bars[j].push(bar); + } else { + bars.push(bar); + } + bar.x = x + Math.round(val * X); + bar.y = Y + barheight / 2; + bar.w = Math.round(val * X); + bar.h = barheight; + bar.value = +val; + if (!opts.stacked) { + Y += barheight; + } else { + stack.push(bar); + } + } + if (opts.stacked) { + var cvr = this.rect(x, stack[0].y - stack[0].h / 2, width, barheight).attr(this.g.shim); + covers2.push(cvr); + cvr.bars = this.set(); + var size = 0; + for (var s = stack.length; s--;) { + stack[s].toFront(); + } + for (var s = 0, ss = stack.length; s < ss; s++) { + var bar = stack[s], + cover, + val = Math.round((size + bar.value) * X), + path = this.g.finger(x, bar.y, val, barheight - 1, false, type, 1); + cvr.bars.push(bar); + size && bar.attr({path: path}); + bar.w = val; + bar.x = x + val; + covers.push(cover = this.rect(x + size * X, bar.y - bar.h / 2, bar.value * X, barheight).attr(this.g.shim)); + cover.bar = bar; + size += bar.value; + } + Y += barheight; + } + Y += bargutter; + } + covers2.toFront(); + Y = y + bargutter; + if (!opts.stacked) { + for (var i = 0; i < len; i++) { + for (var j = 0; j < (multi || 1); j++) { + var cover = this.rect(x, Y, width, barheight).attr(this.g.shim); + covers.push(cover); + cover.bar = multi ? bars[j][i] : bars[i]; + cover.value = cover.bar.value; + Y += barheight; + } + Y += bargutter; + } + } + chart.label = function (labels, isRight) { + labels = labels || []; + this.labels = paper.set(); + for (var i = 0; i < len; i++) { + for (var j = 0; j < multi; j++) { + var label = paper.g.labelise(multi ? labels[j] && labels[j][i] : labels[i], multi ? values[j][i] : values[i], total); + var X = isRight ? bars[i * (multi || 1) + j].x - barheight / 2 + 3 : x + 5, + A = isRight ? "end" : "start", + L; + this.labels.push(L = paper.g.text(X, bars[i * (multi || 1) + j].y, label).attr({"text-anchor": A}).insertBefore(covers[0])); + if (L.getBBox().x < x + 5) { + L.attr({x: x + 5, "text-anchor": "start"}); + } else { + bars[i * (multi || 1) + j].label = L; + } + } + } + return this; + }; + chart.hover = function (fin, fout) { + covers2.hide(); + covers.show(); + fout = fout || function () {}; + covers.mouseover(fin).mouseout(fout); + return this; + }; + chart.hoverColumn = function (fin, fout) { + covers.hide(); + covers2.show(); + fout = fout || function () {}; + covers2.mouseover(fin).mouseout(fout); + return this; + }; + chart.each = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers.length; i--;) { + f.call(covers[i]); + } + return this; + }; + chart.eachColumn = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers2.length; i--;) { + f.call(covers2[i]); + } + return this; + }; + chart.click = function (f) { + covers2.hide(); + covers.show(); + covers.click(f); + return this; + }; + chart.clickColumn = function (f) { + covers.hide(); + covers2.show(); + covers2.click(f); + return this; + }; + chart.push(bars, covers, covers2); + chart.bars = bars; + chart.covers = covers; + return chart; +}; +/*! + * g.Raphael 0.4.1 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael.fn.g.dotchart = function (x, y, width, height, valuesx, valuesy, size, opts) { + function drawAxis(ax) { + +ax[0] && (ax[0] = paper.g.axis(x + gutter, y + gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 2, opts.axisxlabels || null, opts.axisxtype || "t")); + +ax[1] && (ax[1] = paper.g.axis(x + width - gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 3, opts.axisylabels || null, opts.axisytype || "t")); + +ax[2] && (ax[2] = paper.g.axis(x + gutter, y + height - gutter + maxR, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 0, opts.axisxlabels || null, opts.axisxtype || "t")); + +ax[3] && (ax[3] = paper.g.axis(x + gutter - maxR, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 1, opts.axisylabels || null, opts.axisytype || "t")); + } + opts = opts || {}; + var xdim = this.g.snapEnds(Math.min.apply(Math, valuesx), Math.max.apply(Math, valuesx), valuesx.length - 1), + minx = xdim.from, + maxx = xdim.to, + gutter = opts.gutter || 10, + ydim = this.g.snapEnds(Math.min.apply(Math, valuesy), Math.max.apply(Math, valuesy), valuesy.length - 1), + miny = ydim.from, + maxy = ydim.to, + len = Math.max(valuesx.length, valuesy.length, size.length), + symbol = this.g.markers[opts.symbol] || "disc", + res = this.set(), + series = this.set(), + max = opts.max || 100, + top = Math.max.apply(Math, size), + R = [], + paper = this, + k = Math.sqrt(top / Math.PI) * 2 / max; + + for (var i = 0; i < len; i++) { + R[i] = Math.min(Math.sqrt(size[i] / Math.PI) * 2 / k, max); + } + gutter = Math.max.apply(Math, R.concat(gutter)); + var axis = this.set(), + maxR = Math.max.apply(Math, R); + if (opts.axis) { + var ax = (opts.axis + "").split(/[,\s]+/); + drawAxis(ax); + var g = [], b = []; + for (var i = 0, ii = ax.length; i < ii; i++) { + var bb = ax[i].all ? ax[i].all.getBBox()[["height", "width"][i % 2]] : 0; + g[i] = bb + gutter; + b[i] = bb; + } + gutter = Math.max.apply(Math, g.concat(gutter)); + for (var i = 0, ii = ax.length; i < ii; i++) if (ax[i].all) { + ax[i].remove(); + ax[i] = 1; + } + drawAxis(ax); + for (var i = 0, ii = ax.length; i < ii; i++) if (ax[i].all) { + axis.push(ax[i].all); + } + res.axis = axis; + } + var kx = (width - gutter * 2) / ((maxx - minx) || 1), + ky = (height - gutter * 2) / ((maxy - miny) || 1); + for (var i = 0, ii = valuesy.length; i < ii; i++) { + var sym = this.raphael.is(symbol, "array") ? symbol[i] : symbol, + X = x + gutter + (valuesx[i] - minx) * kx, + Y = y + height - gutter - (valuesy[i] - miny) * ky; + sym && R[i] && series.push(this.g[sym](X, Y, R[i]).attr({fill: opts.heat ? this.g.colorValue(R[i], maxR) : Raphael.fn.g.colors[0], "fill-opacity": opts.opacity ? R[i] / max : 1, stroke: "none"})); + } + var covers = this.set(); + for (var i = 0, ii = valuesy.length; i < ii; i++) { + var X = x + gutter + (valuesx[i] - minx) * kx, + Y = y + height - gutter - (valuesy[i] - miny) * ky; + covers.push(this.circle(X, Y, maxR).attr(this.g.shim)); + opts.href && opts.href[i] && covers[i].attr({href: opts.href[i]}); + covers[i].r = +R[i].toFixed(3); + covers[i].x = +X.toFixed(3); + covers[i].y = +Y.toFixed(3); + covers[i].X = valuesx[i]; + covers[i].Y = valuesy[i]; + covers[i].value = size[i] || 0; + covers[i].dot = series[i]; + } + res.covers = covers; + res.series = series; + res.push(series, axis, covers); + res.hover = function (fin, fout) { + covers.mouseover(fin).mouseout(fout); + return this; + }; + res.click = function (f) { + covers.click(f); + return this; + }; + res.each = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers.length; i--;) { + f.call(covers[i]); + } + return this; + }; + res.href = function (map) { + var cover; + for (var i = covers.length; i--;) { + cover = covers[i]; + if (cover.X == map.x && cover.Y == map.y && cover.value == map.value) { + cover.attr({href: map.href}); + } + } + }; + return res; +}; +/*! + * g.Raphael 0.4.2 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael.fn.g.linechart = function (x, y, width, height, valuesx, valuesy, opts) { + function shrink(values, dim) { + var k = values.length / dim, + j = 0, + l = k, + sum = 0, + res = []; + while (j < values.length) { + l--; + if (l < 0) { + sum += values[j] * (1 + l); + res.push(sum / k); + sum = values[j++] * -l; + l += k; + } else { + sum += values[j++]; + } + } + return res; + } + function getAnchors(p1x, p1y, p2x, p2y, p3x, p3y) { + var l1 = (p2x - p1x) / 2, + l2 = (p3x - p2x) / 2, + a = Math.atan((p2x - p1x) / Math.abs(p2y - p1y)), + b = Math.atan((p3x - p2x) / Math.abs(p2y - p3y)); + a = p1y < p2y ? Math.PI - a : a; + b = p3y < p2y ? Math.PI - b : b; + var alpha = Math.PI / 2 - ((a + b) % (Math.PI * 2)) / 2, + dx1 = l1 * Math.sin(alpha + a), + dy1 = l1 * Math.cos(alpha + a), + dx2 = l2 * Math.sin(alpha + b), + dy2 = l2 * Math.cos(alpha + b); + return { + x1: p2x - dx1, + y1: p2y + dy1, + x2: p2x + dx2, + y2: p2y + dy2 + }; + } + opts = opts || {}; + if (!this.raphael.is(valuesx[0], "array")) { + valuesx = [valuesx]; + } + if (!this.raphael.is(valuesy[0], "array")) { + valuesy = [valuesy]; + } + var gutter = opts.gutter || 10, + len = Math.max(valuesx[0].length, valuesy[0].length), + symbol = opts.symbol || "", + colors = opts.colors || Raphael.fn.g.colors, + that = this, + columns = null, + dots = null, + chart = this.set(), + path = []; + + for (var i = 0, ii = valuesy.length; i < ii; i++) { + len = Math.max(len, valuesy[i].length); + } + var shades = this.set(); + for (i = 0, ii = valuesy.length; i < ii; i++) { + if (opts.shade) { + shades.push(this.path().attr({stroke: "none", fill: colors[i], opacity: opts.nostroke ? 1 : .3})); + } + if (valuesy[i].length > width - 2 * gutter) { + valuesy[i] = shrink(valuesy[i], width - 2 * gutter); + len = width - 2 * gutter; + } + if (valuesx[i] && valuesx[i].length > width - 2 * gutter) { + valuesx[i] = shrink(valuesx[i], width - 2 * gutter); + } + } + var allx = Array.prototype.concat.apply([], valuesx), + ally = Array.prototype.concat.apply([], valuesy), + xdim = this.g.snapEnds(Math.min.apply(Math, allx), Math.max.apply(Math, allx), valuesx[0].length - 1); + if(opts.clip) { + var minx = opts.minx || xdim.from, + maxx = opts.maxx || xdim.to, + ydim = this.g.snapEnds(Math.min.apply(Math, ally), Math.max.apply(Math, ally), valuesy[0].length - 1), + miny = opts.miny || ydim.from, + maxy = opts.maxy || ydim.to; + } else { + var minx = opts.minx && Math.min(opts.minx, xdim.from) || xdim.from, + maxx = opts.maxx && Math.max(opts.maxx, xdimt.to) || xdim.to, + ydim = this.g.snapEnds(Math.min.apply(Math, ally), Math.max.apply(Math, ally), valuesy[0].length - 1), + miny = opts.miny && Math.min(opts.miny, ydim.from) || ydim.from, + maxy = opts.maxy && Math.max(opts.maxy, ydim.to) || ydim.to; + } + kx = (width - gutter * 2) / ((maxx - minx) || 1), + ky = (height - gutter * 2) / ((maxy - miny) || 1); + + var lines = this.set(), + symbols = this.set(), + line; + for (i = 0, ii = valuesy.length; i < ii; i++) { + if (!opts.nostroke) { + lines.push(line = this.path().attr({ + stroke: colors[i], + "stroke-width": opts.width || 2, + "stroke-linejoin": "round", + "stroke-linecap": "round", + "stroke-dasharray": opts.dash || "" + })); + } + var sym = this.raphael.is(symbol, "array") ? symbol[i] : symbol, + symset = this.set(); + path = []; + for (var j = 0, jj = valuesy[i].length; j < jj; j++) { + var X = x + gutter + ((valuesx[i] || valuesx[0])[j] - minx) * kx, + Y = y + height - gutter - (valuesy[i][j] - miny) * ky; + (Raphael.is(sym, "array") ? sym[j] : sym) && symset.push(this.g[Raphael.fn.g.markers[this.raphael.is(sym, "array") ? sym[j] : sym]](X, Y, (opts.width || 2) * 3).attr({fill: colors[i], stroke: "none"})); + if (opts.smooth) { + if (j && j != jj - 1) { + var X0 = x + gutter + ((valuesx[i] || valuesx[0])[j - 1] - minx) * kx, + Y0 = y + height - gutter - (valuesy[i][j - 1] - miny) * ky, + X2 = x + gutter + ((valuesx[i] || valuesx[0])[j + 1] - minx) * kx, + Y2 = y + height - gutter - (valuesy[i][j + 1] - miny) * ky; + var a = getAnchors(X0, Y0, X, Y, X2, Y2); + path = path.concat([a.x1, a.y1, X, Y, a.x2, a.y2]); + } + if (!j) { + path = ["M", X, Y, "C", X, Y]; + } + } else { + path = path.concat([j ? "L" : "M", X, Y]); + } + } + if (opts.smooth) { + path = path.concat([X, Y, X, Y]); + } + symbols.push(symset); + if (opts.shade) { + shades[i].attr({path: path.concat(["L", X, y + height - gutter, "L", x + gutter + ((valuesx[i] || valuesx[0])[0] - minx) * kx, y + height - gutter, "z"]).join(",")}); + } + !opts.nostroke && line.attr({path: path.join(","), 'clip-rect': [x + gutter, y + gutter, width - 2 * gutter, height - 2 * gutter].join(",")}); + } + + function createColumns(f) { + // unite Xs together + var Xs = []; + for (var i = 0, ii = valuesx.length; i < ii; i++) { + Xs = Xs.concat(valuesx[i]); + } + Xs.sort(function(a,b) { return a - b; }); + // remove duplicates + var Xs2 = [], + xs = []; + for (i = 0, ii = Xs.length; i < ii; i++) { + Xs[i] != Xs[i - 1] && Xs2.push(Xs[i]) && xs.push(x + gutter + (Xs[i] - minx) * kx); + } + Xs = Xs2; + ii = Xs.length; + var cvrs = f || that.set(); + for (i = 0; i < ii; i++) { + var X = xs[i] - (xs[i] - (xs[i - 1] || x)) / 2, + w = ((xs[i + 1] || x + width) - xs[i]) / 2 + (xs[i] - (xs[i - 1] || x)) / 2, + C; + f ? (C = {}) : cvrs.push(C = that.rect(X - 1, y, Math.max(w + 1, 1), height).attr({stroke: "none", fill: "#000", opacity: 0})); + C.values = []; + C.symbols = that.set(); + C.y = []; + C.x = xs[i]; + C.axis = Xs[i]; + for (var j = 0, jj = valuesy.length; j < jj; j++) { + Xs2 = valuesx[j] || valuesx[0]; + for (var k = 0, kk = Xs2.length; k < kk; k++) { + if (Xs2[k] == Xs[i]) { + C.values.push(valuesy[j][k]); + C.y.push(y + height - gutter - (valuesy[j][k] - miny) * ky); + C.symbols.push(chart.symbols[j][k]); + } + } + } + f && f.call(C); + } + !f && (columns = cvrs); + } + function createDots(f) { + var cvrs = f || that.set(), + C; + for (var i = 0, ii = valuesy.length; i < ii; i++) { + for (var j = 0, jj = valuesy[i].length; j < jj; j++) { + var X = x + gutter + ((valuesx[i] || valuesx[0])[j] - minx) * kx, + nearX = x + gutter + ((valuesx[i] || valuesx[0])[j ? j - 1 : 1] - minx) * kx, + Y = y + height - gutter - (valuesy[i][j] - miny) * ky; + f ? (C = {}) : cvrs.push(C = that.circle(X, Y, Math.abs(nearX - X) / 2).attr({stroke: "none", fill: "#000", opacity: 0})); + C.x = X; + C.y = Y; + C.value = valuesy[i][j]; + C.line = chart.lines[i]; + C.shade = chart.shades[i]; + C.symbol = chart.symbols[i][j]; + C.symbols = chart.symbols[i]; + C.axis = (valuesx[i] || valuesx[0])[j]; + f && f.call(C); + } + } + !f && (dots = cvrs); + } + + var axis = this.set(); + if (opts.axis) { + var ax = (opts.axis + "").split(/[,\s]+/); + +ax[0] && axis.push(this.g.axis(x + gutter, y + gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 2, opts.axisxlabels || null, opts.axisxtype || "t")); + +ax[1] && axis.push(this.g.axis(x + width - gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 3, opts.axisylabels || null, opts.axisytype || "t")); + +ax[2] && axis.push(this.g.axis(x + gutter, y + height - gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 0, opts.axisxlabels || null, opts.axisxtype || "t")); + +ax[3] && axis.push(this.g.axis(x + gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 1, opts.axisylabels || null, opts.axisytype || "t")); + } + + chart.push(lines, shades, symbols, axis, columns, dots); + chart.lines = lines; + chart.shades = shades; + chart.symbols = symbols; + chart.axis = axis; + chart.hoverColumn = function (fin, fout) { + !columns && createColumns(); + columns.mouseover(fin).mouseout(fout); + return this; + }; + chart.clickColumn = function (f) { + !columns && createColumns(); + columns.click(f); + return this; + }; + chart.hrefColumn = function (cols) { + var hrefs = that.raphael.is(arguments[0], "array") ? arguments[0] : arguments; + if (!(arguments.length - 1) && typeof cols == "object") { + for (var x in cols) { + for (var i = 0, ii = columns.length; i < ii; i++) if (columns[i].axis == x) { + columns[i].attr("href", cols[x]); + } + } + } + !columns && createColumns(); + for (i = 0, ii = hrefs.length; i < ii; i++) { + columns[i] && columns[i].attr("href", hrefs[i]); + } + return this; + }; + chart.hover = function (fin, fout) { + !dots && createDots(); + dots.mouseover(fin).mouseout(fout); + return this; + }; + chart.click = function (f) { + !dots && createDots(); + dots.click(f); + return this; + }; + chart.each = function (f) { + createDots(f); + return this; + }; + chart.eachColumn = function (f) { + createColumns(f); + return this; + }; + return chart; +}; +/*! + * g.Raphael 0.4.1 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael.fn.g.piechart = function (cx, cy, r, values, opts) { + opts = opts || {}; + var paper = this, + sectors = [], + covers = this.set(), + chart = this.set(), + series = this.set(), + order = [], + len = values.length, + angle = 0, + total = 0, + others = 0, + cut = 9, + defcut = true; + + var sum = 0; + for (var i = 0; i < len; i++) + sum += values[i]; + var single = false; + var single_index = -1; + for (var i = 0; i < len; i++) + if (sum == values[i]) { + single = true; + single_index = i; + break; + } + if (len == 1 || single == true) { + for(var i = 0; i < len; i++) { + var radius = 0.1; + if (i == single_index) { + radius = r; + } + series.push(this.circle(cx, cy, radius).attr({fill: opts.colors && opts.colors[i] || this.g.colors[i], stroke: opts.stroke || "#fff", "stroke-width": opts.strokewidth == null ? 1 : opts.strokewidth})); + covers.push(this.circle(cx, cy, radius).attr({href: opts.href ? opts.href[i] : null}).attr(this.g.shim)); + values[i] = {value: values[i], order: i, valueOf: function () { return this.value; }}; + series[i].middle = {x: cx, y: cy}; + series[i].mangle = 180; + } + total = values[single_index]; + } else { + function sector(cx, cy, r, startAngle, endAngle, fill) { + var rad = Math.PI / 180, + x1 = cx + r * Math.cos(-startAngle * rad), + x2 = cx + r * Math.cos(-endAngle * rad), + xm = cx + r / 2 * Math.cos(-(startAngle + (endAngle - startAngle) / 2) * rad), + y1 = cy + r * Math.sin(-startAngle * rad), + y2 = cy + r * Math.sin(-endAngle * rad), + ym = cy + r / 2 * Math.sin(-(startAngle + (endAngle - startAngle) / 2) * rad), + res = ["M", cx, cy, "L", x1, y1, "A", r, r, 0, +(Math.abs(endAngle - startAngle) > 180), 1, x2, y2, "z"]; + res.middle = {x: xm, y: ym}; + return res; + } + for (var i = 0; i < len; i++) { + total += values[i]; + values[i] = {value: values[i], order: i, valueOf: function () { return this.value; }}; + } + values.sort(function (a, b) { + return b.value - a.value; + }); + for (i = 0; i < len; i++) { + if (defcut && values[i] * 360 / total <= 1.5) { + cut = i; + defcut = false; + } + if (i > cut) { + defcut = false; + values[cut].value += values[i]; + values[cut].others = true; + others = values[cut].value; + } + } + len = Math.min(cut + 1, values.length); + others && values.splice(len) && (values[cut].others = true); + for (i = 0; i < len; i++) { + var valueOrder = values[i].order; + var mangle = angle - 360 * values[i] / total / 2; + if (!i) { + angle = 90 - mangle; + mangle = angle - 360 * values[i] / total / 2; + } + if (opts.init) { + var ipath = sector(cx, cy, 1, angle, angle - 360 * values[i] / total).join(","); + } + var path = sector(cx, cy, r, angle, angle -= 360 * values[i] / total); + var p = this.path(opts.init ? ipath : path).attr({fill: opts.colors && opts.colors[valueOrder] || this.g.colors[valueOrder] || "#666", stroke: opts.stroke || "#fff", "stroke-width": (opts.strokewidth == null ? 1 : opts.strokewidth), "stroke-linejoin": "round"}); + p.value = values[i]; + p.middle = path.middle; + p.mangle = mangle; + sectors.push(p); + series.push(p); + opts.init && p.animate({path: path.join(",")}, (+opts.init - 1) || 1000, ">"); + } + for (i = 0; i < len; i++) { + p = paper.path(sectors[i].attr("path")).attr(this.g.shim); + var valueOrder = values[i].order; + opts.href && opts.href[valueOrder] && p.attr({href: opts.href[valueOrder]}); + //p.attr = function () {}; // this breaks translate! + covers.push(p); + } + } + + chart.hover = function (fin, fout) { + fout = fout || function () {}; + var that = this; + for (var i = 0; i < len; i++) { + (function (sector, cover, j) { + var o = { + sector: sector, + cover: cover, + cx: cx, + cy: cy, + mx: sector.middle.x, + my: sector.middle.y, + mangle: sector.mangle, + r: r, + value: values[j], + total: total, + label: that.labels && that.labels[j] + }; + cover.mouseover(function () { + fin.call(o); + }).mouseout(function () { + fout.call(o); + }); + })(series[i], covers[i], i); + } + return this; + }; + // x: where label could be put + // y: where label could be put + // value: value to show + // total: total number to count % + chart.each = function (f) { + var that = this; + for (var i = 0; i < len; i++) { + (function (sector, cover, j) { + var o = { + sector: sector, + cover: cover, + cx: cx, + cy: cy, + x: sector.middle.x, + y: sector.middle.y, + mangle: sector.mangle, + r: r, + value: values[j], + total: total, + label: that.labels && that.labels[j] + }; + f.call(o); + })(series[i], covers[i], i); + } + return this; + }; + chart.click = function (f) { + var that = this; + for (var i = 0; i < len; i++) { + (function (sector, cover, j) { + var o = { + sector: sector, + cover: cover, + cx: cx, + cy: cy, + mx: sector.middle.x, + my: sector.middle.y, + mangle: sector.mangle, + r: r, + value: values[j], + total: total, + label: that.labels && that.labels[j] + }; + cover.click(function () { f.call(o); }); + })(series[i], covers[i], i); + } + return this; + }; + chart.inject = function (element) { + element.insertBefore(covers[0]); + }; + var legend = function (labels, otherslabel, mark, dir) { + var x = cx + r + r / 5, + y = cy, + h = y + 10; + labels = labels || []; + dir = (dir && dir.toLowerCase && dir.toLowerCase()) || "east"; + mark = paper.g.markers[mark && mark.toLowerCase()] || "disc"; + chart.labels = paper.set(); + for (var i = 0; i < len; i++) { + var clr = series[i].attr("fill"), + j = values[i].order, + txt; + values[i].others && (labels[j] = otherslabel || "Others"); + labels[j] = paper.g.labelise(labels[j], values[i], total); + chart.labels.push(paper.set()); + chart.labels[i].push(paper.g[mark](x + 5, h, 5).attr({fill: clr, stroke: "none"})); + chart.labels[i].push(txt = paper.text(x + 20, h, labels[j] || values[j]).attr(paper.g.txtattr).attr({fill: opts.legendcolor || "#000", "text-anchor": "start"})); + covers[i].label = chart.labels[i]; + h += txt.getBBox().height * 1.2; + } + var bb = chart.labels.getBBox(), + tr = { + east: [0, -bb.height / 2], + west: [-bb.width - 2 * r - 20, -bb.height / 2], + north: [-r - bb.width / 2, -r - bb.height - 10], + south: [-r - bb.width / 2, r + 10] + }[dir]; + chart.labels.translate.apply(chart.labels, tr); + chart.push(chart.labels); + }; + if (opts.legend) { + legend(opts.legend, opts.legendothers, opts.legendmark, opts.legendpos); + } + chart.push(series, covers); + chart.series = series; + chart.covers = covers; + + var w = paper.width, + h = paper.height, + bb = chart.getBBox(), + tr = [(w - bb.width)/2 - bb.x, (h - bb.height)/2 - bb.y]; + cx += tr[0]; + cy += tr[1]; + chart.translate.apply(chart, tr); + return chart; +}; + +/*! + * date-range-parser.js + * Contributed to the Apache Software Foundation by: + * Ben Birch - Aconex + * fork me at https://github.com/mobz/date-range-parser + +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. + +*/ + +(function() { + + var drp = window.dateRangeParser = {}; + + drp.defaultRange = 1000 * 60 * 60 * 24; + + drp.now = null; // set a different value for now than the time at function invocation + + drp.parse = function(v) { + try { + var r = drp._parse(v); + r.end && r.end--; // remove 1 millisecond from the final end range + } catch(e) { + r = null; + } + return r; + }; + + drp.print = function(t, p) { + var format = ["", "-", "-", " ", ":", ":", "."]; + var da = makeArray(t); + var str = ""; + for(var i = 0; i <= p; i++) { + str += format[i] + (da[i] < 10 ? "0" : "") + da[i]; + } + return str; + }; + + (function() { + drp._relTokens = {}; + + var values = { + "yr" : 365*24*60*60*1000, + "mon" : 31*24*60*60*1000, + "day" : 24*60*60*1000, + "hr" : 60*60*1000, + "min" : 60*1000, + "sec" : 1000 + }; + + var alias_lu = { + "yr" : "y,yr,yrs,year,years", + "mon" : "mo,mon,mos,mons,month,months", + "day" : "d,dy,dys,day,days", + "hr" : "h,hr,hrs,hour,hours", + "min" : "m,min,mins,minute,minutes", + "sec" : "s,sec,secs,second,seconds" + }; + + for(var key in alias_lu) { + if(alias_lu.hasOwnProperty(key)) { + var aliases = alias_lu[key].split(","); + for(var i = 0; i < aliases.length; i++) { + drp._relTokens[aliases[i]] = values[key]; + } + } + } + })(); + + function makeArray(d) { + var da = new Date(d); + return [ da.getUTCFullYear(), da.getUTCMonth()+1, da.getUTCDate(), da.getUTCHours(), da.getUTCMinutes(), da.getUTCSeconds(), da.getUTCMilliseconds() ]; + } + + function fromArray(a) { + var d = [].concat(a); d[1]--; + return Date.UTC.apply(null, d); + } + + drp._parse = function parse(v) { + var now = this.now || new Date().getTime(); + + function precArray(d, p, offset) { + var tn = makeArray(d); + tn[p] += offset || 0; + for(var i = p+1; i < 7; i++) { + tn[i] = i < 3 ? 1 : 0; + } + return tn; + } + function makePrecRange(dt, p, r) { + var ret = { }; + ret.start = fromArray(dt); + dt[p] += r || 1; + ret.end = fromArray(dt); + return ret; + } + function procTerm(term) { + var m = term.replace(/\s/g, "").toLowerCase().match(/^([a-z ]+)$|^([ 0-9:-]+)$|^(\d+[a-z]+)$/); + if(m[1]) { // matches ([a-z ]+) + function dra(p, o, r) { + var dt = precArray(now, p, o); + if(r) { + dt[2] -= new Date(fromArray(dt)).getUTCDay(); + } + return makePrecRange(dt, p, r); + } + switch( m[1]) { + case "now" : return { start: now, end: now, now: now }; + case "today" : return dra( 2, 0 ); + case "thisweek" : return dra( 2, 0, 7 ); + case "thismonth" : return dra( 1, 0 ); + case "thisyear" : return dra( 0, 0 ); + case "yesterday" : return dra( 2, -1 ); + case "lastweek" : return dra( 2, -7, 7 ); + case "lastmonth" : return dra( 1, -1 ); + case "lastyear" : return dra( 0, -1 ); + case "tomorrow" : return dra( 2, 1 ); + case "nextweek" : return dra( 2, 7, 7 ); + case "nextmonth" : return dra( 1, 1 ); + case "nextyear" : return dra(0, 1 ); + } + throw "unknown token " + m[1]; + } else if(m[2]) { // matches ([ 0-9:-]+) + dn = makeArray(now); + var dt = m[2].match(/^(?:(\d{4})(?:\-(\d\d))?(?:\-(\d\d))?)? ?(?:(\d{1,2})(?:\:(\d\d)(?:\:(\d\d))?)?)?$/); + dt.shift(); + for(var p = 0, z = false, i = 0; i < 7; i++) { + if(dt[i]) { + dn[i] = parseInt(dt[i], 10); + p = i; + z = true; + } else { + if(z) + dn[i] = i < 3 ? 1 : 0; + } + } + return makePrecRange(dn, p); + } else if(m[3]) { // matches (\d+[a-z]{1,4}) + var dr = m[3].match(/(\d+)\s*([a-z]+)/i); + var n = parseInt(dr[1], 10); + return { rel: n * drp._relTokens[dr[2]] }; + } + throw "unknown term " + term; + } + + if(!v) { + return { start: null, end: null }; + } + var terms = v.split(/\s*([^<>]*[^<>-])?\s*(->|<>|<)?\s*([^<>]+)?\s*/); + + var term1 = terms[1] ? procTerm(terms[1]) : null; + var op = terms[2] || ""; + var term2 = terms[3] ? procTerm(terms[3]) : null; + + if(op === "<" || op === "->" ) { + if(term1 && !term2) { + return { start: term1.start, end: null }; + } else if(!term1 && term2) { + return { start: null, end: term2.end }; + } else { + if(term2.rel) { + return { start: term1.start, end: term1.end + term2.rel }; + } else if(term1.rel) { + return { start: term2.start - term1.rel, end: term2.end }; + } else { + return { start: term1.start, end: term2.end }; + } + } + } else if(op === "<>") { + if(!term2) { + return { start: term1.start - drp.defaultRange, end: term1.end + drp.defaultRange } + } else { + if(! ("rel" in term2)) throw "second term did not hav a range"; + return { start: term1.start - term2.rel, end: term1.end + term2.rel }; + } + } else { + if(term1.rel) { + return { start: now - term1.rel, end: now + term1.rel }; + } else if(term1.now) { + return { start: term1.now - drp.defaultRange, end: term1.now + drp.defaultRange }; + } else { + return { start: term1.start, end: term1.end }; + } + } + throw "could not process value " + v; + }; +})();
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/elasticsearch-head.sublime-project b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/elasticsearch-head.sublime-project new file mode 100644 index 000000000..16bb2d88b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/elasticsearch-head.sublime-project @@ -0,0 +1,9 @@ +{ + "folders": + [ + { + "path": ".", + "folder_exclude_patterns": [ "node_modules", "_site" ] + } + ] +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/grunt_fileSets.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/grunt_fileSets.js new file mode 100644 index 000000000..2ac1ae092 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/grunt_fileSets.js @@ -0,0 +1,102 @@ +exports.vendorJs = [ + 'src/vendor/jquery/jquery.js', + 'src/vendor/joey/joey.js', + 'src/vendor/nohtml/jquery-nohtml.js', + 'src/vendor/graphael/g.raphael.standalone.js', + 'src/vendor/dateRangeParser/date-range-parser.js' +]; + +exports.vendorCss = [ + 'src/vendor/font-awesome/css/font-awesome.css' +]; + +exports.srcJs = [ + 'src/app/base/boot.js', + + 'src/app/ux/class.js', + 'src/app/ux/templates/templates.js', + 'src/app/ux/observable.js', + 'src/app/ux/singleton.js', + 'src/app/ux/dragdrop.js', + 'src/app/ux/fieldCollection.js', + + 'src/app/data/model/model.js', + 'src/app/data/dataSourceInterface.js', + 'src/app/data/resultDataSourceInterface.js', + 'src/app/data/metaData.js', + 'src/app/data/metaDataFactory.js', + 'src/app/data/query.js', + 'src/app/data/queryDataSourceInterface.js', + 'src/app/data/boolQuery.js', + + 'src/app/services/preferences/preferences.js', + 'src/app/services/cluster/cluster.js', + 'src/app/services/clusterState/clusterState.js', + + 'src/app/ui/abstractWidget/abstractWidget.js', + 'src/app/ui/abstractField/abstractField.js', + 'src/app/ui/textField/textField.js', + 'src/app/ui/checkField/checkField.js', + 'src/app/ui/button/button.js', + 'src/app/ui/menuButton/menuButton.js', + 'src/app/ui/splitButton/splitButton.js', + 'src/app/ui/refreshButton/refreshButton.js', + 'src/app/ui/toolbar/toolbar.js', + 'src/app/ui/abstractPanel/abstractPanel.js', + 'src/app/ui/draggablePanel/draggablePanel.js', + 'src/app/ui/infoPanel/infoPanel.js', + 'src/app/ui/dialogPanel/dialogPanel.js', + 'src/app/ui/menuPanel/menuPanel.js', + 'src/app/ui/selectMenuPanel/selectMenuPanel.js', + 'src/app/ui/table/table.js', + 'src/app/ui/csvTable/csvTable.js', + 'src/app/ui/jsonPretty/jsonPretty.js', + 'src/app/ui/panelForm/panelForm.js', + 'src/app/ui/helpPanel/helpPanel.js', + 'src/app/ui/jsonPanel/jsonPanel.js', + 'src/app/ui/sidebarSection/sidebarSection.js', + 'src/app/ui/resultTable/resultTable.js', + 'src/app/ui/queryFilter/queryFilter.js', + 'src/app/ui/page/page.js', + 'src/app/ui/browser/browser.js', + 'src/app/ui/anyRequest/anyRequest.js', + 'src/app/ui/nodesView/nodesView.js', + 'src/app/ui/clusterOverview/clusterOverview.js', + 'src/app/ui/dateHistogram/dateHistogram.js', + 'src/app/ui/clusterConnect/clusterConnect.js', + 'src/app/ui/structuredQuery/structuredQuery.js', + 'src/app/ui/filterBrowser/filterBrowser.js', + 'src/app/ui/indexSelector/indexSelector.js', + 'src/app/ui/header/header.js', + 'src/app/ui/indexOverview/indexOverview.js', + + 'src/app/app.js' +]; + +exports.srcCss = [ + 'src/app/ux/table.css', + 'src/app/ui/abstractField/abstractField.css', + 'src/app/ui/button/button.css', + 'src/app/ui/menuButton/menuButton.css', + 'src/app/ui/splitButton/splitButton.css', + 'src/app/ui/toolbar/toolbar.css', + 'src/app/ui/abstractPanel/abstractPanel.css', + 'src/app/ui/infoPanel/infoPanel.css', + 'src/app/ui/menuPanel/menuPanel.css', + 'src/app/ui/selectMenuPanel/selectMenuPanel.css', + 'src/app/ui/table/table.css', + 'src/app/ui/jsonPretty/jsonPretty.css', + 'src/app/ui/jsonPanel/jsonPanel.css', + 'src/app/ui/panelForm/panelForm.css', + 'src/app/ui/sidebarSection/sidebarSection.css', + 'src/app/ui/queryFilter/queryFilter.css', + 'src/app/ui/browser/browser.css', + 'src/app/ui/anyRequest/anyRequest.css', + 'src/app/ui/nodesView/nodesView.css', + 'src/app/ui/clusterOverview/clusterOverview.css', + 'src/app/ui/clusterConnect/clusterConnect.css', + 'src/app/ui/structuredQuery/structuredQuery.css', + 'src/app/ui/filterBrowser/filterBrowser.css', + 'src/app/ui/header/header.css', + 'src/app/app.css' +]; diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/index.html b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/index.html new file mode 100644 index 000000000..8b5c3ee9d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/index.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> + +<html> + <head> + <meta charset="UTF-8"> + <title>elasticsearch-head</title> + <link rel="stylesheet" href="_site/base/reset.css"> + <link rel="stylesheet" href="_site/vendor.css"> + <link rel="stylesheet" href="_site/app.css"> + <script src="_site/i18n.js" data-baseDir="_site/lang" data-langs="en,fr,pt,zh,tr"></script> + <script src="_site/vendor.js"></script> + <script src="_site/app.js"></script> + <script> + window.onload = function() { + if(location.href.contains("/_plugin/")) { + var base_uri = location.href.replace(/_plugin\/.*/, ''); + } + var args = location.search.substring(1).split("&").reduce(function(r, p) { + r[decodeURIComponent(p.split("=")[0])] = decodeURIComponent(p.split("=")[1]); return r; + }, {}); + new app.App("body", { + id: "es", + base_uri: args["base_uri"] || base_uri, + auth_user : args["auth_user"] || "", + auth_password : args["auth_password"], + dashboard: args["dashboard"] + }); + }; + </script> + <link rel="icon" href="base/favicon.png" type="image/png"> + </head> + <body></body> +</html> diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/package.json b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/package.json new file mode 100644 index 000000000..4aefb7a11 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/package.json @@ -0,0 +1,31 @@ +{ + "name": "elasticsearch-head", + "version": "0.0.0", + "description": "Front end for an elasticsearch cluster", + "main": "_site/index.html", + "directories": { + "test": "test" + }, + "scripts": { + "test": "grunt jasmine" + }, + "repository": { + "type": "git", + "url": "https://github.com/mobz/elasticsearch-head.git" + }, + "author": "", + "license": "Apache2", + "gitHead": "0c2ac0b5723b493e4454baa7398f386ecb829412", + "readmeFilename": "README.textile", + "devDependencies": { + "grunt": "0.4.5", + "grunt-contrib-concat": "0.4.0", + "grunt-contrib-watch": "0.5.1", + "grunt-contrib-connect": "0.3.0", + "grunt-contrib-copy": "0.5.0", + "grunt-contrib-clean": "0.5.0", + "grunt-contrib-jasmine": "0.6.4", + "karma": "0.12.16", + "grunt-karma": "0.8.3" + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/plugin-descriptor.properties b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/plugin-descriptor.properties new file mode 100644 index 000000000..37a90649c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/plugin-descriptor.properties @@ -0,0 +1,4 @@ +description=head - A web front end for an elastic search cluster +version=master +site=true +name=head diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/app.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/app.css new file mode 100644 index 000000000..08e2dcf95 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/app.css @@ -0,0 +1,39 @@ +.uiApp-header { + background: #eee; + position: fixed; + width: 100%; + z-index: 9; +} + +.uiApp-header H1 { + margin: -2px 0 -4px 0; + float: left; + padding-right: 25px; +} + +.uiApp-headerMenu { + border-bottom: 1px solid #bbb; + padding: 0px 3px; + height: 22px; +} + +.uiApp-headerMenu .active { + background: white; + border-bottom-color: white; +} + +.uiApp-headerMenuItem { + border: 1px solid #bbb; + padding: 4px 8px 1px ; + margin: 2px 1px 0; + height: 14px; + cursor: pointer; +} + +.uiApp-body { + padding: 51px 0px 0px 0px; +} + +.uiApp-headerNewMenuItem { + color: blue; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/app.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/app.js new file mode 100644 index 000000000..036e97f50 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/app.js @@ -0,0 +1,132 @@ +(function( app, i18n ) { + + var ui = app.ns("ui"); + var services = app.ns("services"); + + app.App = ui.AbstractWidget.extend({ + defaults: { + base_uri: null + }, + init: function(parent) { + this._super(); + this.prefs = services.Preferences.instance(); + this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200"; + if( this.base_uri.charAt( this.base_uri.length - 1 ) !== "/" ) { + // XHR request fails if the URL is not ending with a "/" + this.base_uri += "/"; + } + if( this.config.auth_user ) { + var credentials = window.btoa( this.config.auth_user + ":" + this.config.auth_password ); + $.ajaxSetup({ + headers: { + "Authorization": "Basic " + credentials + } + }); + } + this.cluster = new services.Cluster({ base_uri: this.base_uri }); + this._clusterState = new services.ClusterState({ + cluster: this.cluster + }); + + this._header = new ui.Header({ cluster: this.cluster, clusterState: this._clusterState }); + this.$body = $.joey( this._body_template() ); + this.el = $.joey(this._main_template()); + this.attach( parent ); + this.instances = {}; + this.el.find(".uiApp-headerMenuItem:first").click(); + if( this.config.dashboard ) { + if( this.config.dashboard === "cluster" ) { + var page = this.instances["ClusterOverview"]; + page._refreshButton.set( 5000 ); + } + } + }, + + navigateTo: function( type, config, ev ) { + if( ev.target.classList.contains( "uiApp-headerNewMenuItem" ) ) { + this.showNew( type, config, ev ); + } else { + var ref = type + "0"; + if(! this.instances[ ref ]) { + this.createPage( type, 0, config ); + } + this.show( ref, ev ); + } + }, + + createPage: function( type, id, config ) { + var page = this.instances[ type + id ] = new ui[ type ]( config ); + this.$body.append( page ); + return page; + }, + + show: function( ref, ev ) { + $( ev.target ).closest("DIV.uiApp-headerMenuItem").addClass("active").siblings().removeClass("active"); + for(var p in this.instances) { + this.instances[p][ p === ref ? "show" : "hide" ](); + } + }, + + showNew: function( type, config, jEv ) { + var ref, page, $tab, + type_index = 0; + + while ( ! page ) { + ref = type + ( ++type_index ); + if (! ( ref in this.instances ) ) { + page = this.createPage( type, type_index, config ); + } + } + + // Add the tab and its click handlers + $tab = $.joey({ + tag: "DIV", + cls: "uiApp-headerMenuItem pull-left", + text: i18n.text("Nav." + type ) + " " + type_index, + onclick: function( ev ) { this.show( ref, ev ); }.bind(this), + children: [ + { tag: "A", text: " [-]", onclick: function (ev) { + $tab.remove(); + page.remove(); + delete this.instances[ ref ]; + }.bind(this) } + ] + }); + + $('.uiApp-headerMenu').append( $tab ); + $tab.trigger("click"); + }, + + _openAnyRequest_handler: function(ev) { this.navigateTo("AnyRequest", { cluster: this.cluster }, ev ); }, + _openStructuredQuery_handler: function(ev) { this.navigateTo("StructuredQuery", { cluster: this.cluster }, ev ); }, + _openBrowser_handler: function(ev) { this.navigateTo("Browser", { cluster: this.cluster }, ev ); }, + _openClusterOverview_handler: function(ev) { this.navigateTo("ClusterOverview", { cluster: this.cluster, clusterState: this._clusterState }, ev ); }, + _openIndexOverview_handler: function(ev) { this.navigateTo("IndexOverview", { cluster: this.cluster, clusterState: this._clusterState }, ev ); }, + + _body_template: function() { return ( + { tag: "DIV", id: this.id("body"), cls: "uiApp-body" } + ); }, + + _main_template: function() { + return { tag: "DIV", cls: "uiApp", children: [ + { tag: "DIV", id: this.id("header"), cls: "uiApp-header", children: [ + this._header, + { tag: "DIV", cls: "uiApp-headerMenu", children: [ + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.Overview"), onclick: this._openClusterOverview_handler }, + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.Indices"), onclick: this._openIndexOverview_handler }, + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.Browser"), onclick: this._openBrowser_handler }, + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.StructuredQuery"), onclick: this._openStructuredQuery_handler, children: [ + { tag: "A", cls: "uiApp-headerNewMenuItem ", text: ' [+]' } + ] }, + { tag: "DIV", cls: "uiApp-headerMenuItem pull-left", text: i18n.text("Nav.AnyRequest"), onclick: this._openAnyRequest_handler, children: [ + { tag: "A", cls: "uiApp-headerNewMenuItem ", text: ' [+]' } + ] }, + ]} + ]}, + this.$body + ]}; + } + + }); + +})( this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/boot.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/boot.js new file mode 100644 index 000000000..4dd0c0d05 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/boot.js @@ -0,0 +1,241 @@ +(function() { + + var window = this, + $ = jQuery; + + function ns( namespace ) { + return (namespace || "").split(".").reduce( function( space, name ) { + return space[ name ] || ( space[ name ] = { ns: ns } ); + }, this ); + } + + var app = ns("app"); + + var acx = ns("acx"); + + /** + * object iterator, returns an array with one element for each property of the object + * @function + */ + acx.eachMap = function(obj, fn, thisp) { + var ret = []; + for(var n in obj) { + ret.push(fn.call(thisp, n, obj[n], obj)); + } + return ret; + }; + + /** + * augments the first argument with the properties of the second and subsequent arguments + * like {@link $.extend} except that existing properties are not overwritten + */ + acx.augment = function() { + var args = Array.prototype.slice.call(arguments), + src = (args.length === 1) ? this : args.shift(), + augf = function(n, v) { + if(! (n in src)) { + src[n] = v; + } + }; + for(var i = 0; i < args.length; i++) { + $.each(args[i], augf); + } + return src; + }; + + /** + * tests whether the argument is an array + * @function + */ + acx.isArray = $.isArray; + + /** + * tests whether the argument is an object + * @function + */ + acx.isObject = function (value) { + return Object.prototype.toString.call(value) == "[object Object]"; + }; + + /** + * tests whether the argument is a function + * @function + */ + acx.isFunction = $.isFunction; + + /** + * tests whether the argument is a date + * @function + */ + acx.isDate = function (value) { + return Object.prototype.toString.call(value) == "[object Date]"; + }; + + /** + * tests whether the argument is a regexp + * @function + */ + acx.isRegExp = function (value) { + return Object.prototype.toString.call(value) == "[object RegExp]"; + }; + + /** + * tests whether the value is blank or empty + * @function + */ + acx.isEmpty = function (value, allowBlank) { + return value === null || value === undefined || ((acx.isArray(value) && !value.length)) || (!allowBlank ? value === '' : false); + }; + + /** + * data type for performing chainable geometry calculations<br> + * can be initialised x,y | {x, y} | {left, top} + */ + acx.vector = function(x, y) { + return new acx.vector.prototype.Init(x, y); + }; + + acx.vector.prototype = { + Init : function(x, y) { + x = x || 0; + this.y = isFinite(x.y) ? x.y : (isFinite(x.top) ? x.top : (isFinite(y) ? y : 0)); + this.x = isFinite(x.x) ? x.x : (isFinite(x.left) ? x.left : (isFinite(x) ? x : 0)); + }, + + add : function(i, j) { + var d = acx.vector(i, j); + return new this.Init(this.x + d.x, this.y + d.y); + }, + + sub : function(i, j) { + var d = acx.vector(i, j); + return new this.Init(this.x - d.x, this.y - d.y); + }, + + addX : function(i) { + return new this.Init(this.x + i, this.y); + }, + + addY : function(j) { + return new this.Init(this.x, this.y + j); + }, + + mod : function(fn) { // runs a function against the x and y values + return new this.Init({x: fn.call(this, this.x, "x"), y: fn.call(this, this.y, "y")}); + }, + + /** returns true if this is within a rectangle formed by the points p and q */ + within : function(p, q) { + return ( this.x >= ((p.x < q.x) ? p.x : q.x) && this.x <= ((p.x > q.x) ? p.x : q.x) && + this.y >= ((p.y < q.y) ? p.y : q.y) && this.y <= ((p.y > q.y) ? p.y : q.y) ); + }, + + asOffset : function() { + return { top: this.y, left: this.x }; + }, + + asSize : function() { + return { height: this.y, width: this.x }; + } + }; + + acx.vector.prototype.Init.prototype = acx.vector.prototype; + + /** + * short cut functions for working with vectors and jquery. + * Each function returns the equivalent jquery value in a two dimentional vector + */ + $.fn.vSize = function() { return acx.vector(this.width(), this.height()); }; + $.fn.vOuterSize = function(margin) { return acx.vector(this.outerWidth(margin), this.outerHeight(margin)); }; + $.fn.vScroll = function() { return acx.vector(this.scrollLeft(), this.scrollTop()); }; + $.fn.vOffset = function() { return acx.vector(this.offset()); }; + $.fn.vPosition = function() { return acx.vector(this.position()); }; + $.Event.prototype.vMouse = function() { return acx.vector(this.pageX, this.pageY); }; + + /** + * object extensions (ecma5 compatible) + */ + acx.augment(Object, { + keys: function(obj) { + var ret = []; + for(var n in obj) if(Object.prototype.hasOwnProperty.call(obj, n)) ret.push(n); + return ret; + } + }); + + /** + * Array prototype extensions + */ + acx.augment(Array.prototype, { + 'contains' : function(needle) { + return this.indexOf(needle) !== -1; + }, + + // returns a new array consisting of all the members that are in both arrays + 'intersection' : function(b) { + var ret = []; + for(var i = 0; i < this.length; i++) { + if(b.contains(this[i])) { + ret.push(this[i]); + } + } + return ret; + }, + + 'remove' : function(value) { + var i = this.indexOf(value); + if(i !== -1) { + this.splice(i, 1); + } + } + }); + + /** + * String prototype extensions + */ + acx.augment(String.prototype, { + 'contains' : function(needle) { + return this.indexOf(needle) !== -1; + }, + + 'equalsIgnoreCase' : function(match) { + return this.toLowerCase() === match.toLowerCase(); + }, + + 'escapeHtml' : function() { + return this.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); + }, + + 'escapeJS' : function() { + var meta = {'"':'\\"', '\\':'\\\\', '/':'\\/', '\b':'\\b', '\f':'\\f', '\n':'\\n', '\r':'\\r', '\t':'\\t'}, + xfrm = function(c) { return meta[c] || "\\u" + c.charCodeAt(0).toString(16).zeroPad(4); }; + return this.replace(new RegExp('(["\\\\\x00-\x1f\x7f-\uffff])', 'g'), xfrm); + }, + + 'escapeRegExp' : function() { + var ret = "", esc = "\\^$*+?.()=|{,}[]-"; + for ( var i = 0; i < this.length; i++) { + ret += (esc.contains(this.charAt(i)) ? "\\" : "") + this.charAt(i); + } + return ret; + }, + + 'zeroPad' : function(len) { + return ("0000000000" + this).substring(this.length - len + 10); + } + }); + + $.fn.forEach = Array.prototype.forEach; + + // joey / jquery integration + $.joey = function( obj ) { + return $( window.joey( obj ) ); + }; + + window.joey.plugins.push( function( obj ) { + if( obj instanceof jQuery ) { + return obj[0]; + } + }); + +})(); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/favicon.png b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/favicon.png Binary files differnew file mode 100644 index 000000000..f433ec6d0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/favicon.png diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/loading.gif b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/loading.gif Binary files differnew file mode 100644 index 000000000..f001e23f7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/loading.gif diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/reset.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/reset.css new file mode 100644 index 000000000..29a5f1b69 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/base/reset.css @@ -0,0 +1,44 @@ +BODY { + font-family: Verdana, sans-serif; + font-size: 73%; + padding: 0; + margin: 0; +} + +INPUT, SELECT, TEXTAREA { + border: 1px solid #cecece; + padding: 1px 3px; + background: white; +} + +SELECT { + padding: 0; +} + +.saf SELECT { + margin-top: 0; + margin-bottom: 0; +} + +TEXTAREA, CODE { + font-family: monospace; + font-size: 13px; +} + +BUTTON::-moz-focus-inner { + border: none; +} + +.pull-left { + float: left; +} + +.pull-right { + float: right; +} + +.loading { + background-image: url(loading.gif); + background-repeat: no-repeat; + text-indent: 20px; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/boolQuery.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/boolQuery.js new file mode 100644 index 000000000..782d49074 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/boolQuery.js @@ -0,0 +1,75 @@ +(function( app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.BoolQuery = ux.Observable.extend({ + defaults: { + size: 50 // size of pages to return + }, + init: function() { + this._super(); + this.refuid = 0; + this.refmap = {}; + this.search = { + query: { bool: { must: [], must_not: [], should: [] } }, + from: 0, + size: this.config.size, + sort: [], + aggs: {} + }; + this.defaultClause = this.addClause(); + }, + setSize: function(size) { + this.search.size = parseInt( size, 10 ); + }, + setPage: function(page) { + this.search.from = this.config.size * (page - 1) + 1; + }, + addClause: function(value, field, op, bool) { + bool = bool || "should"; + op = op || "match_all"; + field = field || "_all"; + var clause = this._setClause(value, field, op, bool); + var uqid = "q-" + this.refuid++; + this.refmap[uqid] = { clause: clause, value: value, field: field, op: op, bool: bool }; + if(this.search.query.bool.must.length + this.search.query.bool.should.length > 1) { + this.removeClause(this.defaultClause); + } + this.fire("queryChanged", this, { uqid: uqid, search: this.search} ); + return uqid; // returns reference to inner query object to allow fast updating + }, + removeClause: function(uqid) { + var ref = this.refmap[uqid], + bool = this.search.query.bool[ref.bool]; + var clauseIdx = bool.indexOf(ref.clause); + // Check that this clause hasn't already been removed + if (clauseIdx >=0) { + bool.splice(clauseIdx, 1); + } + }, + _setClause: function(value, field, op, bool) { + var clause = {}, query = {}; + if(op === "match_all") { + } else if(op === "query_string") { + query["default_field"] = field; + query["query"] = value; + } else if(op === "missing") { + op = "constant_score" + var missing = {}, filter = {}; + missing["field"] = field; + filter["missing"] = missing + query["filter"] = filter; + } else { + query[field.substring(field.indexOf(".")+1)] = value; + } + clause[op] = query; + this.search.query.bool[bool].push(clause); + return clause; + }, + getData: function() { + return JSON.stringify(this.search); + } + }); + +})( this.app );
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/dataSourceInterface.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/dataSourceInterface.js new file mode 100644 index 000000000..001d53225 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/dataSourceInterface.js @@ -0,0 +1,24 @@ +(function( app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.DataSourceInterface = ux.Observable.extend({ + /* + properties + meta = { total: 0 }, + headers = [ { name: "" } ], + data = [ { column: value, column: value } ], + sort = { column: "name", dir: "desc" } + events + data: function( DataSourceInterface ) + */ + _getSummary: function(res) { + this.summary = i18n.text("TableResults.Summary", res._shards.successful, res._shards.total, res.hits.total, (res.took / 1000).toFixed(3)); + }, + _getMeta: function(res) { + this.meta = { total: res.hits.total, shards: res._shards, tool: res.took }; + } + }); + +})( this.app );
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/metaData.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/metaData.js new file mode 100644 index 000000000..bb420fdfc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/metaData.js @@ -0,0 +1,172 @@ +(function( app ) { + + /* + notes on elasticsearch terminology used in this project + + indices[index] contains one or more + types[type] contains one or more + documents contain one or more + paths[path] + each path contains one element of data + each path maps to one field + + eg PUT, "/twitter/tweet/1" + { + user: "mobz", + date: "2011-01-01", + message: "You know, for browsing elasticsearch", + name: { + first: "Ben", + last: "Birch" + } + } + + creates + 1 index: twitter + this is the collection of index data + 1 type: tweet + this is the type of document (kind of like a table in sql) + 1 document: /twitter/tweet/1 + this is an actual document in the index ( kind of like a row in sql) + 5 paths: [ ["user"], ["date"], ["message"], ["name","first"], ["name","last"] ] + since documents can be heirarchical this maps a path from a document root to a piece of data + 5 fields: [ "user", "date", "message", "first", "last" ] + this is an indexed 'column' of data. fields are not heirarchical + + the relationship between a path and a field is called a mapping. mappings also contain a wealth of information about how es indexes the field + + notes + 1) a path is stored as an array, the dpath is <index> . <type> . path.join("."), + which can be considered the canonical reference for a mapping + 2) confusingly, es uses the term index for both the collection of indexed data, and the individually indexed fields + so the term index_name is the same as field_name in this sense. + + */ + + var data = app.ns("data"); + var ux = app.ns("ux"); + + var coretype_map = { + "string" : "string", + "keyword" : "string", + "text" : "string", + "byte" : "number", + "short" : "number", + "long" : "number", + "integer" : "number", + "float" : "number", + "double" : "number", + "ip" : "number", + "date" : "date", + "boolean" : "boolean", + "binary" : "binary", + "multi_field" : "multi_field" + }; + + var default_property_map = { + "string" : { "store" : "no", "index" : "analysed" }, + "number" : { "store" : "no", "precision_steps" : 4 }, + "date" : { "store" : "no", "format" : "dateOptionalTime", "index": "yes", "precision_steps": 4 }, + "boolean" : { "store" : "no", "index": "yes" }, + "binary" : { }, + "multi_field" : { } + }; + + // parses metatdata from a cluster, into a bunch of useful data structures + data.MetaData = ux.Observable.extend({ + defaults: { + state: null // (required) response from a /_cluster/state request + }, + init: function() { + this._super(); + this.refresh(this.config.state); + }, + getIndices: function(alias) { + return alias ? this.aliases[alias] : this.indicesList; + }, + // returns an array of strings containing all types that are in all of the indices passed in, or all types + getTypes: function(indices) { + var indices = indices || [], types = []; + this.typesList.forEach(function(type) { + for(var i = 0; i < indices.length; i++) { + if(! this.indices[indices[i]].types.contains(type)) + return; + } + types.push(type); + }, this); + return types; + }, + refresh: function(state) { + // currently metadata expects all like named fields to have the same type, even when from different types and indices + var aliases = this.aliases = {}; + var indices = this.indices = {}; + var types = this.types = {}; + var fields = this.fields = {}; + var paths = this.paths = {}; + + function createField( mapping, index, type, path, name ) { + var dpath = [ index, type ].concat( path ).join( "." ); + var field_name = mapping.index_name || path.join( "." ); + var field = paths[ dpath ] = fields[ field_name ] || $.extend({ + field_name : field_name, + core_type : coretype_map[ mapping.type ], + dpaths : [] + }, default_property_map[ coretype_map[ mapping.type ] ], mapping ); + + if (field.type === "multi_field" && typeof field.fields !== "undefined") { + for (var subField in field.fields) { + field.fields[ subField ] = createField( field.fields[ subField ], index, type, path.concat( subField ), name + "." + subField ); + } + } + if (fields.dpaths) { + field.dpaths.push(dpath); + } + return field; + } + function getFields(properties, type, index, listeners) { + (function procPath(prop, path) { + for (var n in prop) { + if ("properties" in prop[n]) { + procPath( prop[ n ].properties, path.concat( n ) ); + } else { + var field = createField(prop[n], index, type, path.concat(n), n); + listeners.forEach( function( listener ) { + listener[ field.field_name ] = field; + } ); + } + } + })(properties, []); + } + for (var index in state.metadata.indices) { + indices[index] = { + types : [], fields : {}, paths : {}, parents : {} + }; + indices[index].aliases = state.metadata.indices[index].aliases; + indices[index].aliases.forEach(function(alias) { + (aliases[alias] || (aliases[alias] = [])).push(index); + }); + var mapping = state.metadata.indices[index].mappings; + for (var type in mapping) { + indices[index].types.push(type); + if ( type in types) { + types[type].indices.push(index); + } else { + types[type] = { + indices : [index], fields : {} + }; + } + getFields(mapping[type].properties, type, index, [fields, types[type].fields, indices[index].fields]); + if ( typeof mapping[type]._parent !== "undefined") { + indices[index].parents[type] = mapping[type]._parent.type; + } + } + } + + this.aliasesList = Object.keys(aliases); + this.indicesList = Object.keys(indices); + this.typesList = Object.keys(types); + this.fieldsList = Object.keys(fields); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/metaDataFactory.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/metaDataFactory.js new file mode 100644 index 000000000..694546e0e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/metaDataFactory.js @@ -0,0 +1,19 @@ +(function( app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.MetaDataFactory = ux.Observable.extend({ + defaults: { + cluster: null // (required) an app.services.Cluster + }, + init: function() { + this._super(); + this.config.cluster.get("_cluster/state", function(data) { + this.metaData = new app.data.MetaData({state: data}); + this.fire("ready", this.metaData, { originalData: data }); // TODO originalData needed for legacy ui.FilterBrowser + }.bind(this)); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/model/model.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/model/model.js new file mode 100644 index 000000000..a35e53b9b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/model/model.js @@ -0,0 +1,35 @@ +(function( $, app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.Model = ux.Observable.extend({ + defaults: { + data: null + }, + init: function() { + this.set( this.config.data ); + }, + set: function( key, value ) { + if( arguments.length === 1 ) { + this._data = $.extend( {}, key ); + } else { + key.split(".").reduce(function( ptr, prop, i, props) { + if(i === (props.length - 1) ) { + ptr[prop] = value; + } else { + if( !(prop in ptr) ) { + ptr[ prop ] = {}; + } + return ptr[prop]; + } + }, this._data ); + } + }, + get: function( key ) { + return key.split(".").reduce( function( ptr, prop ) { + return ( ptr && ( prop in ptr ) ) ? ptr[ prop ] : undefined; + }, this._data ); + }, + }); +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/model/modelSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/model/modelSpec.js new file mode 100644 index 000000000..fa9d904e1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/model/modelSpec.js @@ -0,0 +1,74 @@ +describe("app.data.Model", function() { + + var Model = window.app.data.Model; + + it("test setting model does a shallow copy", function() { + var test = {}; + var array = [ 1, 2, 3 ]; + var m = new Model({ + data: { + "foo": "bar", + "test": test, + "array": array + } + }); + expect( m.get("foo") ).toBe("bar"); + expect( m.get("array").length ).toBe( 3 ); + expect( m.get("array")[1] ).toBe( 2 ); + expect( m.get("array") ).toBe( array ); + expect( m.get("test") ).toBe( test ); + }); + + it("should replace model with shallow copy when put with no path", function() { + var m = new Model({ foo: "bar" }); + m.set({ bar: "blat" }); + expect( m.get("foo")).toBe( undefined ); + expect( m.get("bar")).toBe("blat"); + }); + + it("test getting values from deep in a model", function() { + var m = new Model({ + data: { + "foo": { + "bar": { + "baz": { + "quix": "abcdefg" + } + } + } + } + }); + + expect( m.get("foo.bar.baz.quix") ).toBe( "abcdefg" ); + }); + + it("test setting non-existant values creates new values", function() { + var m = new Model({ + data: { + "foo": { + "bar": "abc" + } + } + }); + m.set("foo.bar", "123" ); + m.set("foo.baz", "456" ); + expect( m.get("foo.bar") ).toBe( "123" ); + expect( m.get("foo.baz") ).toBe( "456" ); + }); + + it("test setting values deep in a model", function() { + var m = new Model({ + data: { + "foo": { + "bar": "abc" + } + } + }); + m.set("foo.bar", "123" ); + m.set("foo.baz", "456" ); + m.set("foo.something.else.is.here", "xyz" ); + expect( m.get("foo.something.else.is").here ).toBe( "xyz" ); + expect( m.get("foo.something.else.is.here") ).toBe( "xyz" ); + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/query.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/query.js new file mode 100644 index 000000000..41890b383 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/query.js @@ -0,0 +1,203 @@ +(function( app ) { + + var data = app.ns("data"); + var ux = app.ns("ux"); + + data.Query = ux.Observable.extend({ + defaults: { + cluster: null, // (required) instanceof app.services.Cluster + size: 50 // size of pages to return + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.refuid = 0; + this.refmap = {}; + this.indices = []; + this.types = []; + this.search = { + query: { bool: { must: [], must_not: [], should: [] } }, + from: 0, + size: this.config.size, + sort: [], + aggs: {}, + version: true + }; + this.defaultClause = this.addClause(); + this.history = [ this.getState() ]; + }, + clone: function() { + var q = new data.Query({ cluster: this.cluster }); + q.restoreState(this.getState()); + for(var uqid in q.refmap) { + q.removeClause(uqid); + } + return q; + }, + getState: function() { + return $.extend(true, {}, { search: this.search, indices: this.indices, types: this.types }); + }, + restoreState: function(state) { + state = $.extend(true, {}, state || this.history[this.history.length - 1]); + this.indices = state.indices; + this.types = state.types; + this.search = state.search; + }, + getData: function() { + return JSON.stringify(this.search); + }, + query: function() { + var state = this.getState(); + this.cluster.post( + (this.indices.join(",") || "_all") + "/" + ( this.types.length ? this.types.join(",") + "/" : "") + "_search", + this.getData(), + function(results) { + if(results === null) { + alert(i18n.text("Query.FailAndUndo")); + this.restoreState(); + return; + } + this.history.push(state); + + this.fire("results", this, results); + }.bind(this)); + }, + loadParents: function(res,metadata){ + //create data for mget + var data = { docs :[] }; + var indexToTypeToParentIds = {}; + res.hits.hits.forEach(function(hit) { + if (typeof hit.fields != "undefined"){ + if (typeof hit.fields._parent != "undefined"){ + var parentType = metadata.indices[hit._index].parents[hit._type]; + if (typeof indexToTypeToParentIds[hit._index] == "undefined"){ + indexToTypeToParentIds[hit._index] = new Object(); + } + if (typeof indexToTypeToParentIds[hit._index][hit._type] == "undefined"){ + indexToTypeToParentIds[hit._index][hit._type] = new Object(); + } + if (typeof indexToTypeToParentIds[hit._index][hit._type][hit.fields._parent] == "undefined"){ + indexToTypeToParentIds[hit._index][hit._type][hit.fields._parent] = null; + data.docs.push({ _index:hit._index, _type:parentType, _id:hit.fields._parent}); + } + } + } + }); + + //load parents + var state = this.getState(); + this.cluster.post("_mget",JSON.stringify(data), + function(results) { + if(results === null) { + alert(i18n.text("Query.FailAndUndo")); + this.restoreState(); + return; + } + this.history.push(state); + var indexToTypeToParentIdToHit = new Object(); + results.docs.forEach(function(doc) { + if (typeof indexToTypeToParentIdToHit[doc._index] == "undefined"){ + indexToTypeToParentIdToHit[doc._index] = new Object(); + } + + if (typeof indexToTypeToParentIdToHit[doc._index][doc._type] == "undefined"){ + indexToTypeToParentIdToHit[doc._index][doc._type] = new Object(); + } + + indexToTypeToParentIdToHit[doc._index][doc._type][doc._id] = doc; + }); + + res.hits.hits.forEach(function(hit) { + if (typeof hit.fields != "undefined"){ + if (typeof hit.fields._parent != "undefined"){ + var parentType = metadata.indices[hit._index].parents[hit._type]; + hit._parent = indexToTypeToParentIdToHit[hit._index][parentType][hit.fields._parent]; + } + } + }); + + this.fire("resultsWithParents", this, res); + }.bind(this)); + }, + setPage: function(page) { + this.search.from = this.config.size * (page - 1); + }, + setSort: function(index, desc) { + var sortd = {}; sortd[index] = { reverse: !!desc }; + this.search.sort.unshift( sortd ); + for(var i = 1; i < this.search.sort.length; i++) { + if(Object.keys(this.search.sort[i])[0] === index) { + this.search.sort.splice(i, 1); + break; + } + } + }, + setIndex: function(index, add) { + if(add) { + if(! this.indices.contains(index)) this.indices.push(index); + } else { + this.indices.remove(index); + } + this.fire("setIndex", this, { index: index, add: !!add }); + }, + setType: function(type, add) { + if(add) { + if(! this.types.contains(type)) this.types.push(type); + } else { + this.types.remove(type); + } + this.fire("setType", this, { type: type, add: !!add }); + }, + addClause: function(value, field, op, bool) { + bool = bool || "should"; + op = op || "match_all"; + field = field || "_all"; + var clause = this._setClause(value, field, op, bool); + var uqid = "q-" + this.refuid++; + this.refmap[uqid] = { clause: clause, value: value, field: field, op: op, bool: bool }; + if(this.search.query.bool.must.length + this.search.query.bool.should.length > 1) { + this.removeClause(this.defaultClause); + } + this.fire("queryChanged", this, { uqid: uqid, search: this.search} ); + return uqid; // returns reference to inner query object to allow fast updating + }, + removeClause: function(uqid) { + var ref = this.refmap[uqid], + bool = this.search.query.bool[ref.bool]; + bool.remove(ref.clause); + if(this.search.query.bool.must.length + this.search.query.bool.should.length === 0) { + this.defaultClause = this.addClause(); + } + }, + addAggs: function(aggs) { + var aggsId = "f-" + this.refuid++; + this.search.aggs[aggsId] = aggs; + this.refmap[aggsId] = { aggsId: aggsId, aggs: aggs }; + return aggsId; + }, + removeAggs: function(aggsId) { + delete this.search.aggs[aggsId]; + delete this.refmap[aggsId]; + }, + _setClause: function(value, field, op, bool) { + var clause = {}, query = {}; + if(op === "match_all") { + } else if(op === "query_string") { + query["default_field"] = field; + query["query"] = value; + } else if(op === "missing") { + op = "constant_score" + var missing = {}, filter = {}; + missing["field"] = field; + filter["missing"] = missing + query["filter"] = filter; + } else { + query[field] = value; + } + clause[op] = query; + this.search.query.bool[bool].push(clause); + return clause; + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/queryDataSourceInterface.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/queryDataSourceInterface.js new file mode 100644 index 000000000..3e2b45a15 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/queryDataSourceInterface.js @@ -0,0 +1,87 @@ +(function( app ) { + + var data = app.ns("data"); + + data.QueryDataSourceInterface = data.DataSourceInterface.extend({ + defaults: { + metadata: null, // (required) instanceof app.data.MetaData, the cluster metadata + query: null // (required) instanceof app.data.Query the data source + }, + init: function() { + this._super(); + this.config.query.on("results", this._results_handler.bind(this) ); + this.config.query.on("resultsWithParents", this._load_parents.bind(this) ); + }, + _results_handler: function(query, res) { + this._getSummary(res); + this._getMeta(res); + var sort = query.search.sort[0] || { "_score": { reverse: false }}; + var sortField = Object.keys(sort)[0]; + this.sort = { column: sortField, dir: (sort[sortField].reverse ? "asc" : "desc") }; + this._getData(res, this.config.metadata); + this.fire("data", this); + }, + _load_parents: function(query, res) { + query.loadParents(res, this.config.metadata); + }, + _getData: function(res, metadata) { + var metaColumns = ["_index", "_type", "_id", "_score"]; + var columns = this.columns = [].concat(metaColumns); + + this.data = res.hits.hits.map(function(hit) { + var row = (function(path, spec, row) { + for(var prop in spec) { + if(acx.isObject(spec[prop])) { + arguments.callee(path.concat(prop), spec[prop], row); + } else if(acx.isArray(spec[prop])) { + if(spec[prop].length) { + arguments.callee(path.concat(prop), spec[prop][0], row) + } + } else { + var dpath = path.concat(prop).join("."); + if(metadata.paths[dpath]) { + var field_name = metadata.paths[dpath].field_name; + if(! columns.contains(field_name)) { + columns.push(field_name); + } + row[field_name] = (spec[prop] === null ? "null" : spec[prop] ).toString(); + } else { + // TODO: field not in metadata index + } + } + } + return row; + })([ hit._index, hit._type ], hit._source, {}); + metaColumns.forEach(function(n) { row[n] = hit[n]; }); + row._source = hit; + if (typeof hit._parent!= "undefined") { + (function(prefix, path, spec, row) { + for(var prop in spec) { + if(acx.isObject(spec[prop])) { + arguments.callee(prefix, path.concat(prop), spec[prop], row); + } else if(acx.isArray(spec[prop])) { + if(spec[prop].length) { + arguments.callee(prefix, path.concat(prop), spec[prop][0], row) + } + } else { + var dpath = path.concat(prop).join("."); + if(metadata.paths[dpath]) { + var field_name = metadata.paths[dpath].field_name; + var column_name = prefix+"."+field_name; + if(! columns.contains(column_name)) { + columns.push(column_name); + } + row[column_name] = (spec[prop] === null ? "null" : spec[prop] ).toString(); + } else { + // TODO: field not in metadata index + } + } + } + })(hit._parent._type,[hit._parent._index, hit._parent._type], hit._parent._source, row); + } + return row; + }, this); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/resultDataSourceInterface.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/resultDataSourceInterface.js new file mode 100644 index 000000000..b985b0422 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/data/resultDataSourceInterface.js @@ -0,0 +1,40 @@ +(function( app ) { + + var data = app.ns("data"); + + data.ResultDataSourceInterface = data.DataSourceInterface.extend({ + results: function(res) { + this._getSummary(res); + this._getMeta(res); + this._getData(res); + this.sort = {}; + this.fire("data", this); + }, + _getData: function(res) { + var columns = this.columns = []; + this.data = res.hits.hits.map(function(hit) { + var row = (function(path, spec, row) { + for(var prop in spec) { + if(acx.isObject(spec[prop])) { + arguments.callee(path.concat(prop), spec[prop], row); + } else if(acx.isArray(spec[prop])) { + if(spec[prop].length) { + arguments.callee(path.concat(prop), spec[prop][0], row) + } + } else { + var dpath = path.concat(prop).join("."); + if(! columns.contains(dpath)) { + columns.push(dpath); + } + row[dpath] = (spec[prop] || "null").toString(); + } + } + return row; + })([ hit._type ], hit, {}); + row._source = hit; + return row; + }, this); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/en_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/en_strings.js new file mode 100644 index 000000000..3679dfbbc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/en_strings.js @@ -0,0 +1,177 @@ +i18n.setKeys({ + "General.Elasticsearch": "Elasticsearch", + "General.LoadingAggs": "Loading Aggregations...", + "General.Searching": "Searching...", + "General.Search": "Search", + "General.Help": "Help", + "General.HelpGlyph": "?", + "General.CloseGlyph": "X", + "General.RefreshResults": "Refresh", + "General.ManualRefresh": "Manual Refresh", + "General.RefreshQuickly": "Refresh quickly", + "General.Refresh5seconds": "Refresh every 5 seconds", + "General.Refresh1minute": "Refresh every minute", + "AliasForm.AliasName": "Alias Name", + "AliasForm.NewAliasForIndex": "New Alias for {0}", + "AliasForm.DeleteAliasMessage": "type ''{0}'' to delete {1}. There is no undo", + "AnyRequest.DisplayOptions" : "Display Options", + "AnyRequest.AsGraph" : "Graph Results", + "AnyRequest.AsJson" : "Show Raw JSON", + "AnyRequest.AsTable" : "Show Search Results Table", + "AnyRequest.History" : "History", + "AnyRequest.RepeatRequest" : "Repeat Request", + "AnyRequest.RepeatRequestSelect" : "Repeat request every ", + "AnyRequest.Transformer" : "Result Transformer", + "AnyRequest.Pretty": "Pretty", + "AnyRequest.Query" : "Query", + "AnyRequest.Request": "Request", + "AnyRequest.Requesting": "Requesting...", + "AnyRequest.ValidateJSON": "Validate JSON", + "Browser.Title": "Browser", + "Browser.ResultSourcePanelTitle": "Result Source", + "Command.DELETE": "DELETE", + "Command.SHUTDOWN": "SHUTDOWN", + "Command.DeleteAliasMessage": "Delete Alias?", + "ClusterOverView.IndexName": "Index Name", + "ClusterOverview.NumShards": "Number of Shards", + "ClusterOverview.NumReplicas": "Number of Replicas", + "ClusterOverview.NewIndex": "New Index", + "IndexActionsMenu.Title": "Actions", + "IndexActionsMenu.NewAlias": "New Alias...", + "IndexActionsMenu.Refresh": "Refresh", + "IndexActionsMenu.Flush": "Flush", + "IndexActionsMenu.Optimize": "Optimize...", + "IndexActionsMenu.Snapshot": "Gateway Snapshot", + "IndexActionsMenu.Analyser": "Test Analyser", + "IndexActionsMenu.Open": "Open", + "IndexActionsMenu.Close": "Close", + "IndexActionsMenu.Delete": "Delete...", + "IndexInfoMenu.Title": "Info", + "IndexInfoMenu.Status": "Index Status", + "IndexInfoMenu.Metadata": "Index Metadata", + "IndexCommand.TextToAnalyze": "Text to Analyse", + "IndexCommand.ShutdownMessage": "type ''{0}'' to shutdown {1}. Node can NOT be restarted from this interface", + "IndexOverview.PageTitle": "Indices Overview", + "IndexSelector.NameWithDocs": "{0} ({1} docs)", + "IndexSelector.SearchIndexForDocs": "Search {0} for documents where:", + "FilterBrowser.OutputType": "Output Results: {0}", + "FilterBrowser.OutputSize": "Number of Results: {0}", + "Header.ClusterHealth": "cluster health: {0} ({1} of {2})", + "Header.ClusterNotConnected": "cluster health: not connected", + "Header.Connect": "Connect", + "Nav.AnyRequest": "Any Request", + "Nav.Browser": "Browser", + "Nav.ClusterHealth": "Cluster Health", + "Nav.ClusterState": "Cluster State", + "Nav.ClusterNodes": "Nodes Info", + "Nav.Info": "Info", + "Nav.NodeStats": "Nodes Stats", + "Nav.Overview": "Overview", + "Nav.Indices": "Indices", + "Nav.Plugins": "Plugins", + "Nav.Status": "Indices Stats", + "Nav.Templates": "Templates", + "Nav.StructuredQuery": "Structured Query", + "NodeActionsMenu.Title": "Actions", + "NodeActionsMenu.Shutdown": "Shutdown...", + "NodeInfoMenu.Title": "Info", + "NodeInfoMenu.ClusterNodeInfo": "Cluster Node Info", + "NodeInfoMenu.NodeStats": "Node Stats", + "NodeType.Client": "Client Node", + "NodeType.Coord": "Coordinator", + "NodeType.Master": "Master Node", + "NodeType.Tribe": "Tribe Node", + "NodeType.Worker": "Worker Node", + "NodeType.Unassigned": "Unassigned", + "OptimizeForm.OptimizeIndex": "Optimize {0}", + "OptimizeForm.MaxSegments": "Maximum # Of Segments", + "OptimizeForm.ExpungeDeletes": "Only Expunge Deletes", + "OptimizeForm.FlushAfter": "Flush After Optimize", + "OptimizeForm.WaitForMerge": "Wait For Merge", + "Overview.PageTitle" : "Cluster Overview", + "Output.JSON": "JSON", + "Output.Table": "Table", + "Output.CSV": "CSV", + "Output.ShowSource": "Show query source", + "Preference.SortCluster": "Sort Cluster", + "Sort.ByName": "By Name", + "Sort.ByAddress": "By Address", + "Sort.ByType": "By Type", + "Preference.SortIndices": "Sort Indices", + "SortIndices.Descending": "Descending", + "SortIndices.Ascending": "Ascending", + "Preference.ViewAliases": "View Aliases", + "ViewAliases.Grouped": "Grouped", + "ViewAliases.List": "List", + "ViewAliases.None": "None", + "Overview.IndexFilter": "Index Filter", + "TableResults.Summary": "Searched {0} of {1} shards. {2} hits. {3} seconds", + "QueryFilter.AllIndices": "All Indices", + "QueryFilter.AnyValue": "any", + "QueryFilter-Header-Indices": "Indices", + "QueryFilter-Header-Types": "Types", + "QueryFilter-Header-Fields": "Fields", + "QueryFilter.DateRangeHint.from": "From : {0}", + "QueryFilter.DateRangeHint.to": " To : {0}", + "Query.FailAndUndo": "Query Failed. Undoing last changes", + "StructuredQuery.ShowRawJson": "Show Raw JSON" +}); + +i18n.setKeys({ + "AnyRequest.TransformerHelp" : "\ + <p>The Result Transformer can be used to post process the raw json results from a request into a more useful format.</p>\ + <p>The transformer should contain the body of a javascript function. The return value from the function becomes the new value passed to the json printer</p>\ + <p>Example:<br>\ + <code>return root.hits.hits[0];</code> would traverse a result set to show just the first match<br>\ + <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> would return the total memory used across an entire cluster<br></p>\ + <p>The following functions are available and can be useful processing arrays and objects<br>\ + <ul>\ + <li><i>Object.keys</i>(object) := array</li>\ + <li>array.<i>forEach</i>(function(prop, index))</li>\ + <li>array.<i>map</i>(function(prop, index)) := array</li>\ + <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\ + </ul>\ + <p>When Repeat Request is running, an extra parameter called prev is passed to the transformation function. This allows comparisons, and cumulative graphing</p>\ + <p>Example:<br>\ + <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> would return the load average on the first cluster node over the last minute\ + This could be fed into the Graph to produce a load graph for the node\ + " +}); + +i18n.setKeys({ + "AnyRequest.DisplayOptionsHelp" : "\ + <p>Raw Json: shows complete results of the query and transformation in raw JSON format </p>\ + <p>Graph Results: To produce a graph of your results, use the result transformer to produce an array of values</p>\ + <p>Search Results Table: If your query is a search, you can display the results of the search in a table.</p>\ + " +}); + +i18n.setKeys({ + "QueryFilter.DateRangeHelp" : "\ + <p>Date fields accept a natural language query to produce a From and To date that form a range that the results are queried over.</p>\ + <p>The following formats are supported:</p>\ + <ul>\ + <li><b>Keywords / Key Phrases</b><br>\ + <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\ + searches for dates matching the keyword. <code>last year</code> would search all of last year.</li>\ + <li><b>Ranges</b><br>\ + <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (spaces optional, many synonyms for range qualifiers)<br>\ + Create a search range centered on <code>now</code> extending into the past and future by the amount specified.</li>\ + <li><b>DateTime and Partial DateTime</b><br>\ + <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\ + these formats specify a specific date range. <code>2011</code> would search the whole of 2011, while <code>2011-01-18 12:32:45</code> would only search for results in that 1 second range</li>\ + <li><b>Time and Time Partials</b><br>\ + <code>12<br> 12:32<br> 12:32:45</code><br>\ + these formats search for a particular time during the current day. <code>12:32</code> would search that minute during today</li>\ + <li><b>Date Ranges</b><br>\ + <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\ + A Date Range is created by specifying two dates in any format (Keyword / DateTime / Time) separated by < or -> (both do the same thing). If either end of the date range is missing, it is the same as having no constraint in that direction.</li>\ + <li><b>Date Range using Offset</b><br>\ + <code>2010 -> 1yr<br> 3mins < now</code>\ + Searches the specified date including the range in the direction specified.</li>\ + <li><b>Anchored Ranges</b><br>\ + <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\ + Similar to above except the range is extend in both directions from the anchor date</li>\ + </ul>\ + " +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/fr_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/fr_strings.js new file mode 100644 index 000000000..2cc9bbb0c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/fr_strings.js @@ -0,0 +1,164 @@ +i18n.setKeys({ +// "General.Elasticsearch": "Elasticsearch", + "General.LoadingAggs" : "Chargement des facettes...", + "General.Searching": "Recherche en cours...", + "General.Search": "Recherche", + "General.Help": "Aide", +// "General.HelpGlyph": "?", +// "General.CloseGlyph": "X", + "General.RefreshResults": "Rafraîchir", + "General.ManualRefresh": "Rafraîchissement manuel", + "General.RefreshQuickly": "Rafraîchissement rapide", + "General.Refresh5seconds": "Rafraîchissement toutes les 5 secondes", + "General.Refresh1minute": "Rafraîchissement toutes les minutes", + "AliasForm.AliasName": "Alias", + "AliasForm.NewAliasForIndex": "Nouvel Alias pour {0}", + "AliasForm.DeleteAliasMessage": "Entrez ''{0}'' pour effacer {1}. Attention, action irréversible.", + "AnyRequest.DisplayOptions" : "Options d'affichage", + "AnyRequest.AsGraph" : "En graphe", + "AnyRequest.AsJson" : "En JSON brut", + "AnyRequest.AsTable" : "En tableau", + "AnyRequest.History" : "Historique", + "AnyRequest.RepeatRequest" : "Répétition automatique de la requête", + "AnyRequest.RepeatRequestSelect" : "Répéter la requête toutes les ", + "AnyRequest.Transformer" : "Transformation des résultats", +// "AnyRequest.Pretty": "Pretty", + "AnyRequest.Query" : "Recherche", + "AnyRequest.Request": "Requête", + "AnyRequest.Requesting": "Requête en cours...", + "AnyRequest.ValidateJSON": "Valider le JSON", + "Browser.Title": "Navigateur", + "Browser.ResultSourcePanelTitle": "Résultat au format JSON", + "Command.DELETE": "SUPPRIMER", + "Command.SHUTDOWN": "ETEINDRE", + "Command.DeleteAliasMessage": "Supprimer l'Alias?", + "ClusterOverView.IndexName": "Index", + "ClusterOverview.NumShards": "Nombre de shards", + "ClusterOverview.NumReplicas": "Nombre de replica", + "ClusterOverview.NewIndex": "Nouvel Index", +// "IndexActionsMenu.Title": "Actions", + "IndexActionsMenu.NewAlias": "Nouvel Alias...", + "IndexActionsMenu.Refresh": "Rafraîchir", + "IndexActionsMenu.Flush": "Flusher", + "IndexActionsMenu.Optimize": "Optimiser...", + "IndexActionsMenu.Snapshot": "Dupliquer l'index (Snapshot)", + "IndexActionsMenu.Analyser": "Tester un analyseur", + "IndexActionsMenu.Open": "Ouvrir", + "IndexActionsMenu.Close": "Fermer", + "IndexActionsMenu.Delete": "Effacer...", +// "IndexInfoMenu.Title": "Info", + "IndexInfoMenu.Status": "Etat de l'Index", + "IndexInfoMenu.Metadata": "Métadonnées de l'Index", + "IndexCommand.TextToAnalyze": "Texte à analyser", + "IndexCommand.ShutdownMessage": "Entrez ''{0}'' pour éteindre {1}. Le noeud NE PEUT PAS être redémarré depuis cette interface.", +// "IndexSelector.NameWithDocs": "{0} ({1} docs)", + "IndexSelector.SearchIndexForDocs": "Chercher dans {0} les documents correspondant à", + "FilterBrowser.OutputType": "Format d'affichage des résultats {0}", + "FilterBrowser.OutputSize": "Nombre de Résultats: {0}", + "Header.ClusterHealth": "Santé du cluster: {0} ({1} {2})", + "Header.ClusterNotConnected": "Santé du cluster: non connecté", + "Header.Connect": "Se connecter", + "Nav.AnyRequest": "Autres requêtes", + "Nav.StructuredQuery": "Requêtes structurées", + "Nav.Browser": "Navigateur", + "Nav.ClusterHealth": "Santé du cluster", + "Nav.ClusterState": "Etat du cluster", + "Nav.ClusterNodes": "Noeuds du cluster", +// "Nav.Info": "Info", + "Nav.NodeStats": "Statistiques sur les noeuds", + "Nav.Overview": "Aperçu", + "Nav.Indices": "Index", + "Nav.Plugins": "Plugins", + "Nav.Status": "Etat", + "Nav.Templates": "Templates", + "Nav.StructuredQuery": "Recherche Structurée", +// "NodeActionsMenu.Title": "Actions", + "NodeActionsMenu.Shutdown": "Eteindre...", +// "NodeInfoMenu.Title": "Info", + "NodeInfoMenu.ClusterNodeInfo": "Infos sur le noeud du cluster", + "NodeInfoMenu.NodeStats": "Statistiques du noeud", + "NodeType.Client": "Noeud Client", + "NodeType.Coord": "Coordinateur", + "NodeType.Master": "Noeud Master", + "NodeType.Tribe": "Noeud Tribe", + "NodeType.Worker": "Noeud Worker", + "NodeType.Unassigned": "Non assigné", + "OptimizeForm.OptimizeIndex": "Optimiser {0}", + "OptimizeForm.MaxSegments": "Nombre maximum de segments", + "OptimizeForm.ExpungeDeletes": "Seulement purger les suppressions", + "OptimizeForm.FlushAfter": "Flusher après l'optimisation", + "OptimizeForm.WaitForMerge": "Attendre la fin de la fusion", + "Overview.PageTitle" : "Aperçu du cluster", +// "Output.JSON": "JSON", + "Output.Table": "Tableau", + "Output.ShowSource": "Voir la requête source", + "TableResults.Summary": "Recherche sur {0} des {1} shards. {2} résultats. {3} secondes", + "QueryFilter.AllIndices": "Tous les index", + "QueryFilter.AnyValue": "Tout", + "QueryFilter-Header-Indices": "Index", +// "QueryFilter-Header-Types": "Types", + "QueryFilter-Header-Fields": "Champs", + "QueryFilter.DateRangeHint.from": "De : {0}", + "QueryFilter.DateRangeHint.to": " A : {0}", + "Query.FailAndUndo": "Requête en échec. Annulation des dernières modifications.", + "StructuredQuery.ShowRawJson": "Voir le JSON brut" +}); + +i18n.setKeys({ + "AnyRequest.TransformerHelp" : "\ + <p>Le transformateur de résultats peut être utilisé pour modifier a posteriori les résultats JSON bruts dans un format plus utile.</p>\ + <p>Le transformateur devrait contenir le corps d'une fonction javascript. La valeur de retour de la fonction devient la nouvelle valeur qui sera passée à l'afficheur des documents JSON.</p>\ + <p>Exemple:<br>\ + <code>return root.hits.hits[0];</code> ne renverra que le premier élément de l'ensemble des résultats.<br>\ + <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> retournera la mémoire totale utilisée dans l'ensemble du cluster.<br></p>\ + <p>Les fonctions suivantes sont disponibles et peuvent vous être utiles pour travailler sur les tableaux et les objets:<br>\ + <ul>\ + <li><i>Object.keys</i>(object) := array</li>\ + <li>array.<i>forEach</i>(function(prop, index))</li>\ + <li>array.<i>map</i>(function(prop, index)) := array</li>\ + <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\ + </ul>\ + <p>Lorsque vous activez la répétition automatique de la requête, un paramètre supplémentaire nommé prev est passé à la fonction de transformation. Cela permet les comparaisons et les graphes cumulatifs.</p>\ + <p>Exemple:<br>\ + <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> retournera la charge moyenne du premier noeud du cluster pour la dernière minute écoulée.\ + Cela peut alimenter ensuite le graphe pour produire un graphe de charge du noeud.\ + " +}); + +i18n.setKeys({ + "AnyRequest.DisplayOptionsHelp" : "\ + <p>En JSON brut: affiche les résultats complets de la recherche éventuellement transformée au format JSON brut.</p>\ + <p>En graphe: pour fabriquer un graphe de vos résultats, utilsez la transformation de résultats pour générer un tableau de valeurs.</p>\ + <p>En tableau: si votre requête est une recherche, vous pouvez alors afficher les résultats dans un tableau.</p>\ + " +}); + +i18n.setKeys({ + "QueryFilter.DateRangeHelp" : "\ + <p>Les champs Date acceptent une requête en langage naturel pour produire un écart de date (from/to) correspondant.</p>\ + <p>Les formats suivants sont acceptés :</p>\ + <ul>\ + <li><b>Mots clés</b><br>\ + <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\ + Cherchera pour des dates correspondant au mot clé. <code>last year</code> cherchera sur toute l'année précédente.</li>\ + <li><b>Ecarts</b><br>\ + <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (les espaces sont optionnels et il existe beaucoup de synonymes pour qualifier les écarts)<br>\ + Créé un écart de date basé sur l'heure courante (maintenant) avec plus ou moins l'écart indiqué.</li>\ + <li><b>Dates et Dates partielles</b><br>\ + <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\ + Ces formats indiquent un écart de date spécifique. <code>2011</code> cherchera sur toute l'année 2011, alors que <code>2011-01-18 12:32:45</code> ne cherchera que pour la date précise à la seconde près.</li>\ + <li><b>Heures et heures partielles</b><br>\ + <code>12<br> 12:32<br> 12:32:45</code><br>\ + Ces formats indiquent un espace de temps pour la date du jour. <code>12:32</code> cherchera les éléments d'aujourd'hui à cette minute précise.</li>\ + <li><b>Ecart de Date</b><br>\ + <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\ + Un écart de date est créé en spécifiant deux dates dans n'importe lequel des formats précédents (Mot clé / Dates / Heures) séparées par < ou -> (les deux produisent le même effet). Si la date de fin n'est pas indiquée, alors il n'y aura aucune contrainte de fin.</li>\ + <li><b>Ecart de date avec décalage</b><br>\ + <code>2010 -> 1yr<br> 3mins < now</code>\ + Cherche en incluant un décalage de la date dans la direction indiquée.</li>\ + <li><b>Ecart de date avec bornes</b><br>\ + <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\ + Similaire à ci-dessus excepté que le décalage est appliqué dans les deux sens à partir de la date indiquée.</li>\ + </ul>\ + " +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/pt_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/pt_strings.js new file mode 100644 index 000000000..d4b6abff5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/pt_strings.js @@ -0,0 +1,174 @@ +i18n.setKeys({ + "General.Elasticsearch": "Elasticsearch", + "General.LoadingAggs": "Carregando Facetas...", + "General.Searching": "Buscando...", + "General.Search": "Busca", + "General.Help": "Ajuda", + "General.HelpGlyph": "?", + "General.CloseGlyph": "X", + "General.RefreshResults": "Atualizar", + "General.ManualRefresh": "Atualização Manual", + "General.RefreshQuickly": "Atualização rápida", + "General.Refresh5seconds": "Atualização a cada 5 segundos", + "General.Refresh1minute": "Atualização a cada minuto", + "AliasForm.AliasName": "Apelido", + "AliasForm.NewAliasForIndex": "Novo apelido para {0}", + "AliasForm.DeleteAliasMessage": "digite ''{0}'' para deletar {1}. Não há como voltar atrás", + "AnyRequest.DisplayOptions" : "Mostrar Opções", + "AnyRequest.AsGraph" : "Mostrar como gráfico", + "AnyRequest.AsJson" : "Mostrar JSON bruto", + "AnyRequest.AsTable" : "Mostrar tabela de resultados da consulta", + "AnyRequest.History" : "Histórico", + "AnyRequest.RepeatRequest" : "Refazer requisição", + "AnyRequest.RepeatRequestSelect" : "Repetir requisição a cada ", + "AnyRequest.Transformer" : "Transformador de resultado", + "AnyRequest.Pretty": "Amigável", + "AnyRequest.Query" : "Consulta", + "AnyRequest.Request": "Requisição", + "AnyRequest.Requesting": "Realizando requisição...", + "AnyRequest.ValidateJSON": "Validar JSON", + "Browser.Title": "Navegador", + "Browser.ResultSourcePanelTitle": "Resultado", + "Command.DELETE": "DELETAR", + "Command.SHUTDOWN": "DESLIGAR", + "Command.DeleteAliasMessage": "Remover apelido?", + "ClusterOverView.IndexName": "Nome do índice", + "ClusterOverview.NumShards": "Número de Shards", + "ClusterOverview.NumReplicas": "Número de Réplicas", + "ClusterOverview.NewIndex": "Novo índice", + "IndexActionsMenu.Title": "Ações", + "IndexActionsMenu.NewAlias": "Novo apelido...", + "IndexActionsMenu.Refresh": "Atualizar", + "IndexActionsMenu.Flush": "Flush", + "IndexActionsMenu.Optimize": "Otimizar...", + "IndexActionsMenu.Snapshot": "Snapshot do Gateway", + "IndexActionsMenu.Analyser": "Analizador de teste", + "IndexActionsMenu.Open": "Abrir", + "IndexActionsMenu.Close": "Fechar", + "IndexActionsMenu.Delete": "Deletar...", + "IndexInfoMenu.Title": "Info", + "IndexInfoMenu.Status": "Status do índice", + "IndexInfoMenu.Metadata": "Metadados do índice", + "IndexCommand.TextToAnalyze": "Texto para analizar", + "IndexCommand.ShutdownMessage": "digite ''{0}'' para desligar {1}. Nó NÃO PODE ser reiniciado à partir dessa interface", + "IndexOverview.PageTitle": "Visão geral dos índices", + "IndexSelector.NameWithDocs": "{0} ({1} documentoss)", + "IndexSelector.SearchIndexForDocs": "Busca {0} por documentos onde:", + "FilterBrowser.OutputType": "Resultados: {0}", + "FilterBrowser.OutputSize": "Número de Resultados: {0}", + "Header.ClusterHealth": "saúde do cluster: {0} ({1} {2})", + "Header.ClusterNotConnected": "saúde do cluster: não conectado", + "Header.Connect": "Conectar", + "Nav.AnyRequest": "Qualquer requisição", + "Nav.Browser": "Navegador", + "Nav.ClusterHealth": "Saúde do Cluster", + "Nav.ClusterState": "Estado do Cluster", + "Nav.ClusterNodes": "Nós do Cluster", + "Nav.Info": "Informações", + "Nav.NodeStats": "Estatísticas do nó", + "Nav.Overview": "Visão Geral", + "Nav.Indices": "Índices", + "Nav.Plugins": "Plugins", + "Nav.Status": "Status", + "Nav.Templates": "Modelos", + "Nav.StructuredQuery": "Consulta Estruturada", + "NodeActionsMenu.Title": "Ações", + "NodeActionsMenu.Shutdown": "Desligar...", + "NodeInfoMenu.Title": "Informações", + "NodeInfoMenu.ClusterNodeInfo": "Informações do Nó do Cluster", + "NodeInfoMenu.NodeStats": "Estatísticas do Nó", + "NodeType.Client": "Nó cliente", + "NodeType.Coord": "Coordenador", + "NodeType.Master": "Nó mestre", + "NodeType.Tribe": "Nó tribo", + "NodeType.Worker": "Nó trabalhador", + "NodeType.Unassigned": "Não atribuido", + "OptimizeForm.OptimizeIndex": "Otimizar {0}", + "OptimizeForm.MaxSegments": "# Máximo De Segmentos", + "OptimizeForm.ExpungeDeletes": "Apenas Expurgar Exclusões", + "OptimizeForm.FlushAfter": "Flush após Otimizar", + "OptimizeForm.WaitForMerge": "Esperar Por Merge", + "Overview.PageTitle": "Visão geral do Cluster", + "Output.JSON": "JSON", + "Output.Table": "Tabela", + "Output.CSV": "CSV", + "Output.ShowSource": "Mostrar consulta original", + "Preference.SortCluster": "Ordenar Cluster", + "Sort.ByName": "Por nome", + "Sort.ByAddress": "Por endereço", + "Sort.ByType": "Por tipo", + "Preference.ViewAliases": "Ver Alias", + "ViewAliases.Grouped": "Agrupado", + "ViewAliases.List": "Lista", + "ViewAliases.None": "Nenhum", + "Overview.IndexFilter": "Filtar Índice", + "TableResults.Summary": "Buscado {0} de {1} shards. {2} resultados. {3} segundos", + "QueryFilter.AllIndices": "Todos os Índices", + "QueryFilter.AnyValue": "qualquer", + "QueryFilter-Header-Indices": "Índices", + "QueryFilter-Header-Types": "Tipos", + "QueryFilter-Header-Fields": "Campos", + "QueryFilter.DateRangeHint.from": "De : {0}", + "QueryFilter.DateRangeHint.to": " A : {0}", + "Query.FailAndUndo": "Consulta falhou. Desfazendo últimas alterações", + "StructuredQuery.ShowRawJson": "Mostrar JSON bruto" +}); + +i18n.setKeys({ + "AnyRequest.TransformerHelp" : "\ + <p>O Transformador de Resultados pode ser usado para transformar os resultados de uma consulta de json bruto para um formato mais útil.</p>\ + <p>O transformador deve possuir o corpo de uma função javascript. O retorno da função se torna o novo valor passado para o json printer</p>\ + <p>Exemplo:<br>\ + <code>return root.hits.hits[0];</code> irá alterar a resposta para mostrar apenas o primeiro resultado<br>\ + <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> irá retornar o total de memória utilizada pelo cluster<br></p>\ + <p>As seguintes funções estão disponíveis e podem ser úteis no processamento de vetores e objetos<br>\ + <ul>\ + <li><i>Object.keys</i>(object) := array</li>\ + <li>array.<i>forEach</i>(function(prop, index))</li>\ + <li>array.<i>map</i>(function(prop, index)) := array</li>\ + <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\ + </ul>\ + <p>Durante a execução da opção Refazer Requisição, um parâmetro extra chamado prev é passado para a função de transformação. Isso permite fazer comparações e marcações cumulativas</p>\ + <p>Exemplo:<br>\ + <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> irá retornar a carga média no primeiro nó do cluster no último minuto\ + Essa informação pode ser inserida no Gráfico para fazer um gráfico de carga do nó\ + " +}); + +i18n.setKeys({ + "AnyRequest.DisplayOptionsHelp" : "\ + <p>Json Bruto: Exibe o resultado completo da consulta e da transformação no formato de JSON bruto</p>\ + <p>Gráfico de Resultados: Para gerar um gráfico com seus resultados, utilize o tranformador de resultados para produzir um vetor de valores</p>\ + <p>Tabela de Resultados da Consulta: Se sua consulta for uma busca, você pode exibir seus resultados no formato de uma tabela.</p>\ + " +}); + +i18n.setKeys({ + "QueryFilter.DateRangeHelp" : "\ + <p>Campos do tipo Data aceitam consultas em linguagem natural (em inglês) para produzir um <i>From</i> e um <i>To</i> de modo a formar um intervalo dentro do qual os resultados são filtrados.</p>\ + <p>Os seguintes formatos são suportados:</p>\ + <ul>\ + <li><b>Palavras-chave</b><br>\ + <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\ + buscam por datas de acordo com a palavra-chave. <code>last year</code> irá buscar tudo do último ano.</li>\ + <li><b>Intervalos</b><br>\ + <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (espaços são opcionais, diversos sinônimos para qualificadores de intervalo)<br>\ + Cria um intervalo de busca a partir de agora (<code>now</code>), extendendo este intervalo no passado e no futuro de acordo com intervalo especificado.</li>\ + <li><b>Data/Hora (<i>DateTime</i>) e Data/Hora parcial</b><br>\ + <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\ + esses formatos especificam um intervalo especifico. <code>2011</code> irá buscar todo o ano de 2011, enquanto <code>2011-01-18 12:32:45</code> irá buscar apenas por resultados dentro deste intervalo de 1 segundo</li>\ + <li><b>Tempo (<i>Time</i>) e Tempo parcial</b><br>\ + <code>12<br> 12:32<br> 12:32:45</code><br>\ + esses formatos buscam por um horário específico no dia atual. <code>12:32</code> irá buscar este minuto específico do dia</li>\ + <li><b>Intervalos de Data</b><br>\ + <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\ + Um intervalo de data é criado especificando-se duas datas em qualquer formato (Palavras-chave, Data/Hora ou Tempo) separados por < ou -> (ambos fazem a mesma coisa). Se a data de início ou fim do intervalo não for especificada é a mesma coisa que não impor limites na busca nesta direção.</li>\ + <li><b>Intervalo de Data com Deslocamento</b><br>\ + <code>2010 -> 1yr<br> 3mins < now</code>\ + Busca a data especificada incluindo o intervalo na direção determinada pelo deslocamento</li>\ + <li><b>Intervalos Bidirecionais</b><br>\ + <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\ + Idêntico ao exemplo anterior porém o intervalo é extendido em ambas as direções a partir da data especificada</li>\ + </ul>\ + " +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/tr_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/tr_strings.js new file mode 100644 index 000000000..f61195616 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/tr_strings.js @@ -0,0 +1,177 @@ +i18n.setKeys({
+ "General.Elasticsearch": "Elasticsearch",
+ "General.LoadingAggs": "Gruplar Yükleniyor...",
+ "General.Searching": "Aranıyor...",
+ "General.Search": "Ara",
+ "General.Help": "Yardım",
+ "General.HelpGlyph": "?",
+ "General.CloseGlyph": "X",
+ "General.RefreshResults": "Yenile",
+ "General.ManualRefresh": "Manuel Yenileme",
+ "General.RefreshQuickly": "Hızlı yenile",
+ "General.Refresh5seconds": "5 saniyede bir yenile",
+ "General.Refresh1minute": "Her dakika yenile",
+ "AliasForm.AliasName": "Alternatif İsim",
+ "AliasForm.NewAliasForIndex": "{0} için yeni alternatif isim",
+ "AliasForm.DeleteAliasMessage": "{1} silmek için ''{0}'' . Geriye dönüş yoktur.",
+ "AnyRequest.DisplayOptions" : "Seçenekleri Göster",
+ "AnyRequest.AsGraph" : "Sonuçları Çizdir",
+ "AnyRequest.AsJson" : "JSON formatında göster",
+ "AnyRequest.AsTable" : "Arama sonuçlarını tablo halinde göster",
+ "AnyRequest.History" : "Geçmiş",
+ "AnyRequest.RepeatRequest" : "İsteği Tekrarla",
+ "AnyRequest.RepeatRequestSelect" : "İsteği sürekli tekrarla ",
+ "AnyRequest.Transformer" : "Sonuç Dönüştürücü",
+ "AnyRequest.Pretty": "Düzenli",
+ "AnyRequest.Query" : "Sorgu",
+ "AnyRequest.Request": "Gönder",
+ "AnyRequest.Requesting": "İsteniyor...",
+ "AnyRequest.ValidateJSON": "JSON Doğrula",
+ "Browser.Title": "Browser",
+ "Browser.ResultSourcePanelTitle": "Sonuç Kaynağı",
+ "Command.DELETE": "SİL",
+ "Command.SHUTDOWN": "KAPA",
+ "Command.DeleteAliasMessage": "Alternatif ismi sil?",
+ "ClusterOverView.IndexName": "Indeks İsmi",
+ "ClusterOverview.NumShards": "Sektör Sayısı",
+ "ClusterOverview.NumReplicas": "Yedek Sayısı",
+ "ClusterOverview.NewIndex": "Yeni Indeks",
+ "IndexActionsMenu.Title": "İşlemler",
+ "IndexActionsMenu.NewAlias": "Yeni Alternatif İsim...",
+ "IndexActionsMenu.Refresh": "Yenile",
+ "IndexActionsMenu.Flush": "Boşalt",
+ "IndexActionsMenu.Optimize": "Optimize et...",
+ "IndexActionsMenu.Snapshot": "Gateway Snapshot (Kopya Al)",
+ "IndexActionsMenu.Analyser": "Analizi test et",
+ "IndexActionsMenu.Open": "Aç",
+ "IndexActionsMenu.Close": "Kapa",
+ "IndexActionsMenu.Delete": "Sil...",
+ "IndexInfoMenu.Title": "Bilgi",
+ "IndexInfoMenu.Status": "Indeks Durumu",
+ "IndexInfoMenu.Metadata": "Indeks Metaveri",
+ "IndexCommand.TextToAnalyze": "Analiz edilecek metin",
+ "IndexCommand.ShutdownMessage": "{1} kapatmak için ''{0}'' yazın . Nod bu arayüzden tekrar BAŞLATILAMAZ",
+ "IndexOverview.PageTitle": "Indeksler Genel Bakış",
+ "IndexSelector.NameWithDocs": "{0} ({1} döküman)",
+ "IndexSelector.SearchIndexForDocs": "{0} indeksinde ara:",
+ "FilterBrowser.OutputType": "Sonuç Formatı: {0}",
+ "FilterBrowser.OutputSize": "Sonuç Sayısı: {0}",
+ "Header.ClusterHealth": "Küme Durumu: {0} ({1} de {2})",
+ "Header.ClusterNotConnected": "Küme Durumu: Bağlı Değil",
+ "Header.Connect": "Bağlan",
+ "Nav.AnyRequest": "Özel Sorgu",
+ "Nav.Browser": "Görüntüle",
+ "Nav.ClusterHealth": "Küme Durumu",
+ "Nav.ClusterState": "Küme Statüsü",
+ "Nav.ClusterNodes": "Nod Bilgileri",
+ "Nav.Info": "Bilgi",
+ "Nav.NodeStats": "Nod İstatistikleri",
+ "Nav.Overview": "Genel Bakış",
+ "Nav.Indices": "Indeksler",
+ "Nav.Plugins": "Eklentiler",
+ "Nav.Status": "Indeks İstatistikleri",
+ "Nav.Templates": "Şablonlar",
+ "Nav.StructuredQuery": "Yapılandırılmış Sorgu",
+ "NodeActionsMenu.Title": "İşlemler",
+ "NodeActionsMenu.Shutdown": "Kapat...",
+ "NodeInfoMenu.Title": "Bilgi",
+ "NodeInfoMenu.ClusterNodeInfo": "Küme Nod Bilgileri",
+ "NodeInfoMenu.NodeStats": "Nod İstatistikleri",
+ "NodeType.Client": "Client Nod",
+ "NodeType.Coord": "Coordinator",
+ "NodeType.Master": "Master Nod",
+ "NodeType.Tribe": "Tribe Nod",
+ "NodeType.Worker": "Worker Nod",
+ "NodeType.Unassigned": "Sahipsiz",
+ "OptimizeForm.OptimizeIndex": "{0} Optimize Et",
+ "OptimizeForm.MaxSegments": "Maksimum Segment Sayısı",
+ "OptimizeForm.ExpungeDeletes": "Silme İşlemi Artıklarını Temizle",
+ "OptimizeForm.FlushAfter": "Optimize Ettikten Sonra Boşalt",
+ "OptimizeForm.WaitForMerge": "Birleştirme İçin Bekle",
+ "Overview.PageTitle" : "Kümeler Genelbakış",
+ "Output.JSON": "JSON",
+ "Output.Table": "Tablo",
+ "Output.CSV": "CSV",
+ "Output.ShowSource": "Sorgu kaynağını göster",
+ "Preference.SortCluster": "Kümeyi Sırala",
+ "Sort.ByName": "İsme göre",
+ "Sort.ByAddress": "Adrese göre",
+ "Sort.ByType": "Tipe göre",
+ "Preference.SortIndices": "Indeksleri sırala",
+ "SortIndices.Descending": "Azalan",
+ "SortIndices.Ascending": "Artan",
+ "Preference.ViewAliases": "Alternatif isimleri görüntüle",
+ "ViewAliases.Grouped": "Gruplanmış",
+ "ViewAliases.List": "Liste",
+ "ViewAliases.None": "Karışık",
+ "Overview.IndexFilter": "Indeks Filtresi",
+ "TableResults.Summary": "{0} parçanın {1} tanesi arandı. {2} sonuç. {3} saniye",
+ "QueryFilter.AllIndices": "Tüm Indeksler",
+ "QueryFilter.AnyValue": "herhangi",
+ "QueryFilter-Header-Indices": "Indeksler",
+ "QueryFilter-Header-Types": "Tipler",
+ "QueryFilter-Header-Fields": "Alanlar",
+ "QueryFilter.DateRangeHint.from": "{0}'dan",
+ "QueryFilter.DateRangeHint.to": " {0}'a",
+ "Query.FailAndUndo": "Sorgu Başarısız. Son değişiklikler geri alınıyor.",
+ "StructuredQuery.ShowRawJson": "Formatsız JSON göster"
+});
+
+i18n.setKeys({
+ "AnyRequest.TransformerHelp" : "\
+ <p>Sonuç Dönüştürücü sorgudan dönen JSON sonuçlarını işleyip daha kullanışlı bir formata dönüştürmek için kullanılabilir.</p>\
+ <p>Dönüştürücü içierisinde javascript fonksiyonu tanımlanmalıdır. Bu fonksiyondan dönen yeni sonuç çıktı kısmına yazdırılır.</p>\
+ <p>Örnek:<br>\
+ <code>return root.hits.hits[0];</code> sonucu dolaşarak ilk eşleşmeyi göster<br>\
+ <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code> tüm kümede kullanılan toplam belleği gösterir<br></p>\
+ <p>Aşağıdaki fonksiyonlar dizi ve objelerin işlenmesinde yardımcı olması için kullanılabilir<br>\
+ <ul>\
+ <li><i>Object.keys</i>(object) := array</li>\
+ <li>array.<i>forEach</i>(function(prop, index))</li>\
+ <li>array.<i>map</i>(function(prop, index)) := array</li>\
+ <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\
+ </ul>\
+ <p>Sorgu tekrarlama çalışırken, prev isimli ekstra bir parametre dönüştürücü fonksiyonuna verilir. Bu sayede karşılaştırmalar ve toplu grafik gösterimleri yapılabilir.</p>\
+ <p>Örnek:<br>\
+ <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code> önceki dakika boyunca kümede bulunan ilk nod üzerindeki averaj yükü verir.\
+ Bu sonuç nod için yük grafiği yaratılmasında kullanılabilir.\
+ "
+});
+
+i18n.setKeys({
+ "AnyRequest.DisplayOptionsHelp" : "\
+ <p>Sade Json: Sorgunun tüm sonuçlarını ve (yapıldıysa) dönüştürüldükten sonraki halini sade JSON formatında gösterir </p>\
+ <p>Sonuçları Çizdir: Sonuçları grafiksel olarak görüntülemek için sonuç dörücüyü kullanarak değerleri dizi haline getirin.</p>\
+ <p>Arama Sonuçları Tablosu: Eğer sorgunuz bir arama ise, sonuçları bir tabloda görüntüleyebilirsiniz.</p>\
+ "
+});
+
+i18n.setKeys({
+ "QueryFilter.DateRangeHelp" : "\
+ <p>Tarih alanları ana dile yakın kelimeler kullanarak iki tarih aralığında sorgu yapılabilmesini sağlar.</p>\
+ <p>Aşağıdaki tanımlar kullanılabilir:</p>\
+ <ul>\
+ <li><b>Anahtar Kelimeler</b><br>\
+ <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\
+ kelimeleri eşleşen tarihleri verir. Örneğin <code>last year</code> geçen yıl tarihli bütün verileri döndürür.</li>\
+ <li><b>Aralıklar</b><br>\
+ <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (boşluklar isteğe bağlıdır, ayni kelime için farklı yazım şekilleri kullanılabilir)<br>\
+ Şu anki tarihi (<code>now</code>) baz alarak geçmiş veya ileriki bir tarih aralığındaki kayıtları verir.</li>\
+ <li><b>Tarih ve Kısmi Tarihler</b><br>\
+ <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\
+ bu formatlar spesifik bir tarihi tanımlarlar. <code>2011</code> tüm 2011 yılını ararken, <code>2011-01-18 12:32:45</code> şeklinde bir sorgu sadece o saniyedeki sonuçları verir.</li>\
+ <li><b>Zaman ve Kısmi Zamanlar</b><br>\
+ <code>12<br> 12:32<br> 12:32:45</code><br>\
+ bu formatlar gün içerisinde spesifik bir zamanı tanımlarlar. Örneğin <code>12:32</code> sadece bu saat ve dakikadaki kayıtları verir.</li>\
+ <li><b>Tarih Aralıkları</b><br>\
+ <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\
+ Tarih aralıkları yukarda belirtilen herhangi bir formatı < or -> ile ayırarak yapılabilir. Eğer aralığın bir tarafı eksikse, sorgu ucu açıkmış gibi davranır.</li>\
+ <li><b>Ofsetli Tarih Aralığı</b><br>\
+ <code>2010 -> 1yr<br> 3mins < now</code>\
+ Verilen yöndeki tarih aralığına bakar.</li>\
+ <li><b>Çakılı Aralıklar</b><br>\
+ <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\
+ Yukarıdakiyle ayni fakat belirtilen tarihten her iki yöne de bakılır.</li>\
+ </ul>\
+ "
+});
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/zh_strings.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/zh_strings.js new file mode 100644 index 000000000..0038de173 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/lang/zh_strings.js @@ -0,0 +1,172 @@ +i18n.setKeys({ + "General.Elasticsearch": "Elasticsearch", + "General.LoadingAggs": "加载聚合查询...", + "General.Searching": "搜索中...", + "General.Search": "搜索", + "General.Help": "帮助", + "General.HelpGlyph": "?", + "General.CloseGlyph": "X", + "General.RefreshResults": "刷新", + "General.ManualRefresh": "手动刷新", + "General.RefreshQuickly": "快速刷新", + "General.Refresh5seconds": "每5秒刷新", + "General.Refresh1minute": "每1分钟刷新", + "AliasForm.AliasName": "别名", + "AliasForm.NewAliasForIndex": "为 {0} 创建新别名", + "AliasForm.DeleteAliasMessage": "输入 ''{0}'' 删除 {1}. 此操作无法恢复", + "AnyRequest.DisplayOptions" : "显示选项", + "AnyRequest.AsGraph" : "图形视图", + "AnyRequest.AsJson" : "原始 JSON", + "AnyRequest.AsTable" : "表格视图", + "AnyRequest.History" : "历史记录", + "AnyRequest.RepeatRequest" : "重复请求", + "AnyRequest.RepeatRequestSelect" : "重复周期 ", + "AnyRequest.Transformer" : "结果转换器", + "AnyRequest.Pretty": "易读", + "AnyRequest.Query" : "查询", + "AnyRequest.Request": "提交请求", + "AnyRequest.Requesting": "请求中...", + "AnyRequest.ValidateJSON": "验证 JSON", + "Browser.Title": "数据浏览", + "Browser.ResultSourcePanelTitle": "原始数据", + "Command.DELETE": "删除", + "Command.SHUTDOWN": "关闭", + "Command.DeleteAliasMessage": "删除别名?", + "ClusterOverView.IndexName": "索引名称", + "ClusterOverview.NumShards": "分片数", + "ClusterOverview.NumReplicas": "副本数", + "ClusterOverview.NewIndex": "新建索引", + "IndexActionsMenu.Title": "动作", + "IndexActionsMenu.NewAlias": "新建别名...", + "IndexActionsMenu.Refresh": "刷新", + "IndexActionsMenu.Flush": "Flush刷新", + "IndexActionsMenu.Optimize": "优化...", + "IndexActionsMenu.Snapshot": "网关快照", + "IndexActionsMenu.Analyser": "测试分析器", + "IndexActionsMenu.Open": "开启", + "IndexActionsMenu.Close": "关闭", + "IndexActionsMenu.Delete": "删除...", + "IndexInfoMenu.Title": "信息", + "IndexInfoMenu.Status": "索引状态", + "IndexInfoMenu.Metadata": "索引信息", + "IndexCommand.TextToAnalyze": "文本分析", + "IndexCommand.ShutdownMessage": "输入 ''{0}'' 以关闭 {1} 节点. 关闭的节点无法从此界面重新启动", + "IndexOverview.PageTitle": "索引概览", + "IndexSelector.NameWithDocs": "{0} ({1} 个文档)", + "IndexSelector.SearchIndexForDocs": "搜索 {0} 的文档, 查询条件:", + "FilterBrowser.OutputType": "返回格式: {0}", + "FilterBrowser.OutputSize": "显示数量: {0}", + "Header.ClusterHealth": "集群健康值: {0} ({1} of {2})", + "Header.ClusterNotConnected": "集群健康值: 未连接", + "Header.Connect": "连接", + "Nav.AnyRequest": "复合查询", + "Nav.Browser": "数据浏览", + "Nav.ClusterHealth": "集群健康值", + "Nav.ClusterState": "群集状态", + "Nav.ClusterNodes": "集群节点", + "Nav.Info": "信息", + "Nav.NodeStats": "节点状态", + "Nav.Overview": "概览", + "Nav.Indices": "索引", + "Nav.Plugins": "插件", + "Nav.Status": "状态", + "Nav.Templates": "模板", + "Nav.StructuredQuery": "基本查询", + "NodeActionsMenu.Title": "动作", + "NodeActionsMenu.Shutdown": "关停...", + "NodeInfoMenu.Title": "信息", + "NodeInfoMenu.ClusterNodeInfo": "集群节点信息", + "NodeInfoMenu.NodeStats": "节点状态", + "NodeType.Client": "节点客户端", + "NodeType.Coord": "协调器", + "NodeType.Master": "主节点", + "NodeType.Tribe": "分支结点", + "NodeType.Worker": "工作节点", + "NodeType.Unassigned": "未分配", + "OptimizeForm.OptimizeIndex": "优化 {0}", + "OptimizeForm.MaxSegments": "最大索引段数", + "OptimizeForm.ExpungeDeletes": "只删除被标记为删除的", + "OptimizeForm.FlushAfter": "优化后刷新", + "OptimizeForm.WaitForMerge": "等待合并", + "Overview.PageTitle" : "集群概览", + "Output.JSON": "JSON", + "Output.Table": "Table", + "Output.CSV": "CSV", + "Output.ShowSource": "显示查询语句", + "Preference.SortCluster": "集群排序", + "Sort.ByName": "按名称", + "Sort.ByAddress": "按地址", + "Sort.ByType": "按类型", + "TableResults.Summary": "查询 {1} 个分片中用的 {0} 个. {2} 命中. 耗时 {3} 秒", + "QueryFilter.AllIndices": "所有索引", + "QueryFilter.AnyValue": "任意", + "QueryFilter-Header-Indices": "索引", + "QueryFilter-Header-Types": "类型", + "QueryFilter-Header-Fields": "字段", + "QueryFilter.DateRangeHint.from": "从 : {0}", + "QueryFilter.DateRangeHint.to": " 到 : {0}", + "Query.FailAndUndo": "查询失败. 撤消最近的更改", + "StructuredQuery.ShowRawJson": "显示原始 JSON" +}); + +i18n.setKeys({ + "AnyRequest.TransformerHelp" : "\ + <p>结果转换器用于返回结果原始JSON的后续处理, 将结果转换为更有用的格式.</p>\ + <p>转换器应当包含javascript函数体. 函数的返回值将传递给json分析器</p>\ + <p>Example:<br>\ + <code>return root.hits.hits[0];</code><br>\ + 遍历结果并只显示第一个元素<br>\ + <code>return Object.keys(root.nodes).reduce(function(tot, node) { return tot + root.nodes[node].os.mem.used_in_bytes; }, 0);</code><br>\ + 将返回整个集群使用的总内存<br></p>\ + <p>以下函数可以方便的处理数组与对象<br>\ + <ul>\ + <li><i>Object.keys</i>(object) := array</li>\ + <li>array.<i>forEach</i>(function(prop, index))</li>\ + <li>array.<i>map</i>(function(prop, index)) := array</li>\ + <li>array.<i>reduce</i>(function(accumulator, prop, index), initial_value) := final_value</li>\ + </ul>\ + <p>当启用重复请求时, prev 参数将会传递给转换器函数. 这将用于比较并累加图形</p>\ + <p>Example:<br>\ + <code>var la = [ root.nodes[Object.keys(root.nodes)[0]].os.load_average[0] ]; return prev ? la.concat(prev) : la;</code><br>\ + 将返回第一个集群节点最近一分钟内的平均负载\ + 将会把结果送人图表以产生一个负载曲线图\ + " +}); + +i18n.setKeys({ + "AnyRequest.DisplayOptionsHelp" : "\ + <p>原始 Json: 将完整的查询结果转换为原始JSON格式 </p>\ + <p>图形视图: 将查询结果图形化, 将查询结果转换为数组值的形式</p>\ + <p>表格视图: 如果查询是一个搜索, 可以将搜索结果以表格形式显示.</p>\ + " +}); + +i18n.setKeys({ + "QueryFilter.DateRangeHelp" : "\ + <p>Date 字段接受日期范围的形式查询.</p>\ + <p>一下格式被支持:</p>\ + <ul>\ + <li><b>关键词 / 关键短语</b><br>\ + <code>now<br> today<br> tomorrow<br> yesterday<br> last / this / next + week / month / year</code><br>\ + 搜索关键字匹配的日期. <code>last year</code> 将搜索过去全年.</li>\ + <li><b>范围</b><br>\ + <code>1000 secs<br> 5mins<br> 1day<br> 2days<br> 80d<br> 9 months<br> 2yrs</code> (空格可选, 同等于多个范围修饰词)<br>\ + 创建一个指定时间范围的搜索, 将围绕<code>现在</code> 并延伸至过去与未来时间段.</li>\ + <li><b>DateTime 与 DateTime局部</b><br>\ + <code>2011<br> 2011-01<br> 2011-01-18<br> 2011-01-18 12<br> 2011-01-18 12:32<br> 2011-01-18 12:32:45</code><br>\ + 指定一个特定的日期范围. <code>2011</code>会搜索整个 2011年, 而 <code>2011-01-18 12:32:45</code> 将只搜索1秒范围内</li>\ + <li><b>Time 与 Time局部</b><br>\ + <code>12<br> 12:32<br> 12:32:45</code><br>\ + 这些格式只搜索当天的特定时间. <code>12:32</code> 将搜索当天的那一分钟</li>\ + <li><b>日期范围</b><br>\ + <code>2010 -> 2011<br> last week -> next week<br> 2011-05 -><br> < now</code><br>\ + 日期范围是将两个日期格式串 (日期关键字 / DateTime / Time) 用 < 或 -> (效果相同) 分隔. 如果缺少任意一端,那么在这个方向上时间将没有限制.</li>\ + <li><b>偏移日期范围</b><br>\ + <code>2010 -> 1yr<br> 3mins < now</code>\ + 搜索包括指定方向上偏移的日期.</li>\ + <li><b>锚定范围</b><br>\ + <code>2010-05-13 05:13 <> 10m<br> now <> 1yr<br> lastweek <> 1month</code><br>\ + 类似于上面的便宜日期,在两个方向上将锚定的日期延长</li>\ + </ul>\ + " +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/cluster/cluster.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/cluster/cluster.js new file mode 100644 index 000000000..c4ddf6552 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/cluster/cluster.js @@ -0,0 +1,47 @@ +(function( $, app ) { + + var services = app.ns("services"); + var ux = app.ns("ux"); + + function parse_version( v ) { + return v.match(/^(\d+)\.(\d+)\.(\d+)/).slice(1,4).map( function(d) { return parseInt(d || 0, 10); } ); + } + + services.Cluster = ux.Class.extend({ + defaults: { + base_uri: null + }, + init: function() { + this.base_uri = this.config.base_uri; + }, + setVersion: function( v ) { + this.version = v; + this._version_parts = parse_version( v ); + }, + versionAtLeast: function( v ) { + var testVersion = parse_version( v ); + for( var i = 0; i < 3; i++ ) { + if( testVersion[i] !== this._version_parts[i] ) { + return testVersion[i] < this._version_parts[i]; + } + } + return true; + }, + request: function( params ) { + return $.ajax( $.extend({ + url: this.base_uri + params.path, + dataType: "json", + error: function(xhr, type, message) { + if("console" in window) { + console.log({ "XHR Error": type, "message": message }); + } + } + }, params) ); + }, + "get": function(path, success) { return this.request( { type: "GET", path: path, success: success } ); }, + "post": function(path, data, success) { return this.request( { type: "POST", path: path, data: data, success: success } ); }, + "put": function(path, data, success) { return this.request( { type: "PUT", path: path, data: data, success: success } ); }, + "delete": function(path, data, success) { return this.request( { type: "DELETE", path: path, data: data, success: success } ); } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/cluster/clusterSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/cluster/clusterSpec.js new file mode 100644 index 000000000..ff4e8a967 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/cluster/clusterSpec.js @@ -0,0 +1,65 @@ +describe("app.services.Cluster", function() { + + var Cluster = window.app.services.Cluster; + var test = window.test; + + var cluster; + + beforeEach( function() { + cluster = new Cluster({ base_uri: "http://localhost:9200/" }); + }); + + describe( "when it is initialised", function() { + + it("should have a localhost base_uri", function() { + expect( cluster.base_uri ).toBe( "http://localhost:9200/" ); + }); + + it("should have no version", function() { + expect( cluster.version ).toBe( undefined ); + }); + + }); + + describe( "setVersion()", function() { + + it("have a version", function() { + cluster.setVersion( "1.12.3-5" ); + expect( cluster.version ).toBe( "1.12.3-5" ); + }); + + }); + + describe("versionAtLeast()", function() { + var vs = [ "0.0.3", "0.13.5", "0.90.3", "1.0.0", "1.1.0", "1.2.3", "1.12.4.rc2", "13.0.0" ]; + + it("should return true for versions that are less than or equal to the current version", function() { + cluster.setVersion("1.12.5"); + expect( cluster.versionAtLeast("1.12.5" ) ).toBe( true ); + expect( cluster.versionAtLeast("1.12.5rc2" ) ).toBe( true ); + expect( cluster.versionAtLeast("1.12.5-6" ) ).toBe( true ); + expect( cluster.versionAtLeast("1.12.5-6.beta7" ) ).toBe( true ); + expect( cluster.versionAtLeast("1.12.4" ) ).toBe( true ); + expect( cluster.versionAtLeast("0.12.4" ) ).toBe( true ); + expect( cluster.versionAtLeast("1.1.8" ) ).toBe( true ); + + for( var i = 0; i < vs.length - 1; i++ ) { + cluster.setVersion( vs[i+1] ); + expect( cluster.versionAtLeast( vs[i] ) ).toBe( true ); + } + }); + + it("should return false for versions that are greater than the current version", function() { + cluster.setVersion("1.12.5"); + expect( cluster.versionAtLeast("1.12.6" ) ).toBe( false ); + expect( cluster.versionAtLeast("1.13.4" ) ).toBe( false ); + expect( cluster.versionAtLeast("2.0.0" ) ).toBe( false ); + + for( var i = 0; i < vs.length - 1; i++ ) { + cluster.setVersion( vs[i] ); + expect( cluster.versionAtLeast( vs[i+1] ) ).toBe( false ); + } + }); + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/clusterState/clusterState.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/clusterState/clusterState.js new file mode 100644 index 000000000..1d7334e0f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/clusterState/clusterState.js @@ -0,0 +1,73 @@ + (function( app ) { + + var services = app.ns("services"); + var ux = app.ns("ux"); + + services.ClusterState = ux.Observable.extend({ + defaults: { + cluster: null + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.clusterState = null; + this.status = null; + this.nodeStats = null; + this.clusterNodes = null; + }, + refresh: function() { + var self = this, clusterState, status, nodeStats, clusterNodes, clusterHealth; + function updateModel() { + if( clusterState && status && nodeStats && clusterNodes && clusterHealth ) { + this.clusterState = clusterState; + this.status = status; + this.nodeStats = nodeStats; + this.clusterNodes = clusterNodes; + this.clusterHealth = clusterHealth; + this.fire( "data", this ); + } + } + this.cluster.get("_cluster/state", function( data ) { + clusterState = data; + updateModel.call( self ); + }); + this.cluster.get("_stats", function( data ) { + status = data; + updateModel.call( self ); + }); + this.cluster.get("_nodes/stats", function( data ) { + nodeStats = data; + updateModel.call( self ); + }); + this.cluster.get("_nodes", function( data ) { + clusterNodes = data; + updateModel.call( self ); + }); + this.cluster.get("_cluster/health", function( data ) { + clusterHealth = data; + updateModel.call( self ); + }); + }, + _clusterState_handler: function(state) { + this.clusterState = state; + this.redraw("clusterState"); + }, + _status_handler: function(status) { + this.status = status; + this.redraw("status"); + }, + _clusterNodeStats_handler: function(stats) { + this.nodeStats = stats; + this.redraw("nodeStats"); + }, + _clusterNodes_handler: function(nodes) { + this.clusterNodes = nodes; + this.redraw("clusterNodes"); + }, + _clusterHealth_handler: function(health) { + this.clusterHealth = health; + this.redraw("status"); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/clusterState/clusterStateSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/clusterState/clusterStateSpec.js new file mode 100644 index 000000000..b91237c6e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/clusterState/clusterStateSpec.js @@ -0,0 +1,64 @@ +describe("app.services.ClusterState", function() { + + var ClusterState = window.app.services.ClusterState; + var test = window.test; + + var c; + var dummyData = {}; + var dataEventCallback; + + function expectAllDataToBeNull() { + expect( c.clusterState ).toBe( null ); + expect( c.status ).toBe( null ); + expect( c.nodeStats ).toBe( null ); + expect( c.clusterNodes ).toBe( null ); + } + + beforeEach( function() { + test.cb.use(); + dataEventCallback = jasmine.createSpy("onData"); + c = new ClusterState({ + cluster: { + get: test.cb.createSpy("get", 1, [ dummyData ] ) + }, + onData: dataEventCallback + }); + }); + + describe( "when it is initialised", function() { + + it("should have null data", function() { + expectAllDataToBeNull(); + }); + + }); + + describe( "when refresh is called", function() { + + beforeEach( function() { + c.refresh(); + }); + + it("should not not update models until all network requests have completed", function() { + test.cb.execOne(); + expectAllDataToBeNull(); + test.cb.execOne(); + expectAllDataToBeNull(); + test.cb.execOne(); + expectAllDataToBeNull(); + test.cb.execOne(); + expectAllDataToBeNull(); + test.cb.execOne(); + expect( c.clusterState ).toBe( dummyData ); + expect( c.status ).toBe( dummyData ); + expect( c.nodeStats ).toBe( dummyData ); + expect( c.clusterNodes ).toBe( dummyData ); + }); + + it("should fire a 'data' event when all data is ready", function() { + test.cb.execAll(); + expect( dataEventCallback ).toHaveBeenCalledWith( c ); + }); + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/preferences/preferenceSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/preferences/preferenceSpec.js new file mode 100644 index 000000000..968815d4c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/preferences/preferenceSpec.js @@ -0,0 +1,23 @@ +describe("app.services.Preferences", function(){ + +var Preferences = window.app.services.Preferences; + + var prefs; + + beforeEach( function() { + spyOn(window.localStorage, "getItem").and.returnValue( '{"foo":true}' ); + spyOn(window.localStorage, "setItem"); + prefs = Preferences.instance(); + }); + + it("should return a preference from localStorage", function() { + expect( prefs.get("foo") ).toEqual( {foo:true} ); + }); + + it("should set a preference in localStorage", function() { + prefs.set("foo", { foo: false } ); + expect( window.localStorage.setItem ).toHaveBeenCalledWith('foo', '{"foo":false}'); + }); + + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/preferences/preferences.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/preferences/preferences.js new file mode 100644 index 000000000..a45eb966d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/services/preferences/preferences.js @@ -0,0 +1,35 @@ +(function( app ) { + + var ux = app.ns("ux"); + var services = app.ns("services"); + + services.Preferences = ux.Singleton.extend({ + init: function() { + this._storage = window.localStorage; + this._setItem("__version", 1 ); + }, + get: function( key ) { + return this._getItem( key ); + }, + set: function( key, val ) { + return this._setItem( key, val ); + }, + _getItem: function( key ) { + try { + return JSON.parse( this._storage.getItem( key ) ); + } catch(e) { + console.warn( e ); + return undefined; + } + }, + _setItem: function( key, val ) { + try { + return this._storage.setItem( key, JSON.stringify( val ) ); + } catch(e) { + console.warn( e ); + return undefined; + } + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.css new file mode 100644 index 000000000..3042e7b37 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.css @@ -0,0 +1 @@ +.require { color: #a00; } diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.js new file mode 100644 index 000000000..3d629b78d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.js @@ -0,0 +1,49 @@ +(function( $, app, joey ) { + + var ui = app.ns("ui"); + + ui.AbstractField = ui.AbstractWidget.extend({ + + defaults: { + name : "", // (required) - name of the field + require: false, // validation requirements (false, true, regexp, function) + value: "", // default value + label: "" // human readable label of this field + }, + + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + this.field = this.el.find("[name="+this.config.name+"]"); + this.label = this.config.label; + this.require = this.config.require; + this.name = this.config.name; + this.val( this.config.value ); + this.attach( parent ); + }, + + val: function( val ) { + if(val === undefined) { + return this.field.val(); + } else { + this.field.val( val ); + return this; + } + }, + + validate: function() { + var val = this.val(), req = this.require; + if( req === false ) { + return true; + } else if( req === true ) { + return val.length > 0; + } else if( req.test && $.isFunction(req.test) ) { + return req.test( val ); + } else if( $.isFunction(req) ) { + return req( val, this ); + } + } + + }); + +})( this.jQuery, this.app, this.joey ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.css new file mode 100644 index 000000000..6cce209bc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.css @@ -0,0 +1,43 @@ +#uiModal { + background: black; +} + +.uiPanel { + box-shadow: -1px 2.5px 4px -3px black, -1px -2.5px 4px -3px black, 3px 2.5px 4px -3px black, 3px -2.5px 4px -3px black; + position: absolute; + background: #eee; + border: 1px solid #666; +} + +.uiPanel-titleBar { + text-align: center; + font-weight: bold; + padding: 2px 0; + background: rgba(223, 223, 223, 0.75); + background: -moz-linear-gradient(top, rgba(223, 223, 223, 0.75), rgba(193, 193, 193, 0.75), rgba(223, 223, 223, 0.75)); + background: -webkit-linear-gradient(top, rgba(223, 223, 223, 0.75), rgba(193, 193, 193, 0.75), rgba(223, 223, 223, 0.75)); + border-bottom: 1px solid #bbb; +} + +.uiPanel-close { + cursor: pointer; + border: 1px solid #aaa; + background: #fff; + color: #fff; + float: left; + height: 10px; + left: 3px; + line-height: 9px; + padding: 1px 0; + position: relative; + text-shadow: 0 0 1px #000; + top: 0px; + width: 12px; +} +.uiPanel-close:hover { + background: #eee; +} + +.uiPanel-body { + overflow: auto; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.js new file mode 100644 index 000000000..17f62a798 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.js @@ -0,0 +1,83 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.AbstractPanel = ui.AbstractWidget.extend({ + defaults: { + body: null, // initial content of the body + modal: true, // create a modal panel - creates a div that blocks interaction with page + height: 'auto', // panel height + width: 400, // panel width (in pixels) + open: false, // show the panel when it is created + parent: 'BODY', // node that panel is attached to + autoRemove: false // remove the panel from the dom and destroy it when the widget is closed + }, + shared: { // shared data for all instances of ui.Panel and decendants + stack: [], // array of all open panels + modal: $( { tag: "DIV", id: "uiModal", css: { opacity: 0.2, position: "absolute", top: "0px", left: "0px" } } ) + }, + init: function() { + this._super(); + }, + open: function( ev ) { + this.el + .css( { visibility: "hidden" } ) + .appendTo( this.config.parent ) + .css( this._getPosition( ev ) ) + .css( { zIndex: (this.shared.stack.length ? (+this.shared.stack[this.shared.stack.length - 1].el.css("zIndex") + 10) : 100) } ) + .css( { visibility: "visible", display: "block" } ); + this.shared.stack.remove(this); + this.shared.stack.push(this); + this._setModal(); + $(document).bind("keyup", this._close_handler ); + this.fire("open", { source: this, event: ev } ); + return this; + }, + close: function() { + var index = this.shared.stack.indexOf(this); + if(index !== -1) { + this.shared.stack.splice(index, 1); + this.el.css( { left: "-2999px" } ); // move the dialog to the left rather than hiding to prevent ie6 rendering artifacts + this._setModal(); + this.fire("close", this ); + if(this.config.autoRemove) { + this.remove(); + } + } + return this; + }, + // close the panel and remove it from the dom, destroying it (you can not reuse the panel after calling remove) + remove: function() { + this.close(); + $(document).unbind("keyup", this._close_handler ); + this._super(); + }, + // starting at the top of the stack, find the first panel that wants a modal and put it just underneath, otherwise remove the modal + _setModal: function() { + for(var stackPtr = this.shared.stack.length - 1; stackPtr >= 0; stackPtr--) { + if(this.shared.stack[stackPtr].config.modal) { + this.shared.modal + .appendTo( document.body ) + .css( { zIndex: this.shared.stack[stackPtr].el.css("zIndex") - 5 } ) + .css( $(document).vSize().asSize() ); + return; + } + } + this.shared.modal.remove(); // no panels that want a modal were found + }, + _getPosition: function() { + return $(window).vSize() // get the current viewport size + .sub(this.el.vSize()) // subtract the size of the panel + .mod(function(s) { return s / 2; }) // divide by 2 (to center it) + .add($(document).vScroll()) // add the current scroll offset + .mod(function(s) { return Math.max(5, s); }) // make sure the panel is not off the edge of the window + .asOffset(); // and return it as a {top, left} object + }, + _close_handler: function( ev ) { + if( ev.type === "keyup" && ev.keyCode !== 27) { return; } // press esc key to close + $(document).unbind("keyup", this._close_handler); + this.close( ev ); + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractWidget/abstractWidget.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractWidget/abstractWidget.js new file mode 100644 index 000000000..bf3b4c8b6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/abstractWidget/abstractWidget.js @@ -0,0 +1,49 @@ +(function( $, joey, app ) { + + var ui = app.ns("ui"); + var ux = app.ns("ux"); + + ui.AbstractWidget = ux.Observable.extend({ + defaults : { + id: null // the id of the widget + }, + + el: null, // this is the jquery wrapped dom element(s) that is the root of the widget + + init: function() { + this._super(); + for(var prop in this) { // automatically bind all the event handlers + if(prop.contains("_handler")) { + this[prop] = this[prop].bind(this); + } + } + }, + + id: function(suffix) { + return this.config.id ? (this.config.id + (suffix ? "-" + suffix : "")) : undefined; + }, + + attach: function( parent, method ) { + if( parent ) { + this.el[ method || "appendTo"]( parent ); + } + this.fire("attached", this ); + return this; + }, + + remove: function() { + this.el.remove(); + this.fire("removed", this ); + this.removeAllObservers(); + this.el = null; + return this; + } + }); + + joey.plugins.push( function( obj ) { + if( obj instanceof ui.AbstractWidget ) { + return obj.el[0]; + } + }); + +})( this.jQuery, this.joey, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.css new file mode 100644 index 000000000..f00412cf1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.css @@ -0,0 +1,38 @@ +.uiAnyRequest-request { + float: left; + width: 350px; + padding: 5px; + background: #d8e7ff; + background: -moz-linear-gradient(left, #d8e7ff, #e8f1ff); + background: -webkit-linear-gradient(left, #d8e7ff, #e8f1ff); +} + +.uiAnyRequest-request INPUT[type=text], +.uiAnyRequest-request TEXTAREA { + width: 340px; +} + +.anyRequest INPUT[name=path] { + width: 259px; +} + +.uiAnyRequest-out { + margin-left: 365px; +} + +.uiAnyRequest-out P { + margin-top: 0; +} + +.uiAnyRequest-jsonErr { + color: red; +} + +.uiAnyRequest-history { + margin: 0; + padding: 0; + list-style: none; + max-height: 100px; + overflow-x: hidden; + overflow-y: auto; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.js new file mode 100644 index 000000000..926bbcced --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.js @@ -0,0 +1,235 @@ +(function( $, app, i18n, raphael ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + var services = app.ns("services"); + + ui.AnyRequest = ui.Page.extend({ + defaults: { + cluster: null, // (required) instanceof app.services.Cluster + path: "_search", // default uri to send a request to + query: { query: { match_all: { }}}, + transform: " return root;" // default transformer function (does nothing) + }, + init: function(parent) { + this._super(); + this.prefs = services.Preferences.instance(); + this.history = this.prefs.get("anyRequest-history") || [ { type: "POST", path: this.config.path, query : JSON.stringify(this.config.query), transform: this.config.transform } ]; + this.el = $.joey(this._main_template()); + this.base_uriEl = this.el.find("INPUT[name=base_uri]"); + this.pathEl = this.el.find("INPUT[name=path]"); + this.typeEl = this.el.find("SELECT[name=method]"); + this.dataEl = this.el.find("TEXTAREA[name=body]"); + this.prettyEl = this.el.find("INPUT[name=pretty]"); + this.transformEl = this.el.find("TEXTAREA[name=transform]"); + this.asGraphEl = this.el.find("INPUT[name=asGraph]"); + this.asTableEl = this.el.find("INPUT[name=asTable]"); + this.asJsonEl = this.el.find("INPUT[name=asJson]"); + this.cronEl = this.el.find("SELECT[name=cron]"); + this.outEl = this.el.find("DIV.uiAnyRequest-out"); + this.errEl = this.el.find("DIV.uiAnyRequest-jsonErr"); + this.typeEl.val("GET"); + this.attach(parent); + this.setHistoryItem(this.history[this.history.length - 1]); + }, + setHistoryItem: function(item) { + this.pathEl.val(item.path); + this.typeEl.val(item.type); + this.dataEl.val(item.query); + this.transformEl.val(item.transform); + }, + _request_handler: function( ev ) { + if(! this._validateJson_handler()) { + return; + } + var path = this.pathEl.val(), + type = this.typeEl.val(), + query = JSON.stringify(JSON.parse(this.dataEl.val())), + transform = this.transformEl.val(), + base_uri = this.base_uriEl.val(); + if( ev ) { // if the user click request + if(this.timer) { + window.clearTimeout(this.timer); // stop any cron jobs + } + delete this.prevData; // remove data from previous cron runs + this.outEl.text(i18n.text("AnyRequest.Requesting")); + if( ! /\/$/.test( base_uri )) { + base_uri += "/"; + this.base_uriEl.val( base_uri ); + } + for(var i = 0; i < this.history.length; i++) { + if(this.history[i].path === path && + this.history[i].type === type && + this.history[i].query === query && + this.history[i].transform === transform) { + this.history.splice(i, 1); + } + } + this.history.push({ + path: path, + type: type, + query: query, + transform: transform + }); + this.history.slice(250); // make sure history does not get too large + this.prefs.set( "anyRequest-history", this.history ); + this.el.find("UL.uiAnyRequest-history") + .empty() + .append($( { tag: "UL", children: this.history.map(this._historyItem_template, this) }).children()) + .children().find(":last-child").each(function(i, j) { j.scrollIntoView(false); }).end() + .scrollLeft(0); + } + this.config.cluster.request({ + url: base_uri + path, + type: type, + data: query, + success: this._responseWriter_handler, + error: this._responseError_handler + }); + }, + _responseError_handler: function (response) { + var obj; + try { + obj = JSON.parse(response.responseText); + if (obj) { + this._responseWriter_handler(obj); + } + } catch (err) { + } + }, + _responseWriter_handler: function(data) { + this.outEl.empty(); + try { + data = (new Function("root", "prev", this.transformEl.val()))(data, this.prevData) + } catch(e) { + this.errEl.text(e.message); + return; + } + if(this.asGraphEl.attr("checked")) { + var w = this.outEl.width(); + raphael(this.outEl[0], w - 10, 300) + .g.barchart(10, 10, w - 20, 280, [data]); + } + if(this.asTableEl.attr("checked")) { + try { + var store = new app.data.ResultDataSourceInterface(); + this.outEl.append(new app.ui.ResultTable({ + width: this.outEl.width() - 23, + store: store + } ) ); + store.results(data); + } catch(e) { + this.errEl.text("Results Table Failed: " + e.message); + } + } + if(this.asJsonEl.attr("checked")) { + this.outEl.append(new ui.JsonPretty({ obj: data })); + } + if(this.cronEl.val() > 0) { + this.timer = window.setTimeout(function(){ + this._request_handler(); + }.bind(this), this.cronEl.val()); + } + this.prevData = data; + }, + _validateJson_handler: function( ev ) { + /* if the textarea is empty, we replace its value by an empty JSON object : "{}" and the request goes on as usual */ + var jsonData = this.dataEl.val().trim(); + var j; + if(jsonData === "") { + jsonData = "{}"; + this.dataEl.val( jsonData ); + } + try { + j = JSON.parse(jsonData); + } catch(e) { + this.errEl.text(e.message); + return false; + } + this.errEl.text(""); + if(this.prettyEl.attr("checked")) { + this.dataEl.val(JSON.stringify(j, null, " ")); + } + return true; + }, + _historyClick_handler: function( ev ) { + var item = $( ev.target ).closest( "LI" ).data( "item" ); + this.setHistoryItem( item ); + }, + _main_template: function() { + return { tag: "DIV", cls: "anyRequest", children: [ + { tag: "DIV", cls: "uiAnyRequest-request", children: [ + new app.ui.SidebarSection({ + open: false, + title: i18n.text("AnyRequest.History"), + body: { tag: "UL", onclick: this._historyClick_handler, cls: "uiAnyRequest-history", children: this.history.map(this._historyItem_template, this) } + }), + new app.ui.SidebarSection({ + open: true, + title: i18n.text("AnyRequest.Query"), + body: { tag: "DIV", children: [ + { tag: "INPUT", type: "text", name: "base_uri", value: this.config.cluster.config.base_uri }, + { tag: "BR" }, + { tag: "INPUT", type: "text", name: "path", value: this.config.path }, + { tag: "SELECT", name: "method", children: ["POST", "GET", "PUT", "HEAD", "DELETE"].map(ut.option_template) }, + { tag: "TEXTAREA", name: "body", rows: 20, text: JSON.stringify(this.config.query) }, + { tag: "BUTTON", css: { cssFloat: "right" }, type: "button", children: [ { tag: "B", text: i18n.text("AnyRequest.Request") } ], onclick: this._request_handler }, + { tag: "BUTTON", type: "button", text: i18n.text("AnyRequest.ValidateJSON"), onclick: this._validateJson_handler }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "pretty" }, i18n.text("AnyRequest.Pretty") ] }, + { tag: "DIV", cls: "uiAnyRequest-jsonErr" } + ]} + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.Transformer"), + help: "AnyRequest.TransformerHelp", + body: { tag: "DIV", children: [ + { tag: "CODE", text: "function(root, prev) {" }, + { tag: "BR" }, + { tag: "TEXTAREA", name: "transform", rows: 5, text: this.config.transform }, + { tag: "BR" }, + { tag: "CODE", text: "}" } + ] } + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.RepeatRequest"), + body: { tag: "DIV", children: [ + i18n.text("AnyRequest.RepeatRequestSelect"), " ", + { tag: "SELECT", name: "cron", children: [ + { value: 0, text: "do not repeat" }, + { value: 1000, text: "second" }, + { value: 1000 * 2, text: "2 seconds" }, + { value: 1000 * 5, text: "5 seconds" }, + { value: 1000 * 20, text: "20 seconds" }, + { value: 1000 * 60, text: "minute" }, + { value: 1000 * 60 * 10, text: "10 minutes" }, + { value: 1000 * 60 * 60, text: "hour" } + ].map(function(op) { return $.extend({ tag: "OPTION"}, op); }) } + ] } + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.DisplayOptions"), + help: "AnyRequest.DisplayOptionsHelp", + body: { tag: "DIV", children: [ + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", checked: true, name: "asJson" }, i18n.text("AnyRequest.AsJson") ] }, + { tag: "BR" }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "asGraph" }, i18n.text("AnyRequest.AsGraph") ] }, + { tag: "BR" }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "asTable" }, i18n.text("AnyRequest.AsTable") ] } + ] } + }) + ] }, + { tag: "DIV", cls: "uiAnyRequest-out" } + ] }; + }, + _historyItem_template: function(item) { + return { tag: "LI", cls: "booble", data: { item: item }, children: [ + { tag: "SPAN", text: item.path }, + " ", + { tag: "EM", text: item.query }, + " ", + { tag: "SPAN", text: item.transform } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n, this.Raphael ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.css new file mode 100644 index 000000000..66e2110a7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.css @@ -0,0 +1,7 @@ +.uiBrowser-filter { + float: left; +} + +.uiBrowser-table { + margin-left: 365px; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.js new file mode 100644 index 000000000..329aa4d6c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.js @@ -0,0 +1,58 @@ +(function( $, app, i18n ){ + + var ui = app.ns("ui"); + var data = app.ns("data"); + + ui.Browser = ui.Page.extend({ + defaults: { + cluster: null // (required) instanceof app.services.Cluster + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.query = new app.data.Query( { cluster: this.cluster } ); + this._refreshButton = new ui.Button({ + label: i18n.text("General.RefreshResults"), + onclick: function( btn ) { + this.query.query(); + }.bind(this) + }); + this.el = $(this._main_template()); + new data.MetaDataFactory({ + cluster: this.cluster, + onReady: function(metadata) { + this.metadata = metadata; + this.store = new data.QueryDataSourceInterface( { metadata: metadata, query: this.query } ); + this.queryFilter = new ui.QueryFilter({ metadata: metadata, query: this.query }); + this.queryFilter.attach(this.el.find("> .uiBrowser-filter") ); + this.resultTable = new ui.ResultTable( { + onHeaderClick: this._changeSort_handler, + store: this.store + } ); + this.resultTable.attach( this.el.find("> .uiBrowser-table") ); + this.updateResults(); + }.bind(this) + }); + }, + updateResults: function() { + this.query.query(); + }, + _changeSort_handler: function(table, wEv) { + this.query.setSort(wEv.column, wEv.dir === "desc"); + this.query.setPage(1); + this.query.query(); + }, + _main_template: function() { + return { tag: "DIV", cls: "uiBrowser", children: [ + new ui.Toolbar({ + label: i18n.text("Browser.Title"), + left: [ ], + right: [ this._refreshButton ] + }), + { tag: "DIV", cls: "uiBrowser-filter" }, + { tag: "DIV", cls: "uiBrowser-table" } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/button.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/button.css new file mode 100644 index 000000000..17123dcd7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/button.css @@ -0,0 +1,50 @@ +.uiButton { + padding: 0; + border: 0; + margin: 3px; + width: auto; + overflow: visible; + cursor: pointer; + background: transparent; +} + +.uiButton-content { + height: 20px; + border: 1px solid #668dc6; + border-radius: 2px; + background: #96c6eb; + background: -moz-linear-gradient(top, #96c6eb, #5296c7); + background: -webkit-linear-gradient(top, #96c6eb, #5296c7); + color: white; + font-weight: bold; +} + +.moz .uiButton-content { margin: 0 -2px; } + +.uiButton-label { + padding: 2px 6px; + white-space: nowrap; +} +.uiButton:hover .uiButton-content { + background: #2777ba; + background: -moz-linear-gradient(top, #6aaadf, #2777ba); + background: -webkit-linear-gradient(top, #6aaadf, #2777ba); +} +.uiButton.active .uiButton-content, +.uiButton:active .uiButton-content { + background: #2575b7; + background: -moz-linear-gradient(top, #2576b8, #2575b7); + background: -webkit-linear-gradient(top, #2576b8, #2575b7); +} +.uiButton.disabled .uiButton-content, +.uiButton.disabled:active .uiButton-content { + border-color: #c6c6c6; + color: #999999; + background: #ddd; + background: -moz-linear-gradient(top, #ddd, #ddd); + background: -webkit-linear-gradient(top, #ddd, #ddd); +} + +.uiButton.disabled { + cursor: default; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/button.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/button.js new file mode 100644 index 000000000..57f83a083 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/button.js @@ -0,0 +1,53 @@ +(function( $, joey, app ) { + + var ui = app.ns("ui"); + + ui.Button = ui.AbstractWidget.extend({ + defaults : { + label: "", // the label text + disabled: false, // create a disabled button + autoDisable: false // automatically disable the button when clicked + }, + + _baseCls: "uiButton", + + init: function(parent) { + this._super(); + this.el = $.joey(this.button_template()) + .bind("click", this.click_handler); + this.config.disabled && this.disable(); + this.attach( parent ); + }, + + click_handler: function(jEv) { + if(! this.disabled) { + this.fire("click", jEv, this); + this.config.autoDisable && this.disable(); + } + }, + + enable: function() { + this.el.removeClass("disabled"); + this.disabled = false; + return this; + }, + + disable: function(disable) { + if(disable === false) { + return this.enable(); + } + this.el.addClass("disabled"); + this.disabled = true; + return this; + }, + + button_template: function() { return ( + { tag: 'BUTTON', type: 'button', id: this.id(), cls: this._baseCls, children: [ + { tag: 'DIV', cls: 'uiButton-content', children: [ + { tag: 'DIV', cls: 'uiButton-label', text: this.config.label } + ] } + ] } + ); } + }); + +})( this.jQuery, this.joey, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/buttonDemo.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/buttonDemo.js new file mode 100644 index 000000000..060e8f650 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/button/buttonDemo.js @@ -0,0 +1,9 @@ +$( function() { + + var ui = window.app.ns("ui"); + + window.builder = function() { + return new ui.Button({ label: "Default" }); + } ; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkField.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkField.js new file mode 100644 index 000000000..d5f50127e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkField.js @@ -0,0 +1,25 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.CheckField = ui.AbstractField.extend({ + _main_template: function() { return ( + { tag: "DIV", id: this.id(), cls: "uiCheckField", children: [ + { tag: "INPUT", type: "checkbox", name: this.config.name, checked: !!this.config.value } + ] } + ); }, + validate: function() { + return this.val() || ( ! this.require ); + }, + val: function( val ) { + if( val === undefined ) { + return !!this.field.attr( "checked" ); + } else { + this.field.attr( "checked", !!val ); + } + } + }); + +})( this.app ); + + diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldDemo.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldDemo.js new file mode 100644 index 000000000..9a3b3caee --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldDemo.js @@ -0,0 +1,45 @@ +$( function() { + + var ui = window.app.ns("ui"); + var ux = window.app.ns("ux"); + var ut = window.app.ns("ut"); + + window.builder = function() { + var form = new ux.FieldCollection({ + fields: [ + new ui.CheckField({ + label: "default", + name: "check_default" + }), + new ui.CheckField({ + label: "checked", + name: "check_true", + value: true + }), + new ui.CheckField({ + label: "unchecked", + name: "check_false", + value: false + }), + new ui.CheckField({ + label: "required", + name: "check_required", + require: true + }) + ] + }); + + return ( + { tag: "DIV", children: form.fields.map( function( field ) { + return { tag: "LABEL", cls: "uiPanelForm-field", children: [ + { tag: "DIV", cls: "uiPanelForm-label", children: [ field.label, ut.require_template(field) ] }, + field + ]}; + }).concat( new ui.Button({ + label: "Evaluate Form", + onclick: function() { console.log( "valid=" + form.validate(), form.getData() ); } + })) } + ); + }; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldSpec.js new file mode 100644 index 000000000..26ddc6f63 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldSpec.js @@ -0,0 +1,34 @@ +describe("app.ui.CheckField", function() { + + var CheckField = window.app.ui.CheckField; + + it("should have a label", function() { + expect( ( new CheckField({ label: "foo" }) ).label ).toBe( "foo" ); + }); + + it("should have a name", function() { + expect( ( new CheckField({ name: "foo" }) ).name ).toBe( "foo" ); + }); + + it("should have a val that is false when then field is not checked", function() { + expect( ( new CheckField({ name: "foo", value: false }) ).val() ).toBe( false ); + }); + + it("should have a val that is true when the field is checked", function() { + expect( ( new CheckField({ name: "foo", value: true }) ).val() ).toBe( true ); + }); + + it("should be valid if the field value is true", function() { + expect( ( new CheckField({ name: "foo", value: true }) ).validate() ).toBe( true ); + }); + + it("should be valid if require is false", function() { + expect( ( new CheckField({ name: "foo", require: false, value: true }) ).validate() ).toBe( true ); + expect( ( new CheckField({ name: "foo", require: false, value: false }) ).validate() ).toBe( true ); + }); + + it("should be invalid if require is true and value is false", function() { + expect( ( new CheckField({ name: "foo", require: true, value: false }) ).validate() ).toBe( false ); + }); + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.css new file mode 100644 index 000000000..e5b8fb457 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.css @@ -0,0 +1,3 @@ +.uiClusterConnect-uri { + width: 280px; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.js new file mode 100644 index 000000000..63d097723 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.js @@ -0,0 +1,43 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var services = app.ns("services"); + + ui.ClusterConnect = ui.AbstractWidget.extend({ + defaults: { + cluster: null + }, + init: function() { + this._super(); + this.prefs = services.Preferences.instance(); + this.cluster = this.config.cluster; + this.el = $.joey(this._main_template()); + this.cluster.get( "", this._node_handler ); + }, + + _node_handler: function(data) { + if(data) { + this.prefs.set("app-base_uri", this.cluster.base_uri); + } + }, + + _reconnect_handler: function() { + var base_uri = this.el.find(".uiClusterConnect-uri").val(); + $("body").empty().append(new app.App("body", { id: "es", base_uri: base_uri })); + }, + + _main_template: function() { + return { tag: "SPAN", cls: "uiClusterConnect", children: [ + { tag: "INPUT", type: "text", cls: "uiClusterConnect-uri", onkeyup: function( ev ) { + if(ev.which === 13) { + ev.preventDefault(); + this._reconnect_handler(); + } + }.bind(this), id: this.id("baseUri"), value: this.cluster.base_uri }, + { tag: "BUTTON", type: "button", text: i18n.text("Header.Connect"), onclick: this._reconnect_handler } + ]}; + } + }); + +})( this.jQuery, this.app, this.i18n ); + diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnectSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnectSpec.js new file mode 100644 index 000000000..8b8be82d7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnectSpec.js @@ -0,0 +1,38 @@ +describe("clusterConnect", function() { + + var ClusterConnect = window.app.ui.ClusterConnect; + + describe("when created", function() { + + var prefs, success_callback, cluster, clusterConnect; + + beforeEach( function() { + prefs = { + set: jasmine.createSpy("set") + }; + spyOn( window.app.services.Preferences, "instance" ).and.callFake( function() { + return prefs; + }); + cluster = { + get: jasmine.createSpy("get").and.callFake( function(uri, success) { + success_callback = success; + }) + }; + clusterConnect = new ClusterConnect({ + base_uri: "http://localhost:9200", + cluster: cluster + }); + }); + + it("should test the connection to the cluster", function() { + expect( cluster.get ).toHaveBeenCalled(); + }); + + it("should store successful connection in preferences", function() { + success_callback("fakePayload"); + expect( prefs.set ).toHaveBeenCalled(); + }); + + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.css new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.css diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.js new file mode 100644 index 000000000..745ab42e3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.js @@ -0,0 +1,302 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var services = app.ns("services"); + + // ( master ) master = true, data = true + // ( coordinator ) master = true, data = false + // ( worker ) master = false, data = true; + // ( client ) master = false, data = false; + // http enabled ? + + function nodeSort_name(a, b) { + if (!(a.cluster && b.cluster)) { + return 0; + } + return a.cluster.name.toString().localeCompare( b.cluster.name.toString() ); + } + + function nodeSort_addr( a, b ) { + if (!(a.cluster && b.cluster)) { + return 0; + } + return a.cluster.transport_address.toString().localeCompare( b.cluster.transport_address.toString() ); + } + + function nodeSort_type( a, b ) { + if (!(a.cluster && b.cluster)) { + return 0; + } + if( a.master_node ) { + return -1; + } else if( b.master_node ) { + return 1; + } else if( a.data_node && !b.data_node ) { + return -1; + } else if( b.data_node && !a.data_node ) { + return 1; + } else { + return a.cluster.name.toString().localeCompare( b.cluster.name.toString() ); + } + } + + var NODE_SORT_TYPES = { + "Sort.ByName": nodeSort_name, + "Sort.ByAddress": nodeSort_addr, + "Sort.ByType": nodeSort_type + }; + + function nodeFilter_none( a ) { + return true; + } + + function nodeFilter_clients( a ) { + return (a.master_node || a.data_node ); + } + + + ui.ClusterOverview = ui.Page.extend({ + defaults: { + cluster: null // (reqired) an instanceof app.services.Cluster + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.prefs = services.Preferences.instance(); + this._clusterState = this.config.clusterState; + this._clusterState.on("data", this.draw_handler ); + this._refreshButton = new ui.RefreshButton({ + onRefresh: this.refresh.bind(this), + onChange: function( btn ) { + if( btn.value === -1 ) { + this.draw_handler(); + } + }.bind( this ) + }); + var nodeSortPref = this.prefs.get("clusterOverview-nodeSort") || Object.keys(NODE_SORT_TYPES)[0]; + this._nodeSort = NODE_SORT_TYPES[ nodeSortPref ]; + this._nodeSortMenu = new ui.MenuButton({ + label: i18n.text( "Preference.SortCluster" ), + menu: new ui.SelectMenuPanel({ + value: nodeSortPref, + items: Object.keys( NODE_SORT_TYPES ).map( function( k ) { + return { text: i18n.text( k ), value: k }; + }), + onSelect: function( panel, event ) { + this._nodeSort = NODE_SORT_TYPES[ event.value ]; + this.prefs.set("clusterOverview-nodeSort", event.value ); + this.draw_handler(); + }.bind(this) + }) + }); + this._indicesSort = this.prefs.get( "clusterOverview-indicesSort") || "desc"; + this._indicesSortMenu = new ui.MenuButton({ + label: i18n.text( "Preference.SortIndices" ), + menu: new ui.SelectMenuPanel({ + value: this._indicesSort, + items: [ + { value: "desc", text: i18n.text( "SortIndices.Descending" ) }, + { value: "asc", text: i18n.text( "SortIndices.Ascending" ) } ], + onSelect: function( panel, event ) { + this._indicesSort = event.value; + this.prefs.set( "clusterOverview-indicesSort", this._indicesSort ); + this.draw_handler(); + }.bind(this) + }) + }); + this._aliasRenderer = this.prefs.get( "clusterOverview-aliasRender" ) || "full"; + this._aliasMenu = new ui.MenuButton({ + label: i18n.text( "Preference.ViewAliases" ), + menu: new ui.SelectMenuPanel({ + value: this._aliasRenderer, + items: [ + { value: "full", text: i18n.text( "ViewAliases.Grouped" ) }, + { value: "list", text: i18n.text( "ViewAliases.List" ) }, + { value: "none", text: i18n.text( "ViewAliases.None" ) } ], + onSelect: function( panel, event ) { + this._aliasRenderer = event.value; + this.prefs.set( "clusterOverview-aliasRender", this._aliasRenderer ); + this.draw_handler(); + }.bind(this) + }) + }); + this._indexFilter = new ui.TextField({ + value: this.prefs.get("clusterOverview-indexFilter"), + placeholder: i18n.text( "Overview.IndexFilter" ), + onchange: function( indexFilter ) { + this.prefs.set("clusterOverview-indexFilter", indexFilter.val() ); + this.draw_handler(); + }.bind(this) + }); + this.el = $(this._main_template()); + this.tablEl = this.el.find(".uiClusterOverview-table"); + this.refresh(); + }, + remove: function() { + this._clusterState.removeObserver( "data", this.draw_handler ); + }, + refresh: function() { + this._refreshButton.disable(); + this._clusterState.refresh(); + }, + draw_handler: function() { + var data = this._clusterState; + var indexFilter; + try { + var indexFilterRe = new RegExp( this._indexFilter.val() ); + indexFilter = function(s) { return indexFilterRe.test(s); }; + } catch(e) { + indexFilter = function() { return true; }; + } + var clusterState = data.clusterState; + var status = data.status; + var nodeStats = data.nodeStats; + var clusterNodes = data.clusterNodes; + var nodes = []; + var indices = []; + var cluster = {}; + var nodeIndices = {}; + var indexIndices = {}, indexIndicesIndex = 0; + function newNode(n) { + return { + name: n, + routings: [], + master_node: clusterState.master_node === n + }; + } + function newIndex(i) { + return { + name: i, + replicas: [] + }; + } + function getIndexForNode(n) { + return nodeIndices[n] = (n in nodeIndices) ? nodeIndices[n] : nodes.push(newNode(n)) - 1; + } + function getIndexForIndex(routings, i) { + var index = indexIndices[i] = (i in indexIndices) ? + (routings[indexIndices[i]] = routings[indexIndices[i]] || newIndex(i)) && indexIndices[i] + : ( ( routings[indexIndicesIndex] = newIndex(i) ) && indexIndicesIndex++ ); + indices[index] = i; + return index; + } + $.each(clusterNodes.nodes, function(name, node) { + getIndexForNode(name); + }); + + var indexNames = []; + $.each(clusterState.routing_table.indices, function(name, index){ + indexNames.push(name); + }); + indexNames.sort(); + if (this._indicesSort === "desc") indexNames.reverse(); + indexNames.filter( indexFilter ).forEach(function(name) { + var indexObject = clusterState.routing_table.indices[name]; + $.each(indexObject.shards, function(name, shard) { + shard.forEach(function(replica){ + var node = replica.node; + if(node === null) { node = "Unassigned"; } + var index = replica.index; + var shard = replica.shard; + var routings = nodes[getIndexForNode(node)].routings; + var indexIndex = getIndexForIndex(routings, index); + var replicas = routings[indexIndex].replicas; + if(node === "Unassigned" || !indexObject.shards[shard]) { + replicas.push({ replica: replica }); + } else { + replicas[shard] = { + replica: replica, + status: indexObject.shards[shard].filter(function(replica) { + return replica.node === node; + })[0] + }; + } + }); + }); + }); + indices = indices.map(function(index){ + return { + name: index, + state: "open", + metadata: clusterState.metadata.indices[index], + status: status.indices[index] + }; + }, this); + $.each(clusterState.metadata.indices, function(name, index) { + if(index.state === "close" && indexFilter( name )) { + indices.push({ + name: name, + state: "close", + metadata: index, + status: null + }); + } + }); + nodes.forEach(function(node) { + node.stats = nodeStats.nodes[node.name]; + var cluster = clusterNodes.nodes[node.name]; + node.cluster = cluster || { name: "<unknown>" }; + node.data_node = !( cluster && cluster.attributes && cluster.attributes.data === "false" ); + for(var i = 0; i < indices.length; i++) { + node.routings[i] = node.routings[i] || { name: indices[i].name, replicas: [] }; + node.routings[i].max_number_of_shards = indices[i].metadata.settings["index.number_of_shards"]; + node.routings[i].open = indices[i].state === "open"; + } + }); + var aliasesIndex = {}; + var aliases = []; + var indexClone = indices.map(function() { return false; }); + $.each(clusterState.metadata.indices, function(name, index) { + index.aliases.forEach(function(alias) { + var aliasIndex = aliasesIndex[alias] = (alias in aliasesIndex) ? aliasesIndex[alias] : aliases.push( { name: alias, max: -1, min: 999, indices: [].concat(indexClone) }) - 1; + var indexIndex = indexIndices[name]; + var aliasRow = aliases[aliasIndex]; + aliasRow.min = Math.min(aliasRow.min, indexIndex); + aliasRow.max = Math.max(aliasRow.max, indexIndex); + aliasRow.indices[indexIndex] = indices[indexIndex]; + }); + }); + cluster.aliases = aliases; + cluster.nodes = nodes + .filter( nodeFilter_none ) + .sort( this._nodeSort ); + indices.unshift({ name: null }); + this._drawNodesView( cluster, indices ); + this._refreshButton.enable(); + }, + _drawNodesView: function( cluster, indices ) { + this._nodesView && this._nodesView.remove(); + this._nodesView = new ui.NodesView({ + onRedraw: function() { + this.refresh(); + }.bind(this), + interactive: ( this._refreshButton.value === -1 ), + aliasRenderer: this._aliasRenderer, + cluster: this.cluster, + data: { + cluster: cluster, + indices: indices + } + }); + this._nodesView.attach( this.tablEl ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiClusterOverview", children: [ + new ui.Toolbar({ + label: i18n.text("Overview.PageTitle"), + left: [ + this._nodeSortMenu, + this._indicesSortMenu, + this._aliasMenu, + this._indexFilter + ], + right: [ + this._refreshButton + ] + }), + { tag: "DIV", cls: "uiClusterOverview-table" } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/csvTable/csvTable.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/csvTable/csvTable.js new file mode 100644 index 000000000..2daaf5cc6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/csvTable/csvTable.js @@ -0,0 +1,84 @@ +( function( $, app, joey ) { + + var ui = app.ns("ui"); + + var CELL_SEPARATOR = ","; + var CELL_QUOTE = '"'; + var LINE_SEPARATOR = "\r\n"; + + ui.CSVTable = ui.AbstractWidget.extend({ + defaults: { + results: null + }, + _baseCls: "uiCSVTable", + init: function( parent ) { + this._super(); + var results = this.config.results.hits.hits; + var columns = this._parseResults( results ); + this._downloadButton = new ui.Button({ + label: "Generate Download Link", + onclick: this._downloadLinkGenerator_handler + }); + this._downloadLink = $.joey( { tag: "A", text: "download", }); + this._downloadLink.hide(); + this._csvText = this._csv_template( columns, results ); + this.el = $.joey( this._main_template() ); + this.attach( parent ); + }, + _downloadLinkGenerator_handler: function() { + var csvData = new Blob( [ this._csvText ], { type: 'text/csv' }); + var csvURL = URL.createObjectURL( csvData ); + this._downloadLink.attr( "href", csvURL ); + this._downloadLink.show(); + }, + _parseResults: function( results ) { + var columnPaths = {}; + (function parse( path, obj ) { + if( obj instanceof Array ) { + for( var i = 0; i < obj.length; i++ ) { + parse( path, obj[i] ); + } + } else if( typeof obj === "object" ) { + for( var prop in obj ) { + parse( path + "." + prop, obj[ prop ] ); + } + } else { + columnPaths[ path ] = true; + } + })( "root", results ); + var columns = []; + for( var column in columnPaths ) { + columns.push( column.split(".").slice(1) ); + } + return columns; + }, + _main_template: function() { return ( + { tag: "DIV", cls: this._baseCls, id: this.id(), children: [ + this._downloadButton, + this._downloadLink, + { tag: "PRE", text: this._csvText } + ] } + ); }, + _csv_template: function( columns, results ) { + return this._header_template( columns ) + LINE_SEPARATOR + this._results_template( columns, results ); + }, + _header_template: function( columns ) { + return columns.map( function( column ) { + return column.join("."); + }).join( CELL_SEPARATOR ); + }, + _results_template: function( columns, results ) { + return results.map( function( result ) { + return columns.map( function( column ) { + var l = 0, + ptr = result; + while( l !== column.length && ptr != null ) { + ptr = ptr[ column[ l++ ] ]; + } + return ( ptr == null ) ? "" : ( CELL_QUOTE + ptr.toString().replace(/"/g, '""') + CELL_QUOTE ); + }).join( CELL_SEPARATOR ); + }).join( LINE_SEPARATOR ); + } + }); + +})( this.jQuery, this.app, this.joey ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/dateHistogram/dateHistogram.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/dateHistogram/dateHistogram.js new file mode 100644 index 000000000..7c750b604 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/dateHistogram/dateHistogram.js @@ -0,0 +1,104 @@ +(function( app, i18n, raphael ) { + + var ui = app.ns("ui"); + + ui.DateHistogram = ui.AbstractWidget.extend({ + defaults: { + printEl: null, // (optional) if supplied, clicking on elements in the histogram changes the query + cluster: null, // (required) + query: null, // (required) the current query + spec: null // (required) // date field spec + }, + init: function() { + this._super(); + this.el = $(this._main_template()); + this.query = this.config.query.clone(); + // check if the index/types have changed and rebuild the histogram + this.config.query.on("results", function(query) { + if(this.queryChanged) { + this.buildHistogram(query); + this.queryChanged = false; + } + }.bind(this)); + this.config.query.on("setIndex", function(query, params) { + this.query.setIndex(params.index, params.add); + this.queryChanged = true; + }.bind(this)); + this.config.query.on("setType", function(query, params) { + this.query.setType(params.type, params.add); + this.queryChanged = true; + }.bind(this)); + this.query.search.size = 0; + this.query.on("results", this._stat_handler); + this.query.on("results", this._aggs_handler); + this.buildHistogram(); + }, + buildHistogram: function(query) { + this.statAggs = this.query.addAggs({ + stats: { field: this.config.spec.field_name } + }); + this.query.query(); + this.query.removeAggs(this.statAggs); + }, + _stat_handler: function(query, results) { + if(! results.aggregations[this.statAggs]) { return; } + this.stats = results.aggregations[this.statAggs]; + // here we are calculating the approximate range that will give us less than 121 columns + var rangeNames = [ "year", "year", "month", "day", "hour", "minute" ]; + var rangeFactors = [100000, 12, 30, 24, 60, 60000 ]; + this.intervalRange = 1; + var range = this.stats.max - this.stats.min; + do { + this.intervalName = rangeNames.pop(); + var factor = rangeFactors.pop(); + this.intervalRange *= factor; + range = range / factor; + } while(range > 70); + this.dateAggs = this.query.addAggs({ + date_histogram : { + field: this.config.spec.field_name, + interval: this.intervalName + } + }); + this.query.query(); + this.query.removeAggs(this.dateAggs); + }, + _aggs_handler: function(query, results) { + if(! results.aggregations[this.dateAggs]) { return; } + var buckets = [], range = this.intervalRange; + var min = Math.floor(this.stats.min / range) * range; + var prec = [ "year", "month", "day", "hour", "minute", "second" ].indexOf(this.intervalName); + results.aggregations[this.dateAggs].buckets.forEach(function(entry) { + buckets[parseInt((entry.key - min) / range , 10)] = entry.doc_count; + }, this); + for(var i = 0; i < buckets.length; i++) { + buckets[i] = buckets[i] || 0; + } + this.el.removeClass("loading"); + var el = this.el.empty(); + var w = el.width(), h = el.height(); + var r = raphael(el[0], w, h ); + var printEl = this.config.printEl; + query = this.config.query; + r.g.barchart(0, 0, w, h, [buckets], { gutter: "0", vgutter: 0 }).hover( + function() { + this.flag = r.g.popup(this.bar.x, h - 5, this.value || "0").insertBefore(this); + }, function() { + this.flag.animate({opacity: 0}, 200, ">", function () {this.remove();}); + } + ).click(function() { + if(printEl) { + printEl.val(window.dateRangeParser.print(min + this.bar.index * range, prec)); + printEl.trigger("keyup"); + query.query(); + } + }); + }, + _main_template: function() { return ( + { tag: "DIV", cls: "uiDateHistogram loading", css: { height: "50px" }, children: [ + i18n.text("General.LoadingAggs") + ] } + ); } + }); + +})( this.app, this.i18n, this.Raphael );
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/dialogPanel/dialogPanel.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/dialogPanel/dialogPanel.js new file mode 100644 index 000000000..80176fda8 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/dialogPanel/dialogPanel.js @@ -0,0 +1,22 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.DialogPanel = ui.DraggablePanel.extend({ + _commit_handler: function(jEv) { + this.fire("commit", this, { jEv: jEv }); + }, + _main_template: function() { + var t = this._super(); + t.children.push(this._actionsBar_template()); + return t; + }, + _actionsBar_template: function() { + return { tag: "DIV", cls: "pull-right", children: [ + new app.ui.Button({ label: "Cancel", onclick: this._close_handler }), + new app.ui.Button({ label: "OK", onclick: this._commit_handler }) + ]}; + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/draggablePanel/draggablePanel.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/draggablePanel/draggablePanel.js new file mode 100644 index 000000000..ee0a98a14 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/draggablePanel/draggablePanel.js @@ -0,0 +1,42 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.DraggablePanel = ui.AbstractPanel.extend({ + defaults: { + // title: "" // (required) text for the panel title + }, + + _baseCls: "uiPanel", + + init: function() { + this._super(); + this.body = $(this._body_template()); + this.title = $(this._title_template()); + this.el = $.joey( this._main_template() ); + this.el.css( { width: this.config.width } ); + this.dd = new app.ux.DragDrop({ + pickupSelector: this.el.find(".uiPanel-titleBar"), + dragObj: this.el + }); + // open the panel if set in configuration + this.config.open && this.open(); + }, + + setBody: function(body) { + this.body.empty().append(body); + }, + _body_template: function() { return { tag: "DIV", cls: "uiPanel-body", css: { height: this.config.height + (this.config.height === 'auto' ? "" : "px" ) }, children: [ this.config.body ] }; }, + _title_template: function() { return { tag: "SPAN", cls: "uiPanel-title", text: this.config.title }; }, + _main_template: function() { return ( + { tag: "DIV", id: this.id(), cls: this._baseCls, children: [ + { tag: "DIV", cls: "uiPanel-titleBar", children: [ + { tag: "DIV", cls: "uiPanel-close", onclick: this._close_handler, text: "x" }, + this.title + ]}, + this.body + ] } + ); } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.css new file mode 100644 index 000000000..d9acccf3b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.css @@ -0,0 +1,9 @@ +.uiFilterBrowser-row * { + margin-right: 0.4em; +} + +.uiFilterBrowser-row BUTTON { + height: 22px; + position: relative; + top: 1px; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.js new file mode 100644 index 000000000..ca03154d3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.js @@ -0,0 +1,205 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var data = app.ns("data"); + var ut = app.ns("ut"); + + ui.FilterBrowser = ui.AbstractWidget.extend({ + defaults: { + cluster: null, // (required) instanceof app.services.Cluster + index: "" // (required) name of the index to query + }, + + init: function(parent) { + this._super(); + this._cluster = this.config.cluster; + this.el = $(this._main_template()); + this.filtersEl = this.el.find(".uiFilterBrowser-filters"); + this.attach( parent ); + new data.MetaDataFactory({ cluster: this._cluster, onReady: function(metadata, eventData) { + this.metadata = metadata; + this._createFilters_handler(eventData.originalData.metadata.indices); + }.bind(this) }); + }, + + _createFilters_handler: function(data) { + var filters = []; + function scan_properties(path, obj) { + if (obj.properties) { + for (var prop in obj.properties) { + scan_properties(path.concat(prop), obj.properties[prop]); + } + } else { + // handle multi_field + if (obj.fields) { + for (var subField in obj.fields) { + filters.push({ path: (path[path.length - 1] !== subField) ? path.concat(subField) : path, type: obj.fields[subField].type, meta: obj.fields[subField] }); + } + } else { + filters.push({ path: path, type: obj.type, meta: obj }); + } + } + } + for(var type in data[this.config.index].mappings) { + scan_properties([type], data[this.config.index].mappings[type]); + } + + filters.sort( function(a, b) { + var x = a.path.join("."); + var y = b.path.join("."); + return (x < y) ? -1 : (x > y) ? 1 : 0; + }); + + this.filters = [ + { path: ["match_all"], type: "match_all", meta: {} }, + { path: ["_all"], type: "_all", meta: {}} + ].concat(filters); + + this._addFilterRow_handler(); + }, + + _addFilterRow_handler: function() { + this.filtersEl.append(this._filter_template()); + }, + + _removeFilterRow_handler: function(jEv) { + $(jEv.target).closest("DIV.uiFilterBrowser-row").remove(); + if(this.filtersEl.children().length === 0) { + this._addFilterRow_handler(); + } + }, + + _search_handler: function() { + var search = new data.BoolQuery(); + search.setSize( this.el.find(".uiFilterBrowser-outputSize").val() ) + this.fire("startingSearch"); + this.filtersEl.find(".uiFilterBrowser-row").each(function(i, row) { + row = $(row); + var bool = row.find(".bool").val(); + var field = row.find(".field").val(); + var op = row.find(".op").val(); + var value = {}; + if(field === "match_all") { + op = "match_all"; + } else if(op === "range") { + var lowqual = row.find(".lowqual").val(), + highqual = row.find(".highqual").val(); + if(lowqual.length) { + value[row.find(".lowop").val()] = lowqual; + } + if(highqual.length) { + value[row.find(".highop").val()] = highqual; + } + } else if(op === "fuzzy") { + var qual = row.find(".qual").val(), + fuzzyqual = row.find(".fuzzyqual").val(); + if(qual.length) { + value["value"] = qual; + } + if(fuzzyqual.length) { + value[row.find(".fuzzyop").val()] = fuzzyqual; + } + } else { + value = row.find(".qual").val(); + } + search.addClause(value, field, op, bool); + }); + if(this.el.find(".uiFilterBrowser-showSrc").attr("checked")) { + this.fire("searchSource", search.search); + } + this._cluster.post( this.config.index + "/_search", search.getData(), this._results_handler ); + }, + + _results_handler: function( data ) { + var type = this.el.find(".uiFilterBrowser-outputFormat").val(); + this.fire("results", this, { type: type, data: data, metadata: this.metadata }); + }, + + _changeQueryField_handler: function(jEv) { + var select = $(jEv.target); + var spec = select.children(":selected").data("spec"); + select.siblings().remove(".op,.qual,.range,.fuzzy"); + var ops = []; + if(spec.type === 'match_all') { + } else if(spec.type === '_all') { + ops = ["query_string"]; + } else if(spec.type === 'string' || spec.type === 'text' || spec.type === 'keyword') { + ops = ["term", "wildcard", "prefix", "fuzzy", "range", "query_string", "text", "missing"]; + } else if(spec.type === 'long' || spec.type === 'integer' || spec.type === 'float' || + spec.type === 'byte' || spec.type === 'short' || spec.type === 'double') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'date') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'geo_point') { + ops = ["missing"]; + } else if(spec.type === 'ip') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'boolean') { + ops = ["term"] + } + select.after({ tag: "SELECT", cls: "op", onchange: this._changeQueryOp_handler, children: ops.map(ut.option_template) }); + select.next().change(); + }, + + _changeQueryOp_handler: function(jEv) { + var op = $(jEv.target), opv = op.val(); + op.siblings().remove(".qual,.range,.fuzzy"); + if(opv === 'term' || opv === 'wildcard' || opv === 'prefix' || opv === "query_string" || opv === 'text') { + op.after({ tag: "INPUT", cls: "qual", type: "text" }); + } else if(opv === 'range') { + op.after(this._range_template()); + } else if(opv === 'fuzzy') { + op.after(this._fuzzy_template()); + } + }, + + _main_template: function() { + return { tag: "DIV", children: [ + { tag: "DIV", cls: "uiFilterBrowser-filters" }, + { tag: "BUTTON", type: "button", text: i18n.text("General.Search"), onclick: this._search_handler }, + { tag: "LABEL", children: + i18n.complex("FilterBrowser.OutputType", { tag: "SELECT", cls: "uiFilterBrowser-outputFormat", children: [ + { text: i18n.text("Output.Table"), value: "table" }, + { text: i18n.text("Output.JSON"), value: "json" }, + { text: i18n.text("Output.CSV"), value: "csv" } + ].map(function( o ) { return $.extend({ tag: "OPTION" }, o ); } ) } ) + }, + { tag: "LABEL", children: + i18n.complex("FilterBrowser.OutputSize", { tag: "SELECT", cls: "uiFilterBrowser-outputSize", + children: [ "10", "50", "250", "1000", "5000", "25000" ].map( ut.option_template ) + } ) + }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", cls: "uiFilterBrowser-showSrc" }, i18n.text("Output.ShowSource") ] } + ]}; + }, + + _filter_template: function() { + return { tag: "DIV", cls: "uiFilterBrowser-row", children: [ + { tag: "SELECT", cls: "bool", children: ["must", "must_not", "should"].map(ut.option_template) }, + { tag: "SELECT", cls: "field", onchange: this._changeQueryField_handler, children: this.filters.map(function(f) { + return { tag: "OPTION", data: { spec: f }, value: f.path.join("."), text: f.path.join(".") }; + })}, + { tag: "BUTTON", type: "button", text: "+", onclick: this._addFilterRow_handler }, + { tag: "BUTTON", type: "button", text: "-", onclick: this._removeFilterRow_handler } + ]}; + }, + + _range_template: function() { + return { tag: "SPAN", cls: "range", children: [ + { tag: "SELECT", cls: "lowop", children: ["gt", "gte"].map(ut.option_template) }, + { tag: "INPUT", type: "text", cls: "lowqual" }, + { tag: "SELECT", cls: "highop", children: ["lt", "lte"].map(ut.option_template) }, + { tag: "INPUT", type: "text", cls: "highqual" } + ]}; + }, + + _fuzzy_template: function() { + return { tag: "SPAN", cls: "fuzzy", children: [ + { tag: "INPUT", cls: "qual", type: "text" }, + { tag: "SELECT", cls: "fuzzyop", children: ["max_expansions", "min_similarity"].map(ut.option_template) }, + { tag: "INPUT", cls: "fuzzyqual", type: "text" } + ]}; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/header/header.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/header/header.css new file mode 100644 index 000000000..b61badf12 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/header/header.css @@ -0,0 +1,10 @@ +.uiHeader { + padding: 3px 10px; +} + +.uiHeader-name, .uiHeader-status { + font-size: 1.2em; + font-weight: bold; + padding: 0 10px; +} + diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/header/header.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/header/header.js new file mode 100644 index 000000000..a6e1155ec --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/header/header.js @@ -0,0 +1,73 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.Header = ui.AbstractWidget.extend({ + defaults: { + cluster: null, + clusterState: null + }, + _baseCls: "uiHeader", + init: function() { + this._clusterConnect = new ui.ClusterConnect({ + cluster: this.config.cluster + }); + var quicks = [ + { text: i18n.text("Nav.Info"), path: "" }, + { text: i18n.text("Nav.Status"), path: "_stats" }, + { text: i18n.text("Nav.NodeStats"), path: "_nodes/stats" }, + { text: i18n.text("Nav.ClusterNodes"), path: "_nodes" }, + { text: i18n.text("Nav.Plugins"), path: "_nodes/plugins" }, + { text: i18n.text("Nav.ClusterState"), path: "_cluster/state" }, + { text: i18n.text("Nav.ClusterHealth"), path: "_cluster/health" }, + { text: i18n.text("Nav.Templates"), path: "_template" } + ]; + var cluster = this.config.cluster; + var quickPanels = {}; + var menuItems = quicks.map( function( item ) { + return { text: item.text, onclick: function() { + cluster.get( item.path, function( data ) { + quickPanels[ item.path ] && quickPanels[ item.path ].el && quickPanels[ item.path ].remove(); + quickPanels[ item.path ] = new ui.JsonPanel({ + title: item.text, + json: data + }); + } ); + } }; + }, this ); + this._quickMenu = new ui.MenuButton({ + label: i18n.text("NodeInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: menuItems + }) + }); + this.el = $.joey( this._main_template() ); + this.nameEl = this.el.find(".uiHeader-name"); + this.statEl = this.el.find(".uiHeader-status"); + this._clusterState = this.config.clusterState; + this._clusterState.on("data", function( state ) { + var shards = state.status._shards; + var colour = state.clusterHealth.status; + var name = state.clusterState.cluster_name; + this.nameEl.text( name ); + this.statEl + .text( i18n.text("Header.ClusterHealth", colour, shards.successful, shards.total ) ) + .css( "background", colour ); + }.bind(this)); + this.statEl.text( i18n.text("Header.ClusterNotConnected") ).css("background", "grey"); + this._clusterState.refresh(); + }, + _main_template: function() { return ( + { tag: "DIV", cls: this._baseCls, children: [ + this._clusterConnect, + { tag: "SPAN", cls: "uiHeader-name" }, + { tag: "SPAN", cls: "uiHeader-status" }, + { tag: "H1", text: i18n.text("General.Elasticsearch") }, + { tag: "SPAN", cls: "pull-right", children: [ + this._quickMenu + ] } + ] } + ); } + } ); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/helpPanel/helpPanel.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/helpPanel/helpPanel.js new file mode 100644 index 000000000..a76be2dbb --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/helpPanel/helpPanel.js @@ -0,0 +1,21 @@ +(function( app ){ + + var ui = app.ns("ui"); + + ui.HelpPanel = ui.InfoPanel.extend({ + defaults: { + ref: "", + open: true, + autoRemove: true, + modal: false, + width: 500, + height: 450, + title: i18n.text("General.Help") + }, + init: function() { + this._super(); + this.body.append(i18n.text(this.config.ref)); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/indexOverview/indexOverview.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/indexOverview/indexOverview.js new file mode 100644 index 000000000..3eab4f5b4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/indexOverview/indexOverview.js @@ -0,0 +1,115 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.IndexOverview = ui.Page.extend({ + defaults: { + cluster: null + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this._clusterState = this.config.clusterState; + this._clusterState.on("data", this._refresh_handler ); + this.el = $(this._main_template()); + this._refresh_handler(); + }, + remove: function() { + this._clusterState.removeObserver( "data", this._refresh_handler ); + }, + _refresh_handler: function() { + var state = this._clusterState; + var view = { + indices: acx.eachMap( state.status.indices, function( name, index ) { + return { + name: name, + state: index + }; + }).sort( function( a, b ) { + return a.name < b.name ? -1 : 1; + }) + }; + this._indexViewEl && this._indexViewEl.remove(); + this._indexViewEl = $( this._indexTable_template( view ) ); + this.el.find(".uiIndexOverview-table").append( this._indexViewEl ); + }, + _newIndex_handler: function() { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("ClusterOverView.IndexName"), name: "_name", require: true }), + new ui.TextField({ + label: i18n.text("ClusterOverview.NumShards"), + name: "number_of_shards", + value: "5", + require: function( val ) { return parseInt( val, 10 ) >= 1; } + }), + new ui.TextField({ + label: i18n.text("ClusterOverview.NumReplicas"), + name: "number_of_replicas", + value: "1", + require: function( val ) { return parseInt( val, 10 ) >= 0; } + }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("ClusterOverview.NewIndex"), + body: new ui.PanelForm({ fields: fields }), + onCommit: function(panel, args) { + if(fields.validate()) { + var data = fields.getData(); + var name = data["_name"]; + delete data["_name"]; + this.config.cluster.put( encodeURIComponent( name ), JSON.stringify({ settings: { index: data } }), function(d) { + dialog.close(); + alert(JSON.stringify(d)); + this._clusterState.refresh(); + }.bind(this) ); + } + }.bind(this) + }).open(); + }, + _indexTable_template: function( view ) { return ( + { tag: "TABLE", cls: "table", children: [ + { tag: "THEAD", children: [ + { tag: "TR", children: [ + { tag: "TH" }, + { tag: "TH", children: [ + { tag: "H3", text: "Size" } + ] }, + { tag: "TH", children: [ + { tag: "H3", text: "Docs" } + ] } + ] } + ] }, + { tag: "TBODY", cls: "striped", children: view.indices.map( this._index_template, this ) } + ] } + ); }, + + _index_template: function( index ) { return ( + { tag: "TR", children: [ + { tag: "TD", children: [ + { tag: "H3", text: index.name } + ] }, + { tag: "TD", text: ut.byteSize_template( index.state.primaries.store.size_in_bytes ) + "/" + ut.byteSize_template( index.state.total.store.size_in_bytes ) }, + { tag: "TD", text: ut.count_template( index.state.primaries.docs.count ) } + ] } + ); }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiIndexOverview", children: [ + new ui.Toolbar({ + label: i18n.text("IndexOverview.PageTitle"), + left: [ + new ui.Button({ + label: i18n.text("ClusterOverview.NewIndex"), + onclick: this._newIndex_handler + }), + ] + }), + { tag: "DIV", cls: "uiIndexOverview-table", children: this._indexViewEl } + ] }; + } + + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/indexSelector/indexSelector.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/indexSelector/indexSelector.js new file mode 100644 index 000000000..7f51d5f74 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/indexSelector/indexSelector.js @@ -0,0 +1,45 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.IndexSelector = ui.AbstractWidget.extend({ + init: function(parent) { + this._super(); + this.el = $(this._main_template()); + this.attach( parent ); + this.cluster = this.config.cluster; + this.update(); + }, + update: function() { + this.cluster.get( "_stats", this._update_handler ); + }, + + _update_handler: function(data) { + var options = []; + var index_names = Object.keys(data.indices).sort(); + for(var i=0; i < index_names.length; i++) { + name = index_names[i]; + options.push(this._option_template(name, data.indices[name])); + } + this.el.find(".uiIndexSelector-select").empty().append(this._select_template(options)); + this._indexChanged_handler(); + }, + + _main_template: function() { + return { tag: "DIV", cls: "uiIndexSelector", children: i18n.complex( "IndexSelector.SearchIndexForDocs", { tag: "SPAN", cls: "uiIndexSelector-select" } ) }; + }, + + _indexChanged_handler: function() { + this.fire("indexChanged", this.el.find("SELECT").val()); + }, + + _select_template: function(options) { + return { tag: "SELECT", children: options, onChange: this._indexChanged_handler }; + }, + + _option_template: function(name, index) { + return { tag: "OPTION", value: name, text: i18n.text("IndexSelector.NameWithDocs", name, index.primaries.docs.count ) }; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.css new file mode 100644 index 000000000..7d4a86c79 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.css @@ -0,0 +1,38 @@ + +.uiInfoPanel { + background: rgba(0, 0, 0, 0.75); + color: white; + border-radius: 8px; + padding: 1px; +} +.uiInfoPanel .uiPanel-titleBar { + background: rgba(74, 74, 74, 0.75); + background: -moz-linear-gradient(top, rgba(84, 84, 84, 0.75), rgba(54, 54, 54, 0.75), rgba(64, 64, 64, 0.75)); + background: -webkit-linear-gradient(top, rgba(84, 84, 84, 0.75), rgba(54, 54, 54, 0.75), rgba(64, 64, 64, 0.75)); + border-radius: 8px 8px 0 0; + padding: 1px 0 2px 0; + border-bottom: 0; +} +.uiInfoPanel .uiPanel-close { + border-radius: 6px; + height: 13px; + width: 13px; + background: #ccc; + left: 3px; + top: 1px; + color: #333; + text-shadow: #222 0 0 1px; + line-height: 11px; + border: 0; + padding: 0; +} +.uiInfoPanel .uiPanel-close:hover { + background: #eee; +} + +.uiInfoPanel .uiPanel-body { + background: transparent; + padding: 20px; + border-radius: 0 0 8px 8px; + border: 1px solid #222; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.js new file mode 100644 index 000000000..db2440074 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.js @@ -0,0 +1,9 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.InfoPanel = ui.DraggablePanel.extend({ + _baseCls: "uiPanel uiInfoPanel" + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.css new file mode 100644 index 000000000..20aff8817 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.css @@ -0,0 +1,4 @@ +.uiJsonPanel SPAN.uiJsonPretty-string { color: #6F6; } +.uiJsonPanel SPAN.uiJsonPretty-number { color: #66F; } +.uiJsonPanel SPAN.uiJsonPretty-null { color: #F66; } +.uiJsonPanel SPAN.uiJsonPretty-boolean { color: #F6F; } diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.js new file mode 100644 index 000000000..4e83baade --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.js @@ -0,0 +1,24 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.JsonPanel = ui.InfoPanel.extend({ + defaults: { + json: null, // (required) + modal: false, + open: true, + autoRemove: true, + height: 500, + width: 600 + }, + + _baseCls: "uiPanel uiInfoPanel uiJsonPanel", + + _body_template: function() { + var body = this._super(); + body.children = [ new ui.JsonPretty({ obj: this.config.json }) ]; + return body; + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.css new file mode 100644 index 000000000..7a1a0ba62 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.css @@ -0,0 +1,22 @@ +DIV.uiJsonPretty-object { font-size: 1.26em; font-family: monospace; } +UL.uiJsonPretty-object, +UL.uiJsonPretty-array { margin: 0; padding: 0 0 0 2em; list-style: none; } +UL.uiJsonPretty-object LI, +UL.uiJsonPretty-array LI { padding: 0; margin: 0; } +.expando > SPAN.uiJsonPretty-name:before { content: "\25bc\a0"; color: #555; position: relative; top: 2px; } +.expando.uiJsonPretty-minimised > SPAN.uiJsonPretty-name:before { content: "\25ba\a0"; top: 0; } +.uiJsonPretty-minimised > UL SPAN.uiJsonPretty-name:before, +.expando .uiJsonPretty-minimised > UL SPAN.uiJsonPretty-name:before { content: ""; } +SPAN.uiJsonPretty-string, +SPAN.uiJsonPretty-string A { color: green; } +SPAN.uiJsonPretty-string A { text-decoration: underline;} +SPAN.uiJsonPretty-number { color: blue; } +SPAN.uiJsonPretty-null { color: red; } +SPAN.uiJsonPretty-boolean { color: purple; } +.expando > .uiJsonPretty-name { cursor: pointer; } +.expando > .uiJsonPretty-name:hover { text-decoration: underline; } +.uiJsonPretty-minimised { white-space: nowrap; overflow: hidden; } +.uiJsonPretty-minimised > UL { opacity: 0.6; } +.uiJsonPretty-minimised .uiJsonPretty-minimised > UL { opacity: 1; } +.uiJsonPretty-minimised UL, .uiJsonPretty-minimised LI { display: inline; padding: 0; } + diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.js new file mode 100644 index 000000000..76820bb39 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.js @@ -0,0 +1,89 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.JsonPretty = ui.AbstractWidget.extend({ + defaults: { + obj: null + }, + init: function(parent) { + this._super(); + this.el = $(this._main_template()); + this.attach(parent); + this.el.click(this._click_handler); + }, + + _click_handler: function(jEv) { + var t = $(jEv.target).closest(".uiJsonPretty-name").closest("LI"); + if(t.length === 0 || t.parents(".uiJsonPretty-minimised").length > 0) { return; } + t.toggleClass("uiJsonPretty-minimised"); + jEv.stopPropagation(); + }, + + _main_template: function() { + try { + return { tag: "DIV", cls: "uiJsonPretty", children: this.pretty.parse(this.config.obj) }; + } catch (error) { + throw "JsonPretty error: " + error.message; + } + }, + + pretty: { // from https://github.com/RyanAmos/Pretty-JSON/blob/master/pretty_json.js + "expando" : function(value) { + return (value && (/array|object/i).test(value.constructor.name)) ? "expando" : ""; + }, + "parse": function (member) { + return this[(member == null) ? 'null' : member.constructor.name.toLowerCase()](member); + }, + "null": function (value) { + return this['value']('null', 'null'); + }, + "array": function (value) { + var results = []; + var lastItem = value.length - 1; + value.forEach(function( v, i ) { + results.push({ tag: "LI", cls: this.expando(v), children: [ this['parse'](v) ] }); + if( i !== lastItem ) { + results.push(","); + } + }, this); + return [ "[ ", ((results.length > 0) ? { tag: "UL", cls: "uiJsonPretty-array", children: results } : null), "]" ]; + }, + "object": function (value) { + var results = []; + var keys = Object.keys( value ); + var lastItem = keys.length - 1; + keys.forEach( function( key, i ) { + var children = [ this['value']( 'name', '"' + key + '"' ), ": ", this['parse']( value[ key ]) ]; + if( i !== lastItem ) { + children.push(","); + } + results.push( { tag: "LI", cls: this.expando( value[ key ] ), children: children } ); + }, this); + return [ "{ ", ((results.length > 0) ? { tag: "UL", cls: "uiJsonPretty-object", children: results } : null ), "}" ]; + }, + "number": function (value) { + return this['value']('number', value.toString()); + }, + "string": function (value) { + if (/^(http|https|file):\/\/[^\s]+$/.test(value)) { + return this['link']( value ); + } else { + return this['value']('string', '"' + value.toString() + '"'); + } + }, + "boolean": function (value) { + return this['value']('boolean', value.toString()); + }, + "link": function( value ) { + return this['value']("string", { tag: "A", href: value, target: "_blank", text: '"' + value + '"' } ); + }, + "value": function (type, value) { + if (/^(http|https|file):\/\/[^\s]+$/.test(value)) { + } + return { tag: "SPAN", cls: "uiJsonPretty-" + type, text: value }; + } + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.css new file mode 100644 index 000000000..21c36bc59 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.css @@ -0,0 +1,11 @@ +.uiMenuButton { + display: inline-block; +} + +.uiMenuButton .uiButton-label { + background-image: url('data:image/gif;base64,R0lGODlhDwAPAIABAP///////yH5BAEAAAEALAAAAAAPAA8AAAITjI+py+0P4wG0gmavq1HLD4ZiAQA7'); + background-position: right 50%; + background-repeat: no-repeat; + padding-right: 17px; + text-align: left; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.js new file mode 100644 index 000000000..aa7fc8a84 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.js @@ -0,0 +1,22 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.MenuButton = app.ui.Button.extend({ + defaults: { + menu: null + }, + _baseCls: "uiButton uiMenuButton", + init: function(parent) { + this._super(parent); + this.menu = this.config.menu; + this.on("click", this.openMenu_handler); + this.menu.on("open", function() { this.el.addClass("active"); }.bind(this)); + this.menu.on("close", function() { this.el.removeClass("active"); }.bind(this)); + }, + openMenu_handler: function(jEv) { + this.menu && this.menu.open(jEv); + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.css new file mode 100644 index 000000000..8236a856f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.css @@ -0,0 +1,30 @@ +.uiMenuPanel { + border: 1px solid #668dc6; + position: absolute; + background: #96c6eb; + color: white; +} + +.uiMenuPanel LI { + list-style: none; + border-bottom: 1px solid #668dc6; +} + +.uiMenuPanel LI:hover { + background: #2575b7; +} + +.uiMenuPanel LI:last-child { + border-bottom: 0; +} + +.uiMenuPanel-label { + white-space: nowrap; + padding: 2px 10px 2px 10px; + cursor: pointer; +} + +.disabled .uiMenuPanel-label { + cursor: auto; + color: #888; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.js new file mode 100644 index 000000000..631ea5b4c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.js @@ -0,0 +1,43 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.MenuPanel = ui.AbstractPanel.extend({ + defaults: { + items: [], // (required) an array of menu items + modal: false + }, + _baseCls: "uiMenuPanel", + init: function() { + this._super(); + this.el = $(this._main_template()); + }, + open: function(jEv) { + this._super(jEv); + var cx = this; setTimeout(function() { $(document).bind("click", cx._close_handler); }, 50); + }, + _getItems: function() { + return this.config.items; + }, + _close_handler: function(jEv) { + this._super(jEv); + $(document).unbind("click", this._close_handler); + }, + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: this._getItems().map(this._menuItem_template, this) }; + }, + _menuItem_template: function(item) { + var dx = item.disabled ? { onclick: function() {} } : {}; + return { tag: "LI", cls: "uiMenuPanel-item" + (item.disabled ? " disabled" : "") + (item.selected ? " selected" : ""), children: [ $.extend({ tag: "DIV", cls: "uiMenuPanel-label" }, item, dx ) ] }; + }, + _getPosition: function(jEv) { + var right = !! $(jEv.target).parents(".pull-right").length; + var parent = $(jEv.target).closest("BUTTON"); + return parent.vOffset() + .addY(parent.vSize().y) + .addX( right ? parent.vSize().x - this.el.vOuterSize().x : 0 ) + .asOffset(); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.css new file mode 100644 index 000000000..e7a7778f3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.css @@ -0,0 +1,88 @@ +.uiNodesView TH, +.uiNodesView TD { + vertical-align: top; + padding: 2px 20px; +} + +.uiNodesView TH.close, +.uiNodesView TD.close { + color: #888; + background: #f2f2f2; +} + +.uiNodesView .uiMenuButton .uiButton-content { + padding-right: 3px; + border-radius: 8px; + height: 14px; +} + +.uiNodesView .uiMenuButton.active .uiButton-content, +.uiNodesView .uiMenuButton:active .uiButton-content { + border-bottom-right-radius: 0px; + border-bottom-left-radius: 0px; +} + +.uiNodesView .uiMenuButton .uiButton-label { + padding: 0px 17px 0px 7px; +} + +.uiNodesView-hasAlias { + text-align: center; +} +.uiNodesView-hasAlias.max { + border-top-right-radius: 8px; + border-bottom-right-radius: 8px; +} +.uiNodesView-hasAlias.min { + border-top-left-radius: 8px; + border-bottom-left-radius: 8px; +} +.uiNodesView-hasAlias-remove { + float: right; + font-weight: bold; + cursor: pointer; +} + +.uiNodesView TD.uiNodesView-icon { + padding: 20px 0px 15px 20px; +} + +.uiNodesView-node:nth-child(odd) { + background: #eee; +} + +.uiNodesView-routing { + position: relative; + min-width: 90px; +} + +.uiNodesView-nullReplica, +.uiNodesView-replica { + box-sizing: border-box; + cursor: pointer; + float: left; + height: 40px; + width: 35px; + margin: 4px; + border: 2px solid #444; + padding: 2px; + font-size: 32px; + line-height: 32px; + text-align: center; + letter-spacing: -5px; + text-indent: -7px; +} + +.uiNodesView-replica.primary { + border-width: 4px; + line-height: 29px; +} + +.uiNodesView-nullReplica { + border-color: transparent; +} + +.uiNodesView-replica.state-UNASSIGNED { background: #eeeeee; color: #999; border-color: #666; float: none; display: inline-block; } +.uiNodesView-replica.state-INITIALIZING { background: #dddc88; } +.uiNodesView-replica.state-STARTED { background: #99dd88; } +.uiNodesView-replica.state-RELOCATING { background: #dc88dd; } diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.js new file mode 100644 index 000000000..08ce1d301 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.js @@ -0,0 +1,277 @@ +(function( app, i18n, joey ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.NodesView = ui.AbstractWidget.extend({ + defaults: { + interactive: true, + aliasRenderer: "list", + scaleReplicas: 1, + cluster: null, + data: null + }, + init: function() { + this._super(); + this.interactive = this.config.interactive; + this.cluster = this.config.cluster; + this._aliasRenderFunction = { + "none": this._aliasRender_template_none, + "list": this._aliasRender_template_list, + "full": this._aliasRender_template_full + }[ this.config.aliasRenderer ]; + this._styleSheetEl = joey({ tag: "STYLE", text: ".uiNodesView-nullReplica, .uiNodesView-replica { zoom: " + this.config.scaleReplicas + " }" }); + this.el = $( this._main_template( this.config.data.cluster, this.config.data.indices ) ); + }, + + _newAliasAction_handler: function( index ) { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("AliasForm.AliasName"), name: "alias", require: true }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("AliasForm.NewAliasForIndexName", index.name), + body: new ui.PanelForm({ fields: fields }), + onCommit: function(panel, args) { + if(fields.validate()) { + var data = fields.getData(); + var command = { + "actions" : [ + { "add" : { "index" : index.name, "alias" : data["alias"] } } + ] + }; + this.config.cluster.post('_aliases', JSON.stringify(command), function(d) { + dialog.close(); + alert(JSON.stringify(d)); + this.fire("redraw"); + }.bind(this) ); + } + }.bind(this) + }).open(); + }, + _postIndexAction_handler: function(action, index, redraw) { + this.cluster.post(encodeURIComponent( index.name ) + "/" + encodeURIComponent( action ), null, function(r) { + alert(JSON.stringify(r)); + redraw && this.fire("redraw"); + }.bind(this)); + }, + _optimizeIndex_handler: function(index) { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("OptimizeForm.MaxSegments"), name: "max_num_segments", value: "1", require: true }), + new ui.CheckField({ label: i18n.text("OptimizeForm.ExpungeDeletes"), name: "only_expunge_deletes", value: false }), + new ui.CheckField({ label: i18n.text("OptimizeForm.FlushAfter"), name: "flush", value: true }), + new ui.CheckField({ label: i18n.text("OptimizeForm.WaitForMerge"), name: "wait_for_merge", value: false }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("OptimizeForm.OptimizeIndex", index.name), + body: new ui.PanelForm({ fields: fields }), + onCommit: function( panel, args ) { + if(fields.validate()) { + this.cluster.post(encodeURIComponent( index.name ) + "/_optimize", fields.getData(), function(r) { + alert(JSON.stringify(r)); + }); + dialog.close(); + } + }.bind(this) + }).open(); + }, + _testAnalyser_handler: function(index) { + this.cluster.get(encodeURIComponent( index.name ) + "/_analyze?text=" + encodeURIComponent( prompt( i18n.text("IndexCommand.TextToAnalyze") ) ), function(r) { + alert(JSON.stringify(r, true, " ")); + }); + }, + _deleteIndexAction_handler: function(index) { + if( prompt( i18n.text("AliasForm.DeleteAliasMessage", i18n.text("Command.DELETE"), index.name ) ) === i18n.text("Command.DELETE") ) { + this.cluster["delete"](encodeURIComponent( index.name ), null, function(r) { + alert(JSON.stringify(r)); + this.fire("redraw"); + }.bind(this) ); + } + }, + _shutdownNode_handler: function(node) { + if(prompt( i18n.text("IndexCommand.ShutdownMessage", i18n.text("Command.SHUTDOWN"), node.cluster.name ) ) === i18n.text("Command.SHUTDOWN") ) { + this.cluster.post( "_cluster/nodes/" + encodeURIComponent( node.name ) + "/_shutdown", null, function(r) { + alert(JSON.stringify(r)); + this.fire("redraw"); + }.bind(this)); + } + }, + _deleteAliasAction_handler: function( index, alias ) { + if( confirm( i18n.text("Command.DeleteAliasMessage" ) ) ) { + var command = { + "actions" : [ + { "remove" : { "index" : index.name, "alias" : alias.name } } + ] + }; + this.config.cluster.post('_aliases', JSON.stringify(command), function(d) { + alert(JSON.stringify(d)); + this.fire("redraw"); + }.bind(this) ); + } + }, + + _replica_template: function(replica) { + var r = replica.replica; + return { tag: "DIV", + cls: "uiNodesView-replica" + (r.primary ? " primary" : "") + ( " state-" + r.state ), + text: r.shard.toString(), + onclick: function() { new ui.JsonPanel({ + json: replica.status || r, + title: r.index + "/" + r.node + " [" + r.shard + "]" }); + } + }; + }, + _routing_template: function(routing) { + var cell = { tag: "TD", cls: "uiNodesView-routing" + (routing.open ? "" : " close"), children: [] }; + for(var i = 0; i < routing.replicas.length; i++) { + if(i % routing.max_number_of_shards === 0 && i > 0) { + cell.children.push({ tag: "BR" }); + } + if( routing.replicas[i] ) { + cell.children.push(this._replica_template(routing.replicas[i])); + } else { + cell.children.push( { tag: "DIV", cls: "uiNodesView-nullReplica" } ); + } + } + return cell; + }, + _nodeControls_template: function( node ) { return ( + { tag: "DIV", cls: "uiNodesView-controls", children: [ + new ui.MenuButton({ + label: i18n.text("NodeInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("NodeInfoMenu.ClusterNodeInfo"), onclick: function() { new ui.JsonPanel({ json: node.cluster, title: node.name });} }, + { text: i18n.text("NodeInfoMenu.NodeStats"), onclick: function() { new ui.JsonPanel({ json: node.stats, title: node.name });} } + ] + }) + }), + new ui.MenuButton({ + label: i18n.text("NodeActionsMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("NodeActionsMenu.Shutdown"), onclick: function() { this._shutdownNode_handler(node); }.bind(this) } + ] + }) + }) + ] } + ); }, + _nodeIcon_template: function( node ) { + var icon, alt; + if( node.name === "Unassigned" ) { + icon = "fa-exclamation-triangle"; + alt = i18n.text( "NodeType.Unassigned" ); + } else if( node.cluster.settings && "tribe" in node.cluster.settings) { + icon = "fa-sitemap"; + alt = i18n.text("NodeType.Tribe" ); + } else { + icon = "fa-" + (node.master_node ? "star" : "circle") + (node.data_node ? "" : "-o" ); + alt = i18n.text( node.master_node ? ( node.data_node ? "NodeType.Master" : "NodeType.Coord" ) : ( node.data_node ? "NodeType.Worker" : "NodeType.Client" ) ); + } + return { tag: "TD", title: alt, cls: "uiNodesView-icon", children: [ + { tag: "SPAN", cls: "fa fa-2x " + icon } + ] }; + }, + _node_template: function(node) { + return { tag: "TR", cls: "uiNodesView-node" + (node.master_node ? " master": ""), children: [ + this._nodeIcon_template( node ), + { tag: "TH", children: node.name === "Unassigned" ? [ + { tag: "H3", text: node.name } + ] : [ + { tag: "H3", text: node.cluster.name }, + { tag: "DIV", text: node.cluster.hostname }, + this.interactive ? this._nodeControls_template( node ) : null + ] } + ].concat(node.routings.map(this._routing_template, this))}; + }, + _indexHeaderControls_template: function( index ) { return ( + { tag: "DIV", cls: "uiNodesView-controls", children: [ + new ui.MenuButton({ + label: i18n.text("IndexInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("IndexInfoMenu.Status"), onclick: function() { new ui.JsonPanel({ json: index.status, title: index.name }); } }, + { text: i18n.text("IndexInfoMenu.Metadata"), onclick: function() { new ui.JsonPanel({ json: index.metadata, title: index.name }); } } + ] + }) + }), + new ui.MenuButton({ + label: i18n.text("IndexActionsMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("IndexActionsMenu.NewAlias"), onclick: function() { this._newAliasAction_handler(index); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Refresh"), onclick: function() { this._postIndexAction_handler("_refresh", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Flush"), onclick: function() { this._postIndexAction_handler("_flush", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Optimize"), onclick: function () { this._optimizeIndex_handler(index); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Snapshot"), disabled: closed, onclick: function() { this._postIndexAction_handler("_gateway/snapshot", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Analyser"), onclick: function() { this._testAnalyser_handler(index); }.bind(this) }, + { text: (index.state === "close") ? i18n.text("IndexActionsMenu.Open") : i18n.text("IndexActionsMenu.Close"), onclick: function() { this._postIndexAction_handler((index.state === "close") ? "_open" : "_close", index, true); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Delete"), onclick: function() { this._deleteIndexAction_handler(index); }.bind(this) } + ] + }) + }) + ] } + ); }, + _indexHeader_template: function( index ) { + var closed = index.state === "close"; + var line1 = closed ? "index: close" : ( "size: " + (index.status && index.status.primaries && index.status.total ? ut.byteSize_template( index.status.primaries.store.size_in_bytes ) + " (" + ut.byteSize_template( index.status.total.store.size_in_bytes ) + ")" : "unknown" ) ); + var line2 = closed ? "\u00A0" : ( "docs: " + (index.status && index.status.primaries && index.status.primaries.docs && index.status.total && index.status.total.docs ? index.status.primaries.docs.count.toLocaleString() + " (" + (index.status.total.docs.count + index.status.total.docs.deleted).toLocaleString() + ")" : "unknown" ) ); + return index.name ? { tag: "TH", cls: (closed ? "close" : ""), children: [ + { tag: "H3", text: index.name }, + { tag: "DIV", text: line1 }, + { tag: "DIV", text: line2 }, + this.interactive ? this._indexHeaderControls_template( index ) : null + ] } : [ { tag: "TD" }, { tag: "TH" } ]; + }, + _aliasRender_template_none: function( cluster, indices ) { + return null; + }, + _aliasRender_template_list: function( cluster, indices ) { + return cluster.aliases.length && { tag: "TBODY", children: [ + { tag: "TR", children: [ + { tag: "TD" } + ].concat( indices.map( function( index ) { + return { tag: "TD", children: index.metadata && index.metadata.aliases.map( function( alias ) { + return { tag: "LI", text: alias }; + } ) }; + })) } + ] }; + }, + _aliasRender_template_full: function( cluster, indices ) { + return cluster.aliases.length && { tag: "TBODY", children: cluster.aliases.map( function(alias, row) { + return { tag: "TR", children: [ { tag: "TD" },{ tag: "TD" } ].concat(alias.indices.map(function(index, i) { + if (index) { + return { + tag: "TD", + css: { background: "#" + "9ce9c7fc9".substr((row+6)%7,3) }, + cls: "uiNodesView-hasAlias" + ( alias.min === i ? " min" : "" ) + ( alias.max === i ? " max" : "" ), + text: alias.name, + children: this.interactive ? [ + { tag: 'SPAN', + text: i18n.text("General.CloseGlyph"), + cls: 'uiNodesView-hasAlias-remove', + onclick: this._deleteAliasAction_handler.bind( this, index, alias ) + } + ]: null + }; + } else { + return { tag: "TD" }; + } + }, this ) ) }; + }, this ) }; + }, + _main_template: function(cluster, indices) { + return { tag: "TABLE", cls: "table uiNodesView", children: [ + this._styleSheetEl, + { tag: "THEAD", children: [ { tag: "TR", children: indices.map(this._indexHeader_template, this) } ] }, + this._aliasRenderFunction( cluster, indices ), + { tag: "TBODY", children: cluster.nodes.map(this._node_template, this) } + ] }; + } + + }); + +})( this.app, this.i18n, this.joey ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesViewDemo.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesViewDemo.js new file mode 100644 index 000000000..9049163b0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesViewDemo.js @@ -0,0 +1,17 @@ +$( function() { + + var ui = window.app.ns("ui"); + + var data = { + "cluster":{"nodes":[{"name":"cqTmT9GLSlSWx-B7pvM--w","routings":[{"name":"_river","replicas":[],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[null,{"replica":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_01"},"status":{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":10328420,"max_doc":10329720,"deleted_docs":4},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"643ms","total_time_in_millis":643}}}],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[null,{"replica":{"state":"STARTED","primary":false,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":false,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"75ms","total_time_in_millis":75}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[null,{"replica":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"status":{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"86ms","total_time_in_millis":86}}}],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346979,"name":"Elathan","transport_address":"inet[/127.0.0.1:9301]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"277b","size_in_bytes":277,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":0,"index_time":"0s","index_time_in_millis":0,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":6,"query_time":"19ms","query_time_in_millis":19,"query_current":0,"fetch_total":0,"fetch_time":"0s","fetch_time_in_millis":0,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":10,"total_time":"0s","total_time_in_millis":0},"flush":{"total":186,"total_time":"9.1s","total_time_in_millis":9191},"warmer":{"current":0,"total":3,"total_time":"6ms","total_time_in_millis":6},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346979,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4065169408,"used":"4.2gb","used_in_bytes":4524765184,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4426321920,"actual_used":"3.8gb","actual_used_in_bytes":4163612672},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346979,"open_file_descriptors":266,"cpu":{"percent":0,"sys":"2.8m","sys_in_millis":172614,"user":"2.3m","user_in_millis":142295,"total":"5.2m","total_in_millis":314909},"mem":{"resident":"21.6mb","resident_in_bytes":22728704,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3900530688}},"jvm":{"timestamp":1381790346980,"uptime":"4d","uptime_in_millis":349028405,"mem":{"heap_used":"31.3mb","heap_used_in_bytes":32851896,"heap_committed":"265.5mb","heap_committed_in_bytes":278462464,"non_heap_used":"39.3mb","non_heap_used_in_bytes":41210896,"non_heap_committed":"63.7mb","non_heap_committed_in_bytes":66809856,"pools":{"Code Cache":{"used":"2mb","used_in_bytes":2120704,"max":"48mb","max_in_bytes":50331648,"peak_used":"2mb","peak_used_in_bytes":2131520,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"24mb","used_in_bytes":25224136,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"27mb","peak_used_in_bytes":28311552,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"816.5kb","used_in_bytes":836128,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"6.4mb","used_in_bytes":6791632,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"8.2mb","peak_used_in_bytes":8653824,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"37.2mb","used_in_bytes":39090192,"max":"82mb","max_in_bytes":85983232,"peak_used":"37.2mb","peak_used_in_bytes":39090192,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":51,"peak_count":56},"gc":{"collection_count":43,"collection_time":"374ms","collection_time_in_millis":374,"collectors":{"ParNew":{"collection_count":41,"collection_time":"374ms","collection_time_in_millis":374},"ConcurrentMarkSweep":{"collection_count":2,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":3,"completed":7505},"index":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"merge":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":16},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":188},"search":{"threads":6,"queue":0,"active":0,"rejected":0,"largest":6,"completed":6},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":5,"queue":0,"active":1,"rejected":0,"largest":5,"completed":8593},"refresh":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438878,"out_segs":7330495,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790347004,"data":[{"path":"/var/elasticsearch/es2/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231241613312,"available":"215.1gb","available_in_bytes":230979469312,"disk_reads":2641856,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593427456,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":155197,"rx_size":"6.9mb","rx_size_in_bytes":7339947,"tx_count":155195,"tx_size":"11.6mb","tx_size_in_bytes":12251491},"http":{"current_open":0,"total_opened":0}},"cluster":{"name":"Elathan","transport_address":"inet[/127.0.0.1:9301]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9203]"}},{"name":"jw4owU-ZQgOYdM7ElauDTg","routings":[{"name":"_river","replicas":[],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[null,{"replica":{"state":"STARTED","primary":false,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":1,"index":"ag_01"},"status":{"routing":{"state":"STARTED","primary":false,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"194ms","total_time_in_millis":194}}}],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[{"replica":{"state":"STARTED","primary":true,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":0,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":true,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"107ms","total_time_in_millis":107}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346963,"name":"Numinus","transport_address":"inet[/127.0.0.1:9303]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"178b","size_in_bytes":178,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":2,"index_time":"50ms","index_time_in_millis":50,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":12,"query_time":"32ms","query_time_in_millis":32,"query_current":0,"fetch_total":0,"fetch_time":"0s","fetch_time_in_millis":0,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":9,"total_time":"66ms","total_time_in_millis":66},"flush":{"total":218,"total_time":"5.6s","total_time_in_millis":5697},"warmer":{"current":0,"total":2,"total_time":"4ms","total_time_in_millis":4},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346963,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4058091520,"used":"4.2gb","used_in_bytes":4531843072,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4419244032,"actual_used":"3.8gb","actual_used_in_bytes":4170690560},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346963,"open_file_descriptors":264,"cpu":{"percent":0,"sys":"2.9m","sys_in_millis":174208,"user":"2.3m","user_in_millis":139440,"total":"5.2m","total_in_millis":313648},"mem":{"resident":"27.2mb","resident_in_bytes":28606464,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3903823872}},"jvm":{"timestamp":1381790346978,"uptime":"4d","uptime_in_millis":349026382,"mem":{"heap_used":"12.8mb","heap_used_in_bytes":13428352,"heap_committed":"265.5mb","heap_committed_in_bytes":278462464,"non_heap_used":"39.8mb","non_heap_used_in_bytes":41791784,"non_heap_committed":"55.2mb","non_heap_committed_in_bytes":57950208,"pools":{"Code Cache":{"used":"1.9mb","used_in_bytes":2065280,"max":"48mb","max_in_bytes":50331648,"peak_used":"1.9mb","peak_used_in_bytes":2074880,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"2.4mb","used_in_bytes":2564176,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"27mb","peak_used_in_bytes":28311552,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"646.5kb","used_in_bytes":662048,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2.8mb","peak_used_in_bytes":3029584,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"9.7mb","used_in_bytes":10202128,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"9.7mb","peak_used_in_bytes":10202128,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"37.8mb","used_in_bytes":39726504,"max":"82mb","max_in_bytes":85983232,"peak_used":"37.8mb","peak_used_in_bytes":39726504,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":60,"peak_count":66},"gc":{"collection_count":42,"collection_time":"512ms","collection_time_in_millis":512,"collectors":{"ParNew":{"collection_count":40,"collection_time":"512ms","collection_time_in_millis":512},"ConcurrentMarkSweep":{"collection_count":2,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":3,"completed":7490},"index":{"threads":2,"queue":0,"active":0,"rejected":0,"largest":2,"completed":2},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":18},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":221},"search":{"threads":12,"queue":0,"active":0,"rejected":0,"largest":12,"completed":12},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":3,"queue":0,"active":1,"rejected":0,"largest":5,"completed":8597},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438878,"out_segs":7330495,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790346992,"data":[{"path":"/var/elasticsearch/es4/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231241613312,"available":"215.1gb","available_in_bytes":230979469312,"disk_reads":2641856,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593427456,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":155179,"rx_size":"7mb","rx_size_in_bytes":7341687,"tx_count":155177,"tx_size":"11.6mb","tx_size_in_bytes":12249878},"http":{"current_open":0,"total_opened":0}},"cluster":{"name":"Numinus","transport_address":"inet[/127.0.0.1:9303]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9202]"}},{"name":"SwCmq0QKQuShZcJAbuW8OQ","routings":[{"name":"_river","replicas":[{"replica":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"_river"},"status":{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"_river"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1380240228838,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":62,"total_time":"1.6s","total_time_in_millis":1632}}}],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[{"replica":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"ag_01"},"status":{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"216ms","total_time_in_millis":216}}}],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[null,null,{"replica":{"state":"STARTED","primary":true,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":2,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":true,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"17ms","total_time_in_millis":17}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346944,"name":"Ameridroid","transport_address":"inet[/127.0.0.1:9305]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"257b","size_in_bytes":257,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":6,"index_time":"64ms","index_time_in_millis":64,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":12,"query_time":"27ms","query_time_in_millis":27,"query_current":0,"fetch_total":0,"fetch_time":"0s","fetch_time_in_millis":0,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":10,"total_time":"113ms","total_time_in_millis":113},"flush":{"total":241,"total_time":"5.5s","total_time_in_millis":5553},"warmer":{"current":0,"total":3,"total_time":"4ms","total_time_in_millis":4},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346944,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4059074560,"used":"4.2gb","used_in_bytes":4530860032,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4419702784,"actual_used":"3.8gb","actual_used_in_bytes":4170231808},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346944,"open_file_descriptors":266,"cpu":{"percent":0,"sys":"2.8m","sys_in_millis":171912,"user":"2.3m","user_in_millis":143905,"total":"5.2m","total_in_millis":315817},"mem":{"resident":"30.4mb","resident_in_bytes":31936512,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3905077248}},"jvm":{"timestamp":1381790346944,"uptime":"4d","uptime_in_millis":349024271,"mem":{"heap_used":"16.6mb","heap_used_in_bytes":17485968,"heap_committed":"253.9mb","heap_committed_in_bytes":266272768,"non_heap_used":"39.7mb","non_heap_used_in_bytes":41733256,"non_heap_committed":"40.4mb","non_heap_committed_in_bytes":42405888,"pools":{"Code Cache":{"used":"1.9mb","used_in_bytes":2018624,"max":"48mb","max_in_bytes":50331648,"peak_used":"1.9mb","peak_used_in_bytes":2029504,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"5.9mb","used_in_bytes":6242912,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"16.6mb","peak_used_in_bytes":17432576,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"489.7kb","used_in_bytes":501496,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"10.2mb","used_in_bytes":10741560,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"10.2mb","peak_used_in_bytes":10741560,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"37.8mb","used_in_bytes":39714632,"max":"82mb","max_in_bytes":85983232,"peak_used":"37.8mb","peak_used_in_bytes":39714632,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":63,"peak_count":70},"gc":{"collection_count":61,"collection_time":"533ms","collection_time_in_millis":533,"collectors":{"ParNew":{"collection_count":61,"collection_time":"533ms","collection_time_in_millis":533},"ConcurrentMarkSweep":{"collection_count":0,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":4,"completed":7504},"index":{"threads":4,"queue":0,"active":0,"rejected":0,"largest":4,"completed":6},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":4},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":4},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":23},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":241},"search":{"threads":12,"queue":0,"active":0,"rejected":0,"largest":12,"completed":12},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":4,"queue":0,"active":1,"rejected":0,"largest":5,"completed":10284},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":4}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438844,"out_segs":7330461,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790346959,"data":[{"path":"/var/elasticsearch/es6/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231240040448,"available":"215.1gb","available_in_bytes":230977896448,"disk_reads":2641849,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593058816,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":156880,"rx_size":"7mb","rx_size_in_bytes":7431874,"tx_count":156877,"tx_size":"11.9mb","tx_size_in_bytes":12480678},"http":{"current_open":0,"total_opened":0}},"cluster":{"name":"Ameridroid","transport_address":"inet[/127.0.0.1:9305]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9205]"}},{"name":"aBuoaKR5QVCfUZHgrJEfVg","routings":[{"name":"_river","replicas":[],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[{"replica":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_01"},"status":{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"382ms","total_time_in_millis":382}}}],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[null,null,{"replica":{"state":"STARTED","primary":false,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":2,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":false,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"15ms","total_time_in_millis":15}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[{"replica":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"status":{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"101ms","total_time_in_millis":101}}}],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346945,"name":"Immortus","transport_address":"inet[/127.0.0.1:9302]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"277b","size_in_bytes":277,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":2,"index_time":"59ms","index_time_in_millis":59,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":12,"query_time":"27ms","query_time_in_millis":27,"query_current":0,"fetch_total":1,"fetch_time":"9ms","fetch_time_in_millis":9,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":9,"total_time":"72ms","total_time_in_millis":72},"flush":{"total":239,"total_time":"6.3s","total_time_in_millis":6363},"warmer":{"current":0,"total":3,"total_time":"8ms","total_time_in_millis":8},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346963,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4058099712,"used":"4.2gb","used_in_bytes":4531834880,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4419252224,"actual_used":"3.8gb","actual_used_in_bytes":4170682368},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346963,"open_file_descriptors":266,"cpu":{"percent":0,"sys":"2.9m","sys_in_millis":174105,"user":"2.4m","user_in_millis":145373,"total":"5.3m","total_in_millis":319478},"mem":{"resident":"29mb","resident_in_bytes":30453760,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3912540160}},"jvm":{"timestamp":1381790346963,"uptime":"4d","uptime_in_millis":349027381,"mem":{"heap_used":"28.5mb","heap_used_in_bytes":29980664,"heap_committed":"265.5mb","heap_committed_in_bytes":278462464,"non_heap_used":"40mb","non_heap_used_in_bytes":42021480,"non_heap_committed":"65.6mb","non_heap_committed_in_bytes":68853760,"pools":{"Code Cache":{"used":"2mb","used_in_bytes":2183808,"max":"48mb","max_in_bytes":50331648,"peak_used":"2mb","peak_used_in_bytes":2193408,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"23.8mb","used_in_bytes":25026800,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"27mb","peak_used_in_bytes":28311552,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"464.1kb","used_in_bytes":475296,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"4.2mb","used_in_bytes":4478568,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"12.4mb","peak_used_in_bytes":13054208,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"37.9mb","used_in_bytes":39837672,"max":"82mb","max_in_bytes":85983232,"peak_used":"38.2mb","peak_used_in_bytes":40134632,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":62,"peak_count":67},"gc":{"collection_count":80,"collection_time":"561ms","collection_time_in_millis":561,"collectors":{"ParNew":{"collection_count":78,"collection_time":"557ms","collection_time_in_millis":557},"ConcurrentMarkSweep":{"collection_count":2,"collection_time":"4ms","collection_time_in_millis":4}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":4,"completed":7528},"index":{"threads":2,"queue":0,"active":0,"rejected":0,"largest":2,"completed":2},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":26},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":242},"search":{"threads":12,"queue":0,"active":0,"rejected":0,"largest":12,"completed":13},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":5,"queue":0,"active":2,"rejected":0,"largest":5,"completed":10288},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438862,"out_segs":7330479,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790346977,"data":[{"path":"/var/elasticsearch/es3/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231241089024,"available":"215.1gb","available_in_bytes":230978945024,"disk_reads":2641854,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593402880,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":156920,"rx_size":"7.1mb","rx_size_in_bytes":7451979,"tx_count":156915,"tx_size":"11.9mb","tx_size_in_bytes":12499329},"http":{"current_open":0,"total_opened":0}},"cluster":{"name":"Immortus","transport_address":"inet[/127.0.0.1:9302]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9201]"}},{"name":"3Rbfod0sS9eZ6VrOkY0JKw","routings":[{"name":"_river","replicas":[{"replica":{"state":"STARTED","primary":true,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"_river"},"status":{"routing":{"state":"STARTED","primary":true,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"_river"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1380240228838,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":62,"total_time":"833ms","total_time_in_millis":833}}}],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[{"replica":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"4ms","total_time_in_millis":4}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[{"replica":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"status":{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"274ms","total_time_in_millis":274}}}],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":true,"stats":{"timestamp":1381790346938,"name":"Steel Serpent","transport_address":"inet[server/127.0.0.1:9300]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"237b","size_in_bytes":237,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":2,"index_time":"59ms","index_time_in_millis":59,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":12,"query_time":"32ms","query_time_in_millis":32,"query_current":0,"fetch_total":3,"fetch_time":"5ms","fetch_time_in_millis":5,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":6,"total_time":"58ms","total_time_in_millis":58},"flush":{"total":240,"total_time":"4.3s","total_time_in_millis":4339},"warmer":{"current":0,"total":3,"total_time":"8ms","total_time_in_millis":8},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346938,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4062093312,"used":"4.2gb","used_in_bytes":4527841280,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4422721536,"actual_used":"3.8gb","actual_used_in_bytes":4167213056},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346938,"open_file_descriptors":272,"cpu":{"percent":0,"sys":"3.3m","sys_in_millis":200578,"user":"3.2m","user_in_millis":192613,"total":"6.5m","total_in_millis":393191},"mem":{"resident":"43.8mb","resident_in_bytes":46018560,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3910467584}},"jvm":{"timestamp":1381790346938,"uptime":"4d","uptime_in_millis":349029191,"mem":{"heap_used":"28.9mb","heap_used_in_bytes":30381984,"heap_committed":"253.9mb","heap_committed_in_bytes":266272768,"non_heap_used":"42.9mb","non_heap_used_in_bytes":45068896,"non_heap_committed":"43.3mb","non_heap_committed_in_bytes":45420544,"pools":{"Code Cache":{"used":"3.3mb","used_in_bytes":3534656,"max":"48mb","max_in_bytes":50331648,"peak_used":"3.3mb","peak_used_in_bytes":3545408,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"15.6mb","used_in_bytes":16402808,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"16.6mb","peak_used_in_bytes":17432576,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"44.9kb","used_in_bytes":46016,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"13.2mb","used_in_bytes":13933160,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"13.2mb","peak_used_in_bytes":13933160,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"39.6mb","used_in_bytes":41534240,"max":"82mb","max_in_bytes":85983232,"peak_used":"39.6mb","peak_used_in_bytes":41534240,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":64,"peak_count":68},"gc":{"collection_count":272,"collection_time":"967ms","collection_time_in_millis":967,"collectors":{"ParNew":{"collection_count":272,"collection_time":"967ms","collection_time_in_millis":967},"ConcurrentMarkSweep":{"collection_count":0,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":2,"queue":0,"active":0,"rejected":0,"largest":4,"completed":9499},"index":{"threads":2,"queue":0,"active":0,"rejected":0,"largest":2,"completed":2},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":21},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":241},"search":{"threads":12,"queue":0,"active":0,"rejected":0,"largest":12,"completed":15},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":5,"queue":0,"active":1,"rejected":0,"largest":5,"completed":15207},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438818,"out_segs":7330435,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790346956,"data":[{"path":"/var/elasticsearch/es1/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231240040448,"available":"215.1gb","available_in_bytes":230977896448,"disk_reads":2641849,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593058816,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":780551,"rx_size":"59mb","rx_size_in_bytes":61929023,"tx_count":780563,"tx_size":"35.2mb","tx_size_in_bytes":36961925},"http":{"current_open":6,"total_opened":201}},"cluster":{"name":"Steel Serpent","transport_address":"inet[server/127.0.0.1:9300]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9200]"}},{"name":"PO1wHIidQo-w7sGHaYHvjg","routings":[{"name":"_river","replicas":[],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[null,{"replica":{"state":"STARTED","primary":true,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":true,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"122ms","total_time_in_millis":122}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[null,{"replica":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"status":{"routing":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"137ms","total_time_in_millis":137}}}],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346964,"name":"Thumbelina","transport_address":"inet[/127.0.0.1:9304]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"178b","size_in_bytes":178,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":4,"index_time":"55ms","index_time_in_millis":55,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":6,"query_time":"21ms","query_time_in_millis":21,"query_current":0,"fetch_total":2,"fetch_time":"10ms","fetch_time_in_millis":10,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":9,"total_time":"81ms","total_time_in_millis":81},"flush":{"total":198,"total_time":"3.6s","total_time_in_millis":3662},"warmer":{"current":0,"total":2,"total_time":"3ms","total_time_in_millis":3},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346964,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4058308608,"used":"4.2gb","used_in_bytes":4531625984,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4419461120,"actual_used":"3.8gb","actual_used_in_bytes":4170473472},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346964,"open_file_descriptors":264,"cpu":{"percent":0,"sys":"2.8m","sys_in_millis":172378,"user":"2.3m","user_in_millis":140227,"total":"5.2m","total_in_millis":312605},"mem":{"resident":"28.5mb","resident_in_bytes":29892608,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3904798720}},"jvm":{"timestamp":1381790346976,"uptime":"4d","uptime_in_millis":349025339,"mem":{"heap_used":"20.8mb","heap_used_in_bytes":21889120,"heap_committed":"253.9mb","heap_committed_in_bytes":266272768,"non_heap_used":"40.2mb","non_heap_used_in_bytes":42232320,"non_heap_committed":"40.8mb","non_heap_committed_in_bytes":42799104,"pools":{"Code Cache":{"used":"2mb","used_in_bytes":2125312,"max":"48mb","max_in_bytes":50331648,"peak_used":"2mb","peak_used_in_bytes":2134912,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"8.4mb","used_in_bytes":8836504,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"16.6mb","peak_used_in_bytes":17432576,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"659.3kb","used_in_bytes":675192,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"11.8mb","used_in_bytes":12377424,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"11.8mb","peak_used_in_bytes":12377424,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"38.2mb","used_in_bytes":40107008,"max":"82mb","max_in_bytes":85983232,"peak_used":"38.2mb","peak_used_in_bytes":40107008,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":59,"peak_count":65},"gc":{"collection_count":61,"collection_time":"632ms","collection_time_in_millis":632,"collectors":{"ParNew":{"collection_count":61,"collection_time":"632ms","collection_time_in_millis":632},"ConcurrentMarkSweep":{"collection_count":0,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":4,"completed":7515},"index":{"threads":4,"queue":0,"active":0,"rejected":0,"largest":4,"completed":4},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":22},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":198},"search":{"threads":8,"queue":0,"active":0,"rejected":0,"largest":8,"completed":8},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":4,"queue":0,"active":1,"rejected":0,"largest":5,"completed":10266},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438872,"out_segs":7330489,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790347016,"data":[{"path":"/var/elasticsearch/es5/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231241613312,"available":"215.1gb","available_in_bytes":230979469312,"disk_reads":2641856,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593427456,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":156869,"rx_size":"7mb","rx_size_in_bytes":7444733,"tx_count":156866,"tx_size":"11.9mb","tx_size_in_bytes":12497730},"http":{"current_open":0,"total_opened":2}},"cluster":{"name":"Thumbelina","transport_address":"inet[/127.0.0.1:9304]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9204]"}}],"aliases":[{"name":"search","max":3,"min":1,"indices":[false,{"name":"ag_01","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"1.4s","total_time_in_millis":1435},"shards":{"0":[{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"216ms","total_time_in_millis":216}},{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"382ms","total_time_in_millis":382}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"643ms","total_time_in_millis":643}},{"routing":{"state":"STARTED","primary":false,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"194ms","total_time_in_millis":194}}]}}},{"name":"ag_02","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"3","index.version.created":"900599"},"mappings":{},"aliases":["search"]},"status":{"index":{"primary_size":"297b","primary_size_in_bytes":297,"size":"534b","size_in_bytes":534},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":3,"total_time":"0s","total_time_in_millis":0},"flush":{"total":20,"total_time":"340ms","total_time_in_millis":340},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"107ms","total_time_in_millis":107}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"4ms","total_time_in_millis":4}}],"1":[{"routing":{"state":"STARTED","primary":false,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"75ms","total_time_in_millis":75}},{"routing":{"state":"STARTED","primary":true,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"122ms","total_time_in_millis":122}}],"2":[{"routing":{"state":"STARTED","primary":true,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"17ms","total_time_in_millis":17}},{"routing":{"state":"STARTED","primary":false,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"15ms","total_time_in_millis":15}}]}}},{"name":"ag_03","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search","live"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"598ms","total_time_in_millis":598},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"101ms","total_time_in_millis":101}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"274ms","total_time_in_millis":274}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"86ms","total_time_in_millis":86}},{"routing":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"137ms","total_time_in_millis":137}}]}}},false]},{"name":"live","max":3,"min":3,"indices":[false,false,false,{"name":"ag_03","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search","live"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"598ms","total_time_in_millis":598},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"101ms","total_time_in_millis":101}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"274ms","total_time_in_millis":274}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"86ms","total_time_in_millis":86}},{"routing":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"137ms","total_time_in_millis":137}}]}}},false]}]}, + "indices":[{"name":null},{"name":"_river","state":"open","metadata":{"state":"open","settings":{"index.version.created":"900599","index.number_of_replicas":"1","index.number_of_shards":"1"},"mappings":{},"aliases":[]},"status":{"index":{"primary_size":"79b","primary_size_in_bytes":79,"size":"158b","size_in_bytes":158},"translog":{"operations":0},"docs":{"num_docs":1,"max_doc":1,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":124,"total_time":"2.4s","total_time_in_millis":2465},"shards":{"0":[{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"_river"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1380240228838,"operations":0},"docs":{"num_docs":187162420,"max_doc":187171320,"deleted_docs":9},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":62,"total_time":"1.6s","total_time_in_millis":1632}},{"routing":{"state":"STARTED","primary":true,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"_river"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1380240228838,"operations":0},"docs":{"num_docs":187162420,"max_doc":187171320,"deleted_docs":9},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":62,"total_time":"833ms","total_time_in_millis":833}}]}}},{"name":"ag_01","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":18716242,"max_doc":18717132,"deleted_docs":9},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"1.4s","total_time_in_millis":1435},"shards":{"0":[{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"216ms","total_time_in_millis":216}},{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"382ms","total_time_in_millis":382}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"643ms","total_time_in_millis":643}},{"routing":{"state":"STARTED","primary":false,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"194ms","total_time_in_millis":194}}]}}},{"name":"ag_02","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"3","index.version.created":"900599"},"mappings":{},"aliases":["search"]},"status":{"index":{"primary_size":"297b","primary_size_in_bytes":297,"size":"534b","size_in_bytes":534},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":3,"total_time":"0s","total_time_in_millis":0},"flush":{"total":20,"total_time":"340ms","total_time_in_millis":340},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"107ms","total_time_in_millis":107}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"4ms","total_time_in_millis":4}}],"1":[{"routing":{"state":"STARTED","primary":false,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"75ms","total_time_in_millis":75}},{"routing":{"state":"STARTED","primary":true,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"122ms","total_time_in_millis":122}}],"2":[{"routing":{"state":"STARTED","primary":true,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"17ms","total_time_in_millis":17}},{"routing":{"state":"STARTED","primary":false,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"15ms","total_time_in_millis":15}}]}}},{"name":"ag_03","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search","live"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"598ms","total_time_in_millis":598},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"101ms","total_time_in_millis":101}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"274ms","total_time_in_millis":274}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"86ms","total_time_in_millis":86}},{"routing":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"137ms","total_time_in_millis":137}}]}}},{"name":"twitter_river","state":"close","metadata":{"state":"close","settings":{"index.number_of_replicas":"1","index.version.created":"900599","index.number_of_shards":"5"},"mappings":{"status":{"properties":{"text":{"type":"string"},"location":{"properties":{"lon":{"type":"double"},"lat":{"type":"double"}}},"link":{"properties":{"start":{"type":"long"},"expand_url":{"type":"string"},"display_url":{"type":"string"},"url":{"type":"string"},"end":{"type":"long"}}},"hashtag":{"properties":{"text":{"type":"string"},"start":{"type":"long"},"end":{"type":"long"}}},"truncated":{"type":"boolean"},"source":{"type":"string"},"retweet":{"properties":{"id":{"type":"long"},"user_screen_name":{"type":"string"},"retweet_count":{"type":"long"},"user_id":{"type":"long"}}},"created_at":{"format":"dateOptionalTime","type":"date"},"retweet_count":{"type":"long"},"in_reply":{"properties":{"user_screen_name":{"type":"string"},"status":{"type":"long"},"user_id":{"type":"long"}}},"mention":{"properties":{"id":{"type":"long"},"start":{"type":"long"},"name":{"type":"string"},"screen_name":{"type":"string"},"end":{"type":"long"}}},"place":{"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"country_code":{"type":"string"},"url":{"type":"string"},"full_name":{"type":"string"},"country":{"type":"string"}}},"user":{"properties":{"id":{"type":"long"},"profile_image_url_https":{"type":"string"},"location":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"screen_name":{"type":"string"},"profile_image_url":{"type":"string"}}}}}},"aliases":[]},"status":null}] + }; + + window.builder = function() { + return new ui.NodesView({ + interactive: true, + data: data + }); + }; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/page/page.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/page/page.js new file mode 100644 index 000000000..8c5eb70a9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/page/page.js @@ -0,0 +1,14 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.Page = ui.AbstractWidget.extend({ + show: function() { + this.el.show(); + }, + hide: function() { + this.el.hide(); + } + }); + +})( this.app );
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.css new file mode 100644 index 000000000..cd4138e23 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.css @@ -0,0 +1,12 @@ +.uiPanelForm-field { + display: block; + padding: 2px 0; + clear: both; +} + +.uiPanelForm-label { + float: left; + width: 200px; + padding: 3px 7px; + text-align: right; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.js new file mode 100644 index 000000000..8ed4fe7f0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.js @@ -0,0 +1,26 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.PanelForm = ui.AbstractWidget.extend({ + defaults: { + fields: null // (required) instanceof app.ux.FieldCollection + }, + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + this.attach( parent ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiPanelForm", children: this.config.fields.fields.map(this._field_template, this) }; + }, + _field_template: function(field) { + return { tag: "LABEL", cls: "uiPanelForm-field", children: [ + { tag: "DIV", cls: "uiPanelForm-label", children: [ field.label, ut.require_template(field) ] }, + field + ]}; + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.css new file mode 100644 index 000000000..dfe055cd7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.css @@ -0,0 +1,62 @@ +.uiQueryFilter { + width: 350px; + padding: 5px; + background: #d8e7ff; + background: -moz-linear-gradient(left, #d8e7ff, #e8f1ff); + background: -webkit-linear-gradient(left, #d8e7ff, #e8f1ff); +} + +.uiQueryFilter DIV.uiQueryFilter-section { + margin-bottom: 5px; +} + +.uiQueryFilter HEADER { + display: block; + font-variant: small-caps; + font-weight: bold; + margin: 5px 0; +} + +.uiQueryFilter-aliases SELECT { + width: 100%; +} + +.uiQueryFilter-booble { + cursor: pointer; + background: #e8f1ff; + border: 1px solid #e8f1ff; + border-radius: 5px; + padding: 1px 4px; + margin-bottom: 1px; + overflow: hidden; + white-space: nowrap; +} + +.uiQueryFilter-booble.selected { + background: #dae3f0; + border-top: 1px solid #c8d4e6; + border-left: 1px solid #c8d4e6; + border-bottom: 1px solid #ffffff; + border-right: 1px solid #ffffff; +} + +.uiQueryFilter-filterName { + background-color: #cbdfff; + margin-bottom: 4px; + padding: 3px; + cursor: pointer; +} + +.uiQueryFilter-filters INPUT { + width: 300px; +} + +.uiQueryFilter-subMultiFields { + padding-left: 10px; +} + +.uiQueryFilter-rangeHintFrom, +.uiQueryFilter-rangeHintTo { + margin: 0; + opacity: 0.75; +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js new file mode 100644 index 000000000..bd449a0b7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js @@ -0,0 +1,277 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.QueryFilter = ui.AbstractWidget.extend({ + defaults: { + metadata: null, // (required) instanceof app.data.MetaData + query: null // (required) instanceof app.data.Query that the filters will act apon + }, + init: function() { + this._super(); + this.metadata = this.config.metadata; + this.query = this.config.query; + this.el = $(this._main_template()); + }, + helpTypeMap: { + "date" : "QueryFilter.DateRangeHelp" + }, + requestUpdate: function(jEv) { + if(jEv && jEv.originalEvent) { // we only want to update on real user interaction not generated events + this.query.setPage(1); + this.query.query(); + } + }, + getSpec: function(fieldName) { + return this.metadata.fields[fieldName]; + }, + _selectAlias_handler: function(jEv) { + var indices = (jEv.target.selectedIndex === 0) ? [] : this.metadata.getIndices($(jEv.target).val()); + $(".uiQueryFilter-index").each(function(i, el) { + var jEl = $(el); + if(indices.contains(jEl.text()) !== jEl.hasClass("selected")) { + jEl.click(); + } + }); + this.requestUpdate(jEv); + }, + _selectIndex_handler: function(jEv) { + var jEl = $(jEv.target).closest(".uiQueryFilter-index"); + jEl.toggleClass("selected"); + var selected = jEl.hasClass("selected"); + this.query.setIndex(jEl.text(), selected); + if(selected) { + var types = this.metadata.getTypes(this.query.indices); + this.el.find("DIV.uiQueryFilter-type.selected").each(function(n, el) { + if(! types.contains($(el).text())) { + $(el).click(); + } + }); + } + this.requestUpdate(jEv); + }, + _selectType_handler: function(jEv) { + var jEl = $(jEv.target).closest(".uiQueryFilter-type"); + jEl.toggleClass("selected"); + var type = jEl.text(), selected = jEl.hasClass("selected"); + this.query.setType(type, selected); + if(selected) { + var indices = this.metadata.types[type].indices; + // es throws a 500 if searching an index for a type it does not contain - so we prevent that + this.el.find("DIV.uiQueryFilter-index.selected").each(function(n, el) { + if(! indices.contains($(el).text())) { + $(el).click(); + } + }); + // es throws a 500 if you specify types from different indices with _all + jEl.siblings(".uiQueryFilter-type.selected").forEach(function(el) { + if(this.metadata.types[$(el).text()].indices.intersection(indices).length === 0) { + $(el).click(); + } + }, this); + } + this.requestUpdate(jEv); + }, + _openFilter_handler: function(section) { + var field_name = section.config.title; + if(! section.loaded) { + var spec = this.getSpec(field_name); + if(spec.core_type === "string") { + section.body.append(this._textFilter_template(spec)); + } else if(spec.core_type === "date") { + section.body.append(this._dateFilter_template(spec)); + section.body.append(new ui.DateHistogram({ printEl: section.body.find("INPUT"), cluster: this.cluster, query: this.query, spec: spec })); + } else if(spec.core_type === "number") { + section.body.append(this._numericFilter_template(spec)); + } else if(spec.core_type === 'boolean') { + section.body.append(this._booleanFilter_template(spec)); + } else if (spec.core_type === 'multi_field') { + section.body.append(this._multiFieldFilter_template(section, spec)); + } + section.loaded = true; + } + section.on("animComplete", function(section) { section.body.find("INPUT").focus(); }); + }, + _textFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqids = jEl.data("uqids") || []; + uqids.forEach(function(uqid) { + uqid && this.query.removeClause(uqid); + }, this); + if(val.length) { + if(jEl[0] === document.activeElement && jEl[0].selectionStart === jEl[0].selectionEnd) { + val = val.replace(new RegExp("(.{"+jEl[0].selectionStart+"})"), "$&*"); + } + uqids = val.split(/\s+/).map(function(term) { + // Figure out the actual field name - needed for multi_field, because + // querying for "field.field" will not work. Simply "field" must be used + // if nothing is aliased. + var fieldNameParts = spec.field_name.split('.'); + var part = fieldNameParts.length - 1; + var name = fieldNameParts[part]; + while (part >= 1) { + if (fieldNameParts[part] !== fieldNameParts[part - 1]) { + name = fieldNameParts[part - 1] + "." + name; + } + part--; + } + return term && this.query.addClause(term, name, "wildcard", "must"); + }, this); + } + jEl.data("uqids", uqids); + this.requestUpdate(jEv); + }, + _dateFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + var range = window.dateRangeParser.parse(val); + var lastRange = jEl.data("lastRange"); + if(!range || (lastRange && lastRange.start === range.start && lastRange.end === range.end)) { + return; + } + uqid && this.query.removeClause(uqid); + if((range.start && range.end) === null) { + uqid = null; + } else { + var value = {}; + if( range.start ) { + value["gte"] = range.start; + } + if( range.end ) { + value["lte"] = range.end; + } + uqid = this.query.addClause( value, spec.field_name, "range", "must"); + } + jEl.data("lastRange", range); + jEl.siblings(".uiQueryFilter-rangeHintFrom") + .text(i18n.text("QueryFilter.DateRangeHint.from", range.start && new Date(range.start).toUTCString())); + jEl.siblings(".uiQueryFilter-rangeHintTo") + .text(i18n.text("QueryFilter.DateRangeHint.to", range.end && new Date(range.end).toUTCString())); + jEl.data("uqid", uqid); + this.requestUpdate(jEv); + }, + _numericFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + var lastRange = jEl.data("lastRange"); + var range = (function(val) { + var ops = val.split(/->|<>|</).map( function(v) { return parseInt(v.trim(), 10); }); + if(/<>/.test(val)) { + return { gte: (ops[0] - ops[1]), lte: (ops[0] + ops[1]) }; + } else if(/->|</.test(val)) { + return { gte: ops[0], lte: ops[1] }; + } else { + return { gte: ops[0], lte: ops[0] }; + } + })(val || ""); + if(!range || (lastRange && lastRange.lte === range.lte && lastRange.gte === range.gte)) { + return; + } + jEl.data("lastRange", range); + uqid && this.query.removeClause(uqid); + uqid = this.query.addClause( range, spec.field_name, "range", "must"); + jEl.data("uqid", uqid); + this.requestUpdate(jEv); + }, + _booleanFilterChange_handler: function( jEv ) { + var jEl = $(jEv.target).closest("SELECT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + uqid && this.query.removeClause(uqid); + if(val === "true" || val === "false") { + jEl.data("uqid", this.query.addClause(val, spec.field_name, "term", "must") ); + } + this.requestUpdate(jEv); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiQueryFilter", children: [ + this._aliasSelector_template(), + this._indexSelector_template(), + this._typesSelector_template(), + this._filters_template() + ] }; + }, + _aliasSelector_template: function() { + var aliases = Object.keys(this.metadata.aliases).sort(); + aliases.unshift( i18n.text("QueryFilter.AllIndices") ); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-aliases", children: [ + { tag: "SELECT", onChange: this._selectAlias_handler, children: aliases.map(ut.option_template) } + ] }; + }, + _indexSelector_template: function() { + var indices = Object.keys( this.metadata.indices ).sort(); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-indices", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Indices") }, + { tag: "DIV", onClick: this._selectIndex_handler, children: indices.map( function( name ) { + return { tag: "DIV", cls: "uiQueryFilter-booble uiQueryFilter-index", text: name }; + })} + ] }; + }, + _typesSelector_template: function() { + var types = Object.keys( this.metadata.types ).sort(); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-types", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Types") }, + { tag: "DIV", onClick: this._selectType_handler, children: types.map( function( name ) { + return { tag: "DIV", cls: "uiQueryFilter-booble uiQueryFilter-type", text: name }; + })} + ] }; + }, + _filters_template: function() { + var _metadataFields = this.metadata.fields; + var fields = Object.keys( _metadataFields ).sort() + .filter(function(d) { return (_metadataFields[d].core_type !== undefined); }); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-filters", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Fields") }, + { tag: "DIV", children: fields.map( function(name ) { + return new app.ui.SidebarSection({ + title: name, + help: this.helpTypeMap[this.metadata.fields[ name ].type], + onShow: this._openFilter_handler + }); + }, this ) } + ] }; + }, + _textFilter_template: function(spec) { + return { tag: "INPUT", data: { spec: spec }, onKeyup: this._textFilterChange_handler }; + }, + _dateFilter_template: function(spec) { + return { tag: "DIV", children: [ + { tag: "INPUT", data: { spec: spec }, onKeyup: this._dateFilterChange_handler }, + { tag: "PRE", cls: "uiQueryFilter-rangeHintFrom", text: i18n.text("QueryFilter.DateRangeHint.from", "")}, + { tag: "PRE", cls: "uiQueryFilter-rangeHintTo", text: i18n.text("QueryFilter.DateRangeHint.to", "") } + ]}; + }, + _numericFilter_template: function(spec) { + return { tag: "INPUT", data: { spec: spec }, onKeyup: this._numericFilterChange_handler }; + }, + _booleanFilter_template: function(spec) { + return { tag: "SELECT", data: { spec: spec }, onChange: this._booleanFilterChange_handler, + children: [ i18n.text("QueryFilter.AnyValue"), "true", "false" ].map( function( val ) { + return { tag: "OPTION", value: val, text: val }; + }) + }; + }, + _multiFieldFilter_template: function(section, spec) { + return { + tag : "DIV", cls : "uiQueryFilter-subMultiFields", children : acx.eachMap(spec.fields, function(name, data) { + if (name === spec.field_name) { + section.config.title = spec.field_name + "." + name; + return this._openFilter_handler(section); + } + return new app.ui.SidebarSection({ + title : data.field_name, help : this.helpTypeMap[data.type], onShow : this._openFilter_handler + }); + }, this) + }; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButton.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButton.js new file mode 100644 index 000000000..a776e21f8 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButton.js @@ -0,0 +1,41 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.RefreshButton = ui.SplitButton.extend({ + defaults: { + timer: -1 + }, + init: function( parent ) { + this.config.label = i18n.text("General.RefreshResults"); + this._super( parent ); + this.set( this.config.timer ); + }, + set: function( value ) { + this.value = value; + window.clearInterval( this._timer ); + if( this.value > 0 ) { + this._timer = window.setInterval( this._refresh_handler, this.value ); + } + }, + _click_handler: function() { + this._refresh_handler(); + }, + _select_handler: function( el, event ) { + this.set( event.value ); + this.fire("change", this ); + }, + _refresh_handler: function() { + this.fire("refresh", this ); + }, + _getItems: function() { + return [ + { text: i18n.text("General.ManualRefresh"), value: -1 }, + { text: i18n.text("General.RefreshQuickly"), value: 100 }, + { text: i18n.text("General.Refresh5seconds"), value: 5000 }, + { text: i18n.text("General.Refresh1minute"), value: 60000 } + ]; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonDemo.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonDemo.js new file mode 100644 index 000000000..c37df9c90 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonDemo.js @@ -0,0 +1,12 @@ +$( function() { + + var ui = window.app.ns("ui"); + + window.builder = function() { + return new ui.RefreshButton({ + onRefresh: function() { console.log("-> refresh", arguments ); }, + onChange: function() { console.log("-> change", arguments ); } + }); + }; + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonSpec.js new file mode 100644 index 000000000..8cc325f42 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonSpec.js @@ -0,0 +1,92 @@ +describe("app.ui.RefreshButton", function() { + + var RefreshButton = window.app.ui.RefreshButton; + + var r, refresh_handler, change_handler; + + function openMenuPanel( button, label ) { + button.el.find("BUTTON").eq(1).click(); + $(".uiMenuPanel-label:contains(" + label + ")").click(); + test.clock.tick(); // menuPanel -> bind _close_handler + } + + + beforeEach( function() { + test.clock.steal(); + refresh_handler = jasmine.createSpy("refresh_handler"); + change_handler = jasmine.createSpy("change_handler"); + r = new RefreshButton({ + onRefresh: refresh_handler, + onChange: change_handler + }); + r.attach( document.body ); + }); + + afterEach( function() { + r.remove(); + test.clock.restore(); + }); + + it("should have an initial default value", function() { + expect( r.value ).toBe( -1 ); + }); + + it("should fire a refresh event after clicking the refresh button ", function() { + r.el.find("BUTTON").eq(0).click(); + + expect( refresh_handler ).toHaveBeenCalled(); + }); + + it("should change the refresh rate when set it called", function() { + r.set( 100 ); + expect( r.value ).toBe( 100 ); + }); + + it("should set an interval when rate is set to a positive value", function() { + r.set( 100 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + }); + + it("should not set an interval when rate is set to a non positive value", function() { + r.set( -1 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 0 ); + }); + + it("should fire a refresh event on intervals if refresh menu item is set to quickly", function() { + openMenuPanel( r, "quickly" ); + + expect( refresh_handler.calls.count() ).toBe( 0 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 2 ); + }); + + it("should not fire refresh events when user selects Manual", function() { + + openMenuPanel( r, "quickly" ); + + expect( refresh_handler.calls.count() ).toBe( 0 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + + openMenuPanel( r, "Manual" ); + + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + }); + + it("should fire a change event when a new refresh rate is selected", function() { + openMenuPanel( r, "quickly" ); + expect( change_handler.calls.count() ).toBe( 1 ); + expect( r.value ).toBe( 100 ); + openMenuPanel( r, "Manual" ); + expect( change_handler.calls.count() ).toBe( 2 ); + expect( r.value ).toBe( -1 ); + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/resultTable/resultTable.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/resultTable/resultTable.js new file mode 100644 index 000000000..6c7cf558d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/resultTable/resultTable.js @@ -0,0 +1,55 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.ResultTable = ui.Table.extend({ + defaults: { + width: 500, + height: 400 + }, + + init: function() { + this._super(); + this.on("rowClick", this._showPreview_handler); + this.selectedRow = null; + $(document).bind("keydown", this._nav_handler); + }, + remove: function() { + $(document).unbind("keydown", this._nav_handler); + this._super(); + }, + attach: function(parent) { + if(parent) { + var height = parent.height() || ( $(document).height() - parent.offset().top - 41 ); // 41 = height in px of .uiTable-tools + uiTable-header + var width = parent.width(); + this.el.width( width ); + this.body.width( width ).height( height ); + } + this._super(parent); + }, + showPreview: function(row) { + row.addClass("selected"); + this.preview = new app.ui.JsonPanel({ + title: i18n.text("Browser.ResultSourcePanelTitle"), + json: row.data("row")._source, + onClose: function() { row.removeClass("selected"); } + }); + }, + _nav_handler: function(jEv) { + if(jEv.keyCode !== 40 && jEv.keyCode !== 38) { + return; + } + this.selectedRow && this.preview && this.preview.remove(); + if(jEv.keyCode === 40) { // up arrow + this.selectedRow = this.selectedRow ? this.selectedRow.next("TR") : this.body.find("TR:first"); + } else if(jEv.keyCode === 38) { // down arrow + this.selectedRow = this.selectedRow ? this.selectedRow.prev("TR") : this.body.find("TR:last"); + } + this.selectedRow && this.showPreview(this.selectedRow); + }, + _showPreview_handler: function(obj, data) { + this.showPreview(this.selectedRow = data.row); + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.css new file mode 100644 index 000000000..7315527df --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.css @@ -0,0 +1,11 @@ +.uiSelectMenuPanel .uiMenuPanel-label { + margin-left: 1em; + padding-left: 4px; +} + +.uiSelectMenuPanel .uiMenuPanel-item.selected .uiMenuPanel-label:before { + content: "\2713"; + width: 12px; + margin-left: -12px; + display: inline-block; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.js new file mode 100644 index 000000000..8cbecc56c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.js @@ -0,0 +1,33 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.SelectMenuPanel = ui.MenuPanel.extend({ + defaults: { + items: [], // (required) an array of menu items + value: null + }, + _baseCls: "uiSelectMenuPanel uiMenuPanel", + init: function() { + this.value = this.config.value; + this._super(); + }, + _getItems: function() { + return this.config.items.map( function( item ) { + return { + text: item.text, + selected: this.value === item.value, + onclick: function( jEv ) { + var el = $( jEv.target ).closest("LI"); + el.parent().children().removeClass("selected"); + el.addClass("selected"); + this.fire( "select", this, { value: item.value } ); + this.value = item.value; + }.bind(this) + }; + }, this ); + + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.css new file mode 100644 index 000000000..654389fcd --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.css @@ -0,0 +1,28 @@ +.uiSidebarSection-head { + background-color: #b9cfff; + background-image: url('data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAcCAMAAABifa5OAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQUCFf///wICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///2Oyy/cAAAACdFJOU/8A5bcwSgAAADxJREFUeNq8zzkOACAMA8Hd/3+agiuRcIsrRopIjArOoLK1QAMNNBCRPkhLyzkn35Bjfd7JR1Nr09NoDACnvgDl1zlzoQAAAABJRU5ErkJggg=='); + background-repeat: no-repeat; + background-position: 2px 5px; + margin-bottom: 1px; + padding: 3px 3px 3px 17px; + cursor: pointer; +} + +.shown > .uiSidebarSection-head { + background-position: 2px -13px; +} + +.uiSidebarSection-body { + margin-bottom: 3px; + display: none; +} + +.uiSidebarSection-help { + text-shadow: #228 1px 1px 2px; + color: blue; + cursor: pointer; +} + +.uiSidebarSection-help:hover { + text-decoration: underline; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.js new file mode 100644 index 000000000..d5ab98449 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.js @@ -0,0 +1,41 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.SidebarSection = ui.AbstractWidget.extend({ + defaults: { + title: "", + help: null, + body: null, + open: false + }, + init: function() { + this._super(); + this.el = $.joey( this._main_template() ); + this.body = this.el.children(".uiSidebarSection-body"); + this.config.open && ( this.el.addClass("shown") && this.body.css("display", "block") ); + }, + _showSection_handler: function( ev ) { + var shown = $( ev.target ).closest(".uiSidebarSection") + .toggleClass("shown") + .children(".uiSidebarSection-body").slideToggle(200, function() { this.fire("animComplete", this); }.bind(this)) + .end() + .hasClass("shown"); + this.fire(shown ? "show" : "hide", this); + }, + _showHelp_handler: function( ev ) { + new ui.HelpPanel({ref: this.config.help}); + ev.stopPropagation(); + }, + _main_template: function() { return ( + { tag: "DIV", cls: "uiSidebarSection", children: [ + (this.config.title && { tag: "DIV", cls: "uiSidebarSection-head", onclick: this._showSection_handler, children: [ + this.config.title, + ( this.config.help && { tag: "SPAN", cls: "uiSidebarSection-help pull-right", onclick: this._showHelp_handler, text: i18n.text("General.HelpGlyph") } ) + ] }), + { tag: "DIV", cls: "uiSidebarSection-body", children: [ this.config.body ] } + ] } + ); } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.css new file mode 100644 index 000000000..e8d275296 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.css @@ -0,0 +1,33 @@ +.uiSplitButton { + white-space: nowrap; +} + +.uiSplitButton .uiButton:first-child { + margin-right: 0; + display: inline-block; +} + +.uiSplitButton .uiButton:first-child .uiButton-content { + border-right-width: 1; + border-right-color: #5296c7; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.uiSplitButton .uiMenuButton { + margin-left: 0; +} + +.uiSplitButton .uiButton:last-child .uiButton-content { + border-radius: 2px; + border-left-width: 1; + border-left-color: #96c6eb; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + height: 20px; +} + +.uiSplitButton .uiButton:last-child .uiButton-label { + padding: 2px 17px 2px 6px; + margin-left: -8px; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.js new file mode 100644 index 000000000..8785b99c5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.js @@ -0,0 +1,54 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.SplitButton = ui.AbstractWidget.extend({ + defaults: { + items: [], + label: "" + }, + _baseCls: "uiSplitButton", + init: function( parent ) { + this._super( parent ); + this.value = null; + this.button = new ui.Button({ + label: this.config.label, + onclick: this._click_handler + }); + this.menu = new ui.SelectMenuPanel({ + value: this.config.value, + items: this._getItems(), + onSelect: this._select_handler + }); + this.menuButton = new ui.MenuButton({ + label: "\u00a0", + menu: this.menu + }); + this.el = $.joey(this._main_template()); + }, + remove: function() { + this.menu.remove(); + }, + disable: function() { + this.button.disable(); + }, + enable: function() { + this.button.enable(); + }, + _click_handler: function() { + this.fire("click", this, { value: this.value } ); + }, + _select_handler: function( panel, event ) { + this.fire( "select", this, event ); + }, + _getItems: function() { + return this.config.items; + }, + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: [ + this.button, this.menuButton + ] }; + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButtonDemo.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButtonDemo.js new file mode 100644 index 000000000..76b6fa2dc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButtonDemo.js @@ -0,0 +1,16 @@ +$( function() { + + var ui = window.app.ns("ui"); + + window.builder = function() { + return new ui.SplitButton({ + label: "Default", + items: [ + { label: "Action" }, + { label: "Another Action" }, + { label: "Selected", selected: true } + ] + }); + }; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.css new file mode 100644 index 000000000..502204587 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.css @@ -0,0 +1,7 @@ +.uiStructuredQuery { + padding: 10px; +} + +.uiStructuredQuery-out { + min-height: 30px; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.js new file mode 100644 index 000000000..aeb4b6b8f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.js @@ -0,0 +1,95 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var data = app.ns("data"); + + var StructuredQuery = ui.AbstractWidget.extend({ + defaults: { + cluster: null // (required) instanceof app.services.Cluster + }, + _baseCls: "uiStructuredQuery", + init: function(parent) { + this._super(); + this.selector = new ui.IndexSelector({ + onIndexChanged: this._indexChanged_handler, + cluster: this.config.cluster + }); + this.el = $(this._main_template()); + this.out = this.el.find("DIV.uiStructuredQuery-out"); + this.attach( parent ); + }, + + _indexChanged_handler: function( index ) { + this.filter && this.filter.remove(); + this.filter = new ui.FilterBrowser({ + cluster: this.config.cluster, + index: index, + onStartingSearch: function() { this.el.find("DIV.uiStructuredQuery-out").text( i18n.text("General.Searching") ); this.el.find("DIV.uiStructuredQuery-src").hide(); }.bind(this), + onSearchSource: this._searchSource_handler, + onResults: this._results_handler + }); + this.el.find(".uiStructuredQuery-body").append(this.filter); + }, + + _results_handler: function( filter, event ) { + var typeMap = { + "json": this._jsonResults_handler, + "table": this._tableResults_handler, + "csv": this._csvResults_handler + }; + typeMap[ event.type ].call( this, event.data, event.metadata ); + }, + _jsonResults_handler: function( results ) { + this.el.find("DIV.uiStructuredQuery-out").empty().append( new ui.JsonPretty({ obj: results })); + }, + _csvResults_handler: function( results ) { + this.el.find("DIV.uiStructuredQuery-out").empty().append( new ui.CSVTable({ results: results })); + }, + _tableResults_handler: function( results, metadata ) { + // hack up a QueryDataSourceInterface so that StructuredQuery keeps working without using a Query object + var qdi = new data.QueryDataSourceInterface({ metadata: metadata, query: new data.Query() }); + var tab = new ui.Table( { + store: qdi, + height: 400, + width: this.out.innerWidth() + } ).attach(this.out.empty()); + qdi._results_handler(qdi.config.query, results); + }, + + _showRawJSON : function() { + if($("#rawJsonText").length === 0) { + var hiddenButton = $("#showRawJSON"); + var jsonText = $({tag: "P", type: "p", id: "rawJsonText"}); + jsonText.text(hiddenButton[0].value); + hiddenButton.parent().append(jsonText); + } + }, + + _searchSource_handler: function(src) { + var searchSourceDiv = this.el.find("DIV.uiStructuredQuery-src"); + searchSourceDiv.empty().append(new app.ui.JsonPretty({ obj: src })); + if(typeof JSON !== "undefined") { + var showRawJSON = $({ tag: "BUTTON", type: "button", text: i18n.text("StructuredQuery.ShowRawJson"), id: "showRawJSON", value: JSON.stringify(src), onclick: this._showRawJSON }); + searchSourceDiv.append(showRawJSON); + } + searchSourceDiv.show(); + }, + + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: [ + this.selector, + { tag: "DIV", cls: "uiStructuredQuery-body" }, + { tag: "DIV", cls: "uiStructuredQuery-src", css: { display: "none" } }, + { tag: "DIV", cls: "uiStructuredQuery-out" } + ]}; + } + }); + + ui.StructuredQuery = ui.Page.extend({ + init: function() { + this.q = new StructuredQuery( this.config ); + this.el = this.q.el; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/table/table.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/table/table.css new file mode 100644 index 000000000..ea8e0cfd4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/table/table.css @@ -0,0 +1,92 @@ +.uiTable TABLE { + border-collapse: collapse; +} + +.uiTable-body { + overflow-y: scroll; + overflow-x: auto; +} + +.uiTable-headers { + overflow-x: hidden; +} + +.uiTable-body TD { + white-space: nowrap; +} + +.uiTable-body .uiTable-header-row TH, +.uiTable-body .uiTable-header-row TH DIV { + padding-top: 0; + padding-bottom: 0; +} + +.uiTable-body .uiTable-header-cell > DIV { + height: 0; + overflow: hidden; +} + +.uiTable-headercell-menu { + float: right; +} + +.uiTable-tools { + padding: 3px 4px; + height: 14px; +} + +.uiTable-header-row { + background: #ddd; + background: -moz-linear-gradient(top, #eee, #ccc); + background: -webkit-linear-gradient(top, #eee, #ccc); +} + +.uiTable-headercell-text { + margin-right: 20px; +} + +.uiTable-headercell-menu { + display: none; +} + +.uiTable-header-row TH { + border-right: 1px solid #bbb; + padding: 0; + text-align: left; +} + +.uiTable-header-row TH > DIV { + padding: 3px 4px; + border-right: 1px solid #eee; +} + +.uiTable-headerEndCap > DIV { + width: 19px; +} + +.uiTable-header-row .uiTable-sort { + background: #ccc; + background: -moz-linear-gradient(top, #bebebe, #ccc); + background: -webkit-linear-gradient(top, #bebebe, #ccc); +} +.uiTable-header-row TH.uiTable-sort > DIV { + border-right: 1px solid #ccc; +} + +.uiTable-sort .uiTable-headercell-menu { + display: block; +} + +.uiTable TABLE TD { + border-right: 1px solid transparent; + padding: 3px 4px; +} + +.uiTable-body TABLE TR:nth-child(even) { + background: #f3f3f3; +} + +.uiTable-body TABLE TR.selected { + color: white; + background: #6060f1; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/table/table.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/table/table.js new file mode 100644 index 000000000..eb847a056 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/table/table.js @@ -0,0 +1,102 @@ +( function( $, app ) { + + var ui = app.ns("ui"); + + ui.Table = ui.AbstractWidget.extend({ + defaults: { + store: null, // (required) implements interface app.data.DataSourceInterface + height: 0, + width: 0 + }, + _baseCls: "uiTable", + init: function(parent) { + this._super(); + this.initElements(parent); + this.config.store.on("data", this._data_handler); + }, + attach: function(parent) { + if(parent) { + this._super(parent); + this._reflow(); + } + }, + initElements: function(parent) { + this.el = $.joey(this._main_template()); + this.body = this.el.find(".uiTable-body"); + this.headers = this.el.find(".uiTable-headers"); + this.tools = this.el.find(".uiTable-tools"); + this.attach( parent ); + }, + _data_handler: function(store) { + this.tools.text(store.summary); + this.headers.empty().append(this._header_template(store.columns)); + this.body.empty().append(this._body_template(store.data, store.columns)); + this._reflow(); + }, + _reflow: function() { + var firstCol = this.body.find("TR:first TH.uiTable-header-cell > DIV"), + headers = this.headers.find("TR:first TH.uiTable-header-cell > DIV"); + for(var i = 0; i < headers.length; i++) { + $(headers[i]).width( $(firstCol[i]).width() ); + } + this._scroll_handler(); + }, + _scroll_handler: function(ev) { + this.el.find(".uiTable-headers").scrollLeft(this.body.scrollLeft()); + }, + _dataClick_handler: function(ev) { + var row = $(ev.target).closest("TR"); + if(row.length) { + this.fire("rowClick", this, { row: row } ); + } + }, + _headerClick_handler: function(ev) { + var header = $(ev.target).closest("TH.uiTable-header-cell"); + if(header.length) { + this.fire("headerClick", this, { header: header, column: header.data("column"), dir: header.data("dir") }); + } + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), css: { width: this.config.width + "px" }, cls: this._baseCls, children: [ + { tag: "DIV", cls: "uiTable-tools" }, + { tag: "DIV", cls: "uiTable-headers", onclick: this._headerClick_handler }, + { tag: "DIV", cls: "uiTable-body", + onclick: this._dataClick_handler, + onscroll: this._scroll_handler, + css: { height: this.config.height + "px", width: this.config.width + "px" } + } + ] }; + }, + _header_template: function(columns) { + var ret = { tag: "TABLE", children: [ this._headerRow_template(columns) ] }; + ret.children[0].children.push(this._headerEndCap_template()); + return ret; + }, + _headerRow_template: function(columns) { + return { tag: "TR", cls: "uiTable-header-row", children: columns.map(function(column) { + var dir = ((this.config.store.sort.column === column) && this.config.store.sort.dir) || "none"; + return { tag: "TH", data: { column: column, dir: dir }, cls: "uiTable-header-cell" + ((dir !== "none") ? " uiTable-sort" : ""), children: [ + { tag: "DIV", children: [ + { tag: "DIV", cls: "uiTable-headercell-menu", text: dir === "asc" ? "\u25b2" : "\u25bc" }, + { tag: "DIV", cls: "uiTable-headercell-text", text: column } + ]} + ]}; + }, this)}; + }, + _headerEndCap_template: function() { + return { tag: "TH", cls: "uiTable-headerEndCap", children: [ { tag: "DIV" } ] }; + }, + _body_template: function(data, columns) { + return { tag: "TABLE", children: [] + .concat(this._headerRow_template(columns)) + .concat(data.map(function(row) { + return { tag: "TR", data: { row: row }, cls: "uiTable-row", children: columns.map(function(column){ + return { tag: "TD", cls: "uiTable-cell", children: [ { tag: "DIV", text: (row[column] || "").toString() } ] }; + })}; + })) + }; + } + + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/textField/textField.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/textField/textField.js new file mode 100644 index 000000000..c7348962d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/textField/textField.js @@ -0,0 +1,24 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.TextField = ui.AbstractField.extend({ + init: function() { + this._super(); + }, + _keyup_handler: function() { + this.fire("change", this ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiField uiTextField", children: [ + { tag: "INPUT", + type: "text", + name: this.config.name, + placeholder: this.config.placeholder, + onkeyup: this._keyup_handler + } + ]}; + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/textField/textFieldDemo.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/textField/textFieldDemo.js new file mode 100644 index 000000000..25790d489 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/textField/textFieldDemo.js @@ -0,0 +1,13 @@ +$( function() { + + var ui = window.app.ns("ui"); + + window.builder = function() { return ( + { tag: "DIV", children: [ + new ui.TextField({}), + new ui.TextField({ placeholder: "placeholder" }), + new ui.TextField({ onchange: function( tf ) { console.log( tf.val() ); } }) + ] } + ); }; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.css new file mode 100644 index 000000000..e5cf72f1f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.css @@ -0,0 +1,24 @@ +.uiToolbar { + height: 28px; + background: #fdfefe; + background: -moz-linear-gradient(top, #fdfefe, #eaedef); + background: -webkit-linear-gradient(top, #fdfefe, #eaedef); + border-bottom: 1px solid #d2d5d7; + padding: 3px 10px; +} + +.uiToolbar H2 { + display: inline-block; + font-size: 120%; + margin: 0; + padding: 5px 20px 5px 0; +} + +.uiToolbar .uiTextField { + display: inline-block; +} + +.uiToolbar .uiTextField INPUT { + padding-top: 2px; + padding-bottom: 5px; +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.js new file mode 100644 index 000000000..d64eefe32 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.js @@ -0,0 +1,25 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.Toolbar = ui.AbstractWidget.extend({ + defaults: { + label: "", + left: [], + right: [] + }, + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + }, + _main_template: function() { + return { tag: "DIV", cls: "uiToolbar", children: [ + { tag: "DIV", cls: "pull-left", children: [ + { tag: "H2", text: this.config.label } + ].concat(this.config.left) }, + { tag: "DIV", cls: "pull-right", children: this.config.right } + ]}; + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/class.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/class.js new file mode 100644 index 000000000..80142637c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/class.js @@ -0,0 +1,50 @@ +/** + * base class for creating inheritable classes + * based on resigs 'Simple Javascript Inheritance Class' (based on base2 and prototypejs) + * modified with static super and auto config + * @name Class + * @constructor + */ +(function( $, app ){ + + var ux = app.ns("ux"); + + var initializing = false, fnTest = /\b_super\b/; + + ux.Class = function(){}; + + ux.Class.extend = function(prop) { + function Class() { + if(!initializing) { + var args = Array.prototype.slice.call(arguments); + this.config = $.extend( function(t) { // automatically construct a config object based on defaults and last item passed into the constructor + return $.extend(t._proto && t._proto() && arguments.callee(t._proto()) || {}, t.defaults); + } (this) , args.pop() ); + this.init && this.init.apply(this, args); // automatically run the init function when class created + } + } + + initializing = true; + var prototype = new this(); + initializing = false; + + var _super = this.prototype; + prototype._proto = function() { + return _super; + }; + + for(var name in prop) { + prototype[name] = typeof prop[name] === "function" && typeof _super[name] === "function" && fnTest.test(prop[name]) ? + (function(name, fn){ + return function() { this._super = _super[name]; return fn.apply(this, arguments); }; + })(name, prop[name]) : prop[name]; + } + + Class.prototype = prototype; + Class.constructor = Class; + + Class.extend = arguments.callee; // make class extendable + + return Class; + }; +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/dragdrop.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/dragdrop.js new file mode 100644 index 000000000..17ca9be1f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/dragdrop.js @@ -0,0 +1,124 @@ +(function( $, app ) { + + var ux = app.ns("ux"); + + /** + * Provides drag and drop functionality<br> + * a DragDrop instance is created for each usage pattern and then used over and over again<br> + * first a dragObj is defined - this is the jquery node that will be dragged around<br> + * second, the event callbacks are defined - these allow you control the ui during dragging and run functions when successfully dropping<br> + * thirdly drop targets are defined - this is a list of DOM nodes, the constructor works in one of two modes: + * <li>without targets - objects can be picked up and dragged around, dragStart and dragStop events fire</li> + * <li>with targets - as objects are dragged over targets dragOver, dragOut and DragDrop events fire + * to start dragging call the DragDrop.pickup_handler() function, dragging stops when the mouse is released. + * @constructor + * The following options are supported + * <dt>targetSelector</dt> + * <dd>an argument passed directly to jquery to create a list of targets, as such it can be a CSS style selector, or an array of DOM nodes<br>if target selector is null the DragDrop does Drag only and will not fire dragOver dragOut and dragDrop events</dd> + * <dt>pickupSelector</dt> + * <dd>a jquery selector. The pickup_handler is automatically bound to matched elements (eg clicking on these elements starts the drag). if pickupSelector is null, the pickup_handler must be manually bound <code>$(el).bind("mousedown", dragdrop.pickup_handler)</code></dd> + * <dt>dragObj</dt> + * <dd>the jQuery element to drag around when pickup is called. If not defined, dragObj must be set in onDragStart</dd> + * <dt>draggingClass</dt> + * <dd>the class(es) added to items when they are being dragged</dd> + * The following observables are supported + * <dt>dragStart</dt> + * <dd>a callback when start to drag<br><code>function(jEv)</code></dd> + * <dt>dragOver</dt> + * <dd>a callback when we drag into a target<br><code>function(jEl)</code></dd> + * <dt>dragOut</dt> + * <dd>a callback when we drag out of a target, or when we drop over a target<br><code>function(jEl)</code></dd> + * <dt>dragDrop</dt> + * <dd>a callback when we drop on a target<br><code>function(jEl)</code></dd> + * <dt>dragStop</dt> + * <dd>a callback when we stop dragging<br><code>function(jEv)</code></dd> + */ + ux.DragDrop = ux.Observable.extend({ + defaults : { + targetsSelector : null, + pickupSelector: null, + dragObj : null, + draggingClass : "dragging" + }, + + init: function(options) { + this._super(); // call the class initialiser + + this.drag_handler = this.drag.bind(this); + this.drop_handler = this.drop.bind(this); + this.pickup_handler = this.pickup.bind(this); + this.targets = []; + this.dragObj = null; + this.dragObjOffset = null; + this.currentTarget = null; + if(this.config.pickupSelector) { + $(this.config.pickupSelector).bind("mousedown", this.pickup_handler); + } + }, + + drag : function(jEv) { + jEv.preventDefault(); + var mloc = acx.vector( this.lockX || jEv.pageX, this.lockY || jEv.pageY ); + this.dragObj.css(mloc.add(this.dragObjOffset).asOffset()); + if(this.targets.length === 0) { + return; + } + if(this.currentTarget !== null && mloc.within(this.currentTarget[1], this.currentTarget[2])) { + return; + } + if(this.currentTarget !== null) { + this.fire('dragOut', this.currentTarget[0]); + this.currentTarget = null; + } + for(var i = 0; i < this.targets.length; i++) { + if(mloc.within(this.targets[i][1], this.targets[i][2])) { + this.currentTarget = this.targets[i]; + break; + } + } + if(this.currentTarget !== null) { + this.fire('dragOver', this.currentTarget[0]); + } + }, + + drop : function(jEv) { + $(document).unbind("mousemove", this.drag_handler); + $(document).unbind("mouseup", this.drop_handler); + this.dragObj.removeClass(this.config.draggingClass); + if(this.currentTarget !== null) { + this.fire('dragOut', this.currentTarget[0]); + this.fire('dragDrop', this.currentTarget[0]); + } + this.fire('dragStop', jEv); + this.dragObj = null; + }, + + pickup : function(jEv, opts) { + $.extend(this.config, opts); + this.fire('dragStart', jEv); + this.dragObj = this.dragObj || this.config.dragObj; + this.dragObjOffset = this.config.dragObjOffset || acx.vector(this.dragObj.offset()).sub(jEv.pageX, jEv.pageY); + this.lockX = this.config.lockX ? jEv.pageX : 0; + this.lockY = this.config.lockY ? jEv.pageY : 0; + this.dragObj.addClass(this.config.draggingClass); + if(!this.dragObj.get(0).parentNode || this.dragObj.get(0).parentNode.nodeType === 11) { // 11 = document fragment + $(document.body).append(this.dragObj); + } + if(this.config.targetsSelector) { + this.currentTarget = null; + var targets = ( this.targets = [] ); + // create an array of elements optimised for rapid collision detection calculation + $(this.config.targetsSelector).each(function(i, el) { + var jEl = $(el); + var tl = acx.vector(jEl.offset()); + var br = tl.add(jEl.width(), jEl.height()); + targets.push([jEl, tl, br]); + }); + } + $(document).bind("mousemove", this.drag_handler); + $(document).bind("mouseup", this.drop_handler); + this.drag_handler(jEv); + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/fieldCollection.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/fieldCollection.js new file mode 100644 index 000000000..ce4064f45 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/fieldCollection.js @@ -0,0 +1,25 @@ +(function( app ) { + + var ux = app.ns("ux"); + + ux.FieldCollection = ux.Observable.extend({ + defaults: { + fields: [] // the collection of fields + }, + init: function() { + this._super(); + this.fields = this.config.fields; + }, + validate: function() { + return this.fields.reduce(function(r, field) { + return r && field.validate(); + }, true); + }, + getData: function(type) { + return this.fields.reduce(function(r, field) { + r[field.name] = field.val(); return r; + }, {}); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/observable.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/observable.js new file mode 100644 index 000000000..013039787 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/observable.js @@ -0,0 +1,46 @@ +(function( app ) { + + var ux = app.ns("ux"); + + ux.Observable = ux.Class.extend((function() { + return { + init: function() { + this.observers = {}; + for( var opt in this.config ) { // automatically install observers that are defined in the configuration + if( opt.indexOf( 'on' ) === 0 ) { + this.on( opt.substring(2) , this.config[ opt ] ); + } + } + }, + _getObs: function( type ) { + return ( this.observers[ type.toLowerCase() ] || ( this.observers[ type.toLowerCase() ] = [] ) ); + }, + on: function( type, fn, params, thisp ) { + this._getObs( type ).push( { "cb" : fn, "args" : params || [] , "cx" : thisp || this } ); + return this; + }, + fire: function( type ) { + var params = Array.prototype.slice.call( arguments, 1 ); + this._getObs( type ).slice().forEach( function( ob ) { + ob["cb"].apply( ob["cx"], ob["args"].concat( params ) ); + } ); + return this; + }, + removeAllObservers: function() { + this.observers = {}; + }, + removeObserver: function( type, fn ) { + var obs = this._getObs( type ), + index = obs.reduce( function(p, t, i) { return (t.cb === fn) ? i : p; }, -1 ); + if(index !== -1) { + obs.splice( index, 1 ); + } + return this; // make observable functions chainable + }, + hasObserver: function( type ) { + return !! this._getObs( type ).length; + } + }; + })()); + +})( this.app );
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/singleton.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/singleton.js new file mode 100644 index 000000000..953e4a095 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/singleton.js @@ -0,0 +1,21 @@ +(function( app ) { + + var ux = app.ns("ux"); + + var extend = ux.Observable.extend; + var instance = function() { + if( ! ("me" in this) ) { + this.me = new this(); + } + return this.me; + }; + + ux.Singleton = ux.Observable.extend({}); + + ux.Singleton.extend = function() { + var Self = extend.apply( this, arguments ); + Self.instance = instance; + return Self; + }; + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/singletonSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/singletonSpec.js new file mode 100644 index 000000000..96ef6a282 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/singletonSpec.js @@ -0,0 +1,41 @@ +describe("app.ux.singleton", function(){ + +var Singleton = window.app.ux.Singleton; + + describe("creating a singleton", function() { + var X = Singleton.extend({ + foo: function() { + return "bar"; + } + }); + + var Y = Singleton.extend({ + bar: function() { + return "baz"; + } + }); + + it("should have properties like a normal class", function() { + var a = X.instance(); + + expect( a instanceof X ).toBe( true ); + expect( a.foo() ).toBe( "bar" ); + }); + + it("should return single instance each time instance() is called", function() { + var a = X.instance(); + var b = X.instance(); + + expect( a ).toBe( b ); + }); + + it("should not share instances with different singletons", function() { + var a = X.instance(); + var c = Y.instance(); + + expect( a ).not.toBe( c ); + }); + + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/table.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/table.css new file mode 100644 index 000000000..7d829c4ce --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/table.css @@ -0,0 +1,20 @@ +TABLE.table { + border-collapse: collapse; +} + + +TABLE.table TH { + font-weight: normal; + text-align: left; + vertical-align: middle; +} + +TABLE.table TBODY.striped TR:nth-child(odd) { + background: #eee; +} + +TABLE.table H3 { + margin: 0; + font-weight: bold; + font-size: 140%; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/templates/templateSpec.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/templates/templateSpec.js new file mode 100644 index 000000000..db76b1326 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/templates/templateSpec.js @@ -0,0 +1,81 @@ +describe("app.ut.byteSize_template", function() { + + describe("byteSize_template()", function() { + var byteSize_template = window.app.ut.byteSize_template; + + it("should postfix with a B and have not decimal for number less than 1000", function() { + expect( byteSize_template( 0 ) ).toBe( "0B" ); + expect( byteSize_template( 1 ) ).toBe( "1B" ); + expect( byteSize_template( 10 ) ).toBe( "10B" ); + expect( byteSize_template( 100 ) ).toBe( "100B" ); + expect( byteSize_template( 999 ) ).toBe( "999B" ); + }); + + it("should have 0.xxX for values between 1000 and 1023", function() { + expect( byteSize_template( 1000 ) ).toBe( "0.98ki" ); + expect( byteSize_template( 1024 * 1000 ) ).toBe( "0.98Mi" ); + }); + + it("should always have three significant digits", function() { + expect( byteSize_template( 1023 ) ).toBe( "1.00ki" ); + expect( byteSize_template( 1024 ) ).toBe( "1.00ki" ); + expect( byteSize_template( 1025 ) ).toBe( "1.00ki" ); + expect( byteSize_template( 1024 * 5 ) ).toBe( "5.00ki" ); + expect( byteSize_template( 1024 * 55 ) ).toBe( "55.0ki" ); + expect( byteSize_template( 1024 * 555 ) ).toBe( "555ki" ); + }); + + it("should have the correct postfix", function() { + expect( byteSize_template( 3 * Math.pow( 1024, 1) ) ).toBe( "3.00ki" ); + expect( byteSize_template( 3 * Math.pow( 1024, 2) ) ).toBe( "3.00Mi" ); + expect( byteSize_template( 3 * Math.pow( 1024, 3) ) ).toBe( "3.00Gi" ); + expect( byteSize_template( 3 * Math.pow( 1024, 4) ) ).toBe( "3.00Ti" ); + expect( byteSize_template( 3 * Math.pow( 1024, 5) ) ).toBe( "3.00Pi" ); + expect( byteSize_template( 3 * Math.pow( 1024, 6) ) ).toBe( "3.00Ei" ); + expect( byteSize_template( 3 * Math.pow( 1024, 7) ) ).toBe( "3.00Zi" ); + expect( byteSize_template( 3 * Math.pow( 1024, 8) ) ).toBe( "3.00Yi" ); + }); + + it("should show an overflow for stupidly big numbers", function() { + expect( byteSize_template( 3 * Math.pow( 1024, 10) ) ).toBe( "3.00..E" ); + }); + }); + + describe("count_template()", function() { + var count_template = window.app.ut.count_template; + + it("should not postfix and not decimal for number less than 1000", function() { + expect( count_template( 0 ) ).toBe( "0" ); + expect( count_template( 1 ) ).toBe( "1" ); + expect( count_template( 10 ) ).toBe( "10" ); + expect( count_template( 100 ) ).toBe( "100" ); + expect( count_template( 999 ) ).toBe( "999" ); + }); + + it("should always have three significant digits", function() { + expect( count_template( 1000 ) ).toBe( "1.00k" ); + expect( count_template( 1005 ) ).toBe( "1.00k" ); + expect( count_template( 1055 ) ).toBe( "1.05k" ); + expect( count_template( 1000 * 5 ) ).toBe( "5.00k" ); + expect( count_template( 1000 * 55 ) ).toBe( "55.0k" ); + expect( count_template( 1000 * 555 ) ).toBe( "555k" ); + }); + + it("should have the correct postfix", function() { + expect( count_template( 3 * Math.pow( 1000, 1) ) ).toBe( "3.00k" ); + expect( count_template( 3 * Math.pow( 1000, 2) ) ).toBe( "3.00M" ); + expect( count_template( 3 * Math.pow( 1000, 3) ) ).toBe( "3.00G" ); + expect( count_template( 3 * Math.pow( 1000, 4) ) ).toBe( "3.00T" ); + expect( count_template( 3 * Math.pow( 1000, 5) ) ).toBe( "3.00P" ); + expect( count_template( 3 * Math.pow( 1000, 6) ) ).toBe( "3.00E" ); + expect( count_template( 3 * Math.pow( 1000, 7) ) ).toBe( "3.00Z" ); + expect( count_template( 3 * Math.pow( 1000, 8) ) ).toBe( "3.00Y" ); + }); + + it("should show an overflow for stupidly big numbers", function() { + expect( count_template( 3 * Math.pow( 1000, 10) ) ).toBe( "3.00..E" ); + }); + }); + + +}); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/templates/templates.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/templates/templates.js new file mode 100644 index 000000000..3fdb5087a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/app/ux/templates/templates.js @@ -0,0 +1,32 @@ +(function( app ) { + + var ut = app.ns("ut"); + + ut.option_template = function(v) { return { tag: "OPTION", value: v, text: v }; }; + + ut.require_template = function(f) { return f.require ? { tag: "SPAN", cls: "require", text: "*" } : null; }; + + + var sib_prefix = ['B','ki','Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi']; + + ut.byteSize_template = function(n) { + var i = 0; + while( n >= 1000 ) { + i++; + n /= 1024; + } + return (i === 0 ? n.toString() : n.toFixed( 3 - parseInt(n,10).toString().length )) + ( sib_prefix[ i ] || "..E" ); + }; + + var sid_prefix = ['','k','M', 'G', 'T', 'P', 'E', 'Z', 'Y']; + + ut.count_template = function(n) { + var i = 0; + while( n >= 1000 ) { + i++; + n /= 1000; + } + return i === 0 ? n.toString() : ( n.toFixed( 3 - parseInt(n,10).toString().length ) + ( sid_prefix[ i ] || "..E" ) ); + }; + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/dateRangeParser/date-range-parser.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/dateRangeParser/date-range-parser.js new file mode 100644 index 000000000..b8095fd61 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/dateRangeParser/date-range-parser.js @@ -0,0 +1,203 @@ +/*! + * date-range-parser.js + * Contributed to the Apache Software Foundation by: + * Ben Birch - Aconex + * fork me at https://github.com/mobz/date-range-parser + +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. + +*/ + +(function() { + + var drp = window.dateRangeParser = {}; + + drp.defaultRange = 1000 * 60 * 60 * 24; + + drp.now = null; // set a different value for now than the time at function invocation + + drp.parse = function(v) { + try { + var r = drp._parse(v); + r.end && r.end--; // remove 1 millisecond from the final end range + } catch(e) { + r = null; + } + return r; + }; + + drp.print = function(t, p) { + var format = ["", "-", "-", " ", ":", ":", "."]; + var da = makeArray(t); + var str = ""; + for(var i = 0; i <= p; i++) { + str += format[i] + (da[i] < 10 ? "0" : "") + da[i]; + } + return str; + }; + + (function() { + drp._relTokens = {}; + + var values = { + "yr" : 365*24*60*60*1000, + "mon" : 31*24*60*60*1000, + "day" : 24*60*60*1000, + "hr" : 60*60*1000, + "min" : 60*1000, + "sec" : 1000 + }; + + var alias_lu = { + "yr" : "y,yr,yrs,year,years", + "mon" : "mo,mon,mos,mons,month,months", + "day" : "d,dy,dys,day,days", + "hr" : "h,hr,hrs,hour,hours", + "min" : "m,min,mins,minute,minutes", + "sec" : "s,sec,secs,second,seconds" + }; + + for(var key in alias_lu) { + if(alias_lu.hasOwnProperty(key)) { + var aliases = alias_lu[key].split(","); + for(var i = 0; i < aliases.length; i++) { + drp._relTokens[aliases[i]] = values[key]; + } + } + } + })(); + + function makeArray(d) { + var da = new Date(d); + return [ da.getUTCFullYear(), da.getUTCMonth()+1, da.getUTCDate(), da.getUTCHours(), da.getUTCMinutes(), da.getUTCSeconds(), da.getUTCMilliseconds() ]; + } + + function fromArray(a) { + var d = [].concat(a); d[1]--; + return Date.UTC.apply(null, d); + } + + drp._parse = function parse(v) { + var now = this.now || new Date().getTime(); + + function precArray(d, p, offset) { + var tn = makeArray(d); + tn[p] += offset || 0; + for(var i = p+1; i < 7; i++) { + tn[i] = i < 3 ? 1 : 0; + } + return tn; + } + function makePrecRange(dt, p, r) { + var ret = { }; + ret.start = fromArray(dt); + dt[p] += r || 1; + ret.end = fromArray(dt); + return ret; + } + function procTerm(term) { + var m = term.replace(/\s/g, "").toLowerCase().match(/^([a-z ]+)$|^([ 0-9:-]+)$|^(\d+[a-z]+)$/); + if(m[1]) { // matches ([a-z ]+) + function dra(p, o, r) { + var dt = precArray(now, p, o); + if(r) { + dt[2] -= new Date(fromArray(dt)).getUTCDay(); + } + return makePrecRange(dt, p, r); + } + switch( m[1]) { + case "now" : return { start: now, end: now, now: now }; + case "today" : return dra( 2, 0 ); + case "thisweek" : return dra( 2, 0, 7 ); + case "thismonth" : return dra( 1, 0 ); + case "thisyear" : return dra( 0, 0 ); + case "yesterday" : return dra( 2, -1 ); + case "lastweek" : return dra( 2, -7, 7 ); + case "lastmonth" : return dra( 1, -1 ); + case "lastyear" : return dra( 0, -1 ); + case "tomorrow" : return dra( 2, 1 ); + case "nextweek" : return dra( 2, 7, 7 ); + case "nextmonth" : return dra( 1, 1 ); + case "nextyear" : return dra(0, 1 ); + } + throw "unknown token " + m[1]; + } else if(m[2]) { // matches ([ 0-9:-]+) + dn = makeArray(now); + var dt = m[2].match(/^(?:(\d{4})(?:\-(\d\d))?(?:\-(\d\d))?)? ?(?:(\d{1,2})(?:\:(\d\d)(?:\:(\d\d))?)?)?$/); + dt.shift(); + for(var p = 0, z = false, i = 0; i < 7; i++) { + if(dt[i]) { + dn[i] = parseInt(dt[i], 10); + p = i; + z = true; + } else { + if(z) + dn[i] = i < 3 ? 1 : 0; + } + } + return makePrecRange(dn, p); + } else if(m[3]) { // matches (\d+[a-z]{1,4}) + var dr = m[3].match(/(\d+)\s*([a-z]+)/i); + var n = parseInt(dr[1], 10); + return { rel: n * drp._relTokens[dr[2]] }; + } + throw "unknown term " + term; + } + + if(!v) { + return { start: null, end: null }; + } + var terms = v.split(/\s*([^<>]*[^<>-])?\s*(->|<>|<)?\s*([^<>]+)?\s*/); + + var term1 = terms[1] ? procTerm(terms[1]) : null; + var op = terms[2] || ""; + var term2 = terms[3] ? procTerm(terms[3]) : null; + + if(op === "<" || op === "->" ) { + if(term1 && !term2) { + return { start: term1.start, end: null }; + } else if(!term1 && term2) { + return { start: null, end: term2.end }; + } else { + if(term2.rel) { + return { start: term1.start, end: term1.end + term2.rel }; + } else if(term1.rel) { + return { start: term2.start - term1.rel, end: term2.end }; + } else { + return { start: term1.start, end: term2.end }; + } + } + } else if(op === "<>") { + if(!term2) { + return { start: term1.start - drp.defaultRange, end: term1.end + drp.defaultRange } + } else { + if(! ("rel" in term2)) throw "second term did not hav a range"; + return { start: term1.start - term2.rel, end: term1.end + term2.rel }; + } + } else { + if(term1.rel) { + return { start: now - term1.rel, end: now + term1.rel }; + } else if(term1.now) { + return { start: term1.now - drp.defaultRange, end: term1.now + drp.defaultRange }; + } else { + return { start: term1.start, end: term1.end }; + } + } + throw "could not process value " + v; + }; +})();
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/css/font-awesome.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/css/font-awesome.css new file mode 100644 index 000000000..be7e15cb3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/css/font-awesome.css @@ -0,0 +1,1338 @@ +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('fonts/fontawesome-webfont.eot?v=4.0.3'); + src: url('fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.2857142857142858em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.142857142857143em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + top: 0.14285714285714285em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571428572em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-asc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-desc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-reply-all:before { + content: "\f122"; +} +.fa-mail-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/css/font-awesome.min.css b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/css/font-awesome.min.css new file mode 100644 index 000000000..449d6ac55 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/FontAwesome.otf b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/FontAwesome.otf Binary files differnew file mode 100644 index 000000000..8b0f54e47 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/FontAwesome.otf diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.eot b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.eot Binary files differnew file mode 100755 index 000000000..7c79c6a6b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.eot diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.svg b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.svg new file mode 100755 index 000000000..45fdf3383 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,414 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="fontawesomeregular" horiz-adv-x="1536" > +<font-face units-per-em="1792" ascent="1536" descent="-256" /> +<missing-glyph horiz-adv-x="448" /> +<glyph unicode=" " horiz-adv-x="448" /> +<glyph unicode="	" horiz-adv-x="448" /> +<glyph unicode=" " horiz-adv-x="448" /> +<glyph unicode="¨" horiz-adv-x="1792" /> +<glyph unicode="©" horiz-adv-x="1792" /> +<glyph unicode="®" horiz-adv-x="1792" /> +<glyph unicode="´" horiz-adv-x="1792" /> +<glyph unicode="Æ" horiz-adv-x="1792" /> +<glyph unicode=" " horiz-adv-x="768" /> +<glyph unicode=" " /> +<glyph unicode=" " horiz-adv-x="768" /> +<glyph unicode=" " /> +<glyph unicode=" " horiz-adv-x="512" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode=" " horiz-adv-x="256" /> +<glyph unicode=" " horiz-adv-x="256" /> +<glyph unicode=" " horiz-adv-x="192" /> +<glyph unicode=" " horiz-adv-x="307" /> +<glyph unicode=" " horiz-adv-x="85" /> +<glyph unicode=" " horiz-adv-x="307" /> +<glyph unicode=" " horiz-adv-x="384" /> +<glyph unicode="™" horiz-adv-x="1792" /> +<glyph unicode="∞" horiz-adv-x="1792" /> +<glyph unicode="≠" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> +<glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> +<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " /> +<glyph unicode="" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> +<glyph unicode="" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" /> +<glyph unicode="" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> +<glyph unicode="" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" /> +<glyph unicode="" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> +<glyph unicode="" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> +<glyph unicode="" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> +<glyph unicode="" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" /> +<glyph unicode="" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" /> +<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" /> +<glyph unicode="" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" /> +<glyph unicode="" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" /> +<glyph unicode="" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> +<glyph unicode="" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> +<glyph unicode="" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> +<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" /> +<glyph unicode="" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> +<glyph unicode="" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" /> +<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> +<glyph unicode="" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> +<glyph unicode="" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" /> +<glyph unicode="" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> +<glyph unicode="" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> +<glyph unicode="" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> +<glyph unicode="" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> +<glyph unicode="" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " /> +<glyph unicode="" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> +<glyph unicode="" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> +<glyph unicode="" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> +<glyph unicode="" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" /> +<glyph unicode="" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> +<glyph unicode="" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> +<glyph unicode="" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> +<glyph unicode="" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> +<glyph unicode="" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" /> +<glyph unicode="" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" /> +<glyph unicode="" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> +<glyph unicode="" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" /> +<glyph unicode="" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> +<glyph unicode="" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> +<glyph unicode="" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> +<glyph unicode="" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> +<glyph unicode="" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " /> +<glyph unicode="" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " /> +<glyph unicode="" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> +<glyph unicode="" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" /> +<glyph unicode="" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> +<glyph unicode="" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> +<glyph unicode="" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> +<glyph unicode="" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> +<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> +<glyph unicode="" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" /> +<glyph unicode="" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" /> +<glyph unicode="" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> +<glyph unicode="" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> +<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> +<glyph unicode="" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> +<glyph unicode="" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> +<glyph unicode="" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" /> +<glyph unicode="" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> +<glyph unicode="" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" /> +<glyph unicode="" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> +<glyph unicode="" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> +<glyph unicode="" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> +<glyph unicode="" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" /> +<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> +<glyph unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> +<glyph unicode="" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" /> +<glyph unicode="" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> +<glyph unicode="" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> +<glyph unicode="" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> +<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" /> +<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" /> +<glyph unicode="" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> +<glyph unicode="" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> +<glyph unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> +<glyph unicode="" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> +<glyph unicode="" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" /> +<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> +<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> +<glyph unicode="" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> +<glyph unicode="" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" /> +<glyph unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> +<glyph unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" /> +<glyph unicode="" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> +<glyph unicode="" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> +<glyph unicode="" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> +<glyph unicode="" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> +<glyph unicode="" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> +<glyph unicode="" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" /> +<glyph unicode="" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" /> +<glyph unicode="" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> +<glyph unicode="" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" /> +<glyph unicode="" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" /> +<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> +<glyph unicode="" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> +<glyph unicode="" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " /> +<glyph unicode="" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> +<glyph unicode="" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> +<glyph unicode="" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> +<glyph unicode="" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> +<glyph unicode="" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> +<glyph unicode="" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" /> +<glyph unicode="" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> +<glyph unicode="" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> +<glyph unicode="" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> +<glyph unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" /> +<glyph unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> +<glyph unicode="" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> +<glyph unicode="" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " /> +<glyph unicode="" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> +<glyph unicode="" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> +<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +<glyph unicode="" horiz-adv-x="1792" /> +</font> +</defs></svg>
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.ttf b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.ttf Binary files differnew file mode 100755 index 000000000..e89738de5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.ttf diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.woff b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.woff Binary files differnew file mode 100755 index 000000000..8c1748aab --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/font-awesome/fonts/fontawesome-webfont.woff diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/graphael/g.raphael.standalone.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/graphael/g.raphael.standalone.js new file mode 100644 index 000000000..2568aa0e9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/graphael/g.raphael.standalone.js @@ -0,0 +1,5205 @@ +/*! + * Raphael 1.5.2 - JavaScript Vector Library + * + * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com) + * Licensed under the MIT (http://raphaeljs.com/license.html) license. + * from fork at git@github.com:mobz/g.raphael.git + */ +(function () { + function R() { + if (R.is(arguments[0], array)) { + var a = arguments[0], + cnv = create[apply](R, a.splice(0, 3 + R.is(a[0], nu))), + res = cnv.set(); + for (var i = 0, ii = a[length]; i < ii; i++) { + var j = a[i] || {}; + elements[has](j.type) && res[push](cnv[j.type]().attr(j)); + } + return res; + } + return create[apply](R, arguments); + } + R.version = "1.5.2"; + var separator = /[, ]+/, + elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1}, + formatrg = /\{(\d+)\}/g, + proto = "prototype", + has = "hasOwnProperty", + doc = document, + win = window, + oldRaphael = { + was: Object[proto][has].call(win, "Raphael"), + is: win.Raphael + }, + Paper = function () { + this.customAttributes = {}; + }, + paperproto, + appendChild = "appendChild", + apply = "apply", + concat = "concat", + supportsTouch = "createTouch" in doc, + E = "", + S = " ", + Str = String, + split = "split", + events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[split](S), + touchMap = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + join = "join", + length = "length", + lowerCase = Str[proto].toLowerCase, + math = Math, + mmax = math.max, + mmin = math.min, + abs = math.abs, + pow = math.pow, + PI = math.PI, + nu = "number", + string = "string", + array = "array", + toString = "toString", + fillString = "fill", + objectToString = Object[proto][toString], + paper = {}, + push = "push", + ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i, + colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i, + isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1}, + bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + round = math.round, + setAttribute = "setAttribute", + toFloat = parseFloat, + toInt = parseInt, + ms = " progid:DXImageTransform.Microsoft", + upperCase = Str[proto].toUpperCase, + availableAttrs = {blur: 0, "clip-rect": "0 0 1e9 1e9", cursor: "default", cx: 0, cy: 0, fill: "#fff", "fill-opacity": 1, font: '10px "Arial"', "font-family": '"Arial"', "font-size": "10", "font-style": "normal", "font-weight": 400, gradient: 0, height: 0, href: "http://raphaeljs.com/", opacity: 1, path: "M0,0", r: 0, rotation: 0, rx: 0, ry: 0, scale: "1 1", src: "", stroke: "#000", "stroke-dasharray": "", "stroke-linecap": "butt", "stroke-linejoin": "butt", "stroke-miterlimit": 0, "stroke-opacity": 1, "stroke-width": 1, target: "_blank", "text-anchor": "middle", title: "Raphael", translation: "0 0", width: 0, x: 0, y: 0}, + availableAnimAttrs = {along: "along", blur: nu, "clip-rect": "csv", cx: nu, cy: nu, fill: "colour", "fill-opacity": nu, "font-size": nu, height: nu, opacity: nu, path: "path", r: nu, rotation: "csv", rx: nu, ry: nu, scale: "csv", stroke: "colour", "stroke-opacity": nu, "stroke-width": nu, translation: "csv", width: nu, x: nu, y: nu}, + rp = "replace", + animKeyFrames= /^(from|to|\d+%?)$/, + commaSpaces = /\s*,\s*/, + hsrg = {hs: 1, rg: 1}, + p2s = /,?([achlmqrstvxz]),?/gi, + pathCommand = /([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig, + pathValues = /(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig, + radial_gradient = /^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/, + sortByKey = function (a, b) { + return a.key - b.key; + }; + + R.type = (win.SVGAngle || doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML"); + if (R.type == "VML") { + var d = doc.createElement("div"), + b; + d.innerHTML = '<v:shape adj="1"/>'; + b = d.firstChild; + b.style.behavior = "url(#default#VML)"; + if (!(b && typeof b.adj == "object")) { + return R.type = null; + } + d = null; + } + R.svg = !(R.vml = R.type == "VML"); + Paper[proto] = R[proto]; + paperproto = Paper[proto]; + R._id = 0; + R._oid = 0; + R.fn = {}; + R.is = function (o, type) { + type = lowerCase.call(type); + if (type == "finite") { + return !isnan[has](+o); + } + return (type == "null" && o === null) || + (type == typeof o) || + (type == "object" && o === Object(o)) || + (type == "array" && Array.isArray && Array.isArray(o)) || + objectToString.call(o).slice(8, -1).toLowerCase() == type; + }; + R.angle = function (x1, y1, x2, y2, x3, y3) { + if (x3 == null) { + var x = x1 - x2, + y = y1 - y2; + if (!x && !y) { + return 0; + } + return ((x < 0) * 180 + math.atan(-y / -x) * 180 / PI + 360) % 360; + } else { + return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3); + } + }; + R.rad = function (deg) { + return deg % 360 * PI / 180; + }; + R.deg = function (rad) { + return rad * 180 / PI % 360; + }; + R.snapTo = function (values, value, tolerance) { + tolerance = R.is(tolerance, "finite") ? tolerance : 10; + if (R.is(values, array)) { + var i = values.length; + while (i--) if (abs(values[i] - value) <= tolerance) { + return values[i]; + } + } else { + values = +values; + var rem = value % values; + if (rem < tolerance) { + return value - rem; + } + if (rem > values - tolerance) { + return value - rem + values; + } + } + return value; + }; + function createUUID() { + // http://www.ietf.org/rfc/rfc4122.txt + var s = [], + i = 0; + for (; i < 32; i++) { + s[i] = (~~(math.random() * 16))[toString](16); + } + s[12] = 4; // bits 12-15 of the time_hi_and_version field to 0010 + s[16] = ((s[16] & 3) | 8)[toString](16); // bits 6-7 of the clock_seq_hi_and_reserved to 01 + return "r-" + s[join](""); + } + + R.setWindow = function (newwin) { + win = newwin; + doc = win.document; + }; + // colour utilities + var toHex = function (color) { + if (R.vml) { + // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/ + var trim = /^\s+|\s+$/g; + var bod; + try { + var docum = new ActiveXObject("htmlfile"); + docum.write("<body>"); + docum.close(); + bod = docum.body; + } catch(e) { + bod = createPopup().document.body; + } + var range = bod.createTextRange(); + toHex = cacher(function (color) { + try { + bod.style.color = Str(color)[rp](trim, E); + var value = range.queryCommandValue("ForeColor"); + value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16); + return "#" + ("000000" + value[toString](16)).slice(-6); + } catch(e) { + return "none"; + } + }); + } else { + var i = doc.createElement("i"); + i.title = "Rapha\xebl Colour Picker"; + i.style.display = "none"; + doc.body[appendChild](i); + toHex = cacher(function (color) { + i.style.color = color; + return doc.defaultView.getComputedStyle(i, E).getPropertyValue("color"); + }); + } + return toHex(color); + }, + hsbtoString = function () { + return "hsb(" + [this.h, this.s, this.b] + ")"; + }, + hsltoString = function () { + return "hsl(" + [this.h, this.s, this.l] + ")"; + }, + rgbtoString = function () { + return this.hex; + }; + R.hsb2rgb = function (h, s, b, o) { + if (R.is(h, "object") && "h" in h && "s" in h && "b" in h) { + b = h.b; + s = h.s; + h = h.h; + o = h.o; + } + return R.hsl2rgb(h, s, b / 2, o); + }; + R.hsl2rgb = function (h, s, l, o) { + if (R.is(h, "object") && "h" in h && "s" in h && "l" in h) { + l = h.l; + s = h.s; + h = h.h; + } + if (h > 1 || s > 1 || l > 1) { + h /= 360; + s /= 100; + l /= 100; + } + var rgb = {}, + channels = ["r", "g", "b"], + t2, t1, t3, r, g, b; + if (!s) { + rgb = { + r: l, + g: l, + b: l + }; + } else { + if (l < .5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + t1 = 2 * l - t2; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + if (t3 * 6 < 1) { + rgb[channels[i]] = t1 + (t2 - t1) * 6 * t3; + } else if (t3 * 2 < 1) { + rgb[channels[i]] = t2; + } else if (t3 * 3 < 2) { + rgb[channels[i]] = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + rgb[channels[i]] = t1; + } + } + } + rgb.r *= 255; + rgb.g *= 255; + rgb.b *= 255; + rgb.hex = "#" + (16777216 | rgb.b | (rgb.g << 8) | (rgb.r << 16)).toString(16).slice(1); + R.is(o, "finite") && (rgb.opacity = o); + rgb.toString = rgbtoString; + return rgb; + }; + R.rgb2hsb = function (red, green, blue) { + if (green == null && R.is(red, "object") && "r" in red && "g" in red && "b" in red) { + blue = red.b; + green = red.g; + red = red.r; + } + if (green == null && R.is(red, string)) { + var clr = R.getRGB(red); + red = clr.r; + green = clr.g; + blue = clr.b; + } + if (red > 1 || green > 1 || blue > 1) { + red /= 255; + green /= 255; + blue /= 255; + } + var max = mmax(red, green, blue), + min = mmin(red, green, blue), + hue, + saturation, + brightness = max; + if (min == max) { + return {h: 0, s: 0, b: max, toString: hsbtoString}; + } else { + var delta = (max - min); + saturation = delta / max; + if (red == max) { + hue = (green - blue) / delta; + } else if (green == max) { + hue = 2 + ((blue - red) / delta); + } else { + hue = 4 + ((red - green) / delta); + } + hue /= 6; + hue < 0 && hue++; + hue > 1 && hue--; + } + return {h: hue, s: saturation, b: brightness, toString: hsbtoString}; + }; + R.rgb2hsl = function (red, green, blue) { + if (green == null && R.is(red, "object") && "r" in red && "g" in red && "b" in red) { + blue = red.b; + green = red.g; + red = red.r; + } + if (green == null && R.is(red, string)) { + var clr = R.getRGB(red); + red = clr.r; + green = clr.g; + blue = clr.b; + } + if (red > 1 || green > 1 || blue > 1) { + red /= 255; + green /= 255; + blue /= 255; + } + var max = mmax(red, green, blue), + min = mmin(red, green, blue), + h, + s, + l = (max + min) / 2, + hsl; + if (min == max) { + hsl = {h: 0, s: 0, l: l}; + } else { + var delta = max - min; + s = l < .5 ? delta / (max + min) : delta / (2 - max - min); + if (red == max) { + h = (green - blue) / delta; + } else if (green == max) { + h = 2 + (blue - red) / delta; + } else { + h = 4 + (red - green) / delta; + } + h /= 6; + h < 0 && h++; + h > 1 && h--; + hsl = {h: h, s: s, l: l}; + } + hsl.toString = hsltoString; + return hsl; + }; + R._path2string = function () { + return this.join(",")[rp](p2s, "$1"); + }; + function cacher(f, scope, postprocessor) { + function newf() { + var arg = Array[proto].slice.call(arguments, 0), + args = arg[join]("\u25ba"), + cache = newf.cache = newf.cache || {}, + count = newf.count = newf.count || []; + if (cache[has](args)) { + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + count[length] >= 1e3 && delete cache[count.shift()]; + count[push](args); + cache[args] = f[apply](scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; + } + + R.getRGB = cacher(function (colour) { + if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1}; + } + if (colour == "none") { + return {r: -1, g: -1, b: -1, hex: "none"}; + } + !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour)); + var res, + red, + green, + blue, + opacity, + t, + values, + rgb = colour.match(colourRegExp); + if (rgb) { + if (rgb[2]) { + blue = toInt(rgb[2].substring(5), 16); + green = toInt(rgb[2].substring(3, 5), 16); + red = toInt(rgb[2].substring(1, 3), 16); + } + if (rgb[3]) { + blue = toInt((t = rgb[3].charAt(3)) + t, 16); + green = toInt((t = rgb[3].charAt(2)) + t, 16); + red = toInt((t = rgb[3].charAt(1)) + t, 16); + } + if (rgb[4]) { + values = rgb[4][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + } + if (rgb[5]) { + values = rgb[5][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsb2rgb(red, green, blue, opacity); + } + if (rgb[6]) { + values = rgb[6][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsl2rgb(red, green, blue, opacity); + } + rgb = {r: red, g: green, b: blue}; + rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1); + R.is(opacity, "finite") && (rgb.opacity = opacity); + return rgb; + } + return {r: -1, g: -1, b: -1, hex: "none", error: 1}; + }, R); + R.getColor = function (value) { + var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75}, + rgb = this.hsb2rgb(start.h, start.s, start.b); + start.h += .075; + if (start.h > 1) { + start.h = 0; + start.s -= .2; + start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b}); + } + return rgb.hex; + }; + R.getColor.reset = function () { + delete this.start; + }; + // path utilities + R.parsePathString = cacher(function (pathString) { + if (!pathString) { + return null; + } + var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0}, + data = []; + if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption + data = pathClone(pathString); + } + if (!data[length]) { + Str(pathString)[rp](pathCommand, function (a, b, c) { + var params = [], + name = lowerCase.call(b); + c[rp](pathValues, function (a, b) { + b && params[push](+b); + }); + if (name == "m" && params[length] > 2) { + data[push]([b][concat](params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + while (params[length] >= paramCounts[name]) { + data[push]([b][concat](params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + }); + } + data[toString] = R._path2string; + return data; + }); + R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t, + x = pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y = pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t * t * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t * t * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t * t * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t * t * (p2y - 2 * c2y + c1y), + ax = (1 - t) * p1x + t * c1x, + ay = (1 - t) * p1y + t * c1y, + cx = (1 - t) * c2x + t * p2x, + cy = (1 - t) * c2y + t * p2y, + alpha = (90 - math.atan((mx - nx) / (my - ny)) * 180 / PI); + (mx > nx || my < ny) && (alpha += 180); + return {x: x, y: y, m: {x: mx, y: my}, n: {x: nx, y: ny}, start: {x: ax, y: ay}, end: {x: cx, y: cy}, alpha: alpha}; + }; + var pathDimensions = cacher(function (path) { + if (!path) { + return {x: 0, y: 0, width: 0, height: 0}; + } + path = path2curve(path); + var x = 0, + y = 0, + X = [], + Y = [], + p; + for (var i = 0, ii = path[length]; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = p[1]; + y = p[2]; + X[push](x); + Y[push](y); + } else { + var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + X = X[concat](dim.min.x, dim.max.x); + Y = Y[concat](dim.min.y, dim.max.y); + x = p[5]; + y = p[6]; + } + } + var xmin = mmin[apply](0, X), + ymin = mmin[apply](0, Y); + return { + x: xmin, + y: ymin, + width: mmax[apply](0, X) - xmin, + height: mmax[apply](0, Y) - ymin + }; + }), + pathClone = function (pathArray) { + var res = []; + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + for (var i = 0, ii = pathArray[length]; i < ii; i++) { + res[i] = []; + for (var j = 0, jj = pathArray[i][length]; j < jj; j++) { + res[i][j] = pathArray[i][j]; + } + } + res[toString] = R._path2string; + return res; + }, + pathToRelative = cacher(function (pathArray) { + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = pathArray[0][1]; + y = pathArray[0][2]; + mx = x; + my = y; + start++; + res[push](["M", x, y]); + } + for (var i = start, ii = pathArray[length]; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != lowerCase.call(pa[0])) { + r[0] = lowerCase.call(pa[0]); + switch (r[0]) { + case "a": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] - x).toFixed(3); + r[7] = +(pa[7] - y).toFixed(3); + break; + case "v": + r[1] = +(pa[1] - y).toFixed(3); + break; + case "m": + mx = pa[1]; + my = pa[2]; + default: + for (var j = 1, jj = pa[length]; j < jj; j++) { + r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3); + } + } + } else { + r = res[i] = []; + if (pa[0] == "m") { + mx = pa[1] + x; + my = pa[2] + y; + } + for (var k = 0, kk = pa[length]; k < kk; k++) { + res[i][k] = pa[k]; + } + } + var len = res[i][length]; + switch (res[i][0]) { + case "z": + x = mx; + y = my; + break; + case "h": + x += +res[i][len - 1]; + break; + case "v": + y += +res[i][len - 1]; + break; + default: + x += +res[i][len - 2]; + y += +res[i][len - 1]; + } + } + res[toString] = R._path2string; + return res; + }, 0, pathClone), + pathToAbsolute = cacher(function (pathArray) { + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = ["M", x, y]; + } + for (var i = start, ii = pathArray[length]; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != upperCase.call(pa[0])) { + r[0] = upperCase.call(pa[0]); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] + x); + r[7] = +(pa[7] + y); + break; + case "V": + r[1] = +pa[1] + y; + break; + case "H": + r[1] = +pa[1] + x; + break; + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + default: + for (var j = 1, jj = pa[length]; j < jj; j++) { + r[j] = +pa[j] + ((j % 2) ? x : y); + } + } + } else { + for (var k = 0, kk = pa[length]; k < kk; k++) { + res[i][k] = pa[k]; + } + } + switch (r[0]) { + case "Z": + x = mx; + y = my; + break; + case "H": + x = r[1]; + break; + case "V": + y = r[1]; + break; + case "M": + mx = res[i][res[i][length] - 2]; + my = res[i][res[i][length] - 1]; + default: + x = res[i][res[i][length] - 2]; + y = res[i][res[i][length] - 1]; + } + } + res[toString] = R._path2string; + return res; + }, null, pathClone), + l2c = function (x1, y1, x2, y2) { + return [x1, y1, x2, y2, x2, y2]; + }, + q2c = function (x1, y1, ax, ay, x2, y2) { + var _13 = 1 / 3, + _23 = 2 / 3; + return [ + _13 * x1 + _23 * ax, + _13 * y1 + _23 * ay, + _13 * x2 + _23 * ax, + _13 * y2 + _23 * ay, + x2, + y2 + ]; + }, + a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var _120 = PI * 120 / 180, + rad = PI / 180 * (+angle || 0), + res = [], + xy, + rotate = cacher(function (x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), + Y = x * math.sin(rad) + y * math.cos(rad); + return {x: X, y: Y}; + }); + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var cos = math.cos(PI / 180 * angle), + sin = math.sin(PI / 180 * angle), + x = (x1 - x2) / 2, + y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + var rx2 = rx * rx, + ry2 = ry * ry, + k = (large_arc_flag == sweep_flag ? -1 : 1) * + math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))), + cx = k * rx * y / ry + (x1 + x2) / 2, + cy = k * -ry * x / rx + (y1 + y2) / 2, + f1 = math.asin(((y1 - cy) / ry).toFixed(9)), + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + f1 < 0 && (f1 = PI * 2 + f1); + f2 < 0 && (f2 = PI * 2 + f2); + if (sweep_flag && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sweep_flag && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + var df = f2 - f1; + if (abs(df) > _120) { + var f2old = f2, + x2old = x2, + y2old = y2; + f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = math.cos(f1), + s1 = math.sin(f1), + c2 = math.cos(f2), + s2 = math.sin(f2), + t = math.tan(df / 4), + hx = 4 / 3 * rx * t, + hy = 4 / 3 * ry * t, + m1 = [x1, y1], + m2 = [x1 + hx * s1, y1 - hy * c1], + m3 = [x2 + hx * s2, y2 - hy * c2], + m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [m2, m3, m4][concat](res); + } else { + res = [m2, m3, m4][concat](res)[join]()[split](","); + var newres = []; + for (var i = 0, ii = res[length]; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + }, + findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t; + return { + x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y + }; + }, + curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x), + b = 2 * (c1x - p1x) - 2 * (c2x - c1x), + c = p1x - c1x, + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a, + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a, + y = [p1y, p2y], + x = [p1x, p2x], + dot; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x[push](dot.x); + y[push](dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x[push](dot.x); + y[push](dot.y); + } + a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y); + b = 2 * (c1y - p1y) - 2 * (c2y - c1y); + c = p1y - c1y; + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a; + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x[push](dot.x); + y[push](dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x[push](dot.x); + y[push](dot.y); + } + return { + min: {x: mmin[apply](0, x), y: mmin[apply](0, y)}, + max: {x: mmax[apply](0, x), y: mmax[apply](0, y)} + }; + }), + path2curve = cacher(function (path, path2) { + var p = pathToAbsolute(path), + p2 = path2 && pathToAbsolute(path2), + attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + processPath = function (path, d) { + var nx, ny; + if (!path) { + return ["C", d.x, d.y, d.x, d.y, d.x, d.y]; + } + !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null); + switch (path[0]) { + case "M": + d.X = path[1]; + d.Y = path[2]; + break; + case "A": + path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1)))); + break; + case "S": + nx = d.x + (d.x - (d.bx || d.x)); + ny = d.y + (d.y - (d.by || d.y)); + path = ["C", nx, ny][concat](path.slice(1)); + break; + case "T": + d.qx = d.x + (d.x - (d.qx || d.x)); + d.qy = d.y + (d.y - (d.qy || d.y)); + path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); + break; + case "Q": + d.qx = path[1]; + d.qy = path[2]; + path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4])); + break; + case "L": + path = ["C"][concat](l2c(d.x, d.y, path[1], path[2])); + break; + case "H": + path = ["C"][concat](l2c(d.x, d.y, path[1], d.y)); + break; + case "V": + path = ["C"][concat](l2c(d.x, d.y, d.x, path[1])); + break; + case "Z": + path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y)); + break; + } + return path; + }, + fixArc = function (pp, i) { + if (pp[i][length] > 7) { + pp[i].shift(); + var pi = pp[i]; + while (pi[length]) { + pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6))); + } + pp.splice(i, 1); + ii = mmax(p[length], p2 && p2[length] || 0); + } + }, + fixM = function (path1, path2, a1, a2, i) { + if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { + path2.splice(i, 0, ["M", a2.x, a2.y]); + a1.bx = 0; + a1.by = 0; + a1.x = path1[i][1]; + a1.y = path1[i][2]; + ii = mmax(p[length], p2 && p2[length] || 0); + } + }; + for (var i = 0, ii = mmax(p[length], p2 && p2[length] || 0); i < ii; i++) { + p[i] = processPath(p[i], attrs); + fixArc(p, i); + p2 && (p2[i] = processPath(p2[i], attrs2)); + p2 && fixArc(p2, i); + fixM(p, p2, attrs, attrs2, i); + fixM(p2, p, attrs2, attrs, i); + var seg = p[i], + seg2 = p2 && p2[i], + seglen = seg[length], + seg2len = p2 && seg2[length]; + attrs.x = seg[seglen - 2]; + attrs.y = seg[seglen - 1]; + attrs.bx = toFloat(seg[seglen - 4]) || attrs.x; + attrs.by = toFloat(seg[seglen - 3]) || attrs.y; + attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x); + attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y); + attrs2.x = p2 && seg2[seg2len - 2]; + attrs2.y = p2 && seg2[seg2len - 1]; + } + return p2 ? [p, p2] : p; + }, null, pathClone), + parseDots = cacher(function (gradient) { + var dots = []; + for (var i = 0, ii = gradient[length]; i < ii; i++) { + var dot = {}, + par = gradient[i].match(/^([^:]*):?([\d\.]*)/); + dot.color = R.getRGB(par[1]); + if (dot.color.error) { + return null; + } + dot.color = dot.color.hex; + par[2] && (dot.offset = par[2] + "%"); + dots[push](dot); + } + for (i = 1, ii = dots[length] - 1; i < ii; i++) { + if (!dots[i].offset) { + var start = toFloat(dots[i - 1].offset || 0), + end = 0; + for (var j = i + 1; j < ii; j++) { + if (dots[j].offset) { + end = dots[j].offset; + break; + } + } + if (!end) { + end = 100; + j = ii; + } + end = toFloat(end); + var d = (end - start) / (j - i + 1); + for (; i < j; i++) { + start += d; + dots[i].offset = start + "%"; + } + } + } + return dots; + }), + getContainer = function (x, y, w, h) { + var container; + if (R.is(x, string) || R.is(x, "object")) { + container = R.is(x, string) ? doc.getElementById(x) : x; + if (container.tagName) { + if (y == null) { + return { + container: container, + width: container.style.pixelWidth || container.offsetWidth, + height: container.style.pixelHeight || container.offsetHeight + }; + } else { + return {container: container, width: y, height: w}; + } + } + } else { + return {container: 1, x: x, y: y, width: w, height: h}; + } + }, + plugins = function (con, add) { + var that = this; + for (var prop in add) { + if (add[has](prop) && !(prop in con)) { + switch (typeof add[prop]) { + case "function": + (function (f) { + con[prop] = con === that ? f : function () { return f[apply](that, arguments); }; + })(add[prop]); + break; + case "object": + con[prop] = con[prop] || {}; + plugins.call(this, con[prop], add[prop]); + break; + default: + con[prop] = add[prop]; + break; + } + } + } + }, + tear = function (el, paper) { + el == paper.top && (paper.top = el.prev); + el == paper.bottom && (paper.bottom = el.next); + el.next && (el.next.prev = el.prev); + el.prev && (el.prev.next = el.next); + }, + tofront = function (el, paper) { + if (paper.top === el) { + return; + } + tear(el, paper); + el.next = null; + el.prev = paper.top; + paper.top.next = el; + paper.top = el; + }, + toback = function (el, paper) { + if (paper.bottom === el) { + return; + } + tear(el, paper); + el.next = paper.bottom; + el.prev = null; + paper.bottom.prev = el; + paper.bottom = el; + }, + insertafter = function (el, el2, paper) { + tear(el, paper); + el2 == paper.top && (paper.top = el); + el2.next && (el2.next.prev = el); + el.next = el2.next; + el.prev = el2; + el2.next = el; + }, + insertbefore = function (el, el2, paper) { + tear(el, paper); + el2 == paper.bottom && (paper.bottom = el); + el2.prev && (el2.prev.next = el); + el.prev = el2.prev; + el2.prev = el; + el.next = el2; + }, + removed = function (methodname) { + return function () { + throw new Error("Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object"); + }; + }; + R.pathToRelative = pathToRelative; + // SVG + if (R.svg) { + paperproto.svgns = "http://www.w3.org/2000/svg"; + paperproto.xlink = "http://www.w3.org/1999/xlink"; + round = function (num) { + return +num + (~~num === num) * .5; + }; + var $ = function (el, attr) { + if (attr) { + for (var key in attr) { + if (attr[has](key)) { + el[setAttribute](key, Str(attr[key])); + } + } + } else { + el = doc.createElementNS(paperproto.svgns, el); + el.style.webkitTapHighlightColor = "rgba(0,0,0,0)"; + return el; + } + }; + R[toString] = function () { + return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version; + }; + var thePath = function (pathString, SVG) { + var el = $("path"); + SVG.canvas && SVG.canvas[appendChild](el); + var p = new Element(el, SVG); + p.type = "path"; + setFillAndStroke(p, {fill: "none", stroke: "#000", path: pathString}); + return p; + }; + var addGradientFill = function (o, gradient, SVG) { + var type = "linear", + fx = .5, fy = .5, + s = o.style; + gradient = Str(gradient)[rp](radial_gradient, function (all, _fx, _fy) { + type = "radial"; + if (_fx && _fy) { + fx = toFloat(_fx); + fy = toFloat(_fy); + var dir = ((fy > .5) * 2 - 1); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && + (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) && + fy != .5 && + (fy = fy.toFixed(5) - 1e-5 * dir); + } + return E; + }); + gradient = gradient[split](/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + var vector = [0, 0, math.cos(angle * PI / 180), math.sin(angle * PI / 180)], + max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1); + vector[2] *= max; + vector[3] *= max; + if (vector[2] < 0) { + vector[0] = -vector[2]; + vector[2] = 0; + } + if (vector[3] < 0) { + vector[1] = -vector[3]; + vector[3] = 0; + } + } + var dots = parseDots(gradient); + if (!dots) { + return null; + } + var id = o.getAttribute(fillString); + id = id.match(/^url\(#(.*)\)$/); + id && SVG.defs.removeChild(doc.getElementById(id[1])); + + var el = $(type + "Gradient"); + el.id = createUUID(); + $(el, type == "radial" ? {fx: fx, fy: fy} : {x1: vector[0], y1: vector[1], x2: vector[2], y2: vector[3]}); + SVG.defs[appendChild](el); + for (var i = 0, ii = dots[length]; i < ii; i++) { + var stop = $("stop"); + $(stop, { + offset: dots[i].offset ? dots[i].offset : !i ? "0%" : "100%", + "stop-color": dots[i].color || "#fff" + }); + el[appendChild](stop); + } + $(o, { + fill: "url(#" + el.id + ")", + opacity: 1, + "fill-opacity": 1 + }); + s.fill = E; + s.opacity = 1; + s.fillOpacity = 1; + return 1; + }; + var updatePosition = function (o) { + var bbox = o.getBBox(); + $(o.pattern, {patternTransform: R.format("translate({0},{1})", bbox.x, bbox.y)}); + }; + var setFillAndStroke = function (o, params) { + var dasharray = { + "": [0], + "none": [0], + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + node = o.node, + attrs = o.attrs, + rot = o.rotate(), + addDashes = function (o, value) { + value = dasharray[lowerCase.call(value)]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = []; + var i = value[length]; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(node, {"stroke-dasharray": dashes[join](",")}); + } + }; + params[has]("rotation") && (rot = params.rotation); + var rotxy = Str(rot)[split](separator); + if (!(rotxy.length - 1)) { + rotxy = null; + } else { + rotxy[1] = +rotxy[1]; + rotxy[2] = +rotxy[2]; + } + toFloat(rot) && o.rotate(0, true); + for (var att in params) { + if (params[has](att)) { + if (!availableAttrs[has](att)) { + continue; + } + var value = params[att]; + attrs[att] = value; + switch (att) { + case "blur": + o.blur(value); + break; + case "rotation": + o.rotate(value, true); + break; + case "href": + case "title": + case "target": + var pn = node.parentNode; + if (lowerCase.call(pn.tagName) != "a") { + var hl = $("a"); + pn.insertBefore(hl, node); + hl[appendChild](node); + pn = hl; + } + if (att == "target" && value == "blank") { + pn.setAttributeNS(o.paper.xlink, "show", "new"); + } else { + pn.setAttributeNS(o.paper.xlink, att, value); + } + break; + case "cursor": + node.style.cursor = value; + break; + case "clip-rect": + var rect = Str(value)[split](separator); + if (rect[length] == 4) { + o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode); + var el = $("clipPath"), + rc = $("rect"); + el.id = createUUID(); + $(rc, { + x: rect[0], + y: rect[1], + width: rect[2], + height: rect[3] + }); + el[appendChild](rc); + o.paper.defs[appendChild](el); + $(node, {"clip-path": "url(#" + el.id + ")"}); + o.clip = rc; + } + if (!value) { + var clip = doc.getElementById(node.getAttribute("clip-path")[rp](/(^url\(#|\)$)/g, E)); + clip && clip.parentNode.removeChild(clip); + $(node, {"clip-path": E}); + delete o.clip; + } + break; + case "path": + if (o.type == "path") { + $(node, {d: value ? attrs.path = pathToAbsolute(value) : "M0,0"}); + } + break; + case "width": + node[setAttribute](att, value); + if (attrs.fx) { + att = "x"; + value = attrs.x; + } else { + break; + } + case "x": + if (attrs.fx) { + value = -attrs.x - (attrs.width || 0); + } + case "rx": + if (att == "rx" && o.type == "rect") { + break; + } + case "cx": + rotxy && (att == "x" || att == "cx") && (rotxy[1] += value - attrs[att]); + node[setAttribute](att, value); + o.pattern && updatePosition(o); + break; + case "height": + node[setAttribute](att, value); + if (attrs.fy) { + att = "y"; + value = attrs.y; + } else { + break; + } + case "y": + if (attrs.fy) { + value = -attrs.y - (attrs.height || 0); + } + case "ry": + if (att == "ry" && o.type == "rect") { + break; + } + case "cy": + rotxy && (att == "y" || att == "cy") && (rotxy[2] += value - attrs[att]); + node[setAttribute](att, value); + o.pattern && updatePosition(o); + break; + case "r": + if (o.type == "rect") { + $(node, {rx: value, ry: value}); + } else { + node[setAttribute](att, value); + } + break; + case "src": + if (o.type == "image") { + node.setAttributeNS(o.paper.xlink, "href", value); + } + break; + case "stroke-width": + node.style.strokeWidth = value; + // Need following line for Firefox + node[setAttribute](att, value); + if (attrs["stroke-dasharray"]) { + addDashes(o, attrs["stroke-dasharray"]); + } + break; + case "stroke-dasharray": + addDashes(o, value); + break; + case "translation": + var xy = Str(value)[split](separator); + xy[0] = +xy[0] || 0; + xy[1] = +xy[1] || 0; + if (rotxy) { + rotxy[1] += xy[0]; + rotxy[2] += xy[1]; + } + translate.call(o, xy[0], xy[1]); + break; + case "scale": + xy = Str(value)[split](separator); + o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, isNaN(toFloat(xy[2])) ? null : +xy[2], isNaN(toFloat(xy[3])) ? null : +xy[3]); + break; + case fillString: + var isURL = Str(value).match(ISURL); + if (isURL) { + el = $("pattern"); + var ig = $("image"); + el.id = createUUID(); + $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1}); + $(ig, {x: 0, y: 0}); + ig.setAttributeNS(o.paper.xlink, "href", isURL[1]); + el[appendChild](ig); + + var img = doc.createElement("img"); + img.style.cssText = "position:absolute;left:-9999em;top-9999em"; + img.onload = function () { + $(el, {width: this.offsetWidth, height: this.offsetHeight}); + $(ig, {width: this.offsetWidth, height: this.offsetHeight}); + doc.body.removeChild(this); + o.paper.safari(); + }; + doc.body[appendChild](img); + img.src = isURL[1]; + o.paper.defs[appendChild](el); + node.style.fill = "url(#" + el.id + ")"; + $(node, {fill: "url(#" + el.id + ")"}); + o.pattern = el; + o.pattern && updatePosition(o); + break; + } + var clr = R.getRGB(value); + if (!clr.error) { + delete params.gradient; + delete attrs.gradient; + !R.is(attrs.opacity, "undefined") && + R.is(params.opacity, "undefined") && + $(node, {opacity: attrs.opacity}); + !R.is(attrs["fill-opacity"], "undefined") && + R.is(params["fill-opacity"], "undefined") && + $(node, {"fill-opacity": attrs["fill-opacity"]}); + } else if ((({circle: 1, ellipse: 1})[has](o.type) || Str(value).charAt() != "r") && addGradientFill(node, value, o.paper)) { + attrs.gradient = value; + attrs.fill = "none"; + break; + } + clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + case "stroke": + clr = R.getRGB(value); + node[setAttribute](att, clr.hex); + att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + break; + case "gradient": + (({circle: 1, ellipse: 1})[has](o.type) || Str(value).charAt() != "r") && addGradientFill(node, value, o.paper); + break; + case "opacity": + if (attrs.gradient && !attrs[has]("stroke-opacity")) { + $(node, {"stroke-opacity": value > 1 ? value / 100 : value}); + } + // fall + case "fill-opacity": + if (attrs.gradient) { + var gradient = doc.getElementById(node.getAttribute(fillString)[rp](/^url\(#|\)$/g, E)); + if (gradient) { + var stops = gradient.getElementsByTagName("stop"); + stops[stops[length] - 1][setAttribute]("stop-opacity", value); + } + break; + } + default: + att == "font-size" && (value = toInt(value, 10) + "px"); + var cssrule = att[rp](/(\-.)/g, function (w) { + return upperCase.call(w.substring(1)); + }); + node.style[cssrule] = value; + // Need following line for Firefox + node[setAttribute](att, value); + break; + } + } + } + + tuneText(o, params); + if (rotxy) { + o.rotate(rotxy.join(S)); + } else { + toFloat(rot) && o.rotate(rot, true); + } + }; + var leading = 1.2, + tuneText = function (el, params) { + if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) { + return; + } + var a = el.attrs, + node = el.node, + fontSize = node.firstChild ? toInt(doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10; + + if (params[has]("text")) { + a.text = params.text; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var texts = Str(params.text)[split]("\n"); + for (var i = 0, ii = texts[length]; i < ii; i++) if (texts[i]) { + var tspan = $("tspan"); + i && $(tspan, {dy: fontSize * leading, x: a.x}); + tspan[appendChild](doc.createTextNode(texts[i])); + node[appendChild](tspan); + } + } else { + texts = node.getElementsByTagName("tspan"); + for (i = 0, ii = texts[length]; i < ii; i++) { + i && $(texts[i], {dy: fontSize * leading, x: a.x}); + } + } + $(node, {y: a.y}); + var bb = el.getBBox(), + dif = a.y - (bb.y + bb.height / 2); + dif && R.is(dif, "finite") && $(node, {y: a.y + dif}); + }, + Element = function (node, svg) { + var X = 0, + Y = 0; + this[0] = node; + this.id = R._oid++; + this.node = node; + node.raphael = this; + this.paper = svg; + this.attrs = this.attrs || {}; + this.transformations = []; // rotate, translate, scale + this._ = { + tx: 0, + ty: 0, + rt: {deg: 0, cx: 0, cy: 0}, + sx: 1, + sy: 1 + }; + !svg.bottom && (svg.bottom = this); + this.prev = svg.top; + svg.top && (svg.top.next = this); + svg.top = this; + this.next = null; + }; + var elproto = Element[proto]; + Element[proto].rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + if (this._.rt.cx) { + return [this._.rt.deg, this._.rt.cx, this._.rt.cy][join](S); + } + return this._.rt.deg; + } + var bbox = this.getBBox(); + deg = Str(deg)[split](separator); + if (deg[length] - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + if (cx != null && cx !== false) { + this._.rt.deg = deg; + } else { + this._.rt.deg += deg; + } + (cy == null) && (cx = null); + this._.rt.cx = cx; + this._.rt.cy = cy; + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + if (this._.rt.deg) { + this.transformations[0] = R.format("rotate({0} {1} {2})", this._.rt.deg, cx, cy); + this.clip && $(this.clip, {transform: R.format("rotate({0} {1} {2})", -this._.rt.deg, cx, cy)}); + } else { + this.transformations[0] = E; + this.clip && $(this.clip, {transform: E}); + } + $(this.node, {transform: this.transformations[join](S)}); + return this; + }; + Element[proto].hide = function () { + !this.removed && (this.node.style.display = "none"); + return this; + }; + Element[proto].show = function () { + !this.removed && (this.node.style.display = ""); + return this; + }; + Element[proto].remove = function () { + if (this.removed) { + return; + } + tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + for (var i in this) { + delete this[i]; + } + this.removed = true; + }; + Element[proto].getBBox = function () { + if (this.removed) { + return this; + } + if (this.type == "path") { + return pathDimensions(this.attrs.path); + } + if (this.node.style.display == "none") { + this.show(); + var hide = true; + } + var bbox = {}; + try { + bbox = this.node.getBBox(); + } catch(e) { + // Firefox 3.0.x plays badly here + } finally { + bbox = bbox || {}; + } + if (this.type == "text") { + bbox = {x: bbox.x, y: Infinity, width: 0, height: 0}; + for (var i = 0, ii = this.node.getNumberOfChars(); i < ii; i++) { + var bb = this.node.getExtentOfChar(i); + (bb.y < bbox.y) && (bbox.y = bb.y); + (bb.y + bb.height - bbox.y > bbox.height) && (bbox.height = bb.y + bb.height - bbox.y); + (bb.x + bb.width - bbox.x > bbox.width) && (bbox.width = bb.x + bb.width - bbox.x); + } + } + hide && this.hide(); + return bbox; + }; + Element[proto].attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var i in this.attrs) if (this.attrs[has](i)) { + res[i] = this.attrs[i]; + } + this._.rt.deg && (res.rotation = this.rotate()); + (this._.sx != 1 || this._.sy != 1) && (res.scale = this.scale()); + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + return res; + } + if (value == null && R.is(name, string)) { + if (name == "translation") { + return translate.call(this); + } + if (name == "rotation") { + return this.rotate(); + } + if (name == "scale") { + return this.scale(); + } + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + return this.attrs[name]; + } + if (value == null && R.is(name, array)) { + var values = {}; + for (var j = 0, jj = name.length; j < jj; j++) { + values[name[j]] = this.attr(name[j]); + } + return values; + } + if (value != null) { + var params = {}; + params[name] = value; + } else if (name != null && R.is(name, "object")) { + params = name; + } + for (var key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [][concat](params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + setFillAndStroke(this, params); + return this; + }; + Element[proto].toFront = function () { + if (this.removed) { + return this; + } + this.node.parentNode[appendChild](this.node); + var svg = this.paper; + svg.top != this && tofront(this, svg); + return this; + }; + Element[proto].toBack = function () { + if (this.removed) { + return this; + } + if (this.node.parentNode.firstChild != this.node) { + this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild); + toback(this, this.paper); + var svg = this.paper; + } + return this; + }; + Element[proto].insertAfter = function (element) { + if (this.removed) { + return this; + } + var node = element.node || element[element.length - 1].node; + if (node.nextSibling) { + node.parentNode.insertBefore(this.node, node.nextSibling); + } else { + node.parentNode[appendChild](this.node); + } + insertafter(this, element, this.paper); + return this; + }; + Element[proto].insertBefore = function (element) { + if (this.removed) { + return this; + } + var node = element.node || element[0].node; + node.parentNode.insertBefore(this.node, node); + insertbefore(this, element, this.paper); + return this; + }; + Element[proto].blur = function (size) { + // Experimental. No Safari support. Use it on your own risk. + var t = this; + if (+size !== 0) { + var fltr = $("filter"), + blur = $("feGaussianBlur"); + t.attrs.blur = size; + fltr.id = createUUID(); + $(blur, {stdDeviation: +size || 1.5}); + fltr.appendChild(blur); + t.paper.defs.appendChild(fltr); + t._blur = fltr; + $(t.node, {filter: "url(#" + fltr.id + ")"}); + } else { + if (t._blur) { + t._blur.parentNode.removeChild(t._blur); + delete t._blur; + delete t.attrs.blur; + } + t.node.removeAttribute("filter"); + } + }; + var theCircle = function (svg, x, y, r) { + var el = $("circle"); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"}; + res.type = "circle"; + $(el, res.attrs); + return res; + }, + theRect = function (svg, x, y, w, h, r) { + var el = $("rect"); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, r: r || 0, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"}; + res.type = "rect"; + $(el, res.attrs); + return res; + }, + theEllipse = function (svg, x, y, rx, ry) { + var el = $("ellipse"); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"}; + res.type = "ellipse"; + $(el, res.attrs); + return res; + }, + theImage = function (svg, src, x, y, w, h) { + var el = $("image"); + $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"}); + el.setAttributeNS(svg.xlink, "href", src); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, src: src}; + res.type = "image"; + return res; + }, + theText = function (svg, x, y, text) { + var el = $("text"); + $(el, {x: x, y: y, "text-anchor": "middle"}); + svg.canvas && svg.canvas[appendChild](el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, "text-anchor": "middle", text: text, font: availableAttrs.font, stroke: "none", fill: "#000"}; + res.type = "text"; + setFillAndStroke(res, res.attrs); + return res; + }, + setSize = function (width, height) { + this.width = width || this.width; + this.height = height || this.height; + this.canvas[setAttribute]("width", this.width); + this.canvas[setAttribute]("height", this.height); + return this; + }, + create = function () { + var con = getContainer[apply](0, arguments), + container = con && con.container, + x = con.x, + y = con.y, + width = con.width, + height = con.height; + if (!container) { + throw new Error("SVG container not found."); + } + var cnvs = $("svg"); + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + $(cnvs, { + xmlns: "http://www.w3.org/2000/svg", + version: 1.1, + width: width, + height: height + }); + if (container == 1) { + cnvs.style.cssText = "position:absolute;left:" + x + "px;top:" + y + "px"; + doc.body[appendChild](cnvs); + } else { + if (container.firstChild) { + container.insertBefore(cnvs, container.firstChild); + } else { + container[appendChild](cnvs); + } + } + container = new Paper; + container.width = width; + container.height = height; + container.canvas = cnvs; + plugins.call(container, container, R.fn); + container.clear(); + return container; + }; + paperproto.clear = function () { + var c = this.canvas; + while (c.firstChild) { + c.removeChild(c.firstChild); + } + this.bottom = this.top = null; + (this.desc = $("desc"))[appendChild](doc.createTextNode("Created with Rapha\xebl")); + c[appendChild](this.desc); + c[appendChild](this.defs = $("defs")); + }; + paperproto.remove = function () { + this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = removed(i); + } + }; + } + + // VML + if (R.vml) { + var map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"}, + bites = /([clmz]),?([^clmz]*)/gi, + blurregexp = / progid:\S+Blur\([^\)]+\)/g, + val = /-?[^,\s-]+/g, + coordsize = 1e3 + S + 1e3, + zoom = 10, + pathlike = {path: 1, rect: 1}, + path2vml = function (path) { + var total = /[ahqstv]/ig, + command = pathToAbsolute; + Str(path).match(total) && (command = path2curve); + total = /[clmz]/g; + if (command == pathToAbsolute && !Str(path).match(total)) { + var res = Str(path)[rp](bites, function (all, command, args) { + var vals = [], + isMove = lowerCase.call(command) == "m", + res = map[command]; + args[rp](val, function (value) { + if (isMove && vals[length] == 2) { + res += vals + map[command == "m" ? "l" : "L"]; + vals = []; + } + vals[push](round(value * zoom)); + }); + return res + vals; + }); + return res; + } + var pa = command(path), p, r; + res = []; + for (var i = 0, ii = pa[length]; i < ii; i++) { + p = pa[i]; + r = lowerCase.call(pa[i][0]); + r == "z" && (r = "x"); + for (var j = 1, jj = p[length]; j < jj; j++) { + r += round(p[j] * zoom) + (j != jj - 1 ? "," : E); + } + res[push](r); + } + return res[join](S); + }; + + R[toString] = function () { + return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version; + }; + thePath = function (pathString, vml) { + var g = createNode("group"); + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = vml.coordsize; + g.coordorigin = vml.coordorigin; + var el = createNode("shape"), ol = el.style; + ol.width = vml.width + "px"; + ol.height = vml.height + "px"; + el.coordsize = coordsize; + el.coordorigin = vml.coordorigin; + g[appendChild](el); + var p = new Element(el, g, vml), + attr = {fill: "none", stroke: "#000"}; + pathString && (attr.path = pathString); + p.type = "path"; + p.path = []; + p.Path = E; + setFillAndStroke(p, attr); + vml.canvas[appendChild](g); + return p; + }; + setFillAndStroke = function (o, params) { + o.attrs = o.attrs || {}; + var node = o.node, + a = o.attrs, + s = node.style, + xy, + newpath = (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.r != a.r) && o.type == "rect", + res = o; + + for (var par in params) if (params[has](par)) { + a[par] = params[par]; + } + if (newpath) { + a.path = rectPath(a.x, a.y, a.width, a.height, a.r); + o.X = a.x; + o.Y = a.y; + o.W = a.width; + o.H = a.height; + } + params.href && (node.href = params.href); + params.title && (node.title = params.title); + params.target && (node.target = params.target); + params.cursor && (s.cursor = params.cursor); + "blur" in params && o.blur(params.blur); + if (params.path && o.type == "path" || newpath) { + node.path = path2vml(a.path); + } + if (params.rotation != null) { + o.rotate(params.rotation, true); + } + if (params.translation) { + xy = Str(params.translation)[split](separator); + translate.call(o, xy[0], xy[1]); + if (o._.rt.cx != null) { + o._.rt.cx +=+ xy[0]; + o._.rt.cy +=+ xy[1]; + o.setBox(o.attrs, xy[0], xy[1]); + } + } + if (params.scale) { + xy = Str(params.scale)[split](separator); + o.scale(+xy[0] || 1, +xy[1] || +xy[0] || 1, +xy[2] || null, +xy[3] || null); + } + if ("clip-rect" in params) { + var rect = Str(params["clip-rect"])[split](separator); + if (rect[length] == 4) { + rect[2] = +rect[2] + (+rect[0]); + rect[3] = +rect[3] + (+rect[1]); + var div = node.clipRect || doc.createElement("div"), + dstyle = div.style, + group = node.parentNode; + dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect); + if (!node.clipRect) { + dstyle.position = "absolute"; + dstyle.top = 0; + dstyle.left = 0; + dstyle.width = o.paper.width + "px"; + dstyle.height = o.paper.height + "px"; + group.parentNode.insertBefore(div, group); + div[appendChild](group); + node.clipRect = div; + } + } + if (!params["clip-rect"]) { + node.clipRect && (node.clipRect.style.clip = E); + } + } + if (o.type == "image" && params.src) { + node.src = params.src; + } + if (o.type == "image" && params.opacity) { + node.filterOpacity = ms + ".Alpha(opacity=" + (params.opacity * 100) + ")"; + s.filter = (node.filterMatrix || E) + (node.filterOpacity || E); + } + params.font && (s.font = params.font); + params["font-family"] && (s.fontFamily = '"' + params["font-family"][split](",")[0][rp](/^['"]+|['"]+$/g, E) + '"'); + params["font-size"] && (s.fontSize = params["font-size"]); + params["font-weight"] && (s.fontWeight = params["font-weight"]); + params["font-style"] && (s.fontStyle = params["font-style"]); + if (params.opacity != null || + params["stroke-width"] != null || + params.fill != null || + params.stroke != null || + params["stroke-width"] != null || + params["stroke-opacity"] != null || + params["fill-opacity"] != null || + params["stroke-dasharray"] != null || + params["stroke-miterlimit"] != null || + params["stroke-linejoin"] != null || + params["stroke-linecap"] != null) { + node = o.shape || node; + var fill = (node.getElementsByTagName(fillString) && node.getElementsByTagName(fillString)[0]), + newfill = false; + !fill && (newfill = fill = createNode(fillString)); + if ("fill-opacity" in params || "opacity" in params) { + var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1); + opacity = mmin(mmax(opacity, 0), 1); + fill.opacity = opacity; + } + params.fill && (fill.on = true); + if (fill.on == null || params.fill == "none") { + fill.on = false; + } + if (fill.on && params.fill) { + var isURL = params.fill.match(ISURL); + if (isURL) { + fill.src = isURL[1]; + fill.type = "tile"; + } else { + fill.color = R.getRGB(params.fill).hex; + fill.src = E; + fill.type = "solid"; + if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill)) { + a.fill = "none"; + a.gradient = params.fill; + } + } + } + newfill && node[appendChild](fill); + var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]), + newstroke = false; + !stroke && (newstroke = stroke = createNode("stroke")); + if ((params.stroke && params.stroke != "none") || + params["stroke-width"] || + params["stroke-opacity"] != null || + params["stroke-dasharray"] || + params["stroke-miterlimit"] || + params["stroke-linejoin"] || + params["stroke-linecap"]) { + stroke.on = true; + } + (params.stroke == "none" || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false); + var strokeColor = R.getRGB(params.stroke); + stroke.on && params.stroke && (stroke.color = strokeColor.hex); + opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1); + var width = (toFloat(params["stroke-width"]) || 1) * .75; + opacity = mmin(mmax(opacity, 0), 1); + params["stroke-width"] == null && (width = a["stroke-width"]); + params["stroke-width"] && (stroke.weight = width); + width && width < 1 && (opacity *= width) && (stroke.weight = 1); + stroke.opacity = opacity; + + params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter"); + stroke.miterlimit = params["stroke-miterlimit"] || 8; + params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round"); + if (params["stroke-dasharray"]) { + var dasharray = { + "-": "shortdash", + ".": "shortdot", + "-.": "shortdashdot", + "-..": "shortdashdotdot", + ". ": "dot", + "- ": "dash", + "--": "longdash", + "- .": "dashdot", + "--.": "longdashdot", + "--..": "longdashdotdot" + }; + stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E; + } + newstroke && node[appendChild](stroke); + } + if (res.type == "text") { + s = res.paper.span.style; + a.font && (s.font = a.font); + a["font-family"] && (s.fontFamily = a["font-family"]); + a["font-size"] && (s.fontSize = a["font-size"]); + a["font-weight"] && (s.fontWeight = a["font-weight"]); + a["font-style"] && (s.fontStyle = a["font-style"]); + res.node.string && (res.paper.span.innerHTML = Str(res.node.string)[rp](/</g, "<")[rp](/&/g, "&")[rp](/\n/g, "<br>")); + res.W = a.w = res.paper.span.offsetWidth; + res.H = a.h = res.paper.span.offsetHeight; + res.X = a.x; + res.Y = a.y + round(res.H / 2); + + // text-anchor emulationm + switch (a["text-anchor"]) { + case "start": + res.node.style["v-text-align"] = "left"; + res.bbx = round(res.W / 2); + break; + case "end": + res.node.style["v-text-align"] = "right"; + res.bbx = -round(res.W / 2); + break; + default: + res.node.style["v-text-align"] = "center"; + break; + } + } + }; + addGradientFill = function (o, gradient) { + o.attrs = o.attrs || {}; + var attrs = o.attrs, + fill, + type = "linear", + fxfy = ".5 .5"; + o.attrs.gradient = gradient; + gradient = Str(gradient)[rp](radial_gradient, function (all, fx, fy) { + type = "radial"; + if (fx && fy) { + fx = toFloat(fx); + fy = toFloat(fy); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5); + fxfy = fx + S + fy; + } + return E; + }); + gradient = gradient[split](/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + } + var dots = parseDots(gradient); + if (!dots) { + return null; + } + o = o.shape || o.node; + fill = o.getElementsByTagName(fillString)[0] || createNode(fillString); + !fill.parentNode && o.appendChild(fill); + if (dots[length]) { + fill.on = true; + fill.method = "none"; + fill.color = dots[0].color; + fill.color2 = dots[dots[length] - 1].color; + var clrs = []; + for (var i = 0, ii = dots[length]; i < ii; i++) { + dots[i].offset && clrs[push](dots[i].offset + S + dots[i].color); + } + fill.colors && (fill.colors.value = clrs[length] ? clrs[join]() : "0% " + fill.color); + if (type == "radial") { + fill.type = "gradientradial"; + fill.focus = "100%"; + fill.focussize = fxfy; + fill.focusposition = fxfy; + } else { + fill.type = "gradient"; + fill.angle = (270 - angle) % 360; + } + } + return 1; + }; + Element = function (node, group, vml) { + var Rotation = 0, + RotX = 0, + RotY = 0, + Scale = 1; + this[0] = node; + this.id = R._oid++; + this.node = node; + node.raphael = this; + this.X = 0; + this.Y = 0; + this.attrs = {}; + this.Group = group; + this.paper = vml; + this._ = { + tx: 0, + ty: 0, + rt: {deg:0}, + sx: 1, + sy: 1 + }; + !vml.bottom && (vml.bottom = this); + this.prev = vml.top; + vml.top && (vml.top.next = this); + vml.top = this; + this.next = null; + }; + elproto = Element[proto]; + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + if (this._.rt.cx) { + return [this._.rt.deg, this._.rt.cx, this._.rt.cy][join](S); + } + return this._.rt.deg; + } + deg = Str(deg)[split](separator); + if (deg[length] - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + if (cx != null) { + this._.rt.deg = deg; + } else { + this._.rt.deg += deg; + } + cy == null && (cx = null); + this._.rt.cx = cx; + this._.rt.cy = cy; + this.setBox(this.attrs, cx, cy); + this.Group.style.rotation = this._.rt.deg; + // gradient fix for rotation. TODO + // var fill = (this.shape || this.node).getElementsByTagName(fillString); + // fill = fill[0] || {}; + // var b = ((360 - this._.rt.deg) - 270) % 360; + // !R.is(fill.angle, "undefined") && (fill.angle = b); + return this; + }; + elproto.setBox = function (params, cx, cy) { + if (this.removed) { + return this; + } + var gs = this.Group.style, + os = (this.shape && this.shape.style) || this.node.style; + params = params || {}; + for (var i in params) if (params[has](i)) { + this.attrs[i] = params[i]; + } + cx = cx || this._.rt.cx; + cy = cy || this._.rt.cy; + var attr = this.attrs, + x, + y, + w, + h; + switch (this.type) { + case "circle": + x = attr.cx - attr.r; + y = attr.cy - attr.r; + w = h = attr.r * 2; + break; + case "ellipse": + x = attr.cx - attr.rx; + y = attr.cy - attr.ry; + w = attr.rx * 2; + h = attr.ry * 2; + break; + case "image": + x = +attr.x; + y = +attr.y; + w = attr.width || 0; + h = attr.height || 0; + break; + case "text": + this.textpath.v = ["m", round(attr.x), ", ", round(attr.y - 2), "l", round(attr.x) + 1, ", ", round(attr.y - 2)][join](E); + x = attr.x - round(this.W / 2); + y = attr.y - this.H / 2; + w = this.W; + h = this.H; + break; + case "rect": + case "path": + if (!this.attrs.path) { + x = 0; + y = 0; + w = this.paper.width; + h = this.paper.height; + } else { + var dim = pathDimensions(this.attrs.path); + x = dim.x; + y = dim.y; + w = dim.width; + h = dim.height; + } + break; + default: + x = 0; + y = 0; + w = this.paper.width; + h = this.paper.height; + break; + } + cx = (cx == null) ? x + w / 2 : cx; + cy = (cy == null) ? y + h / 2 : cy; + var left = cx - this.paper.width / 2, + top = cy - this.paper.height / 2, t; + gs.left != (t = left + "px") && (gs.left = t); + gs.top != (t = top + "px") && (gs.top = t); + this.X = pathlike[has](this.type) ? -left : x; + this.Y = pathlike[has](this.type) ? -top : y; + this.W = w; + this.H = h; + if (pathlike[has](this.type)) { + os.left != (t = -left * zoom + "px") && (os.left = t); + os.top != (t = -top * zoom + "px") && (os.top = t); + } else if (this.type == "text") { + os.left != (t = -left + "px") && (os.left = t); + os.top != (t = -top + "px") && (os.top = t); + } else { + gs.width != (t = this.paper.width + "px") && (gs.width = t); + gs.height != (t = this.paper.height + "px") && (gs.height = t); + os.left != (t = x - left + "px") && (os.left = t); + os.top != (t = y - top + "px") && (os.top = t); + os.width != (t = w + "px") && (os.width = t); + os.height != (t = h + "px") && (os.height = t); + } + }; + elproto.hide = function () { + !this.removed && (this.Group.style.display = "none"); + return this; + }; + elproto.show = function () { + !this.removed && (this.Group.style.display = "block"); + return this; + }; + elproto.getBBox = function () { + if (this.removed) { + return this; + } + if (pathlike[has](this.type)) { + return pathDimensions(this.attrs.path); + } + return { + x: this.X + (this.bbx || 0), + y: this.Y, + width: this.W, + height: this.H + }; + }; + elproto.remove = function () { + if (this.removed) { + return; + } + tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + this.Group.parentNode.removeChild(this.Group); + this.shape && this.shape.parentNode.removeChild(this.shape); + for (var i in this) { + delete this[i]; + } + this.removed = true; + }; + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var i in this.attrs) if (this.attrs[has](i)) { + res[i] = this.attrs[i]; + } + this._.rt.deg && (res.rotation = this.rotate()); + (this._.sx != 1 || this._.sy != 1) && (res.scale = this.scale()); + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == "translation") { + return translate.call(this); + } + if (name == "rotation") { + return this.rotate(); + } + if (name == "scale") { + return this.scale(); + } + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + return this.attrs[name]; + } + if (this.attrs && value == null && R.is(name, array)) { + var ii, values = {}; + for (i = 0, ii = name[length]; i < ii; i++) { + values[name[i]] = this.attr(name[i]); + } + return values; + } + var params; + if (value != null) { + params = {}; + params[name] = value; + } + value == null && R.is(name, "object") && (params = name); + if (params) { + for (var key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [][concat](params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + if (params.text && this.type == "text") { + this.node.string = params.text; + } + setFillAndStroke(this, params); + if (params.gradient && (({circle: 1, ellipse: 1})[has](this.type) || Str(params.gradient).charAt() != "r")) { + addGradientFill(this, params.gradient); + } + (!pathlike[has](this.type) || this._.rt.deg) && this.setBox(this.attrs); + } + return this; + }; + elproto.toFront = function () { + !this.removed && this.Group.parentNode[appendChild](this.Group); + this.paper.top != this && tofront(this, this.paper); + return this; + }; + elproto.toBack = function () { + if (this.removed) { + return this; + } + if (this.Group.parentNode.firstChild != this.Group) { + this.Group.parentNode.insertBefore(this.Group, this.Group.parentNode.firstChild); + toback(this, this.paper); + } + return this; + }; + elproto.insertAfter = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == Set) { + element = element[element.length - 1]; + } + if (element.Group.nextSibling) { + element.Group.parentNode.insertBefore(this.Group, element.Group.nextSibling); + } else { + element.Group.parentNode[appendChild](this.Group); + } + insertafter(this, element, this.paper); + return this; + }; + elproto.insertBefore = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == Set) { + element = element[0]; + } + element.Group.parentNode.insertBefore(this.Group, element.Group); + insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + var s = this.node.runtimeStyle, + f = s.filter; + f = f.replace(blurregexp, E); + if (+size !== 0) { + this.attrs.blur = size; + s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")"; + s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5)); + } else { + s.filter = f; + s.margin = 0; + delete this.attrs.blur; + } + }; + + theCircle = function (vml, x, y, r) { + var g = createNode("group"), + o = createNode("oval"), + ol = o.style; + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = coordsize; + g.coordorigin = vml.coordorigin; + g[appendChild](o); + var res = new Element(o, g, vml); + res.type = "circle"; + setFillAndStroke(res, {stroke: "#000", fill: "none"}); + res.attrs.cx = x; + res.attrs.cy = y; + res.attrs.r = r; + res.setBox({x: x - r, y: y - r, width: r * 2, height: r * 2}); + vml.canvas[appendChild](g); + return res; + }; + function rectPath(x, y, w, h, r) { + if (r) { + return R.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z", x + r, y, w - r * 2, r, -r, h - r * 2, r * 2 - w, r * 2 - h); + } else { + return R.format("M{0},{1}l{2},0,0,{3},{4},0z", x, y, w, h, -w); + } + } + theRect = function (vml, x, y, w, h, r) { + var path = rectPath(x, y, w, h, r), + res = vml.path(path), + a = res.attrs; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.r = r; + a.path = path; + res.type = "rect"; + return res; + }; + theEllipse = function (vml, x, y, rx, ry) { + var g = createNode("group"), + o = createNode("oval"), + ol = o.style; + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = coordsize; + g.coordorigin = vml.coordorigin; + g[appendChild](o); + var res = new Element(o, g, vml); + res.type = "ellipse"; + setFillAndStroke(res, {stroke: "#000"}); + res.attrs.cx = x; + res.attrs.cy = y; + res.attrs.rx = rx; + res.attrs.ry = ry; + res.setBox({x: x - rx, y: y - ry, width: rx * 2, height: ry * 2}); + vml.canvas[appendChild](g); + return res; + }; + theImage = function (vml, src, x, y, w, h) { + var g = createNode("group"), + o = createNode("image"); + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = coordsize; + g.coordorigin = vml.coordorigin; + o.src = src; + g[appendChild](o); + var res = new Element(o, g, vml); + res.type = "image"; + res.attrs.src = src; + res.attrs.x = x; + res.attrs.y = y; + res.attrs.w = w; + res.attrs.h = h; + res.setBox({x: x, y: y, width: w, height: h}); + vml.canvas[appendChild](g); + return res; + }; + theText = function (vml, x, y, text) { + var g = createNode("group"), + el = createNode("shape"), + ol = el.style, + path = createNode("path"), + ps = path.style, + o = createNode("textpath"); + g.style.cssText = "position:absolute;left:0;top:0;width:" + vml.width + "px;height:" + vml.height + "px"; + g.coordsize = coordsize; + g.coordorigin = vml.coordorigin; + path.v = R.format("m{0},{1}l{2},{1}", round(x * 10), round(y * 10), round(x * 10) + 1); + path.textpathok = true; + ol.width = vml.width; + ol.height = vml.height; + o.string = Str(text); + o.on = true; + el[appendChild](o); + el[appendChild](path); + g[appendChild](el); + var res = new Element(o, g, vml); + res.shape = el; + res.textpath = path; + res.type = "text"; + res.attrs.text = text; + res.attrs.x = x; + res.attrs.y = y; + res.attrs.w = 1; + res.attrs.h = 1; + setFillAndStroke(res, {font: availableAttrs.font, stroke: "none", fill: "#000"}); + res.setBox(); + vml.canvas[appendChild](g); + return res; + }; + setSize = function (width, height) { + var cs = this.canvas.style; + width == +width && (width += "px"); + height == +height && (height += "px"); + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + return this; + }; + var createNode; + doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); + try { + !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); + createNode = function (tagName) { + return doc.createElement('<rvml:' + tagName + ' class="rvml">'); + }; + } catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + create = function () { + var con = getContainer[apply](0, arguments), + container = con.container, + height = con.height, + s, + width = con.width, + x = con.x, + y = con.y; + if (!container) { + throw new Error("VML container not found."); + } + var res = new Paper, + c = res.canvas = doc.createElement("div"), + cs = c.style; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + width == +width && (width += "px"); + height == +height && (height += "px"); + res.width = 1e3; + res.height = 1e3; + res.coordsize = zoom * 1e3 + S + zoom * 1e3; + res.coordorigin = "0 0"; + res.span = doc.createElement("span"); + res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + c[appendChild](res.span); + cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height); + if (container == 1) { + doc.body[appendChild](c); + cs.left = x + "px"; + cs.top = y + "px"; + cs.position = "absolute"; + } else { + if (container.firstChild) { + container.insertBefore(c, container.firstChild); + } else { + container[appendChild](c); + } + } + plugins.call(res, res, R.fn); + return res; + }; + paperproto.clear = function () { + this.canvas.innerHTML = E; + this.span = doc.createElement("span"); + this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + this.canvas[appendChild](this.span); + this.bottom = this.top = null; + }; + paperproto.remove = function () { + this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = removed(i); + } + return true; + }; + } + + // rest + // WebKit rendering bug workaround method + var version = navigator.userAgent.match(/Version\/(.*?)\s/); + if ((navigator.vendor == "Apple Computer, Inc.") && (version && version[1] < 4 || navigator.platform.slice(0, 2) == "iP")) { + paperproto.safari = function () { + var rect = this.rect(-99, -99, this.width + 99, this.height + 99).attr({stroke: "none"}); + win.setTimeout(function () {rect.remove();}); + }; + } else { + paperproto.safari = function () {}; + } + + // Events + var preventDefault = function () { + this.returnValue = false; + }, + preventTouch = function () { + return this.originalEvent.preventDefault(); + }, + stopPropagation = function () { + this.cancelBubble = true; + }, + stopTouch = function () { + return this.originalEvent.stopPropagation(); + }, + addEvent = (function () { + if (doc.addEventListener) { + return function (obj, type, fn, element) { + var realName = supportsTouch && touchMap[type] ? touchMap[type] : type; + var f = function (e) { + if (supportsTouch && touchMap[has](type)) { + for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) { + if (e.targetTouches[i].target == obj) { + var olde = e; + e = e.targetTouches[i]; + e.originalEvent = olde; + e.preventDefault = preventTouch; + e.stopPropagation = stopTouch; + break; + } + } + } + return fn.call(element, e); + }; + obj.addEventListener(realName, f, false); + return function () { + obj.removeEventListener(realName, f, false); + return true; + }; + }; + } else if (doc.attachEvent) { + return function (obj, type, fn, element) { + var f = function (e) { + e = e || win.event; + e.preventDefault = e.preventDefault || preventDefault; + e.stopPropagation = e.stopPropagation || stopPropagation; + return fn.call(element, e); + }; + obj.attachEvent("on" + type, f); + var detacher = function () { + obj.detachEvent("on" + type, f); + return true; + }; + return detacher; + }; + } + })(), + drag = [], + dragMove = function (e) { + var x = e.clientX, + y = e.clientY, + scrollY = doc.documentElement.scrollTop || doc.body.scrollTop, + scrollX = doc.documentElement.scrollLeft || doc.body.scrollLeft, + dragi, + j = drag.length; + while (j--) { + dragi = drag[j]; + if (supportsTouch) { + var i = e.touches.length, + touch; + while (i--) { + touch = e.touches[i]; + if (touch.identifier == dragi.el._drag.id) { + x = touch.clientX; + y = touch.clientY; + (e.originalEvent ? e.originalEvent : e).preventDefault(); + break; + } + } + } else { + e.preventDefault(); + } + x += scrollX; + y += scrollY; + dragi.move && dragi.move.call(dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e); + } + }, + dragUp = function (e) { + R.unmousemove(dragMove).unmouseup(dragUp); + var i = drag.length, + dragi; + while (i--) { + dragi = drag[i]; + dragi.el._drag = {}; + dragi.end && dragi.end.call(dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e); + } + drag = []; + }; + for (var i = events[length]; i--;) { + (function (eventName) { + R[eventName] = Element[proto][eventName] = function (fn, scope) { + if (R.is(fn, "function")) { + this.events = this.events || []; + this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || doc, eventName, fn, scope || this)}); + } + return this; + }; + R["un" + eventName] = Element[proto]["un" + eventName] = function (fn) { + var events = this.events, + l = events[length]; + while (l--) if (events[l].name == eventName && events[l].f == fn) { + events[l].unbind(); + events.splice(l, 1); + !events.length && delete this.events; + return this; + } + return this; + }; + })(events[i]); + } + elproto.hover = function (f_in, f_out, scope_in, scope_out) { + return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); + }; + elproto.unhover = function (f_in, f_out) { + return this.unmouseover(f_in).unmouseout(f_out); + }; + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { + this._drag = {}; + this.mousedown(function (e) { + (e.originalEvent || e).preventDefault(); + var scrollY = doc.documentElement.scrollTop || doc.body.scrollTop, + scrollX = doc.documentElement.scrollLeft || doc.body.scrollLeft; + this._drag.x = e.clientX + scrollX; + this._drag.y = e.clientY + scrollY; + this._drag.id = e.identifier; + onstart && onstart.call(start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e); + !drag.length && R.mousemove(dragMove).mouseup(dragUp); + drag.push({el: this, move: onmove, end: onend, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope}); + }); + return this; + }; + elproto.undrag = function (onmove, onstart, onend) { + var i = drag.length; + while (i--) { + drag[i].el == this && (drag[i].move == onmove && drag[i].end == onend) && drag.splice(i++, 1); + } + !drag.length && R.unmousemove(dragMove).unmouseup(dragUp); + }; + paperproto.circle = function (x, y, r) { + return theCircle(this, x || 0, y || 0, r || 0); + }; + paperproto.rect = function (x, y, w, h, r) { + return theRect(this, x || 0, y || 0, w || 0, h || 0, r || 0); + }; + paperproto.ellipse = function (x, y, rx, ry) { + return theEllipse(this, x || 0, y || 0, rx || 0, ry || 0); + }; + paperproto.path = function (pathString) { + pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E); + return thePath(R.format[apply](R, arguments), this); + }; + paperproto.image = function (src, x, y, w, h) { + return theImage(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0); + }; + paperproto.text = function (x, y, text) { + return theText(this, x || 0, y || 0, Str(text)); + }; + paperproto.set = function (itemsArray) { + arguments[length] > 1 && (itemsArray = Array[proto].splice.call(arguments, 0, arguments[length])); + return new Set(itemsArray); + }; + paperproto.setSize = setSize; + paperproto.top = paperproto.bottom = null; + paperproto.raphael = R; + function x_y() { + return this.x + S + this.y; + } + elproto.resetScale = function () { + if (this.removed) { + return this; + } + this._.sx = 1; + this._.sy = 1; + this.attrs.scale = "1 1"; + }; + elproto.scale = function (x, y, cx, cy) { + if (this.removed) { + return this; + } + if (x == null && y == null) { + return { + x: this._.sx, + y: this._.sy, + toString: x_y + }; + } + y = y || x; + !+y && (y = x); + var dx, + dy, + dcx, + dcy, + a = this.attrs; + if (x != 0) { + var bb = this.getBBox(), + rcx = bb.x + bb.width / 2, + rcy = bb.y + bb.height / 2, + kx = abs(x / this._.sx), + ky = abs(y / this._.sy); + cx = (+cx || cx == 0) ? cx : rcx; + cy = (+cy || cy == 0) ? cy : rcy; + var posx = this._.sx > 0, + posy = this._.sy > 0, + dirx = ~~(x / abs(x)), + diry = ~~(y / abs(y)), + dkx = kx * dirx, + dky = ky * diry, + s = this.node.style, + ncx = cx + abs(rcx - cx) * dkx * (rcx > cx == posx ? 1 : -1), + ncy = cy + abs(rcy - cy) * dky * (rcy > cy == posy ? 1 : -1), + fr = (x * dirx > y * diry ? ky : kx); + switch (this.type) { + case "rect": + case "image": + var neww = a.width * kx, + newh = a.height * ky; + this.attr({ + height: newh, + r: a.r * fr, + width: neww, + x: ncx - neww / 2, + y: ncy - newh / 2 + }); + break; + case "circle": + case "ellipse": + this.attr({ + rx: a.rx * kx, + ry: a.ry * ky, + r: a.r * fr, + cx: ncx, + cy: ncy + }); + break; + case "text": + this.attr({ + x: ncx, + y: ncy + }); + break; + case "path": + var path = pathToRelative(a.path), + skip = true, + fx = posx ? dkx : kx, + fy = posy ? dky : ky; + for (var i = 0, ii = path[length]; i < ii; i++) { + var p = path[i], + P0 = upperCase.call(p[0]); + if (P0 == "M" && skip) { + continue; + } else { + skip = false; + } + if (P0 == "A") { + p[path[i][length] - 2] *= fx; + p[path[i][length] - 1] *= fy; + p[1] *= kx; + p[2] *= ky; + p[5] = +(dirx + diry ? !!+p[5] : !+p[5]); + } else if (P0 == "H") { + for (var j = 1, jj = p[length]; j < jj; j++) { + p[j] *= fx; + } + } else if (P0 == "V") { + for (j = 1, jj = p[length]; j < jj; j++) { + p[j] *= fy; + } + } else { + for (j = 1, jj = p[length]; j < jj; j++) { + p[j] *= (j % 2) ? fx : fy; + } + } + } + var dim2 = pathDimensions(path); + dx = ncx - dim2.x - dim2.width / 2; + dy = ncy - dim2.y - dim2.height / 2; + path[0][1] += dx; + path[0][2] += dy; + this.attr({path: path}); + break; + } + if (this.type in {text: 1, image:1} && (dirx != 1 || diry != 1)) { + if (this.transformations) { + this.transformations[2] = "scale("[concat](dirx, ",", diry, ")"); + this.node[setAttribute]("transform", this.transformations[join](S)); + dx = (dirx == -1) ? -a.x - (neww || 0) : a.x; + dy = (diry == -1) ? -a.y - (newh || 0) : a.y; + this.attr({x: dx, y: dy}); + a.fx = dirx - 1; + a.fy = diry - 1; + } else { + this.node.filterMatrix = ms + ".Matrix(M11="[concat](dirx, + ", M12=0, M21=0, M22=", diry, + ", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')"); + s.filter = (this.node.filterMatrix || E) + (this.node.filterOpacity || E); + } + } else { + if (this.transformations) { + this.transformations[2] = E; + this.node[setAttribute]("transform", this.transformations[join](S)); + a.fx = 0; + a.fy = 0; + } else { + this.node.filterMatrix = E; + s.filter = (this.node.filterMatrix || E) + (this.node.filterOpacity || E); + } + } + a.scale = [x, y, cx, cy][join](S); + this._.sx = x; + this._.sy = y; + } + return this; + }; + elproto.clone = function () { + if (this.removed) { + return null; + } + var attr = this.attr(); + delete attr.scale; + delete attr.translation; + return this.paper[this.type]().attr(attr); + }; + var curveslengths = {}, + getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + var len = 0, + precision = 100, + name = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(), + cache = curveslengths[name], + old, dot; + !cache && (curveslengths[name] = cache = {data: []}); + cache.timer && clearTimeout(cache.timer); + cache.timer = setTimeout(function () {delete curveslengths[name];}, 2000); + if (length != null) { + var total = getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + precision = ~~total * 10; + } + for (var i = 0; i < precision + 1; i++) { + if (cache.data[length] > i) { + dot = cache.data[i * precision]; + } else { + dot = R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i / precision); + cache.data[i] = dot; + } + i && (len += pow(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2), .5)); + if (length != null && len >= length) { + return dot; + } + old = dot; + } + if (length == null) { + return len; + } + }, + getLengthFactory = function (istotal, subpath) { + return function (path, length, onlystart) { + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += ["C", point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = ["M", point.x, point.y + "C", point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]][join](); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return {x: point.x, y: point.y, alpha: point.alpha}; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[1], p[2], p[3], p[4], p[5], p[6], 1); + point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha}); + return point; + }; + }; + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + elproto.getTotalLength = function () { + if (this.type != "path") {return;} + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + return getTotalLength(this.attrs.path); + }; + elproto.getPointAtLength = function (length) { + if (this.type != "path") {return;} + return getPointAtLength(this.attrs.path, length); + }; + elproto.getSubpath = function (from, to) { + if (this.type != "path") {return;} + if (abs(this.getTotalLength() - to) < "1e-6") { + return getSubpathsAtLength(this.attrs.path, from).end; + } + var a = getSubpathsAtLength(this.attrs.path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + + // animation easing formulas + R.easing_formulas = { + linear: function (n) { + return n; + }, + "<": function (n) { + return pow(n, 3); + }, + ">": function (n) { + return pow(n - 1, 3) + 1; + }, + "<>": function (n) { + n = n * 2; + if (n < 1) { + return pow(n, 3) / 2; + } + n -= 2; + return (pow(n, 3) + 2) / 2; + }, + backIn: function (n) { + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }, + backOut: function (n) { + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }, + elastic: function (n) { + if (n == 0 || n == 1) { + return n; + } + var p = .3, + s = p / 4; + return pow(2, -10 * n) * math.sin((n - s) * (2 * PI) / p) + 1; + }, + bounce: function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + } + }; + + var animationElements = [], + animation = function () { + var Now = +new Date; + for (var l = 0; l < animationElements[length]; l++) { + var e = animationElements[l]; + if (e.stop || e.el.removed) { + continue; + } + var time = Now - e.start, + ms = e.ms, + easing = e.easing, + from = e.from, + diff = e.diff, + to = e.to, + t = e.t, + that = e.el, + set = {}, + now; + if (time < ms) { + var pos = easing(time / ms); + for (var attr in from) if (from[has](attr)) { + switch (availableAnimAttrs[attr]) { + case "along": + now = pos * ms * diff[attr]; + to.back && (now = to.len - now); + var point = getPointAtLength(to[attr], now); + that.translate(diff.sx - diff.x || 0, diff.sy - diff.y || 0); + diff.x = point.x; + diff.y = point.y; + that.translate(point.x - diff.sx, point.y - diff.sy); + to.rot && that.rotate(diff.r + point.alpha, point.x, point.y); + break; + case nu: + now = +from[attr] + pos * ms * diff[attr]; + break; + case "colour": + now = "rgb(" + [ + upto255(round(from[attr].r + pos * ms * diff[attr].r)), + upto255(round(from[attr].g + pos * ms * diff[attr].g)), + upto255(round(from[attr].b + pos * ms * diff[attr].b)) + ][join](",") + ")"; + break; + case "path": + now = []; + for (var i = 0, ii = from[attr][length]; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (var j = 1, jj = from[attr][i][length]; j < jj; j++) { + now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + now[i] = now[i][join](S); + } + now = now[join](S); + break; + case "csv": + switch (attr) { + case "translation": + var x = pos * ms * diff[attr][0] - t.x, + y = pos * ms * diff[attr][1] - t.y; + t.x += x; + t.y += y; + now = x + S + y; + break; + case "rotation": + now = +from[attr][0] + pos * ms * diff[attr][0]; + from[attr][1] && (now += "," + from[attr][1] + "," + from[attr][2]); + break; + case "scale": + now = [+from[attr][0] + pos * ms * diff[attr][0], +from[attr][1] + pos * ms * diff[attr][1], (2 in to[attr] ? to[attr][2] : E), (3 in to[attr] ? to[attr][3] : E)][join](S); + break; + case "clip-rect": + now = []; + i = 4; + while (i--) { + now[i] = +from[attr][i] + pos * ms * diff[attr][i]; + } + break; + } + break; + default: + var from2 = [].concat(from[attr]); + now = []; + i = that.paper.customAttributes[attr].length; + while (i--) { + now[i] = +from2[i] + pos * ms * diff[attr][i]; + } + break; + } + set[attr] = now; + } + that.attr(set); + that._run && that._run.call(that); + } else { + if (to.along) { + point = getPointAtLength(to.along, to.len * !to.back); + that.translate(diff.sx - (diff.x || 0) + point.x - diff.sx, diff.sy - (diff.y || 0) + point.y - diff.sy); + to.rot && that.rotate(diff.r + point.alpha, point.x, point.y); + } + (t.x || t.y) && that.translate(-t.x, -t.y); + to.scale && (to.scale += E); + that.attr(to); + animationElements.splice(l--, 1); + } + } + R.svg && that && that.paper && that.paper.safari(); + animationElements[length] && setTimeout(animation); + }, + keyframesRun = function (attr, element, time, prev, prevcallback) { + var dif = time - prev; + element.timeouts.push(setTimeout(function () { + R.is(prevcallback, "function") && prevcallback.call(element); + element.animate(attr, dif, attr.easing); + }, prev)); + }, + upto255 = function (color) { + return mmax(mmin(color, 255), 0); + }, + translate = function (x, y) { + if (x == null) { + return {x: this._.tx, y: this._.ty, toString: x_y}; + } + this._.tx += +x; + this._.ty += +y; + switch (this.type) { + case "circle": + case "ellipse": + this.attr({cx: +x + this.attrs.cx, cy: +y + this.attrs.cy}); + break; + case "rect": + case "image": + case "text": + this.attr({x: +x + this.attrs.x, y: +y + this.attrs.y}); + break; + case "path": + var path = pathToRelative(this.attrs.path); + path[0][1] += +x; + path[0][2] += +y; + this.attr({path: path}); + break; + } + return this; + }; + elproto.animateWith = function (element, params, ms, easing, callback) { + for (var i = 0, ii = animationElements.length; i < ii; i++) { + if (animationElements[i].el.id == element.id) { + params.start = animationElements[i].start; + } + } + return this.animate(params, ms, easing, callback); + }; + elproto.animateAlong = along(); + elproto.animateAlongBack = along(1); + function along(isBack) { + return function (path, ms, rotate, callback) { + var params = {back: isBack}; + R.is(rotate, "function") ? (callback = rotate) : (params.rot = rotate); + path && path.constructor == Element && (path = path.attrs.path); + path && (params.along = path); + return this.animate(params, ms, callback); + }; + } + function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) { + var cx = 3 * p1x, + bx = 3 * (p2x - p1x) - cx, + ax = 1 - cx - bx, + cy = 3 * p1y, + by = 3 * (p2y - p1y) - cy, + ay = 1 - cy - by; + function sampleCurveX(t) { + return ((ax * t + bx) * t + cx) * t; + } + function solve(x, epsilon) { + var t = solveCurveX(x, epsilon); + return ((ay * t + by) * t + cy) * t; + } + function solveCurveX(x, epsilon) { + var t0, t1, t2, x2, d2, i; + for(t2 = x, i = 0; i < 8; i++) { + x2 = sampleCurveX(t2) - x; + if (abs(x2) < epsilon) { + return t2; + } + d2 = (3 * ax * t2 + 2 * bx) * t2 + cx; + if (abs(d2) < 1e-6) { + break; + } + t2 = t2 - x2 / d2; + } + t0 = 0; + t1 = 1; + t2 = x; + if (t2 < t0) { + return t0; + } + if (t2 > t1) { + return t1; + } + while (t0 < t1) { + x2 = sampleCurveX(t2); + if (abs(x2 - x) < epsilon) { + return t2; + } + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + t2 = (t1 - t0) / 2 + t0; + } + return t2; + } + return solve(t, 1 / (200 * duration)); + } + elproto.onAnimation = function (f) { + this._run = f || 0; + return this; + }; + elproto.animate = function (params, ms, easing, callback) { + var element = this; + element.timeouts = element.timeouts || []; + if (R.is(easing, "function") || !easing) { + callback = easing || null; + } + if (element.removed) { + callback && callback.call(element); + return element; + } + var from = {}, + to = {}, + animateable = false, + diff = {}; + for (var attr in params) if (params[has](attr)) { + if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) { + animateable = true; + from[attr] = element.attr(attr); + (from[attr] == null) && (from[attr] = availableAttrs[attr]); + to[attr] = params[attr]; + switch (availableAnimAttrs[attr]) { + case "along": + var len = getTotalLength(params[attr]); + var point = getPointAtLength(params[attr], len * !!params.back); + var bb = element.getBBox(); + diff[attr] = len / ms; + diff.tx = bb.x; + diff.ty = bb.y; + diff.sx = point.x; + diff.sy = point.y; + to.rot = params.rot; + to.back = params.back; + to.len = len; + params.rot && (diff.r = toFloat(element.rotate()) || 0); + break; + case nu: + diff[attr] = (to[attr] - from[attr]) / ms; + break; + case "colour": + from[attr] = R.getRGB(from[attr]); + var toColour = R.getRGB(to[attr]); + diff[attr] = { + r: (toColour.r - from[attr].r) / ms, + g: (toColour.g - from[attr].g) / ms, + b: (toColour.b - from[attr].b) / ms + }; + break; + case "path": + var pathes = path2curve(from[attr], to[attr]); + from[attr] = pathes[0]; + var toPath = pathes[1]; + diff[attr] = []; + for (var i = 0, ii = from[attr][length]; i < ii; i++) { + diff[attr][i] = [0]; + for (var j = 1, jj = from[attr][i][length]; j < jj; j++) { + diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms; + } + } + break; + case "csv": + var values = Str(params[attr])[split](separator), + from2 = Str(from[attr])[split](separator); + switch (attr) { + case "translation": + from[attr] = [0, 0]; + diff[attr] = [values[0] / ms, values[1] / ms]; + break; + case "rotation": + from[attr] = (from2[1] == values[1] && from2[2] == values[2]) ? from2 : [0, values[1], values[2]]; + diff[attr] = [(values[0] - from[attr][0]) / ms, 0, 0]; + break; + case "scale": + params[attr] = values; + from[attr] = Str(from[attr])[split](separator); + diff[attr] = [(values[0] - from[attr][0]) / ms, (values[1] - from[attr][1]) / ms, 0, 0]; + break; + case "clip-rect": + from[attr] = Str(from[attr])[split](separator); + diff[attr] = []; + i = 4; + while (i--) { + diff[attr][i] = (values[i] - from[attr][i]) / ms; + } + break; + } + to[attr] = values; + break; + default: + values = [].concat(params[attr]); + from2 = [].concat(from[attr]); + diff[attr] = []; + i = element.paper.customAttributes[attr][length]; + while (i--) { + diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms; + } + break; + } + } + } + if (!animateable) { + var attrs = [], + lastcall; + for (var key in params) if (params[has](key) && animKeyFrames.test(key)) { + attr = {value: params[key]}; + key == "from" && (key = 0); + key == "to" && (key = 100); + attr.key = toInt(key, 10); + attrs.push(attr); + } + attrs.sort(sortByKey); + if (attrs[0].key) { + attrs.unshift({key: 0, value: element.attrs}); + } + for (i = 0, ii = attrs[length]; i < ii; i++) { + keyframesRun(attrs[i].value, element, ms / 100 * attrs[i].key, ms / 100 * (attrs[i - 1] && attrs[i - 1].key || 0), attrs[i - 1] && attrs[i - 1].value.callback); + } + lastcall = attrs[attrs[length] - 1].value.callback; + if (lastcall) { + element.timeouts.push(setTimeout(function () {lastcall.call(element);}, ms)); + } + } else { + var easyeasy = R.easing_formulas[easing]; + if (!easyeasy) { + easyeasy = Str(easing).match(bezierrg); + if (easyeasy && easyeasy[length] == 5) { + var curve = easyeasy; + easyeasy = function (t) { + return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms); + }; + } else { + easyeasy = function (t) { + return t; + }; + } + } + animationElements.push({ + start: params.start || +new Date, + ms: ms, + easing: easyeasy, + from: from, + diff: diff, + to: to, + el: element, + t: {x: 0, y: 0} + }); + R.is(callback, "function") && (element._ac = setTimeout(function () { + callback.call(element); + }, ms)); + animationElements[length] == 1 && setTimeout(animation); + } + return this; + }; + elproto.stop = function () { + for (var i = 0; i < animationElements.length; i++) { + animationElements[i].el.id == this.id && animationElements.splice(i--, 1); + } + for (i = 0, ii = this.timeouts && this.timeouts.length; i < ii; i++) { + clearTimeout(this.timeouts[i]); + } + this.timeouts = []; + clearTimeout(this._ac); + delete this._ac; + return this; + }; + elproto.translate = function (x, y) { + return this.attr({translation: x + " " + y}); + }; + elproto[toString] = function () { + return "Rapha\xebl\u2019s object"; + }; + R.ae = animationElements; + + // Set + var Set = function (items) { + this.items = []; + this[length] = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items[length]; i < ii; i++) { + if (items[i] && (items[i].constructor == Element || items[i].constructor == Set)) { + this[this.items[length]] = this.items[this.items[length]] = items[i]; + this[length]++; + } + } + } + }; + Set[proto][push] = function () { + var item, + len; + for (var i = 0, ii = arguments[length]; i < ii; i++) { + item = arguments[i]; + if (item && (item.constructor == Element || item.constructor == Set)) { + len = this.items[length]; + this[len] = this.items[len] = item; + this[length]++; + } + } + return this; + }; + Set[proto].pop = function () { + delete this[this[length]--]; + return this.items.pop(); + }; + for (var method in elproto) if (elproto[has](method)) { + Set[proto][method] = (function (methodname) { + return function () { + for (var i = 0, ii = this.items[length]; i < ii; i++) { + this.items[i][methodname][apply](this.items[i], arguments); + } + return this; + }; + })(method); + } + Set[proto].attr = function (name, value) { + if (name && R.is(name, array) && R.is(name[0], "object")) { + for (var j = 0, jj = name[length]; j < jj; j++) { + this.items[j].attr(name[j]); + } + } else { + for (var i = 0, ii = this.items[length]; i < ii; i++) { + this.items[i].attr(name, value); + } + } + return this; + }; + Set[proto].animate = function (params, ms, easing, callback) { + (R.is(easing, "function") || !easing) && (callback = easing || null); + var len = this.items[length], + i = len, + item, + set = this, + collector; + callback && (collector = function () { + !--len && callback.call(set); + }); + easing = R.is(easing, string) ? easing : collector; + item = this.items[--i].animate(params, ms, easing, collector); + while (i--) { + this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, params, ms, easing, collector); + } + return this; + }; + Set[proto].insertAfter = function (el) { + var i = this.items[length]; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + Set[proto].getBBox = function () { + var x = [], + y = [], + w = [], + h = []; + for (var i = this.items[length]; i--;) { + var box = this.items[i].getBBox(); + x[push](box.x); + y[push](box.y); + w[push](box.x + box.width); + h[push](box.y + box.height); + } + x = mmin[apply](0, x); + y = mmin[apply](0, y); + return { + x: x, + y: y, + width: mmax[apply](0, w) - x, + height: mmax[apply](0, h) - y + }; + }; + Set[proto].clone = function (s) { + s = new Set; + for (var i = 0, ii = this.items[length]; i < ii; i++) { + s[push](this.items[i].clone()); + } + return s; + }; + + R.registerFont = function (font) { + if (!font.face) { + return font; + } + this.fonts = this.fonts || {}; + var fontcopy = { + w: font.w, + face: {}, + glyphs: {} + }, + family = font.face["font-family"]; + for (var prop in font.face) if (font.face[has](prop)) { + fontcopy.face[prop] = font.face[prop]; + } + if (this.fonts[family]) { + this.fonts[family][push](fontcopy); + } else { + this.fonts[family] = [fontcopy]; + } + if (!font.svg) { + fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10); + for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) { + var path = font.glyphs[glyph]; + fontcopy.glyphs[glyph] = { + w: path.w, + k: {}, + d: path.d && "M" + path.d[rp](/[mlcxtrv]/g, function (command) { + return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M"; + }) + "z" + }; + if (path.k) { + for (var k in path.k) if (path[has](k)) { + fontcopy.glyphs[glyph].k[k] = path.k[k]; + } + } + } + } + return font; + }; + paperproto.getFont = function (family, weight, style, stretch) { + stretch = stretch || "normal"; + style = style || "normal"; + weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400; + if (!R.fonts) { + return; + } + var font = R.fonts[family]; + if (!font) { + var name = new RegExp("(^|\\s)" + family[rp](/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i"); + for (var fontName in R.fonts) if (R.fonts[has](fontName)) { + if (name.test(fontName)) { + font = R.fonts[fontName]; + break; + } + } + } + var thefont; + if (font) { + for (var i = 0, ii = font[length]; i < ii; i++) { + thefont = font[i]; + if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) { + break; + } + } + } + return thefont; + }; + paperproto.print = function (x, y, string, font, size, origin, letter_spacing) { + origin = origin || "middle"; // baseline|middle + letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1); + var out = this.set(), + letters = Str(string)[split](E), + shift = 0, + path = E, + scale; + R.is(font, string) && (font = this.getFont(font)); + if (font) { + scale = (size || 16) / font.face["units-per-em"]; + var bb = font.face.bbox.split(separator), + top = +bb[0], + height = +bb[1] + (origin == "baseline" ? bb[3] - bb[1] + (+font.face.descent) : (bb[3] - bb[1]) / 2); + for (var i = 0, ii = letters[length]; i < ii; i++) { + var prev = i && font.glyphs[letters[i - 1]] || {}, + curr = font.glyphs[letters[i]]; + shift += i ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0; + curr && curr.d && out[push](this.path(curr.d).attr({fill: "#000", stroke: "none", translation: [shift, 0]})); + } + out.scale(scale, scale, top, height).translate(x - top, y - height); + } + return out; + }; + + R.format = function (token, params) { + var args = R.is(params, array) ? [0][concat](params) : arguments; + token && R.is(token, string) && args[length] - 1 && (token = token[rp](formatrg, function (str, i) { + return args[++i] == null ? E : args[i]; + })); + return token || E; + }; + R.ninja = function () { + oldRaphael.was ? (win.Raphael = oldRaphael.is) : delete Raphael; + return R; + }; + R.el = elproto; + R.st = Set[proto]; + + oldRaphael.was ? (win.Raphael = R) : (Raphael = R); +})();/*! + * g.Raphael 0.4.1 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ + + +(function () { + var mmax = Math.max, + mmin = Math.min; + Raphael.fn.g = Raphael.fn.g || {}; + Raphael.fn.g.markers = { + disc: "disc", + o: "disc", + flower: "flower", + f: "flower", + diamond: "diamond", + d: "diamond", + square: "square", + s: "square", + triangle: "triangle", + t: "triangle", + star: "star", + "*": "star", + cross: "cross", + x: "cross", + plus: "plus", + "+": "plus", + arrow: "arrow", + "->": "arrow" + }; + Raphael.fn.g.shim = {stroke: "none", fill: "#000", "fill-opacity": 0}; + Raphael.fn.g.txtattr = {font: "12px Arial, sans-serif"}; + Raphael.fn.g.colors = []; + var hues = [.6, .2, .05, .1333, .75, 0]; + for (var i = 0; i < 10; i++) { + if (i < hues.length) { + Raphael.fn.g.colors.push("hsb(" + hues[i] + ", .75, .75)"); + } else { + Raphael.fn.g.colors.push("hsb(" + hues[i - hues.length] + ", 1, .5)"); + } + } + Raphael.fn.g.text = function (x, y, text) { + return this.text(x, y, text).attr(this.g.txtattr); + }; + Raphael.fn.g.labelise = function (label, val, total) { + if (label) { + return (label + "").replace(/(##+(?:\.#+)?)|(%%+(?:\.%+)?)/g, function (all, value, percent) { + if (value) { + return (+val).toFixed(value.replace(/^#+\.?/g, "").length); + } + if (percent) { + return (val * 100 / total).toFixed(percent.replace(/^%+\.?/g, "").length) + "%"; + } + }); + } else { + return (+val).toFixed(0); + } + }; + + Raphael.fn.g.finger = function (x, y, width, height, dir, ending, isPath) { + // dir 0 for horisontal and 1 for vertical + if ((dir && !height) || (!dir && !width)) { + return isPath ? "" : this.path(); + } + ending = {square: "square", sharp: "sharp", soft: "soft"}[ending] || "round"; + var path; + height = Math.round(height); + width = Math.round(width); + x = Math.round(x); + y = Math.round(y); + switch (ending) { + case "round": + if (!dir) { + var r = ~~(height / 2); + if (width < r) { + r = width; + path = ["M", x + .5, y + .5 - ~~(height / 2), "l", 0, 0, "a", r, ~~(height / 2), 0, 0, 1, 0, height, "l", 0, 0, "z"]; + } else { + path = ["M", x + .5, y + .5 - r, "l", width - r, 0, "a", r, r, 0, 1, 1, 0, height, "l", r - width, 0, "z"]; + } + } else { + r = ~~(width / 2); + if (height < r) { + r = height; + path = ["M", x - ~~(width / 2), y, "l", 0, 0, "a", ~~(width / 2), r, 0, 0, 1, width, 0, "l", 0, 0, "z"]; + } else { + path = ["M", x - r, y, "l", 0, r - height, "a", r, r, 0, 1, 1, width, 0, "l", 0, height - r, "z"]; + } + } + break; + case "sharp": + if (!dir) { + var half = ~~(height / 2); + path = ["M", x, y + half, "l", 0, -height, mmax(width - half, 0), 0, mmin(half, width), half, -mmin(half, width), half + (half * 2 < height), "z"]; + } else { + half = ~~(width / 2); + path = ["M", x + half, y, "l", -width, 0, 0, -mmax(height - half, 0), half, -mmin(half, height), half, mmin(half, height), half, "z"]; + } + break; + case "square": + if (!dir) { + path = ["M", x, y + ~~(height / 2), "l", 0, -height, width, 0, 0, height, "z"]; + } else { + path = ["M", x + ~~(width / 2), y, "l", 1 - width, 0, 0, -height, width - 1, 0, "z"]; + } + break; + case "soft": + if (!dir) { + r = mmin(width, Math.round(height / 5)); + path = ["M", x + .5, y + .5 - ~~(height / 2), "l", width - r, 0, "a", r, r, 0, 0, 1, r, r, "l", 0, height - r * 2, "a", r, r, 0, 0, 1, -r, r, "l", r - width, 0, "z"]; + } else { + r = mmin(Math.round(width / 5), height); + path = ["M", x - ~~(width / 2), y, "l", 0, r - height, "a", r, r, 0, 0, 1, r, -r, "l", width - 2 * r, 0, "a", r, r, 0, 0, 1, r, r, "l", 0, height - r, "z"]; + } + } + if (isPath) { + return path.join(","); + } else { + return this.path(path); + } + }; + + // Symbols + Raphael.fn.g.disc = function (cx, cy, r) { + return this.circle(cx, cy, r); + }; + Raphael.fn.g.line = function (cx, cy, r) { + return this.rect(cx - r, cy - r / 5, 2 * r, 2 * r / 5); + }; + Raphael.fn.g.square = function (cx, cy, r) { + r = r * .7; + return this.rect(cx - r, cy - r, 2 * r, 2 * r); + }; + Raphael.fn.g.triangle = function (cx, cy, r) { + r *= 1.75; + return this.path("M".concat(cx, ",", cy, "m0-", r * .58, "l", r * .5, ",", r * .87, "-", r, ",0z")); + }; + Raphael.fn.g.diamond = function (cx, cy, r) { + return this.path(["M", cx, cy - r, "l", r, r, -r, r, -r, -r, r, -r, "z"]); + }; + Raphael.fn.g.flower = function (cx, cy, r, n) { + r = r * 1.25; + var rout = r, + rin = rout * .5; + n = +n < 3 || !n ? 5 : n; + var points = ["M", cx, cy + rin, "Q"], + R; + for (var i = 1; i < n * 2 + 1; i++) { + R = i % 2 ? rout : rin; + points = points.concat([+(cx + R * Math.sin(i * Math.PI / n)).toFixed(3), +(cy + R * Math.cos(i * Math.PI / n)).toFixed(3)]); + } + points.push("z"); + return this.path(points.join(",")); + }; + Raphael.fn.g.star = function (cx, cy, r, r2, rays) { + r2 = r2 || r * .382; + rays = rays || 5; + var points = ["M", cx, cy + r2, "L"], + R; + for (var i = 1; i < rays * 2; i++) { + R = i % 2 ? r : r2; + points = points.concat([(cx + R * Math.sin(i * Math.PI / rays)), (cy + R * Math.cos(i * Math.PI / rays))]); + } + points.push("z"); + return this.path(points.join(",")); + }; + Raphael.fn.g.cross = function (cx, cy, r) { + r = r / 2.5; + return this.path("M".concat(cx - r, ",", cy, "l", [-r, -r, r, -r, r, r, r, -r, r, r, -r, r, r, r, -r, r, -r, -r, -r, r, -r, -r, "z"])); + }; + Raphael.fn.g.plus = function (cx, cy, r) { + r = r / 2; + return this.path("M".concat(cx - r / 2, ",", cy - r / 2, "l", [0, -r, r, 0, 0, r, r, 0, 0, r, -r, 0, 0, r, -r, 0, 0, -r, -r, 0, 0, -r, "z"])); + }; + Raphael.fn.g.arrow = function (cx, cy, r) { + return this.path("M".concat(cx - r * .7, ",", cy - r * .4, "l", [r * .6, 0, 0, -r * .4, r, r * .8, -r, r * .8, 0, -r * .4, -r * .6, 0], "z")); + }; + + // Tooltips + Raphael.fn.g.tag = function (x, y, text, angle, r) { + angle = angle || 0; + r = r == null ? 5 : r; + text = text == null ? "$9.99" : text; + var R = .5522 * r, + res = this.set(), + d = 3; + res.push(this.path().attr({fill: "#000", stroke: "#000"})); + res.push(this.text(x, y, text).attr(this.g.txtattr).attr({fill: "#fff", "font-family": "Helvetica, Arial"})); + res.update = function () { + this.rotate(0, x, y); + var bb = this[1].getBBox(); + if (bb.height >= r * 2) { + this[0].attr({path: ["M", x, y + r, "a", r, r, 0, 1, 1, 0, -r * 2, r, r, 0, 1, 1, 0, r * 2, "m", 0, -r * 2 -d, "a", r + d, r + d, 0, 1, 0, 0, (r + d) * 2, "L", x + r + d, y + bb.height / 2 + d, "l", bb.width + 2 * d, 0, 0, -bb.height - 2 * d, -bb.width - 2 * d, 0, "L", x, y - r - d].join(",")}); + } else { + var dx = Math.sqrt(Math.pow(r + d, 2) - Math.pow(bb.height / 2 + d, 2)); + this[0].attr({path: ["M", x, y + r, "c", -R, 0, -r, R - r, -r, -r, 0, -R, r - R, -r, r, -r, R, 0, r, r - R, r, r, 0, R, R - r, r, -r, r, "M", x + dx, y - bb.height / 2 - d, "a", r + d, r + d, 0, 1, 0, 0, bb.height + 2 * d, "l", r + d - dx + bb.width + 2 * d, 0, 0, -bb.height - 2 * d, "L", x + dx, y - bb.height / 2 - d].join(",")}); + } + this[1].attr({x: x + r + d + bb.width / 2, y: y}); + angle = (360 - angle) % 360; + this.rotate(angle, x, y); + angle > 90 && angle < 270 && this[1].attr({x: x - r - d - bb.width / 2, y: y, rotation: [180 + angle, x, y]}); + return this; + }; + res.update(); + return res; + }; + Raphael.fn.g.popupit = function (x, y, set, dir, size) { + dir = dir == null ? 2 : dir; + size = size || 5; + x = Math.round(x); + y = Math.round(y); + var bb = set.getBBox(), + w = Math.round(bb.width / 2), + h = Math.round(bb.height / 2), + dx = [0, w + size * 2, 0, -w - size * 2], + dy = [-h * 2 - size * 3, -h - size, 0, -h - size], + p = ["M", x - dx[dir], y - dy[dir], "l", -size, (dir == 2) * -size, -mmax(w - size, 0), 0, "a", size, size, 0, 0, 1, -size, -size, + "l", 0, -mmax(h - size, 0), (dir == 3) * -size, -size, (dir == 3) * size, -size, 0, -mmax(h - size, 0), "a", size, size, 0, 0, 1, size, -size, + "l", mmax(w - size, 0), 0, size, !dir * -size, size, !dir * size, mmax(w - size, 0), 0, "a", size, size, 0, 0, 1, size, size, + "l", 0, mmax(h - size, 0), (dir == 1) * size, size, (dir == 1) * -size, size, 0, mmax(h - size, 0), "a", size, size, 0, 0, 1, -size, size, + "l", -mmax(w - size, 0), 0, "z"].join(","), + xy = [{x: x, y: y + size * 2 + h}, {x: x - size * 2 - w, y: y}, {x: x, y: y - size * 2 - h}, {x: x + size * 2 + w, y: y}][dir]; + set.translate(xy.x - w - bb.x, xy.y - h - bb.y); + return this.path(p).attr({fill: "#000", stroke: "none"}).insertBefore(set.node ? set : set[0]); + }; + Raphael.fn.g.popup = function (x, y, text, dir, size) { + dir = dir == null ? 2 : dir > 3 ? 3 : dir; + size = size || 5; + text = text || "$9.99"; + var res = this.set(), + d = 3; + res.push(this.path().attr({fill: "#000", stroke: "#000"})); + res.push(this.text(x, y, text).attr(this.g.txtattr).attr({fill: "#fff", "font-family": "Helvetica, Arial"})); + res.update = function (X, Y, withAnimation) { + X = X || x; + Y = Y || y; + var bb = this[1].getBBox(), + w = bb.width / 2, + h = bb.height / 2, + dx = [0, w + size * 2, 0, -w - size * 2], + dy = [-h * 2 - size * 3, -h - size, 0, -h - size], + p = ["M", X - dx[dir], Y - dy[dir], "l", -size, (dir == 2) * -size, -mmax(w - size, 0), 0, "a", size, size, 0, 0, 1, -size, -size, + "l", 0, -mmax(h - size, 0), (dir == 3) * -size, -size, (dir == 3) * size, -size, 0, -mmax(h - size, 0), "a", size, size, 0, 0, 1, size, -size, + "l", mmax(w - size, 0), 0, size, !dir * -size, size, !dir * size, mmax(w - size, 0), 0, "a", size, size, 0, 0, 1, size, size, + "l", 0, mmax(h - size, 0), (dir == 1) * size, size, (dir == 1) * -size, size, 0, mmax(h - size, 0), "a", size, size, 0, 0, 1, -size, size, + "l", -mmax(w - size, 0), 0, "z"].join(","), + xy = [{x: X, y: Y + size * 2 + h}, {x: X - size * 2 - w, y: Y}, {x: X, y: Y - size * 2 - h}, {x: X + size * 2 + w, y: Y}][dir]; + xy.path = p; + if (withAnimation) { + this.animate(xy, 500, ">"); + } else { + this.attr(xy); + } + return this; + }; + return res.update(x, y); + }; + Raphael.fn.g.flag = function (x, y, text, angle) { + angle = angle || 0; + text = text || "$9.99"; + var res = this.set(), + d = 3; + res.push(this.path().attr({fill: "#000", stroke: "#000"})); + res.push(this.text(x, y, text).attr(this.g.txtattr).attr({fill: "#fff", "font-family": "Helvetica, Arial"})); + res.update = function (x, y) { + this.rotate(0, x, y); + var bb = this[1].getBBox(), + h = bb.height / 2; + this[0].attr({path: ["M", x, y, "l", h + d, -h - d, bb.width + 2 * d, 0, 0, bb.height + 2 * d, -bb.width - 2 * d, 0, "z"].join(",")}); + this[1].attr({x: x + h + d + bb.width / 2, y: y}); + angle = 360 - angle; + this.rotate(angle, x, y); + angle > 90 && angle < 270 && this[1].attr({x: x - r - d - bb.width / 2, y: y, rotation: [180 + angle, x, y]}); + return this; + }; + return res.update(x, y); + }; + Raphael.fn.g.label = function (x, y, text) { + var res = this.set(); + res.push(this.rect(x, y, 10, 10).attr({stroke: "none", fill: "#000"})); + res.push(this.text(x, y, text).attr(this.g.txtattr).attr({fill: "#fff"})); + res.update = function () { + var bb = this[1].getBBox(), + r = mmin(bb.width + 10, bb.height + 10) / 2; + this[0].attr({x: bb.x - r / 2, y: bb.y - r / 2, width: bb.width + r, height: bb.height + r, r: r}); + }; + res.update(); + return res; + }; + Raphael.fn.g.labelit = function (set) { + var bb = set.getBBox(), + r = mmin(20, bb.width + 10, bb.height + 10) / 2; + return this.rect(bb.x - r / 2, bb.y - r / 2, bb.width + r, bb.height + r, r).attr({stroke: "none", fill: "#000"}).insertBefore(set.node ? set : set[0]); + }; + Raphael.fn.g.drop = function (x, y, text, size, angle) { + size = size || 30; + angle = angle || 0; + var res = this.set(); + res.push(this.path(["M", x, y, "l", size, 0, "A", size * .4, size * .4, 0, 1, 0, x + size * .7, y - size * .7, "z"]).attr({fill: "#000", stroke: "none", rotation: [22.5 - angle, x, y]})); + angle = (angle + 90) * Math.PI / 180; + res.push(this.text(x + size * Math.sin(angle), y + size * Math.cos(angle), text).attr(this.g.txtattr).attr({"font-size": size * 12 / 30, fill: "#fff"})); + res.drop = res[0]; + res.text = res[1]; + return res; + }; + Raphael.fn.g.blob = function (x, y, text, angle, size) { + angle = (+angle + 1 ? angle : 45) + 90; + size = size || 12; + var rad = Math.PI / 180, + fontSize = size * 12 / 12; + var res = this.set(); + res.push(this.path().attr({fill: "#000", stroke: "none"})); + res.push(this.text(x + size * Math.sin((angle) * rad), y + size * Math.cos((angle) * rad) - fontSize / 2, text).attr(this.g.txtattr).attr({"font-size": fontSize, fill: "#fff"})); + res.update = function (X, Y, withAnimation) { + X = X || x; + Y = Y || y; + var bb = this[1].getBBox(), + w = mmax(bb.width + fontSize, size * 25 / 12), + h = mmax(bb.height + fontSize, size * 25 / 12), + x2 = X + size * Math.sin((angle - 22.5) * rad), + y2 = Y + size * Math.cos((angle - 22.5) * rad), + x1 = X + size * Math.sin((angle + 22.5) * rad), + y1 = Y + size * Math.cos((angle + 22.5) * rad), + dx = (x1 - x2) / 2, + dy = (y1 - y2) / 2, + rx = w / 2, + ry = h / 2, + k = -Math.sqrt(Math.abs(rx * rx * ry * ry - rx * rx * dy * dy - ry * ry * dx * dx) / (rx * rx * dy * dy + ry * ry * dx * dx)), + cx = k * rx * dy / ry + (x1 + x2) / 2, + cy = k * -ry * dx / rx + (y1 + y2) / 2; + if (withAnimation) { + this.animate({x: cx, y: cy, path: ["M", x, y, "L", x1, y1, "A", rx, ry, 0, 1, 1, x2, y2, "z"].join(",")}, 500, ">"); + } else { + this.attr({x: cx, y: cy, path: ["M", x, y, "L", x1, y1, "A", rx, ry, 0, 1, 1, x2, y2, "z"].join(",")}); + } + return this; + }; + res.update(x, y); + return res; + }; + + Raphael.fn.g.colorValue = function (value, total, s, b) { + return "hsb(" + [mmin((1 - value / total) * .4, 1), s || .75, b || .75] + ")"; + }; + + Raphael.fn.g.snapEnds = function (from, to, steps) { + var f = from, + t = to; + if (f == t) { + return {from: f, to: t, power: 0}; + } + function round(a) { + return Math.abs(a - .5) < .25 ? ~~(a) + .5 : Math.round(a); + } + var d = (t - f) / steps, + r = ~~(d), + R = r, + i = 0; + if (r) { + while (R) { + i--; + R = ~~(d * Math.pow(10, i)) / Math.pow(10, i); + } + i ++; + } else { + while (!r) { + i = i || 1; + r = ~~(d * Math.pow(10, i)) / Math.pow(10, i); + i++; + } + i && i--; + } + t = round(to * Math.pow(10, i)) / Math.pow(10, i); + if (t < to) { + t = round((to + .5) * Math.pow(10, i)) / Math.pow(10, i); + } + f = round((from - (i > 0 ? 0 : .5)) * Math.pow(10, i)) / Math.pow(10, i); + return {from: f, to: t, power: i}; + }; + Raphael.fn.g.axis = function (x, y, length, from, to, steps, orientation, labels, type, dashsize) { + dashsize = dashsize == null ? 2 : dashsize; + type = type || "t"; + steps = steps || 10; + var path = type == "|" || type == " " ? ["M", x + .5, y, "l", 0, .001] : orientation == 1 || orientation == 3 ? ["M", x + .5, y, "l", 0, -length] : ["M", x, y + .5, "l", length, 0], + ends = this.g.snapEnds(from, to, steps), + f = ends.from, + t = ends.to, + i = ends.power, + j = 0, + text = this.set(); + d = (t - f) / steps; + var label = f, + rnd = i > 0 ? i : 0; + dx = length / steps; + if (+orientation == 1 || +orientation == 3) { + var Y = y, + addon = (orientation - 1 ? 1 : -1) * (dashsize + 3 + !!(orientation - 1)); + while (Y >= y - length) { + type != "-" && type != " " && (path = path.concat(["M", x - (type == "+" || type == "|" ? dashsize : !(orientation - 1) * dashsize * 2), Y + .5, "l", dashsize * 2 + 1, 0])); + text.push(this.text(x + addon, Y, (labels && labels[j++]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(this.g.txtattr).attr({"text-anchor": orientation - 1 ? "start" : "end"})); + label += d; + Y -= dx; + } + if (Math.round(Y + dx - (y - length))) { + type != "-" && type != " " && (path = path.concat(["M", x - (type == "+" || type == "|" ? dashsize : !(orientation - 1) * dashsize * 2), y - length + .5, "l", dashsize * 2 + 1, 0])); + text.push(this.text(x + addon, y - length, (labels && labels[j]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(this.g.txtattr).attr({"text-anchor": orientation - 1 ? "start" : "end"})); + } + } else { + label = f; + rnd = (i > 0) * i; + addon = (orientation ? -1 : 1) * (dashsize + 9 + !orientation); + var X = x, + dx = length / steps, + txt = 0, + prev = 0; + while (X <= x + length) { + type != "-" && type != " " && (path = path.concat(["M", X + .5, y - (type == "+" ? dashsize : !!orientation * dashsize * 2), "l", 0, dashsize * 2 + 1])); + text.push(txt = this.text(X, y + addon, (labels && labels[j++]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(this.g.txtattr)); + var bb = txt.getBBox(); + if (prev >= bb.x - 5) { + text.pop(text.length - 1).remove(); + } else { + prev = bb.x + bb.width; + } + label += d; + X += dx; + } + if (Math.round(X - dx - x - length)) { + type != "-" && type != " " && (path = path.concat(["M", x + length + .5, y - (type == "+" ? dashsize : !!orientation * dashsize * 2), "l", 0, dashsize * 2 + 1])); + text.push(this.text(x + length, y + addon, (labels && labels[j]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(this.g.txtattr)); + } + } + var res = this.path(path); + res.text = text; + res.all = this.set([res, text]); + res.remove = function () { + this.text.remove(); + this.constructor.prototype.remove.call(this); + }; + return res; + }; + + Raphael.el.lighter = function (times) { + times = times || 2; + var fs = [this.attrs.fill, this.attrs.stroke]; + this.fs = this.fs || [fs[0], fs[1]]; + fs[0] = Raphael.rgb2hsb(Raphael.getRGB(fs[0]).hex); + fs[1] = Raphael.rgb2hsb(Raphael.getRGB(fs[1]).hex); + fs[0].b = mmin(fs[0].b * times, 1); + fs[0].s = fs[0].s / times; + fs[1].b = mmin(fs[1].b * times, 1); + fs[1].s = fs[1].s / times; + this.attr({fill: "hsb(" + [fs[0].h, fs[0].s, fs[0].b] + ")", stroke: "hsb(" + [fs[1].h, fs[1].s, fs[1].b] + ")"}); + }; + Raphael.el.darker = function (times) { + times = times || 2; + var fs = [this.attrs.fill, this.attrs.stroke]; + this.fs = this.fs || [fs[0], fs[1]]; + fs[0] = Raphael.rgb2hsb(Raphael.getRGB(fs[0]).hex); + fs[1] = Raphael.rgb2hsb(Raphael.getRGB(fs[1]).hex); + fs[0].s = mmin(fs[0].s * times, 1); + fs[0].b = fs[0].b / times; + fs[1].s = mmin(fs[1].s * times, 1); + fs[1].b = fs[1].b / times; + this.attr({fill: "hsb(" + [fs[0].h, fs[0].s, fs[0].b] + ")", stroke: "hsb(" + [fs[1].h, fs[1].s, fs[1].b] + ")"}); + }; + Raphael.el.original = function () { + if (this.fs) { + this.attr({fill: this.fs[0], stroke: this.fs[1]}); + delete this.fs; + } + }; +})();/*! + * g.Raphael 0.4.1 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael.fn.g.barchart = function (x, y, width, height, values, opts) { + opts = opts || {}; + var type = {round: "round", sharp: "sharp", soft: "soft"}[opts.type] || "square", + gutter = parseFloat(opts.gutter || "20%"), + chart = this.set(), + bars = this.set(), + covers = this.set(), + covers2 = this.set(), + total = Math.max.apply(Math, values), + stacktotal = [], + paper = this, + multi = 0, + colors = opts.colors || this.g.colors, + len = values.length; + if (this.raphael.is(values[0], "array")) { + total = []; + multi = len; + len = 0; + for (var i = values.length; i--;) { + bars.push(this.set()); + total.push(Math.max.apply(Math, values[i])); + len = Math.max(len, values[i].length); + } + if (opts.stacked) { + for (var i = len; i--;) { + var tot = 0; + for (var j = values.length; j--;) { + tot +=+ values[j][i] || 0; + } + stacktotal.push(tot); + } + } + for (var i = values.length; i--;) { + if (values[i].length < len) { + for (var j = len; j--;) { + values[i].push(0); + } + } + } + total = Math.max.apply(Math, opts.stacked ? stacktotal : total); + } + + total = (opts.to) || total; + var barwidth = width / (len * (100 + gutter) + gutter) * 100, + barhgutter = barwidth * gutter / 100, + barvgutter = opts.vgutter == null ? 20 : opts.vgutter, + stack = [], + X = x + barhgutter, + Y = (height - 2 * barvgutter) / total; + if (!opts.stretch) { + barhgutter = Math.round(barhgutter); + barwidth = Math.floor(barwidth); + } + !opts.stacked && (barwidth /= multi || 1); + for (var i = 0; i < len; i++) { + stack = []; + for (var j = 0; j < (multi || 1); j++) { + var h = Math.round((multi ? values[j][i] : values[i]) * Y), + top = y + height - barvgutter - h, + bar = this.g.finger(Math.round(X + barwidth / 2), top + h, barwidth, h, true, type).attr({stroke: "none", fill: colors[multi ? j : i]}); + if (multi) { + bars[j].push(bar); + } else { + bars.push(bar); + } + bar.y = top; + bar.x = Math.round(X + barwidth / 2); + bar.w = barwidth; + bar.h = h; + bar.index = i; + bar.value = multi ? values[j][i] : values[i]; + if (!opts.stacked) { + X += barwidth; + } else { + stack.push(bar); + } + } + if (opts.stacked) { + var cvr; + covers2.push(cvr = this.rect(stack[0].x - stack[0].w / 2, y, barwidth, height).attr(this.g.shim)); + cvr.bars = this.set(); + var size = 0; + for (var s = stack.length; s--;) { + stack[s].toFront(); + } + for (var s = 0, ss = stack.length; s < ss; s++) { + var bar = stack[s], + cover, + h = (size + bar.value) * Y, + path = this.g.finger(bar.x, y + height - barvgutter - !!size * .5, barwidth, h, true, type, 1); + cvr.bars.push(bar); + size && bar.attr({path: path}); + bar.h = h; + bar.y = y + height - barvgutter - !!size * .5 - h; + covers.push(cover = this.rect(bar.x - bar.w / 2, bar.y, barwidth, bar.value * Y).attr(this.g.shim)); + cover.bar = bar; + cover.value = bar.value; + size += bar.value; + } + X += barwidth; + } + X += barhgutter; + } + covers2.toFront(); + X = x + barhgutter; + if (!opts.stacked) { + for (var i = 0; i < len; i++) { + for (var j = 0; j < (multi || 1); j++) { + var cover; + covers.push(cover = this.rect(Math.round(X), y + barvgutter, barwidth, height - barvgutter).attr(this.g.shim)); + cover.bar = multi ? bars[j][i] : bars[i]; + cover.value = cover.bar.value; + X += barwidth; + } + X += barhgutter; + } + } + chart.label = function (labels, isBottom, rotate) { + labels = labels || []; + isBottom = isBottom == undefined ? true : isBottom; + rotate = rotate == undefined ? false : rotate; + this.labels = paper.set(); + var L, l = -Infinity; + if (opts.stacked) { + for (var i = 0; i < len; i++) { + var tot = 0; + for (var j = 0; j < (multi || 1); j++) { + tot += multi ? values[j][i] : values[i]; + if (j == 0) { + var label = paper.g.labelise(labels[j][i], tot, total); + L = paper.g.text(bars[j][i].x, isBottom ? y + height - barvgutter / 2 : bars[j][i].y - 10, label); + if (rotate) { + L.rotate(90); + } + var bb = L.getBBox(); + if (bb.x - 7 < l) { + L.remove(); + } else { + this.labels.push(L); + l = bb.x + (rotate ? bb.height : bb.width); + } + } + } + } + } else { + for (var i = 0; i < len; i++) { + for (var j = 0; j < (multi || 1); j++) { + // did not remove the loop because don't yet know whether to accept multi array input for arrays + var label = paper.g.labelise(multi ? labels[0] && labels[0][i] : labels[i], multi ? values[0][i] : values[i], total); + L = paper.g.text(bars[0][i].x, isBottom ? y + 5 + height - barvgutter / 2 : bars[0][i].y - 10, label); + if (rotate) { + L.rotate(90); + // If we rotated it, we need to move it as well. Still have to use the width + // to get the "length" of the label, divided it in two and shift down. + L.translate(0, (L.getBBox().width / 2)); + } + var bb = L.getBBox(); +// if (bb.x - 7 < l) { + if (bb.x - (this.getBBox().width) < l) { + L.remove(); + } else { + this.labels.push(L); + l = bb.x + (rotate ? bb.height : bb.width); + } + } + } + } + return this; + }; + chart.hover = function (fin, fout) { + covers2.hide(); + covers.show(); + covers.mouseover(fin).mouseout(fout); + return this; + }; + chart.hoverColumn = function (fin, fout) { + covers.hide(); + covers2.show(); + fout = fout || function () {}; + covers2.mouseover(fin).mouseout(fout); + return this; + }; + chart.click = function (f) { + covers2.hide(); + covers.show(); + covers.click(f); + return this; + }; + chart.each = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers.length; i--;) { + f.call(covers[i]); + } + return this; + }; + chart.eachColumn = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers2.length; i--;) { + f.call(covers2[i]); + } + return this; + }; + chart.clickColumn = function (f) { + covers.hide(); + covers2.show(); + covers2.click(f); + return this; + }; + chart.push(bars, covers, covers2); + chart.bars = bars; + chart.covers = covers; + return chart; +}; +Raphael.fn.g.hbarchart = function (x, y, width, height, values, opts) { + opts = opts || {}; + var type = {round: "round", sharp: "sharp", soft: "soft"}[opts.type] || "square", + gutter = parseFloat(opts.gutter || "20%"), + chart = this.set(), + bars = this.set(), + covers = this.set(), + covers2 = this.set(), + total = Math.max.apply(Math, values), + stacktotal = [], + paper = this, + multi = 0, + colors = opts.colors || this.g.colors, + len = values.length; + if (this.raphael.is(values[0], "array")) { + total = []; + multi = len; + len = 0; + for (var i = values.length; i--;) { + bars.push(this.set()); + total.push(Math.max.apply(Math, values[i])); + len = Math.max(len, values[i].length); + } + if (opts.stacked) { + for (var i = len; i--;) { + var tot = 0; + for (var j = values.length; j--;) { + tot +=+ values[j][i] || 0; + } + stacktotal.push(tot); + } + } + for (var i = values.length; i--;) { + if (values[i].length < len) { + for (var j = len; j--;) { + values[i].push(0); + } + } + } + total = Math.max.apply(Math, opts.stacked ? stacktotal : total); + } + + total = (opts.to) || total; + var barheight = Math.floor(height / (len * (100 + gutter) + gutter) * 100), + bargutter = Math.floor(barheight * gutter / 100), + stack = [], + Y = y + bargutter, + X = (width - 1) / total; + !opts.stacked && (barheight /= multi || 1); + for (var i = 0; i < len; i++) { + stack = []; + for (var j = 0; j < (multi || 1); j++) { + var val = multi ? values[j][i] : values[i], + bar = this.g.finger(x, Y + barheight / 2, Math.round(val * X), barheight - 1, false, type).attr({stroke: "none", fill: colors[multi ? j : i]}); + if (multi) { + bars[j].push(bar); + } else { + bars.push(bar); + } + bar.x = x + Math.round(val * X); + bar.y = Y + barheight / 2; + bar.w = Math.round(val * X); + bar.h = barheight; + bar.value = +val; + if (!opts.stacked) { + Y += barheight; + } else { + stack.push(bar); + } + } + if (opts.stacked) { + var cvr = this.rect(x, stack[0].y - stack[0].h / 2, width, barheight).attr(this.g.shim); + covers2.push(cvr); + cvr.bars = this.set(); + var size = 0; + for (var s = stack.length; s--;) { + stack[s].toFront(); + } + for (var s = 0, ss = stack.length; s < ss; s++) { + var bar = stack[s], + cover, + val = Math.round((size + bar.value) * X), + path = this.g.finger(x, bar.y, val, barheight - 1, false, type, 1); + cvr.bars.push(bar); + size && bar.attr({path: path}); + bar.w = val; + bar.x = x + val; + covers.push(cover = this.rect(x + size * X, bar.y - bar.h / 2, bar.value * X, barheight).attr(this.g.shim)); + cover.bar = bar; + size += bar.value; + } + Y += barheight; + } + Y += bargutter; + } + covers2.toFront(); + Y = y + bargutter; + if (!opts.stacked) { + for (var i = 0; i < len; i++) { + for (var j = 0; j < (multi || 1); j++) { + var cover = this.rect(x, Y, width, barheight).attr(this.g.shim); + covers.push(cover); + cover.bar = multi ? bars[j][i] : bars[i]; + cover.value = cover.bar.value; + Y += barheight; + } + Y += bargutter; + } + } + chart.label = function (labels, isRight) { + labels = labels || []; + this.labels = paper.set(); + for (var i = 0; i < len; i++) { + for (var j = 0; j < multi; j++) { + var label = paper.g.labelise(multi ? labels[j] && labels[j][i] : labels[i], multi ? values[j][i] : values[i], total); + var X = isRight ? bars[i * (multi || 1) + j].x - barheight / 2 + 3 : x + 5, + A = isRight ? "end" : "start", + L; + this.labels.push(L = paper.g.text(X, bars[i * (multi || 1) + j].y, label).attr({"text-anchor": A}).insertBefore(covers[0])); + if (L.getBBox().x < x + 5) { + L.attr({x: x + 5, "text-anchor": "start"}); + } else { + bars[i * (multi || 1) + j].label = L; + } + } + } + return this; + }; + chart.hover = function (fin, fout) { + covers2.hide(); + covers.show(); + fout = fout || function () {}; + covers.mouseover(fin).mouseout(fout); + return this; + }; + chart.hoverColumn = function (fin, fout) { + covers.hide(); + covers2.show(); + fout = fout || function () {}; + covers2.mouseover(fin).mouseout(fout); + return this; + }; + chart.each = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers.length; i--;) { + f.call(covers[i]); + } + return this; + }; + chart.eachColumn = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers2.length; i--;) { + f.call(covers2[i]); + } + return this; + }; + chart.click = function (f) { + covers2.hide(); + covers.show(); + covers.click(f); + return this; + }; + chart.clickColumn = function (f) { + covers.hide(); + covers2.show(); + covers2.click(f); + return this; + }; + chart.push(bars, covers, covers2); + chart.bars = bars; + chart.covers = covers; + return chart; +}; +/*! + * g.Raphael 0.4.1 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael.fn.g.dotchart = function (x, y, width, height, valuesx, valuesy, size, opts) { + function drawAxis(ax) { + +ax[0] && (ax[0] = paper.g.axis(x + gutter, y + gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 2, opts.axisxlabels || null, opts.axisxtype || "t")); + +ax[1] && (ax[1] = paper.g.axis(x + width - gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 3, opts.axisylabels || null, opts.axisytype || "t")); + +ax[2] && (ax[2] = paper.g.axis(x + gutter, y + height - gutter + maxR, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 0, opts.axisxlabels || null, opts.axisxtype || "t")); + +ax[3] && (ax[3] = paper.g.axis(x + gutter - maxR, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 1, opts.axisylabels || null, opts.axisytype || "t")); + } + opts = opts || {}; + var xdim = this.g.snapEnds(Math.min.apply(Math, valuesx), Math.max.apply(Math, valuesx), valuesx.length - 1), + minx = xdim.from, + maxx = xdim.to, + gutter = opts.gutter || 10, + ydim = this.g.snapEnds(Math.min.apply(Math, valuesy), Math.max.apply(Math, valuesy), valuesy.length - 1), + miny = ydim.from, + maxy = ydim.to, + len = Math.max(valuesx.length, valuesy.length, size.length), + symbol = this.g.markers[opts.symbol] || "disc", + res = this.set(), + series = this.set(), + max = opts.max || 100, + top = Math.max.apply(Math, size), + R = [], + paper = this, + k = Math.sqrt(top / Math.PI) * 2 / max; + + for (var i = 0; i < len; i++) { + R[i] = Math.min(Math.sqrt(size[i] / Math.PI) * 2 / k, max); + } + gutter = Math.max.apply(Math, R.concat(gutter)); + var axis = this.set(), + maxR = Math.max.apply(Math, R); + if (opts.axis) { + var ax = (opts.axis + "").split(/[,\s]+/); + drawAxis(ax); + var g = [], b = []; + for (var i = 0, ii = ax.length; i < ii; i++) { + var bb = ax[i].all ? ax[i].all.getBBox()[["height", "width"][i % 2]] : 0; + g[i] = bb + gutter; + b[i] = bb; + } + gutter = Math.max.apply(Math, g.concat(gutter)); + for (var i = 0, ii = ax.length; i < ii; i++) if (ax[i].all) { + ax[i].remove(); + ax[i] = 1; + } + drawAxis(ax); + for (var i = 0, ii = ax.length; i < ii; i++) if (ax[i].all) { + axis.push(ax[i].all); + } + res.axis = axis; + } + var kx = (width - gutter * 2) / ((maxx - minx) || 1), + ky = (height - gutter * 2) / ((maxy - miny) || 1); + for (var i = 0, ii = valuesy.length; i < ii; i++) { + var sym = this.raphael.is(symbol, "array") ? symbol[i] : symbol, + X = x + gutter + (valuesx[i] - minx) * kx, + Y = y + height - gutter - (valuesy[i] - miny) * ky; + sym && R[i] && series.push(this.g[sym](X, Y, R[i]).attr({fill: opts.heat ? this.g.colorValue(R[i], maxR) : Raphael.fn.g.colors[0], "fill-opacity": opts.opacity ? R[i] / max : 1, stroke: "none"})); + } + var covers = this.set(); + for (var i = 0, ii = valuesy.length; i < ii; i++) { + var X = x + gutter + (valuesx[i] - minx) * kx, + Y = y + height - gutter - (valuesy[i] - miny) * ky; + covers.push(this.circle(X, Y, maxR).attr(this.g.shim)); + opts.href && opts.href[i] && covers[i].attr({href: opts.href[i]}); + covers[i].r = +R[i].toFixed(3); + covers[i].x = +X.toFixed(3); + covers[i].y = +Y.toFixed(3); + covers[i].X = valuesx[i]; + covers[i].Y = valuesy[i]; + covers[i].value = size[i] || 0; + covers[i].dot = series[i]; + } + res.covers = covers; + res.series = series; + res.push(series, axis, covers); + res.hover = function (fin, fout) { + covers.mouseover(fin).mouseout(fout); + return this; + }; + res.click = function (f) { + covers.click(f); + return this; + }; + res.each = function (f) { + if (!Raphael.is(f, "function")) { + return this; + } + for (var i = covers.length; i--;) { + f.call(covers[i]); + } + return this; + }; + res.href = function (map) { + var cover; + for (var i = covers.length; i--;) { + cover = covers[i]; + if (cover.X == map.x && cover.Y == map.y && cover.value == map.value) { + cover.attr({href: map.href}); + } + } + }; + return res; +}; +/*! + * g.Raphael 0.4.2 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael.fn.g.linechart = function (x, y, width, height, valuesx, valuesy, opts) { + function shrink(values, dim) { + var k = values.length / dim, + j = 0, + l = k, + sum = 0, + res = []; + while (j < values.length) { + l--; + if (l < 0) { + sum += values[j] * (1 + l); + res.push(sum / k); + sum = values[j++] * -l; + l += k; + } else { + sum += values[j++]; + } + } + return res; + } + function getAnchors(p1x, p1y, p2x, p2y, p3x, p3y) { + var l1 = (p2x - p1x) / 2, + l2 = (p3x - p2x) / 2, + a = Math.atan((p2x - p1x) / Math.abs(p2y - p1y)), + b = Math.atan((p3x - p2x) / Math.abs(p2y - p3y)); + a = p1y < p2y ? Math.PI - a : a; + b = p3y < p2y ? Math.PI - b : b; + var alpha = Math.PI / 2 - ((a + b) % (Math.PI * 2)) / 2, + dx1 = l1 * Math.sin(alpha + a), + dy1 = l1 * Math.cos(alpha + a), + dx2 = l2 * Math.sin(alpha + b), + dy2 = l2 * Math.cos(alpha + b); + return { + x1: p2x - dx1, + y1: p2y + dy1, + x2: p2x + dx2, + y2: p2y + dy2 + }; + } + opts = opts || {}; + if (!this.raphael.is(valuesx[0], "array")) { + valuesx = [valuesx]; + } + if (!this.raphael.is(valuesy[0], "array")) { + valuesy = [valuesy]; + } + var gutter = opts.gutter || 10, + len = Math.max(valuesx[0].length, valuesy[0].length), + symbol = opts.symbol || "", + colors = opts.colors || Raphael.fn.g.colors, + that = this, + columns = null, + dots = null, + chart = this.set(), + path = []; + + for (var i = 0, ii = valuesy.length; i < ii; i++) { + len = Math.max(len, valuesy[i].length); + } + var shades = this.set(); + for (i = 0, ii = valuesy.length; i < ii; i++) { + if (opts.shade) { + shades.push(this.path().attr({stroke: "none", fill: colors[i], opacity: opts.nostroke ? 1 : .3})); + } + if (valuesy[i].length > width - 2 * gutter) { + valuesy[i] = shrink(valuesy[i], width - 2 * gutter); + len = width - 2 * gutter; + } + if (valuesx[i] && valuesx[i].length > width - 2 * gutter) { + valuesx[i] = shrink(valuesx[i], width - 2 * gutter); + } + } + var allx = Array.prototype.concat.apply([], valuesx), + ally = Array.prototype.concat.apply([], valuesy), + xdim = this.g.snapEnds(Math.min.apply(Math, allx), Math.max.apply(Math, allx), valuesx[0].length - 1); + if(opts.clip) { + var minx = opts.minx || xdim.from, + maxx = opts.maxx || xdim.to, + ydim = this.g.snapEnds(Math.min.apply(Math, ally), Math.max.apply(Math, ally), valuesy[0].length - 1), + miny = opts.miny || ydim.from, + maxy = opts.maxy || ydim.to; + } else { + var minx = opts.minx && Math.min(opts.minx, xdim.from) || xdim.from, + maxx = opts.maxx && Math.max(opts.maxx, xdimt.to) || xdim.to, + ydim = this.g.snapEnds(Math.min.apply(Math, ally), Math.max.apply(Math, ally), valuesy[0].length - 1), + miny = opts.miny && Math.min(opts.miny, ydim.from) || ydim.from, + maxy = opts.maxy && Math.max(opts.maxy, ydim.to) || ydim.to; + } + kx = (width - gutter * 2) / ((maxx - minx) || 1), + ky = (height - gutter * 2) / ((maxy - miny) || 1); + + var lines = this.set(), + symbols = this.set(), + line; + for (i = 0, ii = valuesy.length; i < ii; i++) { + if (!opts.nostroke) { + lines.push(line = this.path().attr({ + stroke: colors[i], + "stroke-width": opts.width || 2, + "stroke-linejoin": "round", + "stroke-linecap": "round", + "stroke-dasharray": opts.dash || "" + })); + } + var sym = this.raphael.is(symbol, "array") ? symbol[i] : symbol, + symset = this.set(); + path = []; + for (var j = 0, jj = valuesy[i].length; j < jj; j++) { + var X = x + gutter + ((valuesx[i] || valuesx[0])[j] - minx) * kx, + Y = y + height - gutter - (valuesy[i][j] - miny) * ky; + (Raphael.is(sym, "array") ? sym[j] : sym) && symset.push(this.g[Raphael.fn.g.markers[this.raphael.is(sym, "array") ? sym[j] : sym]](X, Y, (opts.width || 2) * 3).attr({fill: colors[i], stroke: "none"})); + if (opts.smooth) { + if (j && j != jj - 1) { + var X0 = x + gutter + ((valuesx[i] || valuesx[0])[j - 1] - minx) * kx, + Y0 = y + height - gutter - (valuesy[i][j - 1] - miny) * ky, + X2 = x + gutter + ((valuesx[i] || valuesx[0])[j + 1] - minx) * kx, + Y2 = y + height - gutter - (valuesy[i][j + 1] - miny) * ky; + var a = getAnchors(X0, Y0, X, Y, X2, Y2); + path = path.concat([a.x1, a.y1, X, Y, a.x2, a.y2]); + } + if (!j) { + path = ["M", X, Y, "C", X, Y]; + } + } else { + path = path.concat([j ? "L" : "M", X, Y]); + } + } + if (opts.smooth) { + path = path.concat([X, Y, X, Y]); + } + symbols.push(symset); + if (opts.shade) { + shades[i].attr({path: path.concat(["L", X, y + height - gutter, "L", x + gutter + ((valuesx[i] || valuesx[0])[0] - minx) * kx, y + height - gutter, "z"]).join(",")}); + } + !opts.nostroke && line.attr({path: path.join(","), 'clip-rect': [x + gutter, y + gutter, width - 2 * gutter, height - 2 * gutter].join(",")}); + } + + function createColumns(f) { + // unite Xs together + var Xs = []; + for (var i = 0, ii = valuesx.length; i < ii; i++) { + Xs = Xs.concat(valuesx[i]); + } + Xs.sort(function(a,b) { return a - b; }); + // remove duplicates + var Xs2 = [], + xs = []; + for (i = 0, ii = Xs.length; i < ii; i++) { + Xs[i] != Xs[i - 1] && Xs2.push(Xs[i]) && xs.push(x + gutter + (Xs[i] - minx) * kx); + } + Xs = Xs2; + ii = Xs.length; + var cvrs = f || that.set(); + for (i = 0; i < ii; i++) { + var X = xs[i] - (xs[i] - (xs[i - 1] || x)) / 2, + w = ((xs[i + 1] || x + width) - xs[i]) / 2 + (xs[i] - (xs[i - 1] || x)) / 2, + C; + f ? (C = {}) : cvrs.push(C = that.rect(X - 1, y, Math.max(w + 1, 1), height).attr({stroke: "none", fill: "#000", opacity: 0})); + C.values = []; + C.symbols = that.set(); + C.y = []; + C.x = xs[i]; + C.axis = Xs[i]; + for (var j = 0, jj = valuesy.length; j < jj; j++) { + Xs2 = valuesx[j] || valuesx[0]; + for (var k = 0, kk = Xs2.length; k < kk; k++) { + if (Xs2[k] == Xs[i]) { + C.values.push(valuesy[j][k]); + C.y.push(y + height - gutter - (valuesy[j][k] - miny) * ky); + C.symbols.push(chart.symbols[j][k]); + } + } + } + f && f.call(C); + } + !f && (columns = cvrs); + } + function createDots(f) { + var cvrs = f || that.set(), + C; + for (var i = 0, ii = valuesy.length; i < ii; i++) { + for (var j = 0, jj = valuesy[i].length; j < jj; j++) { + var X = x + gutter + ((valuesx[i] || valuesx[0])[j] - minx) * kx, + nearX = x + gutter + ((valuesx[i] || valuesx[0])[j ? j - 1 : 1] - minx) * kx, + Y = y + height - gutter - (valuesy[i][j] - miny) * ky; + f ? (C = {}) : cvrs.push(C = that.circle(X, Y, Math.abs(nearX - X) / 2).attr({stroke: "none", fill: "#000", opacity: 0})); + C.x = X; + C.y = Y; + C.value = valuesy[i][j]; + C.line = chart.lines[i]; + C.shade = chart.shades[i]; + C.symbol = chart.symbols[i][j]; + C.symbols = chart.symbols[i]; + C.axis = (valuesx[i] || valuesx[0])[j]; + f && f.call(C); + } + } + !f && (dots = cvrs); + } + + var axis = this.set(); + if (opts.axis) { + var ax = (opts.axis + "").split(/[,\s]+/); + +ax[0] && axis.push(this.g.axis(x + gutter, y + gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 2, opts.axisxlabels || null, opts.axisxtype || "t")); + +ax[1] && axis.push(this.g.axis(x + width - gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 3, opts.axisylabels || null, opts.axisytype || "t")); + +ax[2] && axis.push(this.g.axis(x + gutter, y + height - gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 0, opts.axisxlabels || null, opts.axisxtype || "t")); + +ax[3] && axis.push(this.g.axis(x + gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 1, opts.axisylabels || null, opts.axisytype || "t")); + } + + chart.push(lines, shades, symbols, axis, columns, dots); + chart.lines = lines; + chart.shades = shades; + chart.symbols = symbols; + chart.axis = axis; + chart.hoverColumn = function (fin, fout) { + !columns && createColumns(); + columns.mouseover(fin).mouseout(fout); + return this; + }; + chart.clickColumn = function (f) { + !columns && createColumns(); + columns.click(f); + return this; + }; + chart.hrefColumn = function (cols) { + var hrefs = that.raphael.is(arguments[0], "array") ? arguments[0] : arguments; + if (!(arguments.length - 1) && typeof cols == "object") { + for (var x in cols) { + for (var i = 0, ii = columns.length; i < ii; i++) if (columns[i].axis == x) { + columns[i].attr("href", cols[x]); + } + } + } + !columns && createColumns(); + for (i = 0, ii = hrefs.length; i < ii; i++) { + columns[i] && columns[i].attr("href", hrefs[i]); + } + return this; + }; + chart.hover = function (fin, fout) { + !dots && createDots(); + dots.mouseover(fin).mouseout(fout); + return this; + }; + chart.click = function (f) { + !dots && createDots(); + dots.click(f); + return this; + }; + chart.each = function (f) { + createDots(f); + return this; + }; + chart.eachColumn = function (f) { + createColumns(f); + return this; + }; + return chart; +}; +/*! + * g.Raphael 0.4.1 - Charting library, based on Raphaël + * + * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) + * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael.fn.g.piechart = function (cx, cy, r, values, opts) { + opts = opts || {}; + var paper = this, + sectors = [], + covers = this.set(), + chart = this.set(), + series = this.set(), + order = [], + len = values.length, + angle = 0, + total = 0, + others = 0, + cut = 9, + defcut = true; + + var sum = 0; + for (var i = 0; i < len; i++) + sum += values[i]; + var single = false; + var single_index = -1; + for (var i = 0; i < len; i++) + if (sum == values[i]) { + single = true; + single_index = i; + break; + } + if (len == 1 || single == true) { + for(var i = 0; i < len; i++) { + var radius = 0.1; + if (i == single_index) { + radius = r; + } + series.push(this.circle(cx, cy, radius).attr({fill: opts.colors && opts.colors[i] || this.g.colors[i], stroke: opts.stroke || "#fff", "stroke-width": opts.strokewidth == null ? 1 : opts.strokewidth})); + covers.push(this.circle(cx, cy, radius).attr({href: opts.href ? opts.href[i] : null}).attr(this.g.shim)); + values[i] = {value: values[i], order: i, valueOf: function () { return this.value; }}; + series[i].middle = {x: cx, y: cy}; + series[i].mangle = 180; + } + total = values[single_index]; + } else { + function sector(cx, cy, r, startAngle, endAngle, fill) { + var rad = Math.PI / 180, + x1 = cx + r * Math.cos(-startAngle * rad), + x2 = cx + r * Math.cos(-endAngle * rad), + xm = cx + r / 2 * Math.cos(-(startAngle + (endAngle - startAngle) / 2) * rad), + y1 = cy + r * Math.sin(-startAngle * rad), + y2 = cy + r * Math.sin(-endAngle * rad), + ym = cy + r / 2 * Math.sin(-(startAngle + (endAngle - startAngle) / 2) * rad), + res = ["M", cx, cy, "L", x1, y1, "A", r, r, 0, +(Math.abs(endAngle - startAngle) > 180), 1, x2, y2, "z"]; + res.middle = {x: xm, y: ym}; + return res; + } + for (var i = 0; i < len; i++) { + total += values[i]; + values[i] = {value: values[i], order: i, valueOf: function () { return this.value; }}; + } + values.sort(function (a, b) { + return b.value - a.value; + }); + for (i = 0; i < len; i++) { + if (defcut && values[i] * 360 / total <= 1.5) { + cut = i; + defcut = false; + } + if (i > cut) { + defcut = false; + values[cut].value += values[i]; + values[cut].others = true; + others = values[cut].value; + } + } + len = Math.min(cut + 1, values.length); + others && values.splice(len) && (values[cut].others = true); + for (i = 0; i < len; i++) { + var valueOrder = values[i].order; + var mangle = angle - 360 * values[i] / total / 2; + if (!i) { + angle = 90 - mangle; + mangle = angle - 360 * values[i] / total / 2; + } + if (opts.init) { + var ipath = sector(cx, cy, 1, angle, angle - 360 * values[i] / total).join(","); + } + var path = sector(cx, cy, r, angle, angle -= 360 * values[i] / total); + var p = this.path(opts.init ? ipath : path).attr({fill: opts.colors && opts.colors[valueOrder] || this.g.colors[valueOrder] || "#666", stroke: opts.stroke || "#fff", "stroke-width": (opts.strokewidth == null ? 1 : opts.strokewidth), "stroke-linejoin": "round"}); + p.value = values[i]; + p.middle = path.middle; + p.mangle = mangle; + sectors.push(p); + series.push(p); + opts.init && p.animate({path: path.join(",")}, (+opts.init - 1) || 1000, ">"); + } + for (i = 0; i < len; i++) { + p = paper.path(sectors[i].attr("path")).attr(this.g.shim); + var valueOrder = values[i].order; + opts.href && opts.href[valueOrder] && p.attr({href: opts.href[valueOrder]}); + //p.attr = function () {}; // this breaks translate! + covers.push(p); + } + } + + chart.hover = function (fin, fout) { + fout = fout || function () {}; + var that = this; + for (var i = 0; i < len; i++) { + (function (sector, cover, j) { + var o = { + sector: sector, + cover: cover, + cx: cx, + cy: cy, + mx: sector.middle.x, + my: sector.middle.y, + mangle: sector.mangle, + r: r, + value: values[j], + total: total, + label: that.labels && that.labels[j] + }; + cover.mouseover(function () { + fin.call(o); + }).mouseout(function () { + fout.call(o); + }); + })(series[i], covers[i], i); + } + return this; + }; + // x: where label could be put + // y: where label could be put + // value: value to show + // total: total number to count % + chart.each = function (f) { + var that = this; + for (var i = 0; i < len; i++) { + (function (sector, cover, j) { + var o = { + sector: sector, + cover: cover, + cx: cx, + cy: cy, + x: sector.middle.x, + y: sector.middle.y, + mangle: sector.mangle, + r: r, + value: values[j], + total: total, + label: that.labels && that.labels[j] + }; + f.call(o); + })(series[i], covers[i], i); + } + return this; + }; + chart.click = function (f) { + var that = this; + for (var i = 0; i < len; i++) { + (function (sector, cover, j) { + var o = { + sector: sector, + cover: cover, + cx: cx, + cy: cy, + mx: sector.middle.x, + my: sector.middle.y, + mangle: sector.mangle, + r: r, + value: values[j], + total: total, + label: that.labels && that.labels[j] + }; + cover.click(function () { f.call(o); }); + })(series[i], covers[i], i); + } + return this; + }; + chart.inject = function (element) { + element.insertBefore(covers[0]); + }; + var legend = function (labels, otherslabel, mark, dir) { + var x = cx + r + r / 5, + y = cy, + h = y + 10; + labels = labels || []; + dir = (dir && dir.toLowerCase && dir.toLowerCase()) || "east"; + mark = paper.g.markers[mark && mark.toLowerCase()] || "disc"; + chart.labels = paper.set(); + for (var i = 0; i < len; i++) { + var clr = series[i].attr("fill"), + j = values[i].order, + txt; + values[i].others && (labels[j] = otherslabel || "Others"); + labels[j] = paper.g.labelise(labels[j], values[i], total); + chart.labels.push(paper.set()); + chart.labels[i].push(paper.g[mark](x + 5, h, 5).attr({fill: clr, stroke: "none"})); + chart.labels[i].push(txt = paper.text(x + 20, h, labels[j] || values[j]).attr(paper.g.txtattr).attr({fill: opts.legendcolor || "#000", "text-anchor": "start"})); + covers[i].label = chart.labels[i]; + h += txt.getBBox().height * 1.2; + } + var bb = chart.labels.getBBox(), + tr = { + east: [0, -bb.height / 2], + west: [-bb.width - 2 * r - 20, -bb.height / 2], + north: [-r - bb.width / 2, -r - bb.height - 10], + south: [-r - bb.width / 2, r + 10] + }[dir]; + chart.labels.translate.apply(chart.labels, tr); + chart.push(chart.labels); + }; + if (opts.legend) { + legend(opts.legend, opts.legendothers, opts.legendmark, opts.legendpos); + } + chart.push(series, covers); + chart.series = series; + chart.covers = covers; + + var w = paper.width, + h = paper.height, + bb = chart.getBBox(), + tr = [(w - bb.width)/2 - bb.x, (h - bb.height)/2 - bb.y]; + cx += tr[0]; + cy += tr[1]; + chart.translate.apply(chart, tr); + return chart; +}; diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/i18n/i18n.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/i18n/i18n.js new file mode 100644 index 000000000..de0fc5178 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/i18n/i18n.js @@ -0,0 +1,93 @@ +(function() { + /** + * provides text formatting and i18n key storage features<br> + * implements most of the Sun Java MessageFormat functionality. + * @see <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html" target="sun">Sun's Documentation</a> + */ + + var keys = {}; + + var format = function(message, args) { + var substitute = function() { + var format = arguments[1].split(','); + var substr = escape(args[format.shift()]); + if(format.length === 0) { + return substr; // simple substitution eg {0} + } + switch(format.shift()) { + case "number" : return (new Number(substr)).toLocaleString(); + case "date" : return (new Date(+substr)).toLocaleDateString(); // date and time require milliseconds since epoch + case "time" : return (new Date(+substr)).toLocaleTimeString(); // eg i18n.text("Key", +(new Date())); for current time + } + var styles = format.join("").split("|").map(function(style) { + return style.match(/(-?[\.\d]+)(#|<)([^{}]*)/); + }); + var match = styles[0][3]; + for(var i=0; i<styles.length; i++) { + if((styles[i][2] === "#" && (+styles[i][1]) === (+substr)) || + (styles[i][2] === "<" && ((+styles[i][1]) < (+substr)))) { + match = styles[i][3]; + } + } + return match; + }; + + return message && message.replace(/'(')|'([^']+)'|([^{']+)|([^']+)/g, function(x, sq, qs, ss, sub) { + do {} while(sub && (sub !== (sub = (sub.replace(/\{([^{}]+)\}/, substitute))))); + return sq || qs || ss || unescape(sub); + }); + }; + + this.i18n = { + + setKeys: function(strings) { + for(var key in strings) { + keys[key] = strings[key]; + } + }, + + text: function() { + var args = Array.prototype.slice.call(arguments), + key = keys[args.shift()]; + if(args.length === 0) { + return key; + } + return format(key, args); + }, + + complex: function() { + var args = Array.prototype.slice.call(arguments), + key = keys[args.shift()], + ret = [], + replacer = function(x, pt, sub) { ret.push(pt || args[+sub]); return ""; }; + do {} while(key && key !== (key = key.replace(/([^{]+)|\{(\d+)\}/, replacer ))); + return ret; + } + + }; + +})(); + +(function() { + var nav = window.navigator; + var userLang = ( nav.languages && nav.languages[0] ) || nav.language || nav.userLanguage; + var scripts = document.getElementsByTagName('script'); + var data = scripts[ scripts.length - 1].dataset; + if( ! data["langs"] ) { + return; + } + var langs = data["langs"].split(/\s*,\s*/); + var script0 = scripts[0]; + function install( lang ) { + var s = document.createElement("script"); + s.src = data["basedir"] + "/" + lang + '_strings.js'; + s.async = false; + script0.parentNode.appendChild(s); + script0 = s; + } + + install( langs.shift() ); // always install primary language + userLang && langs + .filter( function( lang ) { return userLang.indexOf( lang ) === 0; } ) + .forEach( install ); +}()); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/joey/joey.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/joey/joey.js new file mode 100644 index 000000000..2c9a0f54b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/joey/joey.js @@ -0,0 +1,57 @@ +(function() { + + var joey = this.joey = function joey(elementDef, parentNode) { + return createNode( elementDef, parentNode, parentNode ? parentNode.ownerDocument : this.document ); + }; + + var shortcuts = joey.shortcuts = { + "text" : "textContent", + "cls" : "className" + }; + + var plugins = joey.plugins = [ + function( obj, context ) { + if( typeof obj === 'string' ) { + return context.createTextNode( obj ); + } + }, + function( obj, context ) { + if( "tag" in obj ) { + var el = context.createElement( obj.tag ); + for( var attr in obj ) { + addAttr( el, attr, obj[ attr ], context ); + } + return el; + } + } + ]; + + function addAttr( el, attr, value, context ) { + attr = shortcuts[attr] || attr; + if( attr === 'children' ) { + for( var i = 0; i < value.length; i++) { + createNode( value[i], el, context ); + } + } else if( attr === 'style' || attr === 'dataset' ) { + for( var prop in value ) { + el[ attr ][ prop ] = value[ prop ]; + } + } else if( attr.indexOf("on") === 0 ) { + el.addEventListener( attr.substr(2), value, false ); + } else if( value !== undefined ) { + el[ attr ] = value; + } + } + + function createNode( obj, parent, context ) { + var el; + if( obj != null ) { + plugins.some( function( plug ) { + return ( el = plug( obj, context ) ); + }); + parent && parent.appendChild( el ); + return el; + } + } + +}()); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/jquery/jquery.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/jquery/jquery.js new file mode 100644 index 000000000..3450ce429 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/jquery/jquery.js @@ -0,0 +1,8936 @@ +/*! + * jQuery JavaScript Library v1.6.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu May 12 15:04:36 2011 -0400 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.6.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // 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 && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery._Deferred(); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return (new Function( "return " + data ))(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + + if ( indexOf ) { + return indexOf.call( array, elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can be optionally by executed if its a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery to the global object +return jQuery; + +})(); + + +var // Promise methods + promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), + // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + always: function() { + return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + pipe: function( fnDone, fnFail ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject ); + } else { + newDefer[ action ]( returned ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + }); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + +jQuery.support = (function() { + + var div = document.createElement( "div" ), + documentElement = document.documentElement, + all, + a, + select, + opt, + input, + marginDiv, + support, + fragment, + body, + bodyStyle, + tds, + events, + eventName, + i, + isSupported; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName( "tbody" ).length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName( "link" ).length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + div.detachEvent( "onclick", click ); + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains it's value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + div.innerHTML = ""; + + // Figure out if the W3C box model works as expected + div.style.width = div.style.paddingLeft = "1px"; + + // We use our own, invisible, body + body = document.createElement( "body" ); + bodyStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + // Set background to avoid IE crashes when removing (#9028) + background: "none" + }; + for ( i in bodyStyle ) { + body.style[ i ] = bodyStyle[ i ]; + } + body.appendChild( div ); + documentElement.insertBefore( body, documentElement.firstChild ); + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "<div style='width:4px;'></div>"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>"; + tds = div.getElementsByTagName( "td" ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Remove the body element we added + body.innerHTML = ""; + documentElement.removeChild( body ); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + } ) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + return support; +})(); + +// Keep track of boxModel +jQuery.boxModel = jQuery.support.boxModel; + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([a-z])([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ jQuery.camelCase( name ) ] : thisCache; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery.data( elem, deferDataKey, undefined, true ); + if ( defer && + ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && + ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery.data( elem, queueDataKey, undefined, true ) && + !jQuery.data( elem, markDataKey, undefined, true ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.resolve(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = (type || "fx") + "mark"; + jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); + if ( count ) { + jQuery.data( elem, key, count, true ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + if ( elem ) { + type = (type || "fx") + "queue"; + var q = jQuery.data( elem, type, undefined, true ); + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery.data( elem, type, jQuery.makeArray(data), true ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + defer; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { + count++; + tmp.done( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + rinvalidChar = /\:/, + formHook, boolHook; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class") || "") ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", + setClass = elem.className; + + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split( rspace ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + return (elem.value || "").replace(rreturn, ""); + } + + return undefined; + } + + var isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attrFix: { + // Always normalize to ensure hook usage + tabindex: "tabIndex" + }, + + attr: function( elem, name, value, pass ) { + var nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( !("getAttribute" in elem) ) { + return jQuery.prop( elem, name, value ); + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Normalize the name if needed + name = notxml && jQuery.attrFix[ name ] || name; + + hooks = jQuery.attrHooks[ name ]; + + if ( !hooks ) { + // Use boolHook for boolean attributes + if ( rboolean.test( name ) && + (typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) { + + hooks = boolHook; + + // Use formHook for forms and if the name contains certain characters + } else if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) { + hooks = formHook; + } + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return undefined; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml ) { + return hooks.get( elem, name ); + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, name ) { + var propName; + if ( elem.nodeType === 1 ) { + name = jQuery.attrFix[ name ] || name; + + if ( jQuery.support.getSetAttribute ) { + // Use removeAttribute in browsers that support it + elem.removeAttribute( name ); + } else { + jQuery.attr( elem, name, "" ); + elem.removeAttributeNode( elem.getAttributeNode( name ) ); + } + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { + elem[ propName ] = false; + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabIndex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return undefined; + } + + var ret, hooks, + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // Try to normalize/fix the name + name = notxml && jQuery.propFix[ name ] || name; + + hooks = jQuery.propHooks[ name ]; + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return (elem[ name ] = value); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: {} +}); + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + return elem[ jQuery.propFix[ name ] || name ] ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = value; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// Use the value property for back compat +// Use the formHook for button elements in IE6/7 (#1954) +jQuery.attrHooks.value = { + get: function( elem, name ) { + if ( formHook && jQuery.nodeName( elem, "button" ) ) { + return formHook.get( elem, name ); + } + return elem.value; + }, + set: function( elem, value, name ) { + if ( formHook && jQuery.nodeName( elem, "button" ) ) { + return formHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !jQuery.support.getSetAttribute ) { + + // propFix is more comprehensive and contains all fixes + jQuery.attrFix = jQuery.propFix; + + // Use this for any attribute on a form in IE6/7 + formHook = jQuery.attrHooks.name = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + // Return undefined if nodeValue is empty string + return ret && ret.nodeValue !== "" ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Check form objects in IE (multiple bugs related) + // Only use nodeValue if the attribute node exists on the form + var ret = elem.getAttributeNode( name ); + if ( ret ) { + ret.nodeValue = value; + return value; + } + } + }; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return (elem.style.cssText = "" + value); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }); +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); + } + } + }); +}); + + + + +var hasOwn = Object.prototype.hasOwnProperty, + rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspaces = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Event object or event type + var type = event.type || event, + namespaces = [], + exclusive; + + if ( type.indexOf("!") >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.exclusive = exclusive; + event.namespace = namespaces.join("."); + event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); + + // triggerHandler() and global events don't bubble or run the default action + if ( onlyHandlers || !elem ) { + event.preventDefault(); + event.stopPropagation(); + } + + // Handle a global trigger + if ( !elem ) { + // TODO: Stop taunting the data cache; remove global events and always attach to document + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + return; + } + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + event.target = elem; + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + var cur = elem, + // IE doesn't like method names with a colon (#3533, #8272) + ontype = type.indexOf(":") < 0 ? "on" + type : ""; + + // Fire event on the current element, then bubble up the DOM tree + do { + var handle = jQuery._data( cur, "handle" ); + + event.currentTarget = cur; + if ( handle ) { + handle.apply( cur, data ); + } + + // Trigger an inline bound script + if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { + event.result = false; + event.preventDefault(); + } + + // Bubble up to document, then to window + cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; + } while ( cur && !event.isPropagationStopped() ); + + // If nobody prevented the default action, do it now + if ( !event.isDefaultPrevented() ) { + var old, + special = jQuery.event.special[ type ] || {}; + + if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction)() check here because IE6/7 fails that test. + // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. + try { + if ( ontype && elem[ type ] ) { + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + jQuery.event.triggered = type; + elem[ type ](); + } + } catch ( ieError ) {} + + if ( old ) { + elem[ ontype ] = old; + } + + jQuery.event.triggered = undefined; + } + } + + return event.result; + }, + + handle: function( event ) { + event = jQuery.event.fix( event || window.event ); + // Snapshot the handlers list since a called handler may add/remove events. + var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), + run_all = !event.exclusive && !event.namespace, + args = Array.prototype.slice.call( arguments, 0 ); + + // Use the fix-ed Event rather than the (read-only) native event + args[0] = event; + event.currentTarget = this; + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Triggered event must 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event. + if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var eventDocument = event.target.ownerDocument || document, + doc = eventDocument.documentElement, + body = eventDocument.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // set the correct event type + event.type = event.data; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent && parent !== document && !parent.parentNode ) { + return; + } + + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( !jQuery.nodeName( this, "form" ) ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( jQuery.nodeName( elem, "select" ) ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; + + if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); + e.type = fix; + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + var handler; + + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( arguments.length === 2 || data === false ) { + fn = data; + data = undefined; + } + + if ( name === "one" ) { + handler = function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }; + handler.guid = fn.guid || jQuery.guid++; + } else { + handler = fn; + } + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( name === "die" && !types && + origSelector && origSelector.charAt(0) === "." ) { + + context.unbind( origSelector ); + + return this; + } + + if ( data === false || jQuery.isFunction( data ) ) { + fn = data || returnFalse; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( liveMap[ type ] ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + + // Make sure not to accidentally match a child element with the same selector + if ( related && jQuery.contains( elem, related ) ) { + related = elem; + } + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = "<a name='" + id + "'/>"; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = "<a href='#'></a>"; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "<p class='TEST'></p>"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "<div class='test e'></div><div class='test'></div>"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( typeof selector === "string" ? + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[ selector ] ) { + matches[ selector ] = POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[ selector ]; + + if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /<tbody/i, + rhtml = /<|&#?\w+;/, + rnocache = /<(?:script|object|embed|option|style)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/, + wrapMap = { + option: [ 1, "<select multiple='multiple'>", "</select>" ], + legend: [ 1, "<fieldset>", "</fieldset>" ], + thead: [ 1, "<table>", "</table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], + area: [ 1, "<map>", "</map>" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize <link> and <script> tags normally +if ( !jQuery.support.htmlSerialize ) { + wrapMap._default = [ 1, "div<div>", "</div>" ]; +} + +jQuery.fn.extend({ + text: function( text ) { + if ( jQuery.isFunction(text) ) { + return this.each(function(i) { + var self = jQuery( this ); + + self.text( text.call(this, i, self.text()) ); + }); + } + + if ( typeof text !== "object" && text !== undefined ) { + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + } + + return jQuery.text( this ); + }, + + wrapAll: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); + }); + } + + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); + + if ( this[0].parentNode ) { + wrap.insertBefore( this[0] ); + } + + wrap.map(function() { + var elem = this; + + while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { + elem = elem.firstChild; + } + + return elem; + }).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each(function(i) { + jQuery(this).wrapInner( html.call(this, i) ); + }); + } + + return this.each(function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + }); + }, + + wrap: function( html ) { + return this.each(function() { + jQuery( this ).wrapAll( html ); + }); + }, + + unwrap: function() { + return this.parent().each(function() { + if ( !jQuery.nodeName( this, "body" ) ) { + jQuery( this ).replaceWith( this.childNodes ); + } + }).end(); + }, + + append: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function( elem ) { + if ( this.nodeType === 1 ) { + this.insertBefore( elem, this.firstChild ); + } + }); + }, + + before: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this ); + }); + } else if ( arguments.length ) { + var set = jQuery(arguments[0]); + set.push.apply( set, this.toArray() ); + return this.pushStack( set, "before", arguments ); + } + }, + + after: function() { + if ( this[0] && this[0].parentNode ) { + return this.domManip(arguments, false, function( elem ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + } else if ( arguments.length ) { + var set = this.pushStack( this, "after", arguments ); + set.push.apply( set, jQuery(arguments[0]).toArray() ); + return set; + } + }, + + // keepData is for internal use only--do not document + remove: function( selector, keepData ) { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + jQuery.cleanData( [ elem ] ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } + } + } + + return this; + }, + + empty: function() { + for ( var i = 0, elem; (elem = this[i]) != null; i++ ) { + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( elem.getElementsByTagName("*") ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function () { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + if ( value === undefined ) { + return this[0] && this[0].nodeType === 1 ? + this[0].innerHTML.replace(rinlinejQuery, "") : + null; + + // See if we can take a shortcut and just use innerHTML + } else if ( typeof value === "string" && !rnocache.test( value ) && + (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) && + !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) { + + value = value.replace(rxhtmlTag, "<$1></$2>"); + + try { + for ( var i = 0, l = this.length; i < l; i++ ) { + // Remove element nodes and prevent memory leaks + if ( this[i].nodeType === 1 ) { + jQuery.cleanData( this[i].getElementsByTagName("*") ); + this[i].innerHTML = value; + } + } + + // If using innerHTML throws an exception, use the fallback method + } catch(e) { + this.empty().append( value ); + } + + } else if ( jQuery.isFunction( value ) ) { + this.each(function(i){ + var self = jQuery( this ); + + self.html( value.call(this, i, self.html()) ); + }); + + } else { + this.empty().append( value ); + } + + return this; + }, + + replaceWith: function( value ) { + if ( this[0] && this[0].parentNode ) { + // Make sure that the elements are removed from the DOM before they are inserted + // this can help fix replacing a parent with child elements + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this), old = self.html(); + self.replaceWith( value.call( this, i, old ) ); + }); + } + + if ( typeof value !== "string" ) { + value = jQuery( value ).detach(); + } + + return this.each(function() { + var next = this.nextSibling, + parent = this.parentNode; + + jQuery( this ).remove(); + + if ( next ) { + jQuery(next).before( value ); + } else { + jQuery(parent).append( value ); + } + }); + } else { + return this.length ? + this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : + this; + } + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, table, callback ) { + var results, first, fragment, parent, + value = args[0], + scripts = []; + + // We can't cloneNode fragments that contain checked, in WebKit + if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) { + return this.each(function() { + jQuery(this).domManip( args, table, callback, true ); + }); + } + + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call(this, i, table ? self.html() : undefined); + self.domManip( args, table, callback ); + }); + } + + if ( this[0] ) { + parent = value && value.parentNode; + + // If we're in a fragment, just use that instead of building a new one + if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) { + results = { fragment: parent }; + + } else { + results = jQuery.buildFragment( args, this, scripts ); + } + + fragment = results.fragment; + + if ( fragment.childNodes.length === 1 ) { + first = fragment = fragment.firstChild; + } else { + first = fragment.firstChild; + } + + if ( first ) { + table = table && jQuery.nodeName( first, "tr" ); + + for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) { + callback.call( + table ? + root(this[i], first) : + this[i], + // Make sure that we do not leak memory by inadvertently discarding + // the original fragment (which might have attached data) instead of + // using it; in addition, use the original fragment object for the last + // item instead of first because it can end up being emptied incorrectly + // in certain situations (Bug #8070). + // Fragments from the fragment cache must always be cloned and never used + // in place. + results.cacheable || (l > 1 && i < lastIndex) ? + jQuery.clone( fragment, true, true ) : + fragment + ); + } + } + + if ( scripts.length ) { + jQuery.each( scripts, evalScript ); + } + } + + return this; + } +}); + +function root( elem, cur ) { + return jQuery.nodeName(elem, "table") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; +} + +function cloneCopyEvent( src, dest ) { + + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var internalKey = jQuery.expando, + oldData = jQuery.data( src ), + curData = jQuery.data( dest, oldData ); + + // Switch to use the internal data object, if it exists, for the next + // stage of data copying + if ( (oldData = oldData[ internalKey ]) ) { + var events = oldData.events; + curData = curData[ internalKey ] = jQuery.extend({}, oldData); + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( var type in events ) { + for ( var i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data ); + } + } + } + } +} + +function cloneFixAttributes( src, dest ) { + var nodeName; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + // clearAttributes removes the attributes, which we don't want, + // but also removes the attachEvent events, which we *do* want + if ( dest.clearAttributes ) { + dest.clearAttributes(); + } + + // mergeAttributes, in contrast, only merges back on the + // original attributes, not the events + if ( dest.mergeAttributes ) { + dest.mergeAttributes( src ); + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 fail to clone children inside object elements that use + // the proprietary classid attribute value (rather than the type + // attribute) to identify the type of content to display + if ( nodeName === "object" ) { + dest.outerHTML = src.outerHTML; + + } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) { + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + if ( src.checked ) { + dest.defaultChecked = dest.checked = src.checked; + } + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } + + // Event data gets referenced instead of copied if the expando + // gets copied too + dest.removeAttribute( jQuery.expando ); +} + +jQuery.buildFragment = function( args, nodes, scripts ) { + var fragment, cacheable, cacheresults, + doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); + + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document + // Cloning options loses the selected state, so don't cache them + // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment + // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache + if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && + args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { + + cacheable = true; + + cacheresults = jQuery.fragments[ args[0] ]; + if ( cacheresults && cacheresults !== 1 ) { + fragment = cacheresults; + } + } + + if ( !fragment ) { + fragment = doc.createDocumentFragment(); + jQuery.clean( args, doc, fragment, scripts ); + } + + if ( cacheable ) { + jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1; + } + + return { fragment: fragment, cacheable: cacheable }; +}; + +jQuery.fragments = {}; + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var ret = [], + insert = jQuery( selector ), + parent = this.length === 1 && this[0].parentNode; + + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { + insert[ original ]( this[0] ); + return this; + + } else { + for ( var i = 0, l = insert.length; i < l; i++ ) { + var elems = (i > 0 ? this.clone(true) : this).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + + return this.pushStack( ret, name, insert.selector ); + } + }; +}); + +function getAll( elem ) { + if ( "getElementsByTagName" in elem ) { + return elem.getElementsByTagName( "*" ); + + } else if ( "querySelectorAll" in elem ) { + return elem.querySelectorAll( "*" ); + + } else { + return []; + } +} + +// Used in clean, fixes the defaultChecked property +function fixDefaultChecked( elem ) { + if ( elem.type === "checkbox" || elem.type === "radio" ) { + elem.defaultChecked = elem.checked; + } +} +// Finds all inputs and passes them to fixDefaultChecked +function findInputs( elem ) { + if ( jQuery.nodeName( elem, "input" ) ) { + fixDefaultChecked( elem ); + } else if ( elem.getElementsByTagName ) { + jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var clone = elem.cloneNode(true), + srcElements, + destElements, + i; + + if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && + (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // IE copies events bound via attachEvent when using cloneNode. + // Calling detachEvent on the clone will also remove the events + // from the original. In order to get around this, we use some + // proprietary methods to clear the events. Thanks to MooTools + // guys for this hotness. + + cloneFixAttributes( elem, clone ); + + // Using Sizzle here is crazy slow, so we use getElementsByTagName + // instead + srcElements = getAll( elem ); + destElements = getAll( clone ); + + // Weird iteration because IE will replace the length property + // with an element if you are cloning the body and one of the + // elements on the page has a name or id of "length" + for ( i = 0; srcElements[i]; ++i ) { + cloneFixAttributes( srcElements[i], destElements[i] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + cloneCopyEvent( elem, clone ); + + if ( deepDataAndEvents ) { + srcElements = getAll( elem ); + destElements = getAll( clone ); + + for ( i = 0; srcElements[i]; ++i ) { + cloneCopyEvent( srcElements[i], destElements[i] ); + } + } + } + + // Return the cloned set + return clone; + }, + + clean: function( elems, context, fragment, scripts ) { + var checkScriptType; + + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) { + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + } + + var ret = [], j; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( typeof elem === "number" ) { + elem += ""; + } + + if ( !elem ) { + continue; + } + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + if ( !rhtml.test( elem ) ) { + elem = context.createTextNode( elem ); + } else { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(rxhtmlTag, "<$1></$2>"); + + // Trim whitespace, otherwise indexOf won't work as expected + var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(), + wrap = wrapMap[ tag ] || wrapMap._default, + depth = wrap[0], + div = context.createElement("div"); + + // Go to html and back, then peel off extra wrappers + div.innerHTML = wrap[1] + elem + wrap[2]; + + // Move to the right depth + while ( depth-- ) { + div = div.lastChild; + } + + // Remove IE's autoinserted <tbody> from table fragments + if ( !jQuery.support.tbody ) { + + // String was a <table>, *may* have spurious <tbody> + var hasBody = rtbody.test(elem), + tbody = tag === "table" && !hasBody ? + div.firstChild && div.firstChild.childNodes : + + // String was a bare <thead> or <tfoot> + wrap[1] === "<table>" && !hasBody ? + div.childNodes : + []; + + for ( j = tbody.length - 1; j >= 0 ; --j ) { + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { + tbody[ j ].parentNode.removeChild( tbody[ j ] ); + } + } + } + + // IE completely kills leading whitespace when innerHTML is used + if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { + div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); + } + + elem = div.childNodes; + } + } + + // Resets defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + var len; + if ( !jQuery.support.appendChecked ) { + if ( elem[0] && typeof (len = elem.length) === "number" ) { + for ( j = 0; j < len; j++ ) { + findInputs( elem[j] ); + } + } else { + findInputs( elem ); + } + } + + if ( elem.nodeType ) { + ret.push( elem ); + } else { + ret = jQuery.merge( ret, elem ); + } + } + + if ( fragment ) { + checkScriptType = function( elem ) { + return !elem.type || rscriptType.test( elem.type ); + }; + for ( i = 0; ret[i]; i++ ) { + if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { + scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); + + } else { + if ( ret[i].nodeType === 1 ) { + var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType ); + + ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); + } + fragment.appendChild( ret[i] ); + } + } + } + + return ret; + }, + + cleanData: function( elems ) { + var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special, + deleteExpando = jQuery.support.deleteExpando; + + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { + continue; + } + + id = elem[ jQuery.expando ]; + + if ( id ) { + data = cache[ id ] && cache[ id ][ internalKey ]; + + if ( data && data.events ) { + for ( var type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + + // Null the DOM reference to avoid IE6/7/8 leak (#7054) + if ( data.handle ) { + data.handle.elem = null; + } + } + + if ( deleteExpando ) { + delete elem[ jQuery.expando ]; + + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } + + delete cache[ id ]; + } + } + } +}); + +function evalScript( i, elem ) { + if ( elem.src ) { + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + } else { + jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) ); + } + + if ( elem.parentNode ) { + elem.parentNode.removeChild( elem ); + } +} + + + + +var ralpha = /alpha\([^)]*\)/i, + ropacity = /opacity=([^)]*)/, + rdashAlpha = /-([a-z])/ig, + // fixed for IE9, see #8346 + rupper = /([A-Z]|^ms)/g, + rnumpx = /^-?\d+(?:px)?$/i, + rnum = /^-?\d/, + rrelNum = /^[+\-]=/, + rrelNumFilter = /[^+\-\.\de]+/g, + + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssWidth = [ "Left", "Right" ], + cssHeight = [ "Top", "Bottom" ], + curCSS, + + getComputedStyle, + currentStyle, + + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn.css = function( name, value ) { + // Setting 'undefined' is a no-op + if ( arguments.length === 2 && value === undefined ) { + return this; + } + + return jQuery.access( this, name, value, true, function( elem, name, value ) { + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }); +}; + +jQuery.extend({ + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity", "opacity" ); + return ret === "" ? "1" : ret; + + } else { + return elem.style.opacity; + } + } + } + }, + + // Exclude the following css properties to add px + cssNumber: { + "zIndex": true, + "fontWeight": true, + "opacity": true, + "zoom": true, + "lineHeight": true, + "widows": true, + "orphans": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + // normalize float css property + "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, origName = jQuery.camelCase( name ), + style = elem.style, hooks = jQuery.cssHooks[ origName ]; + + name = jQuery.cssProps[ origName ] || origName; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Make sure that NaN and null values aren't set. See: #7116 + if ( type === "number" && isNaN( value ) || value == null ) { + return; + } + + // convert relative number strings (+= or -=) to relative numbers. #7345 + if ( type === "string" && rrelNum.test( value ) ) { + value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) ); + } + + // If a number was passed in, add 'px' to the (except for certain CSS properties) + if ( type === "number" && !jQuery.cssNumber[ origName ] ) { + value += "px"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) { + // Wrapped to prevent IE from throwing errors when 'invalid' values are provided + // Fixes bug #5509 + try { + style[ name ] = value; + } catch(e) {} + } + + } else { + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra ) { + var ret, hooks; + + // Make sure that we're working with the right name + name = jQuery.camelCase( name ); + hooks = jQuery.cssHooks[ name ]; + name = jQuery.cssProps[ name ] || name; + + // cssFloat needs a special treatment + if ( name === "cssFloat" ) { + name = "float"; + } + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) { + return ret; + + // Otherwise, if a way to get the computed value exists, use that + } else if ( curCSS ) { + return curCSS( elem, name ); + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + }, + + camelCase: function( string ) { + return string.replace( rdashAlpha, fcamelCase ); + } +}); + +// DEPRECATED, Use jQuery.css() instead +jQuery.curCSS = jQuery.css; + +jQuery.each(["height", "width"], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + var val; + + if ( computed ) { + if ( elem.offsetWidth !== 0 ) { + val = getWH( elem, name, extra ); + + } else { + jQuery.swap( elem, cssShow, function() { + val = getWH( elem, name, extra ); + }); + } + + if ( val <= 0 ) { + val = curCSS( elem, name, name ); + + if ( val === "0px" && currentStyle ) { + val = currentStyle( elem, name, name ); + } + + if ( val != null ) { + // Should return "auto" instead of 0, use 0 for + // temporary backwards-compat + return val === "" || val === "auto" ? "0px" : val; + } + } + + if ( val < 0 || val == null ) { + val = elem.style[ name ]; + + // Should return "auto" instead of 0, use 0 for + // temporary backwards-compat + return val === "" || val === "auto" ? "0px" : val; + } + + return typeof val === "string" ? val : val + "px"; + } + }, + + set: function( elem, value ) { + if ( rnumpx.test( value ) ) { + // ignore negative width and height values #1599 + value = parseFloat(value); + + if ( value >= 0 ) { + return value + "px"; + } + + } else { + return value; + } + } + }; +}); + +if ( !jQuery.support.opacity ) { + jQuery.cssHooks.opacity = { + get: function( elem, computed ) { + // IE uses filters for opacity + return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? + ( parseFloat( RegExp.$1 ) / 100 ) + "" : + computed ? "1" : ""; + }, + + set: function( elem, value ) { + var style = elem.style, + currentStyle = elem.currentStyle; + + // IE has trouble with opacity if it does not have layout + // Force it by setting the zoom level + style.zoom = 1; + + // Set the alpha filter to set the opacity + var opacity = jQuery.isNaN( value ) ? + "" : + "alpha(opacity=" + value * 100 + ")", + filter = currentStyle && currentStyle.filter || style.filter || ""; + + style.filter = ralpha.test( filter ) ? + filter.replace( ralpha, opacity ) : + filter + " " + opacity; + } + }; +} + +jQuery(function() { + // This hook cannot be added until DOM ready because the support test + // for it is not run until after DOM ready + if ( !jQuery.support.reliableMarginRight ) { + jQuery.cssHooks.marginRight = { + get: function( elem, computed ) { + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + // Work around by temporarily setting element display to inline-block + var ret; + jQuery.swap( elem, { "display": "inline-block" }, function() { + if ( computed ) { + ret = curCSS( elem, "margin-right", "marginRight" ); + } else { + ret = elem.style.marginRight; + } + }); + return ret; + } + }; + } +}); + +if ( document.defaultView && document.defaultView.getComputedStyle ) { + getComputedStyle = function( elem, name ) { + var ret, defaultView, computedStyle; + + name = name.replace( rupper, "-$1" ).toLowerCase(); + + if ( !(defaultView = elem.ownerDocument.defaultView) ) { + return undefined; + } + + if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) { + ret = computedStyle.getPropertyValue( name ); + if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) { + ret = jQuery.style( elem, name ); + } + } + + return ret; + }; +} + +if ( document.documentElement.currentStyle ) { + currentStyle = function( elem, name ) { + var left, + ret = elem.currentStyle && elem.currentStyle[ name ], + rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ], + style = elem.style; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !rnumpx.test( ret ) && rnum.test( ret ) ) { + // Remember the original values + left = style.left; + + // Put in the new values to get a computed value out + if ( rsLeft ) { + elem.runtimeStyle.left = elem.currentStyle.left; + } + style.left = name === "fontSize" ? "1em" : (ret || 0); + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + if ( rsLeft ) { + elem.runtimeStyle.left = rsLeft; + } + } + + return ret === "" ? "auto" : ret; + }; +} + +curCSS = getComputedStyle || currentStyle; + +function getWH( elem, name, extra ) { + var which = name === "width" ? cssWidth : cssHeight, + val = name === "width" ? elem.offsetWidth : elem.offsetHeight; + + if ( extra === "border" ) { + return val; + } + + jQuery.each( which, function() { + if ( !extra ) { + val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0; + } + + if ( extra === "margin" ) { + val += parseFloat(jQuery.css( elem, "margin" + this )) || 0; + + } else { + val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0; + } + }); + + return val; +} + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.hidden = function( elem ) { + var width = elem.offsetWidth, + height = elem.offsetHeight; + + return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none"); + }; + + jQuery.expr.filters.visible = function( elem ) { + return !jQuery.expr.filters.hidden( elem ); + }; +} + + + + +var r20 = /%20/g, + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rhash = /#.*$/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL + rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + rquery = /\?/, + rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, + rselectTextarea = /^(?:select|textarea)/i, + rspacesAjax = /\s+/, + rts = /([?&])_=[^&]*/, + rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/, + + // Keep a copy of the old load method + _load = jQuery.fn.load, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Document location + ajaxLocation, + + // Document location segments + ajaxLocParts; + +// #8138, IE may throw an exception when accessing +// a field from window.location if document.domain has been set +try { + ajaxLocation = location.href; +} catch( e ) { + // Use the href attribute of an A element + // since IE will modify it given document.location + ajaxLocation = document.createElement( "a" ); + ajaxLocation.href = ""; + ajaxLocation = ajaxLocation.href; +} + +// Segment location into parts +ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + if ( jQuery.isFunction( func ) ) { + var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ), + i = 0, + length = dataTypes.length, + dataType, + list, + placeBefore; + + // For each dataType in the dataTypeExpression + for(; i < length; i++ ) { + dataType = dataTypes[ i ]; + // We control if we're asked to add before + // any existing element + placeBefore = /^\+/.test( dataType ); + if ( placeBefore ) { + dataType = dataType.substr( 1 ) || "*"; + } + list = structure[ dataType ] = structure[ dataType ] || []; + // then we add to the structure accordingly + list[ placeBefore ? "unshift" : "push" ]( func ); + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, + dataType /* internal */, inspected /* internal */ ) { + + dataType = dataType || options.dataTypes[ 0 ]; + inspected = inspected || {}; + + inspected[ dataType ] = true; + + var list = structure[ dataType ], + i = 0, + length = list ? list.length : 0, + executeOnly = ( structure === prefilters ), + selection; + + for(; i < length && ( executeOnly || !selection ); i++ ) { + selection = list[ i ]( options, originalOptions, jqXHR ); + // If we got redirected to another dataType + // we try there if executing only and not done already + if ( typeof selection === "string" ) { + if ( !executeOnly || inspected[ selection ] ) { + selection = undefined; + } else { + options.dataTypes.unshift( selection ); + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, selection, inspected ); + } + } + } + // If we're only executing or nothing was selected + // we try the catchall dataType if not done already + if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { + selection = inspectPrefiltersOrTransports( + structure, options, originalOptions, jqXHR, "*", inspected ); + } + // unnecessary when only executing (prefilters) + // but it'll be ignored by the caller in that case + return selection; +} + +jQuery.fn.extend({ + load: function( url, params, callback ) { + if ( typeof url !== "string" && _load ) { + return _load.apply( this, arguments ); + + // Don't do a request if no elements are being requested + } else if ( !this.length ) { + return this; + } + + var off = url.indexOf( " " ); + if ( off >= 0 ) { + var selector = url.slice( off, url.length ); + url = url.slice( 0, off ); + } + + // Default to a GET request + var type = "GET"; + + // If the second parameter was provided + if ( params ) { + // If it's a function + if ( jQuery.isFunction( params ) ) { + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( typeof params === "object" ) { + params = jQuery.param( params, jQuery.ajaxSettings.traditional ); + type = "POST"; + } + } + + var self = this; + + // Request the remote document + jQuery.ajax({ + url: url, + type: type, + dataType: "html", + data: params, + // Complete callback (responseText is used internally) + complete: function( jqXHR, status, responseText ) { + // Store the response as specified by the jqXHR object + responseText = jqXHR.responseText; + // If successful, inject the HTML into all the matched elements + if ( jqXHR.isResolved() ) { + // #4825: Get the actual response in case + // a dataFilter is present in ajaxSettings + jqXHR.done(function( r ) { + responseText = r; + }); + // See if a selector was specified + self.html( selector ? + // Create a dummy div to hold the results + jQuery("<div>") + // inject the contents of the document in, removing the scripts + // to avoid any 'Permission Denied' errors in IE + .append(responseText.replace(rscript, "")) + + // Locate the specified elements + .find(selector) : + + // If not, just inject the full result + responseText ); + } + + if ( callback ) { + self.each( callback, [ responseText, status, jqXHR ] ); + } + } + }); + + return this; + }, + + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + + serializeArray: function() { + return this.map(function(){ + return this.elements ? jQuery.makeArray( this.elements ) : this; + }) + .filter(function(){ + return this.name && !this.disabled && + ( this.checked || rselectTextarea.test( this.nodeName ) || + rinput.test( this.type ) ); + }) + .map(function( i, elem ){ + var val = jQuery( this ).val(); + + return val == null ? + null : + jQuery.isArray( val ) ? + jQuery.map( val, function( val, i ){ + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }) : + { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + }).get(); + } +}); + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ + jQuery.fn[ o ] = function( f ){ + return this.bind( o, f ); + }; +}); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + // shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + return jQuery.ajax({ + type: method, + url: url, + data: data, + success: callback, + dataType: type + }); + }; +}); + +jQuery.extend({ + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function ( target, settings ) { + if ( !settings ) { + // Only one parameter, we extend ajaxSettings + settings = target; + target = jQuery.extend( true, jQuery.ajaxSettings, settings ); + } else { + // target was provided, we extend into it + jQuery.extend( true, target, jQuery.ajaxSettings, settings ); + } + // Flatten fields we don't want deep extended + for( var field in { context: 1, url: 1 } ) { + if ( field in settings ) { + target[ field ] = settings[ field ]; + } else if( field in jQuery.ajaxSettings ) { + target[ field ] = jQuery.ajaxSettings[ field ]; + } + } + return target; + }, + + ajaxSettings: { + url: ajaxLocation, + isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), + global: true, + type: "GET", + contentType: "application/x-www-form-urlencoded", + processData: true, + async: true, + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + traditional: false, + headers: {}, + */ + + accepts: { + xml: "application/xml, text/xml", + html: "text/html", + text: "text/plain", + json: "application/json, text/javascript", + "*": "*/*" + }, + + contents: { + xml: /xml/, + html: /html/, + json: /json/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText" + }, + + // List of data converters + // 1) key format is "source_type destination_type" (a single space in-between) + // 2) the catchall symbol "*" can be used for source_type + converters: { + + // Convert anything to text + "* text": window.String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": jQuery.parseJSON, + + // Parse text as xml + "text xml": jQuery.parseXML + } + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + // Callbacks context + callbackContext = s.context || s, + // Context for global events + // It's the callbackContext if one was provided in the options + // and if it's a DOM node or a jQuery collection + globalEventContext = callbackContext !== s && + ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? + jQuery( callbackContext ) : jQuery.event, + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery._Deferred(), + // Status-dependent callbacks + statusCode = s.statusCode || {}, + // ifModified key + ifModifiedKey, + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + // Response headers + responseHeadersString, + responseHeaders, + // transport + transport, + // timeout handle + timeoutTimer, + // Cross-domain detection vars + parts, + // The jqXHR state + state = 0, + // To know if global events are to be dispatched + fireGlobals, + // Loop variable + i, + // Fake xhr + jqXHR = { + + readyState: 0, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( !state ) { + var lname = name.toLowerCase(); + name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Raw string + getAllResponseHeaders: function() { + return state === 2 ? responseHeadersString : null; + }, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( state === 2 ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match === undefined ? null : match; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( !state ) { + s.mimeType = type; + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + statusText = statusText || "abort"; + if ( transport ) { + transport.abort( statusText ); + } + done( 0, statusText ); + return this; + } + }; + + // Callback for when everything is done + // It is defined here because jslint complains if it is declared + // at the end of the function (which would be more logical and readable) + function done( status, statusText, responses, headers ) { + + // Called once + if ( state === 2 ) { + return; + } + + // State is "done" now + state = 2; + + // Clear timeout if it exists + if ( timeoutTimer ) { + clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status ? 4 : 0; + + var isSuccess, + success, + error, + response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined, + lastModified, + etag; + + // If successful, handle type chaining + if ( status >= 200 && status < 300 || status === 304 ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + + if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) { + jQuery.lastModified[ ifModifiedKey ] = lastModified; + } + if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) { + jQuery.etag[ ifModifiedKey ] = etag; + } + } + + // If not modified + if ( status === 304 ) { + + statusText = "notmodified"; + isSuccess = true; + + // If we have data + } else { + + try { + success = ajaxConvert( s, response ); + statusText = "success"; + isSuccess = true; + } catch(e) { + // We have a parsererror + statusText = "parsererror"; + error = e; + } + } + } else { + // We extract error from statusText + // then normalize statusText and status for non-aborts + error = statusText; + if( !statusText || status ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = statusText; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] ); + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + // Attach deferreds + deferred.promise( jqXHR ); + jqXHR.success = jqXHR.done; + jqXHR.error = jqXHR.fail; + jqXHR.complete = completeDeferred.done; + + // Status-dependent callbacks + jqXHR.statusCode = function( map ) { + if ( map ) { + var tmp; + if ( state < 2 ) { + for( tmp in map ) { + statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; + } + } else { + tmp = map[ jqXHR.status ]; + jqXHR.then( tmp, tmp ); + } + } + return this; + }; + + // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) + // We also use the url parameter if available + s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); + + // Extract dataTypes list + s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); + + // Determine if a cross-domain request is in order + if ( s.crossDomain == null ) { + parts = rurl.exec( s.url.toLowerCase() ); + s.crossDomain = !!( parts && + ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) + ); + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefiler, stop there + if ( state === 2 ) { + return false; + } + + // We can fire global events as of now if asked to + fireGlobals = s.global; + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // If data is available, append data to url + if ( s.data ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; + } + + // Get ifModifiedKey before adding the anti-cache parameter + ifModifiedKey = s.url; + + // Add anti-cache in url if needed + if ( s.cache === false ) { + + var ts = jQuery.now(), + // try replacing _= if it is there + ret = s.url.replace( rts, "$1_=" + ts ); + + // if nothing was replaced, add timestamp to the end + s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + ifModifiedKey = ifModifiedKey || s.url; + if ( jQuery.lastModified[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); + } + if ( jQuery.etag[ ifModifiedKey ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); + } + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? + s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { + // Abort if not done already + jqXHR.abort(); + return false; + + } + + // Install callbacks on deferreds + for ( i in { success: 1, error: 1, complete: 1 } ) { + jqXHR[ i ]( s[ i ] ); + } + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = setTimeout( function(){ + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + state = 1; + transport.send( requestHeaders, done ); + } catch (e) { + // Propagate exception as error if not done + if ( status < 2 ) { + done( -1, e ); + // Simply rethrow otherwise + } else { + jQuery.error( e ); + } + } + } + + return jqXHR; + }, + + // Serialize an array of form elements or a set of + // key/values into a query string + param: function( a, traditional ) { + var s = [], + add = function( key, value ) { + // If value is a function, invoke it and return its value + value = jQuery.isFunction( value ) ? value() : value; + s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); + }; + + // Set traditional to true for jQuery <= 1.3.2 behavior. + if ( traditional === undefined ) { + traditional = jQuery.ajaxSettings.traditional; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + }); + + } else { + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( var prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ).replace( r20, "+" ); + } +}); + +function buildParams( prefix, obj, traditional, add ) { + if ( jQuery.isArray( obj ) ) { + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + // If array item is non-scalar (array or object), encode its + // numeric index to resolve deserialization ambiguity issues. + // Note that rack (as of 1.0.0) can't currently deserialize + // nested arrays properly, and attempting to do so may cause + // a server error. Possible fixes are to modify rack's + // deserialization algorithm or to provide an option or flag + // to force array serialization to be shallow. + buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); + } + }); + + } else if ( !traditional && obj != null && typeof obj === "object" ) { + // Serialize object item. + for ( var name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + // Serialize scalar item. + add( prefix, obj ); + } +} + +// This is still on the jQuery object... for now +// Want to move this to jQuery.ajax some day +jQuery.extend({ + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {} + +}); + +/* Handles responses to an ajax request: + * - sets all responseXXX fields accordingly + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var contents = s.contents, + dataTypes = s.dataTypes, + responseFields = s.responseFields, + ct, + type, + finalDataType, + firstDataType; + + // Fill responseXXX fields + for( type in responseFields ) { + if ( type in responses ) { + jqXHR[ responseFields[type] ] = responses[ type ]; + } + } + + // Remove auto dataType and get content-type in the process + while( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +// Chain conversions given the request and the original response +function ajaxConvert( s, response ) { + + // Apply the dataFilter if provided + if ( s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + var dataTypes = s.dataTypes, + converters = {}, + i, + key, + length = dataTypes.length, + tmp, + // Current and previous dataTypes + current = dataTypes[ 0 ], + prev, + // Conversion expression + conversion, + // Conversion function + conv, + // Conversion functions (transitive conversion) + conv1, + conv2; + + // For each dataType in the chain + for( i = 1; i < length; i++ ) { + + // Create converters map + // with lowercased keys + if ( i === 1 ) { + for( key in s.converters ) { + if( typeof key === "string" ) { + converters[ key.toLowerCase() ] = s.converters[ key ]; + } + } + } + + // Get the dataTypes + prev = current; + current = dataTypes[ i ]; + + // If current is auto dataType, update it to prev + if( current === "*" ) { + current = prev; + // If no auto and dataTypes are actually different + } else if ( prev !== "*" && prev !== current ) { + + // Get the converter + conversion = prev + " " + current; + conv = converters[ conversion ] || converters[ "* " + current ]; + + // If there is no direct converter, search transitively + if ( !conv ) { + conv2 = undefined; + for( conv1 in converters ) { + tmp = conv1.split( " " ); + if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) { + conv2 = converters[ tmp[1] + " " + current ]; + if ( conv2 ) { + conv1 = converters[ conv1 ]; + if ( conv1 === true ) { + conv = conv2; + } else if ( conv2 === true ) { + conv = conv1; + } + break; + } + } + } + } + // If we found no converter, dispatch an error + if ( !( conv || conv2 ) ) { + jQuery.error( "No conversion from " + conversion.replace(" "," to ") ); + } + // If found converter is not an equivalence + if ( conv !== true ) { + // Convert with 1 or 2 converters accordingly + response = conv ? conv( response ) : conv2( conv1(response) ); + } + } + } + return response; +} + + + + +var jsc = jQuery.now(), + jsre = /(\=)\?(&|$)|\?\?/i; + +// Default jsonp settings +jQuery.ajaxSetup({ + jsonp: "callback", + jsonpCallback: function() { + return jQuery.expando + "_" + ( jsc++ ); + } +}); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var inspectData = s.contentType === "application/x-www-form-urlencoded" && + ( typeof s.data === "string" ); + + if ( s.dataTypes[ 0 ] === "jsonp" || + s.jsonp !== false && ( jsre.test( s.url ) || + inspectData && jsre.test( s.data ) ) ) { + + var responseContainer, + jsonpCallback = s.jsonpCallback = + jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback, + previous = window[ jsonpCallback ], + url = s.url, + data = s.data, + replace = "$1" + jsonpCallback + "$2"; + + if ( s.jsonp !== false ) { + url = url.replace( jsre, replace ); + if ( s.url === url ) { + if ( inspectData ) { + data = data.replace( jsre, replace ); + } + if ( s.data === data ) { + // Add callback manually + url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback; + } + } + } + + s.url = url; + s.data = data; + + // Install callback + window[ jsonpCallback ] = function( response ) { + responseContainer = [ response ]; + }; + + // Clean-up function + jqXHR.always(function() { + // Set callback back to previous value + window[ jsonpCallback ] = previous; + // Call if it was a function and we have a response + if ( responseContainer && jQuery.isFunction( previous ) ) { + window[ jsonpCallback ]( responseContainer[ 0 ] ); + } + }); + + // Use data converter to retrieve json after script execution + s.converters["script json"] = function() { + if ( !responseContainer ) { + jQuery.error( jsonpCallback + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // force json dataType + s.dataTypes[ 0 ] = "json"; + + // Delegate to script + return "script"; + } +}); + + + + +// Install script dataType +jQuery.ajaxSetup({ + accepts: { + script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /javascript|ecmascript/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +}); + +// Handle cache's special case and global +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + s.global = false; + } +}); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function(s) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + + var script, + head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; + + return { + + send: function( _, callback ) { + + script = document.createElement( "script" ); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function( _, isAbort ) { + + if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + // Dereference the script + script = undefined; + + // Callback if not abort + if ( !isAbort ) { + callback( 200, "success" ); + } + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function() { + if ( script ) { + script.onload( 0, 1 ); + } + } + }; + } +}); + + + + +var // #5280: Internet Explorer will keep connections alive if we don't abort on unload + xhrOnUnloadAbort = window.ActiveXObject ? function() { + // Abort all pending requests + for ( var key in xhrCallbacks ) { + xhrCallbacks[ key ]( 0, 1 ); + } + } : false, + xhrId = 0, + xhrCallbacks; + +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject( "Microsoft.XMLHTTP" ); + } catch( e ) {} +} + +// Create the request object +// (This is still attached to ajaxSettings for backward compatibility) +jQuery.ajaxSettings.xhr = window.ActiveXObject ? + /* Microsoft failed to properly + * implement the XMLHttpRequest in IE7 (can't request local files), + * so we use the ActiveXObject when it is available + * Additionally XMLHttpRequest can be disabled in IE7/IE8 so + * we need a fallback. + */ + function() { + return !this.isLocal && createStandardXHR() || createActiveXHR(); + } : + // For all other browsers, use the standard XMLHttpRequest object + createStandardXHR; + +// Determine support properties +(function( xhr ) { + jQuery.extend( jQuery.support, { + ajax: !!xhr, + cors: !!xhr && ( "withCredentials" in xhr ) + }); +})( jQuery.ajaxSettings.xhr() ); + +// Create transport if the browser can provide an xhr +if ( jQuery.support.ajax ) { + + jQuery.ajaxTransport(function( s ) { + // Cross domain only allowed if supported through XMLHttpRequest + if ( !s.crossDomain || jQuery.support.cors ) { + + var callback; + + return { + send: function( headers, complete ) { + + // Get a new xhr + var xhr = s.xhr(), + handle, + i; + + // Open the socket + // Passing null username, generates a login popup on Opera (#2865) + if ( s.username ) { + xhr.open( s.type, s.url, s.async, s.username, s.password ); + } else { + xhr.open( s.type, s.url, s.async ); + } + + // Apply custom fields if provided + if ( s.xhrFields ) { + for ( i in s.xhrFields ) { + xhr[ i ] = s.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( s.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( s.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !s.crossDomain && !headers["X-Requested-With"] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Need an extra try/catch for cross domain requests in Firefox 3 + try { + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + } catch( _ ) {} + + // Do send the request + // This may raise an exception which is actually + // handled in jQuery.ajax (so no try/catch here) + xhr.send( ( s.hasContent && s.data ) || null ); + + // Listener + callback = function( _, isAbort ) { + + var status, + statusText, + responseHeaders, + responses, + xml; + + // Firefox throws exceptions when accessing properties + // of an xhr when a network error occured + // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) + try { + + // Was never called and is aborted or complete + if ( callback && ( isAbort || xhr.readyState === 4 ) ) { + + // Only called once + callback = undefined; + + // Do not keep as active anymore + if ( handle ) { + xhr.onreadystatechange = jQuery.noop; + if ( xhrOnUnloadAbort ) { + delete xhrCallbacks[ handle ]; + } + } + + // If it's an abort + if ( isAbort ) { + // Abort it manually if needed + if ( xhr.readyState !== 4 ) { + xhr.abort(); + } + } else { + status = xhr.status; + responseHeaders = xhr.getAllResponseHeaders(); + responses = {}; + xml = xhr.responseXML; + + // Construct response list + if ( xml && xml.documentElement /* #4958 */ ) { + responses.xml = xml; + } + responses.text = xhr.responseText; + + // Firefox throws an exception when accessing + // statusText for faulty cross-domain requests + try { + statusText = xhr.statusText; + } catch( e ) { + // We normalize with Webkit giving an empty statusText + statusText = ""; + } + + // Filter status for non standard behaviors + + // If the request is local and we have data: assume a success + // (success with no data won't get notified, that's the best we + // can do given current implementations) + if ( !status && s.isLocal && !s.crossDomain ) { + status = responses.text ? 200 : 404; + // IE - #1450: sometimes returns 1223 when it should be 204 + } else if ( status === 1223 ) { + status = 204; + } + } + } + } catch( firefoxAccessException ) { + if ( !isAbort ) { + complete( -1, firefoxAccessException ); + } + } + + // Call complete if needed + if ( responses ) { + complete( status, statusText, responses, responseHeaders ); + } + }; + + // if we're in sync mode or it's in cache + // and has been retrieved directly (IE6 & IE7) + // we need to manually fire the callback + if ( !s.async || xhr.readyState === 4 ) { + callback(); + } else { + handle = ++xhrId; + if ( xhrOnUnloadAbort ) { + // Create the active xhrs callbacks list if needed + // and attach the unload handler + if ( !xhrCallbacks ) { + xhrCallbacks = {}; + jQuery( window ).unload( xhrOnUnloadAbort ); + } + // Add to list of active xhrs callbacks + xhrCallbacks[ handle ] = callback; + } + xhr.onreadystatechange = callback; + } + }, + + abort: function() { + if ( callback ) { + callback(0,1); + } + } + }; + } + }); +} + + + + +var elemdisplay = {}, + iframe, iframeDoc, + rfxtypes = /^(?:toggle|show|hide)$/, + rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i, + timerId, + fxAttrs = [ + // height animations + [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], + // width animations + [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], + // opacity animations + [ "opacity" ] + ], + fxNow, + requestAnimationFrame = window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame; + +jQuery.fn.extend({ + show: function( speed, easing, callback ) { + var elem, display; + + if ( speed || speed === 0 ) { + return this.animate( genFx("show", 3), speed, easing, callback); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + elem = this[i]; + + if ( elem.style ) { + display = elem.style.display; + + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !jQuery._data(elem, "olddisplay") && display === "none" ) { + display = elem.style.display = ""; + } + + // Set elements which have been overridden with display: none + // in a stylesheet to whatever the default browser style is + // for such an element + if ( display === "" && jQuery.css( elem, "display" ) === "none" ) { + jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); + } + } + } + + // Set the display of most of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + elem = this[i]; + + if ( elem.style ) { + display = elem.style.display; + + if ( display === "" || display === "none" ) { + elem.style.display = jQuery._data(elem, "olddisplay") || ""; + } + } + } + + return this; + } + }, + + hide: function( speed, easing, callback ) { + if ( speed || speed === 0 ) { + return this.animate( genFx("hide", 3), speed, easing, callback); + + } else { + for ( var i = 0, j = this.length; i < j; i++ ) { + if ( this[i].style ) { + var display = jQuery.css( this[i], "display" ); + + if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) { + jQuery._data( this[i], "olddisplay", display ); + } + } + } + + // Set the display of the elements in a second loop + // to avoid the constant reflow + for ( i = 0; i < j; i++ ) { + if ( this[i].style ) { + this[i].style.display = "none"; + } + } + + return this; + } + }, + + // Save the old toggle function + _toggle: jQuery.fn.toggle, + + toggle: function( fn, fn2, callback ) { + var bool = typeof fn === "boolean"; + + if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) { + this._toggle.apply( this, arguments ); + + } else if ( fn == null || bool ) { + this.each(function() { + var state = bool ? fn : jQuery(this).is(":hidden"); + jQuery(this)[ state ? "show" : "hide" ](); + }); + + } else { + this.animate(genFx("toggle", 3), fn, fn2, callback); + } + + return this; + }, + + fadeTo: function( speed, to, easing, callback ) { + return this.filter(":hidden").css("opacity", 0).show().end() + .animate({opacity: to}, speed, easing, callback); + }, + + animate: function( prop, speed, easing, callback ) { + var optall = jQuery.speed(speed, easing, callback); + + if ( jQuery.isEmptyObject( prop ) ) { + return this.each( optall.complete, [ false ] ); + } + + // Do not change referenced properties as per-property easing will be lost + prop = jQuery.extend( {}, prop ); + + return this[ optall.queue === false ? "each" : "queue" ](function() { + // XXX 'this' does not always have a nodeName when running the + // test suite + + if ( optall.queue === false ) { + jQuery._mark( this ); + } + + var opt = jQuery.extend( {}, optall ), + isElement = this.nodeType === 1, + hidden = isElement && jQuery(this).is(":hidden"), + name, val, p, + display, e, + parts, start, end, unit; + + // will store per property easing and be used to determine when an animation is complete + opt.animatedProperties = {}; + + for ( p in prop ) { + + // property name normalization + name = jQuery.camelCase( p ); + if ( p !== name ) { + prop[ name ] = prop[ p ]; + delete prop[ p ]; + } + + val = prop[ name ]; + + // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default) + if ( jQuery.isArray( val ) ) { + opt.animatedProperties[ name ] = val[ 1 ]; + val = prop[ name ] = val[ 0 ]; + } else { + opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing'; + } + + if ( val === "hide" && hidden || val === "show" && !hidden ) { + return opt.complete.call( this ); + } + + if ( isElement && ( name === "height" || name === "width" ) ) { + // Make sure that nothing sneaks out + // Record all 3 overflow attributes because IE does not + // change the overflow attribute when overflowX and + // overflowY are set to the same value + opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ]; + + // Set display property to inline-block for height/width + // animations on inline elements that are having width/height + // animated + if ( jQuery.css( this, "display" ) === "inline" && + jQuery.css( this, "float" ) === "none" ) { + if ( !jQuery.support.inlineBlockNeedsLayout ) { + this.style.display = "inline-block"; + + } else { + display = defaultDisplay( this.nodeName ); + + // inline-level elements accept inline-block; + // block-level elements need to be inline with layout + if ( display === "inline" ) { + this.style.display = "inline-block"; + + } else { + this.style.display = "inline"; + this.style.zoom = 1; + } + } + } + } + } + + if ( opt.overflow != null ) { + this.style.overflow = "hidden"; + } + + for ( p in prop ) { + e = new jQuery.fx( this, opt, p ); + val = prop[ p ]; + + if ( rfxtypes.test(val) ) { + e[ val === "toggle" ? hidden ? "show" : "hide" : val ](); + + } else { + parts = rfxnum.exec( val ); + start = e.cur(); + + if ( parts ) { + end = parseFloat( parts[2] ); + unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" ); + + // We need to compute starting value + if ( unit !== "px" ) { + jQuery.style( this, p, (end || 1) + unit); + start = ((end || 1) / e.cur()) * start; + jQuery.style( this, p, start + unit); + } + + // If a +=/-= token was provided, we're doing a relative animation + if ( parts[1] ) { + end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start; + } + + e.custom( start, end, unit ); + + } else { + e.custom( start, val, "" ); + } + } + } + + // For JS strict compliance + return true; + }); + }, + + stop: function( clearQueue, gotoEnd ) { + if ( clearQueue ) { + this.queue([]); + } + + this.each(function() { + var timers = jQuery.timers, + i = timers.length; + // clear marker counters if we know they won't be + if ( !gotoEnd ) { + jQuery._unmark( true, this ); + } + while ( i-- ) { + if ( timers[i].elem === this ) { + if (gotoEnd) { + // force the next step to be the last + timers[i](true); + } + + timers.splice(i, 1); + } + } + }); + + // start the next in the queue if the last step wasn't forced + if ( !gotoEnd ) { + this.dequeue(); + } + + return this; + } + +}); + +// Animations created synchronously will run synchronously +function createFxNow() { + setTimeout( clearFxNow, 0 ); + return ( fxNow = jQuery.now() ); +} + +function clearFxNow() { + fxNow = undefined; +} + +// Generate parameters to create a standard animation +function genFx( type, num ) { + var obj = {}; + + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() { + obj[ this ] = type; + }); + + return obj; +} + +// Generate shortcuts for custom animations +jQuery.each({ + slideDown: genFx("show", 1), + slideUp: genFx("hide", 1), + slideToggle: genFx("toggle", 1), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +}); + +jQuery.extend({ + speed: function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction(easing) && easing + }; + + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : + opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default; + + // Queueing + opt.old = opt.complete; + opt.complete = function( noUnmark ) { + if ( opt.queue !== false ) { + jQuery.dequeue( this ); + } else if ( noUnmark !== false ) { + jQuery._unmark( this ); + } + + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + }; + + return opt; + }, + + easing: { + linear: function( p, n, firstNum, diff ) { + return firstNum + diff * p; + }, + swing: function( p, n, firstNum, diff ) { + return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; + } + }, + + timers: [], + + fx: function( elem, options, prop ) { + this.options = options; + this.elem = elem; + this.prop = prop; + + options.orig = options.orig || {}; + } + +}); + +jQuery.fx.prototype = { + // Simple function for setting a style value + update: function() { + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); + }, + + // Get the current size + cur: function() { + if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) { + return this.elem[ this.prop ]; + } + + var parsed, + r = jQuery.css( this.elem, this.prop ); + // Empty strings, null, undefined and "auto" are converted to 0, + // complex values such as "rotate(1rad)" are returned as is, + // simple values such as "10px" are parsed to Float. + return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed; + }, + + // Start an animation from one number to another + custom: function( from, to, unit ) { + var self = this, + fx = jQuery.fx, + raf; + + this.startTime = fxNow || createFxNow(); + this.start = from; + this.end = to; + this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" ); + this.now = this.start; + this.pos = this.state = 0; + + function t( gotoEnd ) { + return self.step(gotoEnd); + } + + t.elem = this.elem; + + if ( t() && jQuery.timers.push(t) && !timerId ) { + // Use requestAnimationFrame instead of setInterval if available + if ( requestAnimationFrame ) { + timerId = 1; + raf = function() { + // When timerId gets set to null at any point, this stops + if ( timerId ) { + requestAnimationFrame( raf ); + fx.tick(); + } + }; + requestAnimationFrame( raf ); + } else { + timerId = setInterval( fx.tick, fx.interval ); + } + } + }, + + // Simple 'show' function + show: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.show = true; + + // Begin the animation + // Make sure that we start at a small width/height to avoid any + // flash of content + this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur()); + + // Start by showing the element + jQuery( this.elem ).show(); + }, + + // Simple 'hide' function + hide: function() { + // Remember where we started, so that we can go back to it later + this.options.orig[this.prop] = jQuery.style( this.elem, this.prop ); + this.options.hide = true; + + // Begin the animation + this.custom(this.cur(), 0); + }, + + // Each step of an animation + step: function( gotoEnd ) { + var t = fxNow || createFxNow(), + done = true, + elem = this.elem, + options = this.options, + i, n; + + if ( gotoEnd || t >= options.duration + this.startTime ) { + this.now = this.end; + this.pos = this.state = 1; + this.update(); + + options.animatedProperties[ this.prop ] = true; + + for ( i in options.animatedProperties ) { + if ( options.animatedProperties[i] !== true ) { + done = false; + } + } + + if ( done ) { + // Reset the overflow + if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) { + + jQuery.each( [ "", "X", "Y" ], function (index, value) { + elem.style[ "overflow" + value ] = options.overflow[index]; + }); + } + + // Hide the element if the "hide" operation was done + if ( options.hide ) { + jQuery(elem).hide(); + } + + // Reset the properties, if the item has been hidden or shown + if ( options.hide || options.show ) { + for ( var p in options.animatedProperties ) { + jQuery.style( elem, p, options.orig[p] ); + } + } + + // Execute the complete function + options.complete.call( elem ); + } + + return false; + + } else { + // classical easing cannot be used with an Infinity duration + if ( options.duration == Infinity ) { + this.now = t; + } else { + n = t - this.startTime; + this.state = n / options.duration; + + // Perform the easing function, defaults to swing + this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration ); + this.now = this.start + ((this.end - this.start) * this.pos); + } + // Perform the next step of the animation + this.update(); + } + + return true; + } +}; + +jQuery.extend( jQuery.fx, { + tick: function() { + for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) { + if ( !timers[i]() ) { + timers.splice(i--, 1); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + }, + + interval: 13, + + stop: function() { + clearInterval( timerId ); + timerId = null; + }, + + speeds: { + slow: 600, + fast: 200, + // Default speed + _default: 400 + }, + + step: { + opacity: function( fx ) { + jQuery.style( fx.elem, "opacity", fx.now ); + }, + + _default: function( fx ) { + if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) { + fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit; + } else { + fx.elem[ fx.prop ] = fx.now; + } + } + } +}); + +if ( jQuery.expr && jQuery.expr.filters ) { + jQuery.expr.filters.animated = function( elem ) { + return jQuery.grep(jQuery.timers, function( fn ) { + return elem === fn.elem; + }).length; + }; +} + +// Try to restore the default display value of an element +function defaultDisplay( nodeName ) { + + if ( !elemdisplay[ nodeName ] ) { + + var elem = jQuery( "<" + nodeName + ">" ).appendTo( "body" ), + display = elem.css( "display" ); + + elem.remove(); + + // If the simple way fails, + // get element's real default display by attaching it to a temp iframe + if ( display === "none" || display === "" ) { + // No iframe to use yet, so create it + if ( !iframe ) { + iframe = document.createElement( "iframe" ); + iframe.frameBorder = iframe.width = iframe.height = 0; + } + + document.body.appendChild( iframe ); + + // Create a cacheable copy of the iframe document on first call. + // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake html + // document to it, Webkit & Firefox won't allow reusing the iframe document + if ( !iframeDoc || !iframe.createElement ) { + iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; + iframeDoc.write( "<!doctype><html><body></body></html>" ); + } + + elem = iframeDoc.createElement( nodeName ); + + iframeDoc.body.appendChild( elem ); + + display = jQuery.css( elem, "display" ); + + document.body.removeChild( iframe ); + } + + // Store the correct default display + elemdisplay[ nodeName ] = display; + } + + return elemdisplay[ nodeName ]; +} + + + + +var rtable = /^t(?:able|d|h)$/i, + rroot = /^(?:body|html)$/i; + +if ( "getBoundingClientRect" in document.documentElement ) { + jQuery.fn.offset = function( options ) { + var elem = this[0], box; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + try { + box = elem.getBoundingClientRect(); + } catch(e) {} + + var doc = elem.ownerDocument, + docElem = doc.documentElement; + + // Make sure we're not dealing with a disconnected DOM node + if ( !box || !jQuery.contains( docElem, elem ) ) { + return box ? { top: box.top, left: box.left } : { top: 0, left: 0 }; + } + + var body = doc.body, + win = getWindow(doc), + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop, + scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft, + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: top, left: left }; + }; + +} else { + jQuery.fn.offset = function( options ) { + var elem = this[0]; + + if ( options ) { + return this.each(function( i ) { + jQuery.offset.setOffset( this, options, i ); + }); + } + + if ( !elem || !elem.ownerDocument ) { + return null; + } + + if ( elem === elem.ownerDocument.body ) { + return jQuery.offset.bodyOffset( elem ); + } + + jQuery.offset.initialize(); + + var computedStyle, + offsetParent = elem.offsetParent, + prevOffsetParent = elem, + doc = elem.ownerDocument, + docElem = doc.documentElement, + body = doc.body, + defaultView = doc.defaultView, + prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle, + top = elem.offsetTop, + left = elem.offsetLeft; + + while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + break; + } + + computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle; + top -= elem.scrollTop; + left -= elem.scrollLeft; + + if ( elem === offsetParent ) { + top += elem.offsetTop; + left += elem.offsetLeft; + + if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevOffsetParent = offsetParent; + offsetParent = elem.offsetParent; + } + + if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) { + top += parseFloat( computedStyle.borderTopWidth ) || 0; + left += parseFloat( computedStyle.borderLeftWidth ) || 0; + } + + prevComputedStyle = computedStyle; + } + + if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) { + top += body.offsetTop; + left += body.offsetLeft; + } + + if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) { + top += Math.max( docElem.scrollTop, body.scrollTop ); + left += Math.max( docElem.scrollLeft, body.scrollLeft ); + } + + return { top: top, left: left }; + }; +} + +jQuery.offset = { + initialize: function() { + var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0, + html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; + + jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } ); + + container.innerHTML = html; + body.insertBefore( container, body.firstChild ); + innerDiv = container.firstChild; + checkDiv = innerDiv.firstChild; + td = innerDiv.nextSibling.firstChild.firstChild; + + this.doesNotAddBorder = (checkDiv.offsetTop !== 5); + this.doesAddBorderForTableAndCells = (td.offsetTop === 5); + + checkDiv.style.position = "fixed"; + checkDiv.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15); + checkDiv.style.position = checkDiv.style.top = ""; + + innerDiv.style.overflow = "hidden"; + innerDiv.style.position = "relative"; + + this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); + + this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop); + + body.removeChild( container ); + jQuery.offset.initialize = jQuery.noop; + }, + + bodyOffset: function( body ) { + var top = body.offsetTop, + left = body.offsetLeft; + + jQuery.offset.initialize(); + + if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) { + top += parseFloat( jQuery.css(body, "marginTop") ) || 0; + left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; + } + + return { top: top, left: left }; + }, + + setOffset: function( elem, options, i ) { + var position = jQuery.css( elem, "position" ); + + // set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + var curElem = jQuery( elem ), + curOffset = curElem.offset(), + curCSSTop = jQuery.css( elem, "top" ), + curCSSLeft = jQuery.css( elem, "left" ), + calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, + props = {}, curPosition = {}, curTop, curLeft; + + // need to be able to calculate position if either top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( jQuery.isFunction( options ) ) { + options = options.call( elem, i, curOffset ); + } + + if (options.top != null) { + props.top = (options.top - curOffset.top) + curTop; + } + if (options.left != null) { + props.left = (options.left - curOffset.left) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + } +}; + + +jQuery.fn.extend({ + position: function() { + if ( !this[0] ) { + return null; + } + + var elem = this[0], + + // Get *real* offsetParent + offsetParent = this.offsetParent(), + + // Get correct offsets + offset = this.offset(), + parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); + + // Subtract element margins + // note: when an element has margin: auto the offsetLeft and marginLeft + // are the same in Safari causing offset.left to incorrectly be 0 + offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; + offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; + + // Add offsetParent borders + parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; + parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; + + // Subtract the two offsets + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + }, + + offsetParent: function() { + return this.map(function() { + var offsetParent = this.offsetParent || document.body; + while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent; + }); + } +}); + + +// Create scrollLeft and scrollTop methods +jQuery.each( ["Left", "Top"], function( i, name ) { + var method = "scroll" + name; + + jQuery.fn[ method ] = function( val ) { + var elem, win; + + if ( val === undefined ) { + elem = this[ 0 ]; + + if ( !elem ) { + return null; + } + + win = getWindow( elem ); + + // Return the scroll offset + return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] : + jQuery.support.boxModel && win.document.documentElement[ method ] || + win.document.body[ method ] : + elem[ method ]; + } + + // Set the scroll offset + return this.each(function() { + win = getWindow( this ); + + if ( win ) { + win.scrollTo( + !i ? val : jQuery( win ).scrollLeft(), + i ? val : jQuery( win ).scrollTop() + ); + + } else { + this[ method ] = val; + } + }); + }; +}); + +function getWindow( elem ) { + return jQuery.isWindow( elem ) ? + elem : + elem.nodeType === 9 ? + elem.defaultView || elem.parentWindow : + false; +} + + + + +// Create innerHeight, innerWidth, outerHeight and outerWidth methods +jQuery.each([ "Height", "Width" ], function( i, name ) { + + var type = name.toLowerCase(); + + // innerHeight and innerWidth + jQuery.fn["inner" + name] = function() { + return this[0] ? + parseFloat( jQuery.css( this[0], type, "padding" ) ) : + null; + }; + + // outerHeight and outerWidth + jQuery.fn["outer" + name] = function( margin ) { + return this[0] ? + parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) : + null; + }; + + jQuery.fn[ type ] = function( size ) { + // Get window width or height + var elem = this[0]; + if ( !elem ) { + return size == null ? null : this; + } + + if ( jQuery.isFunction( size ) ) { + return this.each(function( i ) { + var self = jQuery( this ); + self[ type ]( size.call( this, i, self[ type ]() ) ); + }); + } + + if ( jQuery.isWindow( elem ) ) { + // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode + // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat + var docElemProp = elem.document.documentElement[ "client" + name ]; + return elem.document.compatMode === "CSS1Compat" && docElemProp || + elem.document.body[ "client" + name ] || docElemProp; + + // Get document width or height + } else if ( elem.nodeType === 9 ) { + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater + return Math.max( + elem.documentElement["client" + name], + elem.body["scroll" + name], elem.documentElement["scroll" + name], + elem.body["offset" + name], elem.documentElement["offset" + name] + ); + + // Get or set width or height on the element + } else if ( size === undefined ) { + var orig = jQuery.css( elem, type ), + ret = parseFloat( orig ); + + return jQuery.isNaN( ret ) ? orig : ret; + + // Set the width or height on the element (default to pixels if value is unitless) + } else { + return this.css( type, typeof size === "string" ? size : size + "px" ); + } + }; + +}); + + +window.jQuery = window.$ = jQuery; +})(window);
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/nohtml/jquery-nohtml.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/nohtml/jquery-nohtml.js new file mode 100644 index 000000000..1c621687a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/src/vendor/nohtml/jquery-nohtml.js @@ -0,0 +1,96 @@ +(function($, document) { + + var create = $.create = (function() { + + function addAttrs( el, obj, context ) { + for( var attr in obj ){ + switch( attr ) { + case 'tag' : + break; + case 'html' : + el.innerHTML = obj[ attr ]; + break; + case 'css' : + for( var style in obj.css ) { + $.attr( el.style, style, obj.css[ style ] ); + } + break; + case 'text' : case 'child' : case 'children' : + createNode( obj[attr], el, context ); + break; + case 'cls' : + el.className = obj[attr]; + break; + case 'data' : + for( var data in obj.data ) { + $.data( el, data, obj.data[data] ); + } + break; + default : + if( attr.indexOf("on") === 0 && $.isFunction(obj[attr]) ) { + $.event.add( el, attr.substr(2).replace(/^[A-Z]/, function(a) { return a.toLowerCase(); }), obj[attr] ); + } else { + $.attr( el, attr, obj[attr] ); + } + } + } + } + + function createNode(obj, parent, context) { + if(obj && ($.isArray(obj) || obj instanceof $)) { + for(var ret = [], i = 0; i < obj.length; i++) { + var newNode = createNode(obj[i], parent, context); + if(newNode) { + ret.push(newNode); + } + } + return ret; + } + var el; + if(typeof(obj) === 'string') { + el = context.createTextNode( obj ); + } else if(!obj) { + return undefined; + } else if(obj.nodeType === 1) { + el = obj; + } else if( obj instanceof app.ui.AbstractWidget ) { + el = obj.el[0]; + } else { + el = context.createElement( obj.tag || 'DIV' ); + addAttrs(el, obj, context); + } + if(parent){ parent.appendChild(el); } + return el; + } + + return function(elementDef, parentNode) { + return createNode(elementDef, parentNode, (parentNode && parentNode.ownerDocument) || document); + }; + + })(); + + + // inject create into jquery internals so object definitions are treated as first class constructors (overrides non-public methods) + var clean = $.clean, + init = $.fn.init; + + $.clean = function( elems, context, fragment, scripts ) { + for(var i = 0; i < elems.length; i++) { + if( elems[i].tag || elems[i] instanceof app.ui.AbstractWidget ) { + elems[i] = create( elems[i], null, context ); + } + } + return clean( elems, context, fragment, scripts ); + }; + + $.fn.init = function( selector, context, rootjQuery ) { + if ( selector && ( selector.tag || selector instanceof app.ui.AbstractWidget )) { + selector = create( selector, null, context ); + } + return init.call( this, selector, context, rootjQuery ); + }; + + $.fn.init.prototype = $.fn; + +})(jQuery, window.document); + diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/demo.html b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/demo.html new file mode 100644 index 000000000..333a92047 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/demo.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> + +<html> + <head> + <meta charset="UTF-8"> + <title>Elasticsearch UI Demo</title> + <link rel="stylesheet" href="../_site/base/reset.css"> + <link rel="stylesheet" href="../_site/app.css"> + <script src="../_site/i18n.js" data-baseDir="../_site/lang" data-langs="en,fr"></script> + <script src="../_site/vendor.js"></script> + <script src="../_site/app.js"></script> + <script> + $( function() { + var args = location.search.substring(1).split("&").reduce(function(r, p) { + r[decodeURIComponent(p.split("=")[0])] = decodeURIComponent(p.split("=")[1]); return r; + }, {}); + var script0 = document.getElementsByTagName('script')[0]; + var s = document.createElement("script"); + s.src = '../src/' + args['demo']; + s.onload = function() { + $("body").append( + { tag: "DIV", children: [ + window.builder() + ] } + ); + } + script0.parentNode.insertBefore(s, script0); + document.title = args['demo'].match(/([^\/]+)(\.js)$/)[1] + } ); + </script> + <link rel="icon" href="../_site/app/favicon.png" type="image/png"> + </head> + <body></body> +</html> diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/conflictingField.sh b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/conflictingField.sh new file mode 100755 index 000000000..917d896ca --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/conflictingField.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +curl -XDELETE 'http://localhost:9200/conflicting_field_type' +echo +curl -XPUT 'http://localhost:9200/conflicting_field_type' +echo +curl -XPUT 'http://localhost:9200/conflicting_field_type/map1/_mapping' -d '{ + "map1": { + "date_formats": ["date_time", "yyyyMMddHHmmss", "yyyyMMddHHmmssSSS"], + "_all": { + "enabled": true, + "store": "yes" + }, + "properties": { + "field1": { + "type": "date", + "store": "yes", + "format": "yyyyMMddHHmmssSSS", + "include_in_all": false + } + } + } +}' +echo +curl -XPUT 'http://localhost:9200/conflicting_field_type/map2/_mapping' -d '{ + "map2": { + "date_formats": ["date_time", "yyyyMMddHHmmss", "yyyyMMddHHmmssSSS"], + "_all": { + "enabled": true, + "store": "yes" + }, + "properties": { + "field1": { + "type": "string", + "store": "yes", + "term_vector": "yes", + "include_in_all": false + } + } + } +}' +echo +curl -XPUT 'http://localhost:9200/conflicting_field_type/map1/1' -d '{ + "field1" : "20110214172449000" +}' +echo +curl -XPUT 'http://localhost:9200/conflicting_field_type/map2/2' -d '{ + "field1" : "Test map2 with string type field" +}' +echo
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/delete_all_indices.sh b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/delete_all_indices.sh new file mode 100644 index 000000000..878964c54 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/delete_all_indices.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +curl -XDELETE 'http://localhost:9200/conflicting_field_type' +echo +curl -XDELETE 'http://localhost:9200/twitter' +echo diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/multi_type.sh b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/multi_type.sh new file mode 100755 index 000000000..562346275 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/multi_type.sh @@ -0,0 +1,75 @@ +curl -XDELETE 'http://localhost:9200/multi_field_type' +echo +curl -XPUT 'http://localhost:9200/multi_field_type' +echo +curl -XPUT 'http://localhost:9200/multi_field_type/map1/_mapping' -d '{ + "map1": { + "properties": { + "field1": { + "type": "string", + "store": "yes" + }, + "field2": { + "type": "multi_field", + "path": "full", + "fields": { + "field2": { "type": "string" }, + "alt_name": { "type": "string" }, + "alt_name2": { "type": "string" } + } + }, + "field3": { + "type": "multi_field", + "path": "just_name", + "fields": { + "field3": { "type": "string" }, + "foobar": { "type": "string" } + } + }, + "field4": { + "type": "multi_field", + "path": "just_name", + "fields": { + "field4": { "type": "string" }, + "foobar": { "type": "string" } + } + }, + "field5": { + "type": "string" + } + } + } +}' +echo +curl -XPUT 'http://localhost:9200/multi_field_type/map1/1' -d '{ + "field1": "Whats the dogs name", + "field2": "Max", + "field3": "Hey Janelle, whats wrong with Wolfie? I can hear him barking", + "field4": "Wolfies fine, honey, Wolfies just fine. Where are you", + "field5": "Your foster parents are dead" +}' +echo +curl -XPUT 'http://localhost:9200/multi_field_type/map1/2' -d '{ + "field1": "Nice night for a walk, eh", + "field2": "Nice night for a walk", + "field3": "Wash day tomorrow? Nothing clean, right?", + "field4": "Nothing clean. Right", + "field5": "Hey, I think this guys a couple cans short of a six-pack" +}' +echo +curl -XPUT 'http://localhost:9200/multi_field_type/map1/3' -d '{ + "field1": "The 600 series had rubber skin. We spotted them easy, but these are new. They look human... sweat, bad breath, everything. Very hard to spot. I had to wait till he moved on you before I could zero him", + "field2": "Look... I am not stupid, you know. They cannot make things like that yet.", + "field3": "Not yet. Not for about 40 years", + "field4": "Are you saying its from the future?", + "field5": "One possible future. From your point of view... I dont know tech stuff" +}' +echo +curl -XPUT 'http://localhost:9200/multi_field_type/map1/4' -d '{ + "field1": "Did you see this war?", + "field2": "No. I grew up after. In the ruins... starving... hiding from H-Ks", + "field3": "H-Ks?", + "field4": "Hunter-Killers. Patrol machines built in automated factories. Most of us were rounded up, put in camps for orderly disposal", + "field5": "This is burned in by laser scan. Some of us were kept alive... to work... loading bodies. The disposal units ran night and day. We were that close to going out forever. But there was one man who taught us to fight, to storm the wire of the camps, to smash those metal motherfuckers into junk. He turned it around. He brought us back from the brink. His name is Connor. John Connor. Your son, Sarah, your unborn son" +}' +echo diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/twitter_feed.sh b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/twitter_feed.sh new file mode 100755 index 000000000..165246aab --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/twitter_feed.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +curl -XDELETE 'http://localhost:9200/twitter' +echo +curl -XPUT 'http://localhost:9200/twitter' +echo +curl -XPUT 'http://localhost:9200/twitter/_mapping' -d '{ + "tweet": { + "date_formats": ["date_time", "yyyyMMddHHmmss", "yyyyMMddHHmmssSSS"], + "properties" : { + "user" : { "type" : "string", "index" : "not_analyzed" }, + "message" : { "type" : "string" }, + "postDate" : { "type" : "date" }, + "srcAddr" : { "type" : "ip" }, + "priority" : { "type" : "integer", null_value: 1 }, + "rank" : { "type" : "float", null_value: 1.0 }, + "loc" : { "type": "geo_point" } + } + } +}' +echo +curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ + "user" : "mobz", + "message" : "developing a tool to search with", + "postDate" : "20110220100330", + "srcAddr" : "203.19.74.11", + "loc" : "-37.86,144.90" +}' +echo +curl -XPUT 'http://localhost:9200/twitter/tweet/2' -d '{ + "user" : "mobz", + "message" : "you know, for elastic search", + "postDate" : "20110220095900", + "srcAddr" : "203.19.74.11", + "loc" : "-37.86,144.90" +}' +echo +curl -XPUT 'http://localhost:9200/twitter/tweet/3' -d '{ + "user" : "mobz", + "message" : "lets take some matilda bay", + "postDate" : "20110221171330", + "srcAddr" : "203.19.74.11", + "loc" : "-37.86,144.90" +}' +echo
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/twitter_river.sh b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/twitter_river.sh new file mode 100755 index 000000000..e55c66537 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/generators/twitter_river.sh @@ -0,0 +1,28 @@ +curl -XDELETE 'http://localhost:9200/twitter_river' +echo +curl -XDELETE 'http://localhost:9200/_river/twitter_river' +echo +curl -XPUT 'http://localhost:9200/twitter_river' +echo +read -p "consumer key: " consumer_key +read -p "consumer secret: " consumer_secret +read -p "access token: " access_token +read -p "access token secret: " access_token_secret +curl -XPUT 'localhost:9200/_river/twitter_river/_meta' -d ' +{ + "type" : "twitter", + "twitter" : { + "oauth": { + "consumer_key": "'${consumer_key}'", + "consumer_secret": "'${consumer_secret}'", + "access_token": "'${access_token}'", + "access_token_secret": "'${access_token_secret}'" + } + }, + "index": { + "index": "twitter_river", + "type": "status", + "buk_size": 100 + } +}' +echo
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/perf.html b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/perf.html new file mode 100644 index 000000000..eecfc0a6a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/perf.html @@ -0,0 +1,54 @@ +<!DOCTYPE html> + +<html> + <head> + <meta charset="UTF-8"> + <title>Elasticsearch UI Performance Testing Harness</title> + <link rel="stylesheet" href="../_site/base/reset.css"> + <link rel="stylesheet" href="../_site/app.css"> + <script src="../_site/i18n.js" data-baseDir="../_site/lang" data-langs="en,fr"></script> + <script src="../_site/vendor.js"></script> + <script src="../_site/app.js"></script> + <script> + $( function() { + var widget; + var container = document.getElementById("demo"); + function build() { + widget = window.builder(); + widget.attach( demo ); + } + function remove() { + widget.remove(); + widget = null; + } + var args = location.search.substring(1).split("&").reduce(function(r, p) { + r[decodeURIComponent(p.split("=")[0])] = decodeURIComponent(p.split("=")[1]); return r; + }, {}); + var script0 = document.getElementsByTagName('script')[0]; + var s = document.createElement("script"); + s.src = '../src/' + args['demo']; + script0.parentNode.insertBefore(s, script0); + document.title = args['demo'].match(/([^\/]+)(\.js)$/)[1]; + document.getElementsByName("build")[0].addEventListener("click", build ); + document.getElementsByName("remove")[0].addEventListener("click", remove ); + document.getElementsByName("repeat")[0].addEventListener("click", function() { + console.time("build x 1000 in"); + for( var i = 0; i < 1000; i++ ) { + build(); + remove(); + } + console.timeEnd("build x 1000 in"); + }); + } ); + </script> + <link rel="icon" href="../_site/app/favicon.png" type="image/png"> + </head> + <body> + <div class="header"> + <button type="button" name="build">Build</button> + <button type="button" name="remove">Remove</button> + <button type="button" name="repeat">Build and Remove x 1000</button> + </div> + <div id="demo"></div> + </body> +</html> diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/spec/specHelper.js b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/spec/specHelper.js new file mode 100644 index 000000000..55ba80d92 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/elasticsearch/plugins/head/test/spec/specHelper.js @@ -0,0 +1,81 @@ +// find *Spec.js files in the src directory next to the corresponding source file + +var test = window.test = {}; + +test.cb = (function( jasmine ) { + var callbacks = []; + + return { + use: function() { + callbacks = []; + }, + createSpy: function( name, arg, data, context ) { + return jasmine.createSpy( name ).and.callFake( function() { + callbacks.push( { cb: arguments[ arg || 0 ], data: data, context: context } ); + }); + }, + execOne: function() { + var exec = callbacks.shift(); + exec.cb.apply( exec.context, exec.data ); + }, + execAll: function() { + while( callbacks.length ) { + this.execOne(); + } + } + }; +})( this.jasmine ); + + +test.clock = ( function() { + var id = 0, timers, saved; + var names = [ "setTimeout", "setInterval", "clearTimeout", "clearInterval" ]; + var byNext = function( a, b ) { return a.next - b.next; }; + var mocks = { + setTimeout: function( fn, t ) { + timers.push( { id: id, fn: fn, next: t, t: t, type: "t" } ); + return id++; + }, + clearTimeout: function( id ) { + timers = timers.filter( function( timer ) { return timer.id !== id; } ); + }, + setInterval: function( fn, t ) { + timers.push( { id: id, fn: fn, next: t, t: t, type: "i" } ); + return id++; + }, + clearInterval: function( id ) { + timers = timers.filter( function( timer ) { return timer.id !== id; } ); + } + }; + + return { + steal: function() { + timers = []; + saved = {}; + names.forEach( function( n ) { + saved[n] = window[n]; + window[n] = mocks[n]; + }); + }, + restore: function() { + names.forEach( function( n ) { + window[n] = saved[n]; + }); + timers = null; + saved = null; + }, + tick: function() { + if( timers.length ) { + timers.sort( byNext ); + var t0 = timers[0]; + if( t0.type === "t" ) { + timers.shift(); + } else { + t0.next += t0.t; + } + t0.fn(); + } + } + }; + +})(); diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml b/sdnr/wt/devicemanager/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml new file mode 100644 index 000000000..a9a4e18ec --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +============LICENSE_START======================================================= +ONAP : ccsdk feature sdnr wt devicemanager + ================================================================================ +Copyright (C) 2019 highstreet technologies GmbH 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========================================================= + --> + +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" + xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0" odl:use-default-for-reference-types="true"> + + <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" + odl:type="default" /> + + <reference id="notificationPublishService" + interface="org.opendaylight.controller.md.sal.binding.api.NotificationPublishService" + odl:type="default" /> + + <reference id="mountPointService" + interface="org.opendaylight.controller.md.sal.binding.api.MountPointService" + odl:type="default" /> + + <reference id="rpcProviderRegistry" interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry" + odl:type="default" /> + + + <bean id="provider" class="org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl" init-method="init" destroy-method="close"> + <property name="dataBroker" ref="dataBroker"/> + <property name="rpcProviderRegistry" ref="rpcProviderRegistry" /> + <property name="notificationPublishService" ref="notificationPublishService" /> + <property name="mountPointService" ref="mountPointService" /> + </bean> + + +</blueprint> diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/bbf-tr-196-2-0-3-full@2018-04-08.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/bbf-tr-196-2-0-3-full@2018-04-08.yang new file mode 100644 index 000000000..d10c58bd5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/bbf-tr-196-2-0-3-full@2018-04-08.yang @@ -0,0 +1,17194 @@ +module bbf-tr-196-2-0-3-full { + namespace "urn:onf:otcc:wireless:yang:radio-access"; + prefix ran; + + import ietf-yang-types { + prefix yang; + } + import ietf-inet-types { + prefix inet; + } + + organization + "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Project"; + contact + "WG Web: <https://www.opennetworking.org/technical-communities/areas/specification/1931-optical-transport> + WG List: <mailto:wireless-transport@login.opennetworking.org> + WG Chair: Lyndon Ong <mailto:lyong@ciena.com> + WG Chair: Giorgio Cazzaniga <mailto:giorgio.cazzaniga@sm-optics.com> + Editors: Ramakrishnan, Shanthakumar (Shanth) <Shanthakumar.Ramakrishnan@commscope.com> Martin Skorupski <mailto:martin.skorupski@highstreet-technologies.com>"; + description + "This module contains a collection of YANG definitions for managing radio access network (RAN) devices."; + + revision 2018-04-08 { + description + "Initial version, used only for ONAP PoC 2018-06-25"; + reference + "ONF TR ???: A YANG Data Model for Radio Access Networks. + BBF TR-196 2.0.3 full"; + } + + list fap-service { + key "alias"; + uses fap-service-g; + container capabilities { + uses capabilities-g; + description + "Container for object class FAPService.{i}.Capabilities."; + container capabilities-umts { + uses capabilities-umts-g; + description + "Container for object class FAPService.{i}.Capabilities.UMTS."; + container capabilities-umts-self-config { + uses capabilities-umts-self-config-g; + description + "Container for object class FAPService.{i}.Capabilities.UMTS.SelfConfig."; + } + } + container capabilities-lte { + uses capabilities-lte-g; + description + "Container for object class FAPService.{i}.Capabilities.LTE."; + } + container capabilities-cdma2000 { + uses capabilities-cdma2000-g; + description + "Container for object class FAPService.{i}.Capabilities.CDMA2000."; + container capabilities-cdma2000-one-x { + uses capabilities-cdma2000-one-x-g; + description + "Container for object class FAPService.{i}.Capabilities.CDMA2000.OneX."; + container capabilities-cdma2000-one-x-self-config { + uses capabilities-cdma2000-one-x-self-config-g; + description + "Container for object class FAPService.{i}.Capabilities.CDMA2000.OneX.SelfConfig."; + } + } + container capabilities-cdma2000-hrpd { + uses capabilities-cdma2000-hrpd-g; + description + "Container for object class FAPService.{i}.Capabilities.CDMA2000.HRPD."; + container capabilities-cdma2000-hrpd-self-config { + uses capabilities-cdma2000-hrpd-self-config-g; + description + "Container for object class FAPService.{i}.Capabilities.CDMA2000.HRPD.SelfConfig."; + } + } + } + } + container fap-control { + uses fap-control-g; + description + "Container for object class FAPService.{i}.FAPControl."; + container fap-control-umts { + uses fap-control-umts-g; + description + "Container for object class FAPService.{i}.FAPControl.UMTS."; + container fap-control-umts-self-config { + uses fap-control-umts-self-config-g; + description + "Container for object class FAPService.{i}.FAPControl.UMTS.SelfConfig."; + } + container fap-control-umts-gateway { + uses fap-control-umts-gateway-g; + description + "Container for object class FAPService.{i}.FAPControl.UMTS.Gateway."; + } + } + container fap-control-lte { + uses fap-control-lte-g; + description + "Container for object class FAPService.{i}.FAPControl.LTE."; + container fap-control-lte-gateway { + uses fap-control-lte-gateway-g; + description + "Container for object class FAPService.{i}.FAPControl.LTE.Gateway."; + } + } + container fap-control-cdma2000 { + uses fap-control-cdma2000-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000."; + container fap-control-cdma2000-time { + uses fap-control-cdma2000-time-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000.Time."; + } + container fap-control-cdma2000-one-x { + uses fap-control-cdma2000-one-x-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000.OneX."; + container fap-control-cdma2000-one-x-active-handin-measurement { + uses fap-control-cdma2000-one-x-active-handin-measurement-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000.OneX.ActiveHandinMeasurement."; + } + container fap-control-cdma2000-one-x-self-config { + uses fap-control-cdma2000-one-x-self-config-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000.OneX.SelfConfig."; + } + } + container fap-control-cdma2000-gateway { + uses fap-control-cdma2000-gateway-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000.Gateway."; + } + container fap-control-cdma2000-hrpd { + uses fap-control-cdma2000-hrpd-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000.HRPD."; + container fap-control-cdma2000-hrpd-self-config { + uses fap-control-cdma2000-hrpd-self-config-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000.HRPD.SelfConfig."; + } + container fap-control-cdma2000-hrpd-a13 { + uses fap-control-cdma2000-hrpd-a13-g; + description + "Container for object class FAPService.{i}.FAPControl.CDMA2000.HRPD.A13."; + list fap-control-cdma2000-hrpd-a13-color-code-to-uati104 { + key "color-code uati104"; + uses fap-control-cdma2000-hrpd-a13-color-code-to-uati104-g; + description + "List of object class FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.ColorCodeToUATI104.{i}."; + } + list fap-control-cdma2000-hrpd-a13-hrpd-subnet-to-ip { + key "a13-ip-address"; + uses fap-control-cdma2000-hrpd-a13-hrpd-subnet-to-ip-g; + description + "List of object class FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.HRPDSubnetToIP.{i}."; + } + } + } + } + } + container access-mgmt { + uses access-mgmt-g; + description + "Container for object class FAPService.{i}.AccessMgmt."; + container access-mgmt-umts { + uses access-mgmt-umts-g; + description + "Container for object class FAPService.{i}.AccessMgmt.UMTS."; + list access-mgmt-umts-member-detail { + key "imsi"; + uses access-mgmt-umts-member-detail-g; + description + "List of object class FAPService.{i}.AccessMgmt.UMTS.MemberDetail.{i}."; + } + container access-mgmt-umts-local-ip-access { + uses access-mgmt-umts-local-ip-access-g; + description + "Container for object class FAPService.{i}.AccessMgmt.UMTS.LocalIPAccess."; + } + } + container access-mgmt-lte { + uses access-mgmt-lte-g; + description + "Container for object class FAPService.{i}.AccessMgmt.LTE."; + container access-mgmt-lte-local-ip-access { + uses access-mgmt-lte-local-ip-access-g; + description + "Container for object class FAPService.{i}.AccessMgmt.LTE.LocalIPAccess."; + } + } + container access-mgmt-cdma2000 { + uses access-mgmt-cdma2000-g; + description + "Container for object class FAPService.{i}.AccessMgmt.CDMA2000."; + list access-mgmt-cdma2000-member-detail { + key "imsi"; + uses access-mgmt-cdma2000-member-detail-g; + description + "List of object class FAPService.{i}.AccessMgmt.CDMA2000.MemberDetail.{i}."; + } + container access-mgmt-cdma2000-local-ip-access { + uses access-mgmt-cdma2000-local-ip-access-g; + description + "Container for object class FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess."; + container access-mgmt-cdma2000-local-ip-access-hrpd { + uses access-mgmt-cdma2000-local-ip-access-hrpd-g; + description + "Container for object class FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD."; + list access-mgmt-cdma2000-local-ip-access-hrpd-egress-filter { + key "subnet subnet-mask"; + uses access-mgmt-cdma2000-local-ip-access-hrpd-egress-filter-g; + description + "List of object class FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.EgressFilter.{i}."; + } + } + } + } + container access-mgmt-legacy { + uses access-mgmt-legacy-g; + description + "Container for object class FAPService.{i}.AccessMgmt.Legacy."; + container access-mgmt-legacy-local-ip-access { + uses access-mgmt-legacy-local-ip-access-g; + description + "Container for object class FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess."; + list access-mgmt-legacy-local-ip-access-rule { + key "dest-ip-address dest-subnet-mask protocol"; + uses access-mgmt-legacy-local-ip-access-rule-g; + description + "List of object class FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}."; + } + } + } + } + container cell-config { + uses cell-config-g; + description + "Container for object class FAPService.{i}.CellConfig."; + container umts { + uses umts-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS."; + container umts-cn { + uses umts-cn-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.CN."; + container umts-cn-cs-domain { + uses umts-cn-cs-domain-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.CN.CSDomain."; + } + container umts-cn-ps-domain { + uses umts-cn-ps-domain-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.CN.PSDomain."; + } + } + container umts-ran { + uses umts-ran-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN."; + container umts-ran-csg { + uses umts-ran-csg-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.CSG."; + container umts-ran-csg-csgpsc-split-info { + uses umts-ran-csg-csgpsc-split-info-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo."; + } + } + container umts-ran-cell-selection { + uses umts-ran-cell-selection-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.CellSelection."; + } + container umts-ran-rrc-timers { + uses umts-ran-rrc-timers-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers."; + } + container umts-ran-drx { + uses umts-ran-drx-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.DRX."; + } + container umts-ran-power-control { + uses umts-ran-power-control-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.PowerControl."; + } + container umts-ran-cell-restriction { + uses umts-ran-cell-restriction-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.CellRestriction."; + } + container umts-ran-intra-freq-meas { + uses umts-ran-intra-freq-meas-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas."; + list umts-ran-intra-freq-meas-instance { + key "intra-frequency-event-identity"; + uses umts-ran-intra-freq-meas-instance-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}."; + } + } + container umts-ran-inter-freq-meas { + uses umts-ran-inter-freq-meas-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas."; + list umts-ran-inter-freq-meas-instance { + key "intra-frequency-event-identity"; + uses umts-ran-inter-freq-meas-instance-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}."; + } + } + container umts-ran-inter-rat-meas { + uses umts-ran-inter-rat-meas-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas."; + list umts-ran-inter-rat-meas-instance { + key "inter-rat-event-identity"; + uses umts-ran-inter-rat-meas-instance-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}."; + } + } + container umts-ran-ue-internal-meas { + uses umts-ran-ue-internal-meas-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.UEInternalMeas."; + } + container umts-ran-rf { + uses umts-ran-rf-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.RF."; + } + container umts-ran-neighbor-list { + uses umts-ran-neighbor-list-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborList."; + list umts-ran-neighbor-list-intra-freq-cell { + key "pcpich-scrambling-code"; + uses umts-ran-neighbor-list-intra-freq-cell-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}."; + } + list umts-ran-neighbor-list-inter-freq-cell { + key "pcpich-scrambling-code uarfcndl"; + uses umts-ran-neighbor-list-inter-freq-cell-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}."; + } + container umts-ran-neighbor-list-inter-rat-cell { + uses umts-ran-neighbor-list-inter-rat-cell-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell."; + list umts-ran-neighbor-list-inter-rat-cell-gsm { + key "bccharfcn"; + uses umts-ran-neighbor-list-inter-rat-cell-gsm-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}."; + } + } + } + container umts-ran-neighbor-list-in-use { + uses umts-ran-neighbor-list-in-use-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse."; + list umts-ran-neighbor-list-in-use-intra-freq-cell { + key "pcpich-scrambling-code"; + uses umts-ran-neighbor-list-in-use-intra-freq-cell-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}."; + } + list umts-ran-neighbor-list-in-use-inter-freq-cell { + key "pcpich-scrambling-code uarfcndl"; + uses umts-ran-neighbor-list-in-use-inter-freq-cell-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}."; + } + container umts-ran-neighbor-list-in-use-inter-rat-cell { + uses umts-ran-neighbor-list-in-use-inter-rat-cell-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell."; + list umts-ran-neighbor-list-in-use-inter-rat-cell-gsm { + key "bccharfcn"; + uses umts-ran-neighbor-list-in-use-inter-rat-cell-gsm-g; + description + "List of object class FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}."; + } + } + } + } + container umts-rab { + uses umts-rab-g; + description + "Container for object class FAPService.{i}.CellConfig.UMTS.RAB."; + } + } + container lte { + uses lte-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE."; + list lte-tunnel { + key "tunnel-ref"; + uses lte-tunnel-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.Tunnel.{i}."; + } + container lte-epc { + uses lte-epc-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.EPC."; + list lte-epc-plmn-list { + key "plmnid"; + uses lte-epc-plmn-list-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.EPC.PLMNList.{i}."; + } + list lte-epc-qo-s { + key "qci"; + uses lte-epc-qo-s-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}."; + } + } + container lte-ran { + uses lte-ran-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN."; + container lte-ran-common { + uses lte-ran-common-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Common."; + } + container lte-ran-s1-ap { + uses lte-ran-s1-ap-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.S1AP."; + } + container lte-ran-s1-u { + uses lte-ran-s1-u-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.S1U."; + } + container lte-ran-rf { + uses lte-ran-rf-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.RF."; + } + container lte-ran-phy { + uses lte-ran-phy-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY."; + container lte-ran-phy-antenna-info { + uses lte-ran-phy-antenna-info-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.AntennaInfo."; + } + container lte-ran-phy-pdsch { + uses lte-ran-phy-pdsch-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.PDSCH."; + } + container lte-ran-phy-srs { + uses lte-ran-phy-srs-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.SRS."; + } + container lte-ran-phy-prach { + uses lte-ran-phy-prach-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.PRACH."; + } + container lte-ran-phy-pucch { + uses lte-ran-phy-pucch-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH."; + } + container lte-ran-phy-pusch { + uses lte-ran-phy-pusch-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH."; + container lte-ran-phy-pusch-ulrs { + uses lte-ran-phy-pusch-ulrs-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.ULRS."; + } + } + container lte-ran-phy-ul-power-control { + uses lte-ran-phy-ul-power-control-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl."; + } + container lte-ran-phy-mbsfn { + uses lte-ran-phy-mbsfn-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN."; + list lte-ran-phy-mbsfn-sf-config-list { + key "radio-frame-allocation-period radioframe-allocation-offset radio-frame-allocation-size"; + uses lte-ran-phy-mbsfn-sf-config-list-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}."; + } + } + container lte-ran-phy-prs { + uses lte-ran-phy-prs-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.PRS."; + } + container lte-ran-phy-tdd-frame { + uses lte-ran-phy-tdd-frame-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.PHY.TDDFrame."; + } + } + container lte-ran-mac { + uses lte-ran-mac-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.MAC."; + container lte-ran-mac-rach { + uses lte-ran-mac-rach-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH."; + } + container lte-ran-mac-drx { + uses lte-ran-mac-drx-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX."; + } + container lte-ran-mac-ulsch { + uses lte-ran-mac-ulsch-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.MAC.ULSCH."; + } + } + container lte-ran-rlc { + uses lte-ran-rlc-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.RLC."; + container lte-ran-rlc-srb1 { + uses lte-ran-rlc-srb1-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1."; + } + container lte-ran-rlc-srb2 { + uses lte-ran-rlc-srb2-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2."; + } + } + container lte-ran-rrc-timers { + uses lte-ran-rrc-timers-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.RRCTimers."; + } + container lte-ran-cell-restriction { + uses lte-ran-cell-restriction-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.CellRestriction."; + } + container lte-ran-mobility { + uses lte-ran-mobility-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility."; + container lte-ran-mobility-idle-mode { + uses lte-ran-mobility-idle-mode-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode."; + container lte-ran-mobility-idle-mode-common { + uses lte-ran-mobility-idle-mode-common-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common."; + } + container lte-ran-mobility-idle-mode-intra-freq { + uses lte-ran-mobility-idle-mode-intra-freq-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq."; + } + container lte-ran-mobility-idle-mode-inter-freq { + uses lte-ran-mobility-idle-mode-inter-freq-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq."; + list lte-ran-mobility-idle-mode-inter-freq-carrier { + key "eutra-carrier-arfcn"; + uses lte-ran-mobility-idle-mode-inter-freq-carrier-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}."; + } + } + container lte-ran-mobility-idle-mode-irat { + uses lte-ran-mobility-idle-mode-irat-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT."; + container lte-ran-mobility-idle-mode-irat-utra { + uses lte-ran-mobility-idle-mode-irat-utra-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA."; + list lte-ran-mobility-idle-mode-irat-utra-utranfdd-freq { + key "utra-carrier-arfcn"; + uses lte-ran-mobility-idle-mode-irat-utra-utranfdd-freq-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}."; + } + } + container lte-ran-mobility-idle-mode-irat-geran { + uses lte-ran-mobility-idle-mode-irat-geran-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN."; + list lte-ran-mobility-idle-mode-irat-geran-geran-freq-group { + key "bccharfcn"; + uses lte-ran-mobility-idle-mode-irat-geran-geran-freq-group-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}."; + } + } + container lte-ran-mobility-idle-mode-irat-cdma2000 { + uses lte-ran-mobility-idle-mode-irat-cdma2000-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000."; + list lte-ran-mobility-idle-mode-irat-cdma2000-cdma2000-band { + key "band-class"; + uses lte-ran-mobility-idle-mode-irat-cdma2000-cdma2000-band-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}."; + } + } + } + } + container lte-ran-mobility-conn-mode { + uses lte-ran-mobility-conn-mode-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode."; + container lte-ran-mobility-conn-mode-eutra { + uses lte-ran-mobility-conn-mode-eutra-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA."; + } + container lte-ran-mobility-conn-mode-irat { + uses lte-ran-mobility-conn-mode-irat-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT."; + } + } + } + container lte-ran-neighbor-list { + uses lte-ran-neighbor-list-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.NeighborList."; + list lte-ran-neighbor-list-lte-cell { + key "plmnid cid"; + uses lte-ran-neighbor-list-lte-cell-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}."; + } + container lte-ran-neighbor-list-inter-rat-cell { + uses lte-ran-neighbor-list-inter-rat-cell-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell."; + list lte-ran-neighbor-list-inter-rat-cell-umts { + key "plmnid cid"; + uses lte-ran-neighbor-list-inter-rat-cell-umts-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}."; + } + list lte-ran-neighbor-list-inter-rat-cell-gsm { + key "plmnid lac ci"; + uses lte-ran-neighbor-list-inter-rat-cell-gsm-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}."; + } + list lte-ran-neighbor-list-inter-rat-cell-cdma2000 { + key "cid"; + uses lte-ran-neighbor-list-inter-rat-cell-cdma2000-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}."; + } + } + } + container lte-ran-neighbor-list-in-use { + uses lte-ran-neighbor-list-in-use-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse."; + list lte-ran-neighbor-list-in-use-lte-cell { + key "plmnid cid"; + uses lte-ran-neighbor-list-in-use-lte-cell-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}."; + } + container lte-ran-neighbor-list-in-use-inter-rat-cell { + uses lte-ran-neighbor-list-in-use-inter-rat-cell-g; + description + "Container for object class FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell."; + list lte-ran-neighbor-list-in-use-inter-rat-cell-umts { + key "plmnid cid"; + uses lte-ran-neighbor-list-in-use-inter-rat-cell-umts-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}."; + } + list lte-ran-neighbor-list-in-use-inter-rat-cell-gsm { + key "plmnid lac ci"; + uses lte-ran-neighbor-list-in-use-inter-rat-cell-gsm-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}."; + } + list lte-ran-neighbor-list-in-use-inter-rat-cell-cdma2000 { + key "cid"; + uses lte-ran-neighbor-list-in-use-inter-rat-cell-cdma2000-g; + description + "List of object class FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}."; + } + } + } + } + } + container cdma2000 { + uses cdma2000-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000."; + container cdma2000-one-x { + uses cdma2000-one-x-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX."; + container cdma2000-one-x-ran { + uses cdma2000-one-x-ran-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN."; + container cdma2000-one-x-ran-rf { + uses cdma2000-one-x-ran-rf-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF."; + } + container cdma2000-one-x-ran-network-listen-mode-config { + uses cdma2000-one-x-ran-network-listen-mode-config-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig."; + } + container cdma2000-one-x-ran-access-parameters { + uses cdma2000-one-x-ran-access-parameters-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters."; + } + container cdma2000-one-x-ran-system-parameters { + uses cdma2000-one-x-ran-system-parameters-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters."; + } + container cdma2000-one-x-ran-extended-system-parameters { + uses cdma2000-one-x-ran-extended-system-parameters-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters."; + } + container cdma2000-one-x-ran-forward-pwr-ctr { + uses cdma2000-one-x-ran-forward-pwr-ctr-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ForwardPwrCtr."; + } + container cdma2000-one-x-ran-hard-handoff { + uses cdma2000-one-x-ran-hard-handoff-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff."; + container cdma2000-one-x-ran-hard-handoff-stats { + uses cdma2000-one-x-ran-hard-handoff-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats."; + } + } + container cdma2000-one-x-ran-power-control { + uses cdma2000-one-x-ran-power-control-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl."; + } + list cdma2000-one-x-ran-neighbor-list { + key "one-x-neighbor-index neighbor-pn"; + uses cdma2000-one-x-ran-neighbor-list-g; + description + "List of object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}."; + } + container cdma2000-one-x-ran-apidm { + uses cdma2000-one-x-ran-apidm-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM."; + } + container cdma2000-one-x-ran-apidtm { + uses cdma2000-one-x-ran-apidtm-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDTM."; + } + container cdma2000-one-x-ran-appim { + uses cdma2000-one-x-ran-appim-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM."; + list cdma2000-one-x-ran-appim-appirec { + key "apsid apnid apband apfreq appnrectype appnreclen appnrec"; + uses cdma2000-one-x-ran-appim-appirec-g; + description + "List of object class FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}."; + } + } + } + container cdma2000-one-x-pcf-config { + uses cdma2000-one-x-pcf-config-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig."; + container cdma2000-one-x-pcf-config-pcf-performance-stats { + uses cdma2000-one-x-pcf-config-pcf-performance-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats."; + } + } + list cdma2000-one-x-batch-pcfpdsn { + key "batch-table-number"; + uses cdma2000-one-x-batch-pcfpdsn-g; + description + "List of object class FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}."; + } + list cdma2000-one-x-pcfpdsn { + key "pdsn-number security-parameter-index security-key"; + uses cdma2000-one-x-pcfpdsn-g; + container cdma2000-one-x-pcfpdsn-a11-reg-update-stats { + uses cdma2000-one-x-pcfpdsn-a11-reg-update-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats."; + } + container cdma2000-one-x-pcfpdsn-pcfpdsn-stats { + uses cdma2000-one-x-pcfpdsn-pcfpdsn-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats."; + } + description + "List of object class FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}."; + } + container cdma2000-one-x-stats { + uses cdma2000-one-x-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.Stats."; + } + container cdma2000-one-x-redirect { + uses cdma2000-one-x-redirect-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.OneX.Redirect."; + } + } + container cdma2000-hrpd { + uses cdma2000-hrpd-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD."; + container cdma2000-hrpd-ran { + uses cdma2000-hrpd-ran-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN."; + container cdma2000-hrpd-ran-rf { + uses cdma2000-hrpd-ran-rf-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF."; + } + } + container cdma2000-hrpd-pcf-config { + uses cdma2000-hrpd-pcf-config-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig."; + container cdma2000-hrpd-pcf-config-pcf-performance-stats { + uses cdma2000-hrpd-pcf-config-pcf-performance-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats."; + } + } + list cdma2000-hrpd-batch-pcfpdsn { + key "batch-table-number batch-table-security-parameter-index batch-table-secret-key"; + uses cdma2000-hrpd-batch-pcfpdsn-g; + description + "List of object class FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}."; + } + list cdma2000-hrpd-pcfpdsn { + key "pdsn-number security-parameter-index security-key"; + uses cdma2000-hrpd-pcfpdsn-g; + container cdma2000-hrpd-pcfpdsn-a11-session-update-stats { + uses cdma2000-hrpd-pcfpdsn-a11-session-update-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats."; + } + container cdma2000-hrpd-pcfpdsn-a11-reg-update-stats { + uses cdma2000-hrpd-pcfpdsn-a11-reg-update-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats."; + } + container cdma2000-hrpd-pcfpdsn-aux-a10-stats { + uses cdma2000-hrpd-pcfpdsn-aux-a10-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats."; + } + container cdma2000-hrpd-pcfpdsn-pcfpdsn-stats { + uses cdma2000-hrpd-pcfpdsn-pcfpdsn-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats."; + } + description + "List of object class FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}."; + } + container cdma2000-hrpd-redirect { + uses cdma2000-hrpd-redirect-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.Redirect."; + } + container cdma2000-hrpd-call-control-stats { + uses cdma2000-hrpd-call-control-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats."; + } + container cdma2000-hrpd-qo-s-stats { + uses cdma2000-hrpd-qo-s-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats."; + } + container cdma2000-hrpd-rnc-sig-apps-stats { + uses cdma2000-hrpd-rnc-sig-apps-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats."; + } + container cdma2000-hrpd-access-auth-config { + uses cdma2000-hrpd-access-auth-config-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthConfig."; + } + container cdma2000-hrpd-access-auth-stats { + uses cdma2000-hrpd-access-auth-stats-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats."; + } + } + container cdma2000-beacon { + uses cdma2000-beacon-g; + description + "Container for object class FAPService.{i}.CellConfig.CDMA2000.Beacon."; + list cdma2000-beacon-beacon-list { + key "beacon-index"; + uses cdma2000-beacon-beacon-list-g; + description + "List of object class FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}."; + } + list cdma2000-beacon-hrpd-beacon-list { + key "beacon-index"; + uses cdma2000-beacon-hrpd-beacon-list-g; + description + "List of object class FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}."; + } + } + } + } + container rem { + uses rem-g; + description + "Container for object class FAPService.{i}.REM."; + container rem-umts { + uses rem-umts-g; + description + "Container for object class FAPService.{i}.REM.UMTS."; + container rem-umts-wcdma { + uses rem-umts-wcdma-g; + description + "Container for object class FAPService.{i}.REM.UMTS.WCDMA."; + list rem-umts-wcdma-cell { + key "rem-umts-wcdma-cell-key"; + uses rem-umts-wcdma-cell-g; + container rem-umts-wcdma-cell-rf { + uses rem-umts-wcdma-cell-rf-g; + description + "Container for object class FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.RF."; + } + container rem-umts-wcdma-cell-bcch { + uses rem-umts-wcdma-cell-bcch-g; + description + "Container for object class FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH."; + container rem-umts-wcdma-cell-bcch-csgpsc-split-info { + uses rem-umts-wcdma-cell-bcch-csgpsc-split-info-g; + description + "Container for object class FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo."; + } + container rem-umts-wcdma-cell-bcch-reference-position { + uses rem-umts-wcdma-cell-bcch-reference-position-g; + description + "Container for object class FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.ReferencePosition."; + } + } + description + "List of object class FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}."; + } + } + container rem-umts-gsm { + uses rem-umts-gsm-g; + description + "Container for object class FAPService.{i}.REM.UMTS.GSM."; + list rem-umts-gsm-cell { + key "arfcn bsic"; + uses rem-umts-gsm-cell-g; + description + "List of object class FAPService.{i}.REM.UMTS.GSM.Cell.{i}."; + } + } + } + container rem-lte { + uses rem-lte-g; + description + "Container for object class FAPService.{i}.REM.LTE."; + list rem-lte-cell { + key "rem-lte-cell-key"; + uses rem-lte-cell-g; + container rem-lte-cell-rf { + uses rem-lte-cell-rf-g; + description + "Container for object class FAPService.{i}.REM.LTE.Cell.{i}.RF."; + } + container rem-lte-cell-bcch { + uses rem-lte-cell-bcch-g; + description + "Container for object class FAPService.{i}.REM.LTE.Cell.{i}.BCCH."; + list rem-lte-cell-bcch-plmn-list { + key "plmnid"; + uses rem-lte-cell-bcch-plmn-list-g; + description + "List of object class FAPService.{i}.REM.LTE.Cell.{i}.BCCH.PLMNList.{i}."; + } + } + description + "List of object class FAPService.{i}.REM.LTE.Cell.{i}."; + } + list rem-lte-carrier-meas { + key "carrier-arfcndl carrier-ch-width"; + uses rem-lte-carrier-meas-g; + description + "List of object class FAPService.{i}.REM.LTE.CarrierMeas.{i}."; + } + } + container rem-cdma2000 { + uses rem-cdma2000-g; + description + "Container for object class FAPService.{i}.REM.CDMA2000."; + container rem-cdma2000-one-x { + uses rem-cdma2000-one-x-g; + description + "Container for object class FAPService.{i}.REM.CDMA2000.OneX."; + list rem-cdma2000-one-x-channel { + key "sniffing-band-class sniffing-channel-number"; + uses rem-cdma2000-one-x-channel-g; + description + "List of object class FAPService.{i}.REM.CDMA2000.OneX.Channel.{i}."; + } + list rem-cdma2000-one-x-cell { + key "rem-cdma2000-one-x-cell-key"; + uses rem-cdma2000-one-x-cell-g; + container rem-cdma2000-one-x-cell-rf { + uses rem-cdma2000-one-x-cell-rf-g; + description + "Container for object class FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF."; + } + container rem-cdma2000-one-x-cell-control-channel { + uses rem-cdma2000-one-x-cell-control-channel-g; + description + "Container for object class FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel."; + } + description + "List of object class FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}."; + } + } + container rem-cdma2000-hrpd { + uses rem-cdma2000-hrpd-g; + description + "Container for object class FAPService.{i}.REM.CDMA2000.HRPD."; + list rem-cdma2000-hrpd-channel { + key "sniffing-band-class sniffing-channel-number"; + uses rem-cdma2000-hrpd-channel-g; + description + "List of object class FAPService.{i}.REM.CDMA2000.HRPD.Channel.{i}."; + } + list rem-cdma2000-hrpd-cell { + key "rem-cdma2000-hrpd-cell-key"; + uses rem-cdma2000-hrpd-cell-g; + container rem-cdma2000-hrpd-cell-rf { + uses rem-cdma2000-hrpd-cell-rf-g; + description + "Container for object class FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF."; + } + container rem-cdma2000-hrpd-cell-control-channel { + uses rem-cdma2000-hrpd-cell-control-channel-g; + description + "Container for object class FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel."; + } + description + "List of object class FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}."; + } + } + container rem-cdma2000-macro-timing { + uses rem-cdma2000-macro-timing-g; + description + "Container for object class FAPService.{i}.REM.CDMA2000.MacroTiming."; + list rem-cdma2000-macro-timing-channel { + key "band-class channel-number"; + uses rem-cdma2000-macro-timing-channel-g; + description + "List of object class FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}."; + } + } + } + } + container transport { + uses transport-g; + description + "Container for object class FAPService.{i}.Transport."; + container transport-sip { + uses transport-sip-g; + description + "Container for object class FAPService.{i}.Transport.SIP."; + container transport-sip-fcs { + uses transport-sip-fcs-g; + description + "Container for object class FAPService.{i}.Transport.SIP.FCS."; + } + } + container transport-sctp { + uses transport-sctp-g; + description + "Container for object class FAPService.{i}.Transport.SCTP."; + list transport-sctp-assoc { + key "primary-peer-address local-port"; + uses transport-sctp-assoc-g; + description + "List of object class FAPService.{i}.Transport.SCTP.Assoc.{i}."; + } + } + container transport-real-time { + uses transport-real-time-g; + description + "Container for object class FAPService.{i}.Transport.RealTime."; + container transport-real-time-perf { + uses transport-real-time-perf-g; + description + "Container for object class FAPService.{i}.Transport.RealTime.Perf."; + } + } + container transport-packet { + uses transport-packet-g; + description + "Container for object class FAPService.{i}.Transport.Packet."; + } + container transport-security { + uses transport-security-g; + description + "Container for object class FAPService.{i}.Transport.Security."; + list transport-security-secret { + key "uicc-card-id"; + uses transport-security-secret-g; + description + "List of object class FAPService.{i}.Transport.Security.Secret.{i}."; + } + } + } + description + "List of object class FAPService.{i}."; + } + + grouping fap-service-g { + description + "The Femto Access Point (FAP) Service Object."; + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Alias"; + } + leaf device-type { + type enumeration { + enum "standalone" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.DeviceType - Standalone"; + } + enum "integrated" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.DeviceType - Integrated"; + } + } + description + "The type of FAP device."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.DeviceType"; + } + leaf dn-prefix { + type string { + length "0..256"; + } + config false; + description + "The Distinguished Name prefix (DNPrefix) is an operator-configurable prefix string that is pre-pended to object distinguished names in the {{bibref|TR-157a5}} alarm object. See {{bibref|3GPP-TS.32.300}} for the formal definition and examples of DNPrefix as applied to 3GPP alarm objects"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.DNPrefix"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}."; + } + + grouping capabilities-g { + description + "This object contains parameters relating to the hardware capabilities of the FAP device."; + leaf gps-equipped { + type boolean; + description + "Indicates whether the FAP is equipped with a GPS receiver or not."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.GPSEquipped"; + } + leaf max-tx-power { + type uint64; + units "dBm"; + description + "Indicates the maximum possible transmit power in {{units}} that the FAP hardware can support."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.MaxTxPower"; + } + leaf-list supported-systems { + type enumeration { + enum "umts" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.SupportedSystems - UMTS"; + } + enum "lte" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.SupportedSystems - LTE"; + } + enum "cdma1x" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.SupportedSystems - CDMA1x"; + } + enum "cdmahrpd" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.SupportedSystems - CDMAHRPD"; + } + } + description + "{{list}} Each entry is a type of system that the FAP supports. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.SupportedSystems"; + } + leaf beacon { + type boolean; + description + "Indicates whether FAP can support beacon transmission."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.Beacon"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities."; + } + + grouping capabilities-umts-g { + description + "This object contains parameters relating to the system and RF aspect of the FAP device that supports the UMTS system."; + leaf duplex-mode { + type enumeration { + enum "fdd-mode" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.DuplexMode - FDDMode"; + } + } + description + "Indicates the mode supported by the FAP. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.DuplexMode"; + } + leaf gsm-rx-supported { + type boolean; + description + "Indicates whether the FAP hardware supports the receiving function of GSM or not."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxSupported"; + } + leaf hsdpa-supported { + type boolean; + description + "Indicates whether the FAP hardware supports the HSDPA capability or not."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.HSDPASupported"; + } + leaf max-hsdpa-data-rate-supported { + type uint64; + units "Kbps"; + description + "If the FAP hardware supports HSDPA ({{param|HSDPASupported}} is {{true}}), this parameter indicates the maximum HSDPA data rate in {{units}} that the device supports."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.MaxHSDPADataRateSupported"; + } + leaf hsupa-supported { + type boolean; + description + "Indicates whether the FAP hardware supports the HSUPA capability or not."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.HSUPASupported"; + } + leaf max-hsupa-data-rate-supported { + type uint64; + units "Kbps"; + description + "If the FAP hardware supports HSUPA ({{param|HSUPASupported}} is {{true}}), this parameter indicates the maximum HSUPA data rate in {{units}} that the device supports."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.MaxHSUPADataRateSupported"; + } + leaf max-hspdsc-hs-supported { + type uint8 { + range "0..15"; + } + description + "If the FAP hardware supports HSPA family (either {{param|HSDPASupported}} is {{true}} or {{param|HSUPASupported}} is {{true}}), this parameter indicates the available number of codes at the defined spreading factor (SF=16), within the complete code tree. See {{bibref|3GPP-TS.32.642|Section 6.3.9}} for more details."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.MaxHSPDSCHsSupported"; + } + leaf max-hsscc-hs-supported { + type uint64; + description + "If the FAP hardware supports HSPA family (either {{param|HSDPASupported}} is {{true}} or {{param|HSUPASupported}} is {{true}}), this parameter indicates the available number of HS-SCCHs for one cell. See {{bibref|3GPP-TS.32.642|Section 6.3.9}} for more details."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.MaxHSSCCHsSupported"; + } + leaf-list fdd-bands-supported { + type string; + min-elements 1; + max-elements "16"; + description + "{{list}} Indicates the UMTS bands that the FAP supports {{bibref|3GPP-TS.25.104}}, Release 8. At least one band MUST be supported and multiple bands MAY be supported. {{bibref|3GPP-TS.25.104}} Version 8.3.0 defines 14 UMTS bands (I through XIV). Each individual band is identified by its upper case Roman numeral. The order of the band indicators in the string has no significance. In case a new band is defined in the 3GPP standard in a future release of {{bibref|3GPP-TS.25.104}}, the corresponding new upper case Roman numeral will be included in the valid band indicators. The followings are examples of valid values: :\"I\" (specifies only band-I is supported) :\"I,II,V\" (specifies 3 bands are supported) :\"II,VII,I\" (specifies 3 bands are supported)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.FDDBandsSupported"; + } + leaf-list gsm-rx-bands-supported { + type enumeration { + enum "t-gsm380" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - T-GSM380"; + } + enum "t-gsm410" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - T-GSM410"; + } + enum "gsm450" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - GSM450"; + } + enum "gsm480" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - GSM480"; + } + enum "gsm710" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - GSM710"; + } + enum "gsm750" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - GSM750"; + } + enum "t-gsm810" { + value 7; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - T-GSM810"; + } + enum "gsm850" { + value 8; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - GSM850"; + } + enum "p-gsm900" { + value 9; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - P-GSM900"; + } + enum "e-gsm900" { + value 10; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - E-GSM900"; + } + enum "r-gsm900" { + value 11; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - R-GSM900"; + } + enum "t-gsm900" { + value 12; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - T-GSM900"; + } + enum "dcs1800" { + value 13; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - DCS1800"; + } + enum "pcs1900" { + value 14; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported - PCS1900"; + } + } + description + "{{list}} Indicates the GSM receive bands that the FAP supports {{bibref|3GPP-TS.45.005}}. At least one band MUST be supported and multiple bands MAY be supported. {{bibref|3GPP-TS.45.005}} defines 14 GSM bands. {{enum}} The order of the band indicators in the string has no significance. The following is an example of a valid value. :\"GSM850,PCS1900\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.GSMRxBandsSupported"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS."; + } + + grouping capabilities-umts-self-config-g { + description + "This object contains parameters relating to the self-configuration capabilities of the FAP. Self-configuration is enabled in {{object|.FAPControl.UMTS.SelfConfig.}}"; + leaf uarfcn-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the UTRA Absolute Radio Frequency Channel Number (UARFCN). If {{true}} multiple values MAY be provided in {{param|.CellConfig.UMTS.RAN.RF.UARFCNDL}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.UMTS.RAN.RF.UARFCNDL}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.UARFCNConfig"; + } + leaf primary-scrambling-code-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Primary Scrambling Code (PSC). If {{true}} multiple values or a range of values MAY be provided in {{param|.CellConfig.UMTS.RAN.RF.PrimaryScramblingCode}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.UMTS.RAN.RF.PrimaryScramblingCode}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.PrimaryScramblingCodeConfig"; + } + leaf maxfap-tx-power-expanded-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Maximum FAP Transmit Power. If {{true}} a range of values MAY be provided in {{param|.CellConfig.UMTS.RAN.RF.MaxFAPTxPowerExpanded}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.UMTS.RAN.RF.MaxFAPTxPowerExpanded}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.MaxFAPTxPowerExpandedConfig"; + } + leaf pcpich-power-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the P-CPICH power. If {{true}} a range of values MAY be provided in {{param|.CellConfig.UMTS.RAN.RF.PCPICHPower}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.UMTS.RAN.RF.PCPICHPower}} as an upper bound."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.PCPICHPowerConfig"; + } + leaf max-ul-tx-power-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Maximum UL Transmit Power. If {{true}} a range of values MAY be provided in {{param|.CellConfig.UMTS.RAN.RF.MaxULTxPower}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.UMTS.RAN.RF.MaxULTxPower}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.MaxULTxPowerConfig"; + } + leaf lacracura-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the LAC, RAC, and URA. If {{true}} multiple values MAY be provided in {{param|.CellConfig.UMTS.CN.LACRAC}} and {{param|.CellConfig.UMTS.RAN.URAList}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.UMTS.CN.LACRAC}} and {{param|.CellConfig.UMTS.RAN.URAList}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.LACRACURAConfig"; + } + leaf neighbor-list-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the neighbor list. If {{true}} the ACS uses the {{object|.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.}}, {{object|.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.}}, {{object|.CellConfig.UMTS.RAN.NeighborList.InterRATCell.}} tables to explicitly include or exclude entries and the FAP uses that information to determine the final configuration found in the {{object|.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}.}}, {{object|.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.}}, {{object|.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.}} tables. If {{false}} the ACS uses the {{object|.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.}}, {{object|.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.}}, {{object|.CellConfig.UMTS.RAN.NeighborList.InterRATCell.}} tables to only specify the included entries and the FAP uses that list."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.NeighborListConfig"; + } + leaf cell-re-selection-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine cell-reselection values. If {{true}} {{object|.CellConfig.UMTS.RAN.CellSelection.}} can be self-configured. If {{false}} {{object|.CellConfig.UMTS.RAN.CellSelection.}} is provided by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.CellReSelectionConfig"; + } + leaf intra-freq-meas-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine intra-frequency measurement values. If {{true}} {{object|.CellConfig.UMTS.RAN.IntraFreqMeas.}} can be self-configured. If {{false}} {{object|.CellConfig.UMTS.RAN.IntraFreqMeas.}} is provided by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.IntraFreqMeasConfig"; + } + leaf inter-freq-meas-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine inter-frequency measurement values. If {{true}} {{object|.CellConfig.UMTS.RAN.InterFreqMeas.}} can be self-configured. If {{false}} {{object|.CellConfig.UMTS.RAN.InterFreqMeas.}} is provided by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.InterFreqMeasConfig"; + } + leaf inter-rat-meas-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine inter-RAT measurement values. If {{true}} {{object|.CellConfig.UMTS.RAN.InterRATMeas.}} can be self-configured. If {{false}} {{object|.CellConfig.UMTS.RAN.InterRATMeas.}} is provided by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.InterRATMeasConfig"; + } + leaf ue-internal-meas-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine UE internal measurement values. If {{true}} {{object|.CellConfig.UMTS.RAN.UEInternalMeas.}} can be self-configured. If {{false}} {{object|.CellConfig.UMTS.RAN.UEInternalMeas.}} is provided by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.UEInternalMeasConfig"; + } + leaf noise-rise-limit-config { + type boolean; + description + "Indicates whether the FAP supports the selfconfiguration capability to determine the Noise Rise Limit. If {{true}} {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitLowerValue}} and {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitUpperValue}}. MAY provide a range of values to select from. If {{false}} {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitUpperValue}} provides only a single value to be used. The value of {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitLowerValue}} is ignored."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig.NoiseRiseLimitConfig"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.UMTS.SelfConfig."; + } + + grouping capabilities-lte-g { + description + "This object contains parameters relating to the system and RF aspect of the FAP device that supports the LTE system."; + leaf duplex-mode { + type enumeration { + enum "fdd-mode" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.DuplexMode - FDDMode"; + } + enum "tdd-mode" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.DuplexMode - TDDMode"; + } + } + description + "Indicates the mode supported by the LTE FAP. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.DuplexMode"; + } + leaf-list bands-supported { + type uint8 { + range "1..21 | 33..40"; + } + min-elements 1; + max-elements "16"; + description + "{{list}} Indicates the LTE bands that the LTE FAP supports {{bibref|3GPP-TS.36.101|Section 5.5}}. At least one band MUST be supported and multiple bands MAY be supported. Each individual band is identified by arabic number (1, 2,...). The order of the band indicators in the string has no significance. In case a new band is defined in the 3GPP standard in a future release of {{bibref|3GPP-TS.36.101}}, the corresponding new band number will be included in the valid band indicators. The followings are examples of valid values: :\"1\" (specifies only band-1 is supported) :\"1,2,11\" (specifies 3 bands are supported) :\"2,11,1\" (specifies 3 bands are supported)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.BandsSupported"; + } + leaf nnsf-supported { + type boolean; + description + "Indicates whether LTE FAP supports the NAS Node Selection Function (NNSF) or not. NNSF is described in {{bibref|3GPP-TS.36.300|Section 19.2.1.7 and Section 4.6.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.NNSFSupported"; + } + leaf umts-rx-supported { + type boolean; + description + "Indicates whether the LTE FAP hardware supports the receiving function of UMTS or not."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.UMTSRxSupported"; + } + leaf-list umts-rx-bands-supported { + type string; + max-elements "16"; + description + "{{list}} Indicates the UMTS receive bands that the LTE FAP supports {{bibref|3GPP-TS.25.104}}, Release 8. If {{param|UMTSRxSupported}} is {{true}}, then at least one band MUST be supported and multiple bands MAY be supported. Each individual band is identified by its upper case Roman numeral. The order of the band indicators in the string has no significance. In case a new band is defined in the 3GPP standard in a future release of {{bibref|3GPP-TS.25.104}}, the corresponding new upper case Roman numeral will be included in the valid band indicators. The followings are examples of valid values: :\"I\" (specifies only band-I is supported) :\"I,II,V\" (specifies 3 bands are supported) :\"II,VII,I\" (specifies 3 bands are supported)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.UMTSRxBandsSupported"; + } + leaf gsm-rx-supported { + type boolean; + description + "Indicates whether the LTE FAP hardware supports the receiving function of GSM or not."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxSupported"; + } + leaf-list gsm-rx-bands-supported { + type enumeration { + enum "t-gsm380" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - T-GSM380"; + } + enum "t-gsm410" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - T-GSM410"; + } + enum "gsm450" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - GSM450"; + } + enum "gsm480" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - GSM480"; + } + enum "gsm710" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - GSM710"; + } + enum "gsm750" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - GSM750"; + } + enum "t-gsm810" { + value 7; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - T-GSM810"; + } + enum "gsm850" { + value 8; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - GSM850"; + } + enum "p-gsm900" { + value 9; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - P-GSM900"; + } + enum "e-gsm900" { + value 10; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - E-GSM900"; + } + enum "r-gsm900" { + value 11; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - R-GSM900"; + } + enum "t-gsm900" { + value 12; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - T-GSM900"; + } + enum "dcs1800" { + value 13; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - DCS1800"; + } + enum "pcs1900" { + value 14; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported - PCS1900"; + } + } + description + "{{list}} Indicates the GSM receive bands that the LTE FAP supports {{bibref|3GPP-TS.45.005}}. If {{param|GSMRxSupported}} is {{true}}, then at least one band MUST be supported and multiple bands MAY be supported. {{bibref|3GPP-TS.45.005}} defines 14 GSM bands. {{enum}} The order of the band indicators in the string has no significance. The following is an example of a valid value. :\"GSM850,PCS1900\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.GSMRxBandsSupported"; + } + leaf cdma2000-rx-supported { + type boolean; + description + "Indicates whether the LTE FAP hardware supports the receiving function of CDMA2000 or not."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.CDMA2000RxSupported"; + } + leaf-list cdma2000-rx-bands-supported { + type string; + max-elements "16"; + description + "{{list}} Indicates the CDMA2000 receive bands that the LTE FAP supports. If {{param|CDMA2000RxSupported}} is {{true}}, then at least one band MUST be supported and multiple bands MAY be supported. The order of the band indicators in the string has no significance. Bandclass is a 1 or 2-digit number as defined in {{bibref|3GPP2-C.S0057-B}}. The following are example values: :\"0\" (specifies US Cellular) :\"1,3,14\" (specifies US PCS, Japan Cellular and US PCS 1.9Ghz) specifies 3 bands are supported)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE.CDMA2000RxBandsSupported"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.LTE."; + } + + grouping capabilities-cdma2000-g { + description + "This object contains parameters relating to the capability attributes for CDMA2000 FAP."; + leaf remote-ip-access-capable { + type boolean; + description + "Indicates whether the FAP is capable of providing remote IP access service as defined in {{bibref|3GPP2-X.S0059}}. If {{true}}, the FAP is capable of remote IP access service. If {{false}}, the FAP is not capable of remote IP access service."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.RemoteIPAccessCapable"; + } + leaf-list band-class-supportedfap-beacon { + type string; + max-elements "32"; + description + "{{list}} Indicates the band classes that the FAP supports for beacon transmission. One or multiple bands MAY be supported. Bandclass is a 1 or 2-digit number as defined in {{bibref|3GPP2-C.S0057}}. List is empty if FAP can not support beacon transmissions."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.BandClassSupportedFAPBeacon"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000."; + } + + grouping capabilities-cdma2000-one-x-g { + description + "This object contains parameters relating to the capability attributes for the CDMA2000 1x radio technology portions of a CDMA2000 FAP."; + leaf band-class-supportedfap { + type string { + length "0..32"; + } + description + "{{list}} Indicates the CDMA bands that the FAP supports. At least one band MUST be supported and multiple bands MAY be supported. Bandclass is a 1 or 2-digit number as defined in {{bibref|3GPP2-C.S0057}}. The following are example values: \"0\" (specifies US Cellular) \"1,3,14\" (specifies US PCS, Japan Cellular and US PCS 1.9Ghz)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX.BandClassSupportedFAP"; + } + leaf active-handin-capable { + type boolean; + description + "Indicates whether the FAP is capable of accepting hand-in of active 1x call from another base station. If {{true}}, the FAP is capable of accepting hand-in. If {{false}}, the FAP is not capable of accepting hand-in."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX.ActiveHandinCapable"; + } + leaf femto-overhead-messages-capable { + type boolean; + description + "Indicates whether the FAP supports Access Point Identification, Access Point Pilot Information, and Access Point Identification Text messages specified in {{bibref|3GPP2-C.S0005}}. If {{true}}, the FAP supports these messages. If {{false}}, the FAP does not supports these messages."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX.FemtoOverheadMessagesCapable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX."; + } + + grouping capabilities-cdma2000-one-x-self-config-g { + description + "This object contains parameters relating to the self-configuration capabilities of the FAP. Self-configuration is enabled in {{object|.FAPControl.CDMA2000.OneX.SelfConfig.}}."; + leaf rfcnfl-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Radio Frequency Channel Number. If {{true}} multiple values MAY be provided in {{param|.CellConfig.CDMA2000.OneX.RAN.RF.RFCNFL}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.CDMA2000.OneX.RAN.RF.RFCNFL}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX.SelfConfig.RFCNFLConfig"; + } + leaf pilot-pn-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the pilot PN offset. If {{true}} multiple values or a range of values MAY be provided in {{param|.CellConfig.CDMA2000.OneX.RAN.RF.PilotPN}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.CDMA2000.OneX.RAN.RF.PilotPN}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX.SelfConfig.PilotPNConfig"; + } + leaf maxfap-tx-power-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Maximum FAP Transmit Power. If {{true}} a range of values MAY be provided in {{param|.CellConfig.CDMA2000.OneX.RAN.RF.MaxFAPTxPower}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.CDMA2000.OneX.RAN.RF.MaxFAPTxPower}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX.SelfConfig.MaxFAPTxPowerConfig"; + } + leaf maxfap-beacon-tx-power-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Maximum FAP Beacon Transmit Power. If {{true}} a range of values MAY be provided in {{param|.CellConfig.CDMA2000.Beacon.MaxFAPBeaconTxPower}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.CDMA2000.Beacon.MaxFAPBeaconTxPower}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX.SelfConfig.MaxFAPBeaconTxPowerConfig"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.OneX.SelfConfig."; + } + + grouping capabilities-cdma2000-hrpd-g { + description + "This object contains parameters relating to the capability attributes for the CDMA2000 HRPD radio technology portions of a CDMA2000 FAP."; + leaf a13-session-transfer-capable { + type boolean; + description + "Indicates whether the FAP is capable of supporting A13 session transfer. See {{bibref|3GPP2-C.S0024-B}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.A13SessionTransferCapable"; + } + leaf a16-session-transfer-capable { + type boolean; + description + "Indicates whether the FAP is capable of supporting A16 session transfer. See {{bibref|3GPP2-C.S0024-B}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.A16SessionTransferCapable"; + } + leaf local-ip-access-capable { + type boolean; + description + "Indicates whether the FAP is capable of supporting Local IP access. See {{bibref|3GPP2-C.S0024-B}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.LocalIPAccessCapable"; + } + leaf dedicated-hrpd-beacon { + type boolean; + description + "Indicated whether the FAP supports a dedicated transmission of HRPD beacon independent of the generalized beacon."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.DedicatedHRPDBeacon"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD."; + } + + grouping capabilities-cdma2000-hrpd-self-config-g { + description + "This object contains parameters relating to the self-configuration capability attributes for the CDMA2000 HRPD radio technology portions of a CDMA2000 FAP."; + leaf rfcnfl-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Radio Frequency Channel Number. If {{true}} multiple values MAY be provided in {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.RFCNFL}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.RFCNFL}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.SelfConfig.RFCNFLConfig"; + } + leaf pilot-pn-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the pilot PN offset. If {{true}} multiple values or a range of values MAY be provided in {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.PilotPN}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.PilotPN}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.SelfConfig.PilotPNConfig"; + } + leaf maxfap-tx-power-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Maximum FAP Transmit Power. If {{true}} a range of values MAY be provided in {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.MaxFAPTxPower}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.MaxFAPTxPower}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.SelfConfig.MaxFAPTxPowerConfig"; + } + leaf maxfap-beacon-tx-power-config { + type boolean; + description + "Indicates whether the FAP supports the self-configuration capability to determine the Maximum FAP Beacon Transmit Power. If {{true}} a range of values MAY be provided in {{param|.CellConfig.CDMA2000.Beacon.MaxFAPBeaconTxPower}} for the FAP to select from. If {{false}} only a single value SHOULD be provided in {{param|.CellConfig.CDMA2000.Beacon.MaxFAPBeaconTxPower}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.SelfConfig.MaxFAPBeaconTxPowerConfig"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Capabilities.CDMA2000.HRPD.SelfConfig."; + } + + grouping fap-control-g { + description + "This object contains parameters relating to state management and provisioning aspects of the FAP."; + leaf-list self-config-events { + type enumeration { + enum "initial-rem" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.SelfConfigEvents - InitialREM"; + } + } + config false; + description + "{{list}} Each item is an event that causes the FAP to perform self configuration as defined by {{object|.FAPControl.UMTS.SelfConfig.}}, {{object|.FAPControl.CDMA2000.OneX.SelfConfig.}}, or {{object|.FAPControl.CDMA2000.HRPD.SelfConfig.}}. Vendors can extend the enumerated values with vendor-specific extensions, in which case the rules outlined in {{bibref|TR-106a2|Section3.3}} MUST be adhered to."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.SelfConfigEvents"; + } + leaf enclosure-tampering-detected { + type boolean; + config false; + description + "This parameter indicates whether or not physical tampering of the device enclosure occurred, such as illegal opening of the box. If {{true}} device tampering is detected. If {{false}} no sign of device tampering is detected. Tampering state MUST be persisted across reboots and the device MUST never reset it back from {{true}} to {{false}} even after a factory reset."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.EnclosureTamperingDetected"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl."; + } + + grouping fap-control-umts-g { + description + "This object contains parameters relating to the UMTS system specific information."; + leaf op-state { + type boolean; + description + "Current operational state of the UMTS FAP as defined in {{bibref|ITU-X.731}}. If {{true}} the UMTS FAP is currently enabled. If {{false}} the UMTS FAP is currently disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.OpState"; + } + leaf admin-state { + type boolean; + config false; + description + "Lock or unlock the UMTS FAP. This controls the administrative state of the UMTS FAP as defined in {{bibref|ITU-X.731}}. If {{true}} Unlocked with permission to serve traffic (and enable RF transmitter(s)). If {{false}} Locked. Transition UMTS FAP to state where it is NOT permitted to serve traffic. RF transmitter is disabled. Given that this command controls the UMTS FAP's RF transmitter, the underlying expectation is that the unlock is done when all necessary conditions are met to allow the transmitter to key on and provide service, including aspects such as: # location verification (including meeting the governing regulatory requirements) # verifying the UMTS FAP configuration # if physical tampering is supported and no physical tampering is detected. The default value after power-on is {{false}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.AdminState"; + } + leaf rf-tx-status { + type boolean; + description + "Current status of this UMTS FAP RF transmitter. {{true}} indicates that the UMTS FAP Tx transmitter is on. {{false}} indicates that the UMTS FAP Tx transmitter is off. This state is tied to the Administrative state which is controlled by the ACS. :When the ACS sets {{param|AdminState}} to {{true}}, then the UMTS FAP has permission to turn on the RF transmitter. :When the ACS sets {{param|AdminState}} to {{false}}, then the UMTS FAP is not allowed to provide service and MUST turn off the RF transmitter."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.RFTxStatus"; + } + leaf pm-config { + type string { + length "0..256"; + } + config false; + description + "The value MUST be the path name of a row in the optional ''FAP.PerfMgmt.Config.'' table (see {{bibref|TR-262}}). This is the performance management related configuration for the UMTS FAP. In case of a multiple-radio-technology FAP product, each radio technology can have its own PM configuration or share a common PM configuration. In the former case, {{param}} can contain a unique instance number. In the latter case, {{param}} under all radio technologies can have the same instance number. If the referenced object is deleted, the parameter value MUST be set to an empty string."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.PMConfig"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS."; + } + + grouping fap-control-umts-self-config-g { + description + "This object contains parameters relating to the controlling of self-configuration capabilities in the FAP."; + leaf uarfcn-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the values of {{param|.CellConfig.UMTS.RAN.CSG.UARFCNDLList}}. If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.UARFCNSelfConfigEnable"; + } + leaf primary-scrambling-code-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.UMTS.RAN.RF.PrimaryScramblingCode}}. If {{true}} the FAP self-configures the value. If {{false}} the ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.PrimaryScramblingCodeSelfConfigEnable"; + } + leaf maxfap-tx-power-expanded-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.UMTS.RAN.RF.MaxFAPTxPowerExpanded}}. If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.MaxFAPTxPowerExpandedSelfConfigEnable"; + } + leaf pcpich-power-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.UMTS.RAN.RF.PCPICHPower}}. If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.PCPICHPowerSelfConfigEnable"; + } + leaf max-ul-tx-power-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.UMTS.RAN.RF.MaxULTxPower}}. If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.MaxULTxPowerSelfConfigEnable"; + } + leaf lacracura-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the values of {{param|.CellConfig.UMTS.CN.LACRAC}} and {{param|.CellConfig.UMTS.RAN.URAList}}. If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.LACRACURASelfConfigEnable"; + } + leaf neighbor-list-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the values in the object {{object|.CellConfig.UMTS.RAN.NeighborList.}} If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.NeighborListSelfConfigEnable"; + } + leaf cell-re-selection-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine Cell Selection/Reselection-related parameters in {{object|.CellConfig.UMTS.RAN.CellSelection.}} If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.CellReSelectionSelfConfigEnable"; + } + leaf intra-freq-meas-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine intra-frequency measurement -related parameters in {{object|.CellConfig.UMTS.RAN.IntraFreqMeas.}} If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.IntraFreqMeasSelfConfigEnable"; + } + leaf inter-freq-meas-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine inter-frequency measurement -related parameters in {{object|.CellConfig.UMTS.RAN.InterFreqMeas.}} If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.InterFreqMeasSelfConfigEnable"; + } + leaf inter-rat-meas-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine inter-RAT measurement -related parameters in {{object|.CellConfig.UMTS.RAN.InterRATMeas.}} If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.InterRATMeasSelfConfigEnable"; + } + leaf ue-internal-meas-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine UE internal measurement-related parameters in {{object|.CellConfig.UMTS.RAN.UEInternalMeas.}} If {{true}} The FAP self-configures the value. If {{false}} The ACS MUST provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.UEInternalMeasConfigEnable"; + } + leaf noise-rise-limit-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitInUse}}. If {{true}} the FAP self-configures the value, based on the limits specified in {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitLowerValue}} and {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitUpperValue}}. If {{false}} the ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig.NoiseRiseLimitConfigEnable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.SelfConfig."; + } + + grouping fap-control-umts-gateway-g { + description + "This object contains parameters relating to the Gateways that FAP is connected to."; + leaf sec-gw-server1 { + type string { + length "0..64"; + } + config false; + description + "First SecGW the FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.Gateway.SecGWServer1"; + } + leaf sec-gw-server2 { + type string { + length "0..64"; + } + config false; + description + "Second SecGW the FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.Gateway.SecGWServer2"; + } + leaf sec-gw-server3 { + type string { + length "0..64"; + } + config false; + description + "Third SecGW the FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.Gateway.SecGWServer3"; + } + leaf fap-gw-server1 { + type string { + length "0..64"; + } + config false; + description + "First FAPGW the FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.Gateway.FAPGWServer1"; + } + leaf fap-gw-server2 { + type string { + length "0..64"; + } + config false; + description + "Second FAPGW the FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.Gateway.FAPGWServer2"; + } + leaf fap-gw-server3 { + type string { + length "0..64"; + } + config false; + description + "Third FAPGW the FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.Gateway.FAPGWServer3"; + } + leaf fap-gw-port { + type uint16 { + range "0..65535"; + } + config false; + description + "Port number of FAPGW used for initial Iuh SCTP contact. This value is specified as 29169 according to IANA definition per {{bibref|IANA-portnumbers}}, registered on 2009-09-08. Use of IANA-defined value is recommended."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.Gateway.FAPGWPort"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.UMTS.Gateway."; + } + + grouping fap-control-lte-g { + description + "This object contains parameters relating to the LTE system specific information."; + leaf op-state { + type boolean; + description + "Current operational state of the LTE FAP as defined in {{bibref|ITU-X.731}}. If {{true}} the LTE FAP is currently enabled. If {{false}} the LTE FAP is currently disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.OpState"; + } + leaf admin-state { + type boolean; + config false; + description + "Lock or unlock the LTE FAP. This controls the administrative state of the LTE FAP as defined in {{bibref|ITU-X.731}}. If {{true}} Unlocked with permission to serve traffic (and enable RF transmitter(s)). If {{false}} Locked. Transition LTE FAP to state where it is NOT permitted to serve traffic. RF transmitter is disabled. Given that this command controls the LTE FAP's RF transmitter, the underlying expectation is that the unlock is done when all necessary conditions are met to allow the transmitter to key on and provide service, including aspects such as: # location verification (including meeting the governing regulatory requirements) # verifying the LTE FAP configuration # if physical tampering is supported and no physical tampering is detected. The default value after power-on is {{false}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.AdminState"; + } + leaf rf-tx-status { + type boolean; + description + "Current status of this LTE FAP RF transmitter. {{true}} indicates that the LTE FAP Tx transmitter is on. {{false}} indicates that the LTE FAP Tx transmitter is off. This state is tied to the Administrative state which is controlled by the ACS. :When the ACS sets {{param|AdminState}} to {{true}}, then the LTE FAP has permission to turn on the RF transmitter. :When the ACS sets {{param|AdminState}} to {{false}}, then the LTE FAP is not allowed to provide service and MUST turn off the RF transmitter."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.RFTxStatus"; + } + leaf pm-config { + type string { + length "0..256"; + } + config false; + description + "The value MUST be the path name of a row in optional the ''.FAP.PerfMgmt.Config.'' table (see {{bibref|TR-262}}). This is the performance management related configuration for the LTE FAP. In case of a multiple-radio-technology FAP product, each radio technology can have its own PM configuration or share a common PM configuration. In the former case, {{param}} can contain a unique instance number. In the latter case, {{param}} under all radio technologies can have the same instance number. If the referenced object is deleted, the parameter value MUST be set to an empty string."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.PMConfig"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE."; + } + + grouping fap-control-lte-gateway-g { + description + "This object contains parameters relating to the Gateways that the LTE FAP is connected to."; + leaf sec-gw-server1 { + type string { + length "0..64"; + } + config false; + description + "First SecGW the LTE FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway.SecGWServer1"; + } + leaf sec-gw-server2 { + type string { + length "0..64"; + } + config false; + description + "Second SecGW the LTE FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway.SecGWServer2"; + } + leaf sec-gw-server3 { + type string { + length "0..64"; + } + config false; + description + "Third SecGW the LTE FAP attempts to establish connection with. Either hostname or IPaddress."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway.SecGWServer3"; + } + leaf-list s1-sig-link-server-list { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a S1 signaling connection end point (-GW or MME) the LTE FAP attempts to establish connection with. It is in the form of either hostname or IPaddress. LTE FAP's behavior in terms of the number of S1 connection to established with is determined by {{param|S1ConnectionMode}} parameter. If {{param|S1ConnectionMode}} has the value of {{enum|One|S1ConnectionMode}}, then LTE FAP attempts to establish S1 connection with only one address following the ordering of the list. If {{param|S1ConnectionMode}} has the value of {{enum|All|S1ConnectionMode}}, then LTE FAP attempts to establish connection with all addresses in the list."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway.S1SigLinkServerList"; + } + leaf s1-connection-mode { + type enumeration { + enum "one" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway.S1ConnectionMode - One"; + } + enum "all" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway.S1ConnectionMode - All"; + } + } + config false; + description + "Indicates how many of the configured far-end S1 link address(es),as defined in {{param|S1SigLinkServerList}}, LTE FAP SHOULD attempt to establish connection with simultaneously. If {{param}} parameter is not explicitly configured, then LTE FAP shall assume the value to be {{enum|One|S1ConnectionMode}} as default."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway.S1ConnectionMode"; + } + leaf s1-sig-link-port { + type uint16 { + range "0..65535"; + } + config false; + description + "Port number of S1AP signaling connection end point (-GW or MME) used for initial S1 SCTP contact. This value is specified as 36412 according to IANA definition per {{bibref|IANA-portnumbers}}, registered on 2009-09-01. Use of IANA-defined value is recommended."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway.S1SigLinkPort"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.LTE.Gateway."; + } + + grouping fap-control-cdma2000-g { + description + "This object contains parameters relating to the configuration for the control portions of a CDMA2000 FAP."; + leaf home-domain { + type string { + length "0..256"; + } + config false; + description + "A string containing one of operator's home domains in URI format. FAP is preconfigured with a default home domain, which can be overwritten later by ACS. See {{bibref|3GPP2-X.S0059}}. If the''.ManagementServer.URL'' is null, then the FAP shall use the value of this attribute to construct the ''.ManagementServer.URL'' attribute. If {{param|.FAPControl.CDMA2000.Gateway.SecGWServer1}} is null, then the FAP shall use the value of this attribute to construct the {{param|.FAPControl.CDMA2000.Gateway.SecGWServer1}} attribute. If the FAP is unable to connect to the management server indicated by the value of the ''.ManagementServer.URL'' attribute and this attribute is not null, the FAP may use the value of this attribute to construct the ''.ManagementServer.URL'' attribute. If the FAP is unable to connect to any security gateway indicated by the value of the {{param|.FAPControl.CDMA2000.Gateway.SecGWServer1}}, {{param|.FAPControl.CDMA2000.Gateway.SecGWServer2}}, and {{param|.FAPControl.CDMA2000.Gateway.SecGWServer3}} attributes and this attribute is not null, the FAP may use the value of this attribute to construct the {{param|.FAPControl.CDMA2000.Gateway.SecGWServer1}} attribute."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HomeDomain"; + } + leaf remote-ip-access-enable { + type boolean; + config false; + description + "Enable or disable remote IP access service as defined in {{bibref|3GPP2-X.S0059}}. If {{true}} remote IP access is enabled. If {{false}} remove IP access is disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.RemoteIPAccessEnable"; + } + leaf pm-config { + type string { + length "0..256"; + } + config false; + description + "The value MUST be the path name of a row in the ''.FAP.PerfMgmt.Config.'' table. This is the performance management related configuration for the CDMA2000 FAP. In case of a multiple-radio-technology FAP product, each radio technology can have its own PM configuration or share a common PM configuration. In the former case, {{param}} can contain a unique instance number. In the latter case, {{param}} under all radio technologies can have the same instance number. If the referenced object is deleted, the parameter value MUST be set to an empty string."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.PMConfig"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000."; + } + + grouping fap-control-cdma2000-time-g { + description + "This object contains parameters related to time syncronization with CDMA2000 System Time (see {{bibref|3GPP2-C.S0005}})."; + leaf local-time-zone { + type string { + length "0..256"; + } + config false; + description + "The local time zone for CDMA2000 operational purposes. E.g., \"+HH:MM JST\" for Japan. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Time.LocalTimeZone"; + } + leaf current-local-time { + type string { + length "0..64"; + } + description + "The current CDMA System Time (see {{bibref|3GPP2-C.S0005}}), expressed as date and time in the CPE's local time zone. The format of this field is \"YYYY-MM-DDThh:mm:ss.sTZD\" (e.g., 1997-07-16T19:20:30.45+01:00), where: YYYY = four-digit year MM = two-digit month (01=January, etc.) DD = two-digit day of month (01 through 31) hh = two digits of hour (00 through 23) (am/pm NOT allowed) mm = two digits of minute (00 through 59) ss = two digits of second (00 through 59) s = one or more digits representing a decimal fraction of a second TZD = time zone designator (Z or +hh:mm or -hh:mm)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Time.CurrentLocalTime"; + } + leaf leap-seconds { + type int64; + units "seconds"; + config false; + description + "Number of leap seconds (in {{units}} to be applied between CurrentLocalTime and CDMA System Time. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Time.LeapSeconds"; + } + leaf daylight-savings-used { + type boolean; + config false; + description + "Whether or not daylight savings time is in use in the FAP's local time zone with respect to CDMA2000 System Time (see {{bibref|3GPP2-C.S0005}}). {true}} if daylight savings time is being used; otherwise {{false}}. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Time.DaylightSavingsUsed"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Time."; + } + + grouping fap-control-cdma2000-one-x-g { + description + "This object contains all global attributes of the 1xFemto application."; + leaf admin-state { + type enumeration { + enum "lock" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.AdminState - Lock"; + } + enum "unlock" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.AdminState - Unlock"; + } + } + config false; + description + "Administrative state for 1x"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.AdminState"; + } + leaf op-state { + type enumeration { + enum "enabled" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.OpState - Enabled"; + } + enum "disabled" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.OpState - Disabled"; + } + } + description + "Operational state of the 1x"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.OpState"; + } + leaf rf-tx-status { + type boolean; + description + "Current status of this RF transmitter. {{true}} indicates that the 3G Tx transmitter is on. {{false}} indicates that the 3G Tx transmitter is off. This state is tied to the Administrative state which is controlled by the ACS. When the ACS sets AdminState to {{true}}, then the FAP has permission to turn on the RF transmitter. When the ACS sets AdminState to {{false}}, then the FAP is not allowed to provide service and MUST turn off the RF transmitter."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.RFTxStatus"; + } + leaf daylight { + type int64; + config false; + description + "If Daylight Savings Time is being used with respect to CDMA2000 1x overhead parameters (see {{bibref|3GPP2-C.S0005}}), then {{param}} should be set to {{true}}. Otherwise, {{param}} should be set to {{false}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.Daylight"; + } + leaf max-p-rev { + type int64; + config false; + description + "Protocol revision supported by the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.MaxPRev"; + } + leaf reregister { + type uint64; + config false; + description + "{{param}} triggers a re-registration of all mobiles. The FAP triggers re-registration of all registered mobiles everytime this number changes"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.Reregister"; + } + leaf emergency-session-period { + type uint16 { + range "15..1800"; + } + units "seconds"; + config false; + description + "The period (in {{units}}) the session of an unauthorized user is kept alive after an emergency call."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.EmergencySessionPeriod"; + } + leaf location-area-code { + type uint16 { + range "0..65535"; + } + config false; + description + "This is the location area code."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.LocationAreaCode"; + } + leaf msc-id { + type uint64; + config false; + description + "This is the FAP's MSCID. This ID is used in PANI header."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.MSCId"; + } + leaf active-handin-enable { + type boolean; + config false; + description + "Indicates whether the FAP performs active hand-in from another base station. If {{true}} active hand-in is enabled; if {{false}} active hand-in is disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.ActiveHandinEnable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX."; + } + + grouping fap-control-cdma2000-one-x-active-handin-measurement-g { + description + "CDMA2000 1x active handin operational parameters."; + leaf active-handin-measurement-enable { + type boolean; + config false; + description + "Indicates whether the FAP performs active hand-in measurement if a request is received. If {{true}} active hand-in measurement is enabled; if {{false}} active hand-in measurement is disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.ActiveHandinMeasurement.ActiveHandinMeasurementEnable"; + } + leaf active-hand-in-measurement-duration { + type uint16 { + range "0..65535"; + } + units "1.25 ms slots"; + config false; + description + "The minimum duration in {{units}} for which FAP should take a mobile's RL pilot strength measurements for active hand-in purpose when directed by the network. Instead of continuous measurement for this entire duration, a FAP can make multiple measurements by sampling over shorter durations. In such a case, this value specifies the minimum time separation required between the first and last measurement samples."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.ActiveHandinMeasurement.ActiveHandInMeasurementDuration"; + } + leaf measurement-report-threshold { + type int64; + units "dBm"; + config false; + description + "The threshold (in {{units}}) for the FAP to report an active hand-in measurement. If the metric to be reported is below the threshold, the FAP may not send any report."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.ActiveHandinMeasurement.MeasurementReportThreshold"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.ActiveHandinMeasurement."; + } + + grouping fap-control-cdma2000-one-x-self-config-g { + description + "This object contains parameters relating to the controlling of self-configuration capabilities in the FAP."; + leaf rfcnfl-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the values of {{param|.CellConfig.CDMA2000.OneX.RAN.RF.RFCNFL}}. If {{true}}, the FAP self-configures the value. If {{false}}, the ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.SelfConfig.RFCNFLSelfConfigEnable"; + } + leaf pilot-pn-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.CDMA2000.OneX.RAN.RF.PilotPN}}. If {{true}} the FAP self-configures the value. If {{false}} the ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.SelfConfig.PilotPNSelfConfigEnable"; + } + leaf maxfap-tx-power-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.CDMA2000.OneX.RAN.RF.MaxFAPTxPower}}. If {{true}} the FAP self-configures the value. If {{false}} the ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.SelfConfig.MaxFAPTxPowerSelfConfigEnable"; + } + leaf maxfap-beacon-tx-power-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.CDMA2000.Beacon.MaxFAPBeaconTxPower}}. If {{true}}, the FAP self-configures the value. If {{false}}, the ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.SelfConfig.MaxFAPBeaconTxPowerSelfConfigEnable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.OneX.SelfConfig."; + } + + grouping fap-control-cdma2000-gateway-g { + description + "CDMA2000 FAP Security Gateway operational parameters."; + leaf sec-gw-server1 { + type string { + length "0..64"; + } + config false; + description + "First SecGW the FAP attempts to contact. Either FQDN or IP address"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Gateway.SecGWServer1"; + } + leaf sec-gw-server2 { + type string { + length "0..64"; + } + config false; + description + "Second SecGW the FAP attempts to contact. Either FQDN or IP address"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Gateway.SecGWServer2"; + } + leaf sec-gw-server3 { + type string { + length "0..64"; + } + config false; + description + "Third SecGW that the FAP attempts to contact. Can contain either FQDN or IP address"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Gateway.SecGWServer3"; + } + leaf sec-gw-switchover-count { + type uint64; + description + "Counter indicating how many times FAP has switched between SecGW"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Gateway.SecGWSwitchoverCount"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.Gateway."; + } + + grouping fap-control-cdma2000-hrpd-g { + description + "Operational parameters for the HRPD portion of a CDMA2000 FAP."; + leaf op-state { + type boolean; + description + "Current operational state of the FAP as defined in ITU-X.731 [32]. If {{true}} the FAP is currently enabled. If {{false}} the FAP is currently disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.OpState"; + } + leaf admin-state { + type boolean; + config false; + description + "Lock or unlock the FAP. This controls the administrative state of the FAP as defined in ITU-X.731 [32]. If {{true}} Unlocked with permission to serve traffic (and enable RF transmitter(s)). If {{false}} Locked. Transition FAP to state where it is NOT permitted to serve traffic. RF transmitter is disabled. Given that this command controls the FAP's RF transmitter, the underlying expectation is that the unlock is done when all necessary conditions are met to allow the transmitter to key on and provide service, including aspects such as: location verification (including meeting the governing regulatory requirements) verifying the FAP configuration if physical tampering is supported and no physical tampering is detected. The default value after power-on is {{false}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.AdminState"; + } + leaf rf-tx-status { + type boolean; + description + "Current status of this RF transmitter. {{true}} indicates that the 3G Tx transmitter is on. {{false}} indicates that the 3G Tx transmitter is off. This state is tied to the Administrative state which is controlled by the ACS. When the ACS sets AdminState to {{true}}, then the FAP has permission to turn on the RF transmitter. When the ACS sets AdminState to {{false}}, then the FAP is not allowed to provide service and MUST turn off the RF transmitter."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.RFTxStatus"; + } + leaf a13-session-transfer-enable { + type boolean; + config false; + description + "Indicates whether the FAP performs A13 session transfer. If {{true}} A13 session transfer is enabled; if {{false}} A13 session transfer is disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13SessionTransferEnable"; + } + leaf local-ip-access-enable { + type boolean; + config false; + description + "Indicates whether the FAP can assign local IP address to capable ATs. If {{true}} local IP address is assigned.; if {{false}} local IP address is not assigned."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.LocalIPAccessEnable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD."; + } + + grouping fap-control-cdma2000-hrpd-self-config-g { + description + "This object contains parameters relating to the controlling of self-configuration capabilities in the FAP."; + leaf rfcnfl-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the values of {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.RFCNFL}}. If {{true}}, the FAP self-configures the value. If {{false}}, the ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.SelfConfig.RFCNFLSelfConfigEnable"; + } + leaf pilot-pn-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.PilotPN}}. If {{true}}, the FAP self-configures the value. If {{false}}, the ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.SelfConfig.PilotPNSelfConfigEnable"; + } + leaf maxfap-tx-power-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.CDMA2000.HRPD.RAN.RF.MaxFAPTxPower}} . If {{true}}, the FAP self-configures the value. If {{false}}, the ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.SelfConfig.MaxFAPTxPowerSelfConfigEnable"; + } + leaf max-hrpd-beacon-tx-power-self-config-enable { + type boolean; + config false; + description + "Indicates whether the self-configuration capability in the FAP is used or not to determine the value of {{param|.CellConfig.CDMA2000.Beacon.MaxHRPDBeaconTxPower}}. If {{true}} the FAP self-configures the value. If {{false}} The ACS must provide the specific value to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.SelfConfig.MaxHRPDBeaconTxPowerSelfConfigEnable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.SelfConfig."; + } + + grouping fap-control-cdma2000-hrpd-a13-g { + description + "This object contains attributes related to A13 Session Transfer"; + leaf color-code-to-uati104-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.ColorCodeToUATI104NumberOfEntries"; + } + leaf hrpd-subnet-to-ip-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.HRPDSubnetToIPNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13."; + } + + grouping fap-control-cdma2000-hrpd-a13-color-code-to-uati104-g { + description + "HRPD ColorCode to UATI Mapping Table number of entries."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.ColorCodeToUATI104.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.ColorCodeToUATI104.{i}.Alias"; + } + leaf color-code { + type uint16 { + range "0..256"; + } + description + "Color Code mapped to UATI104 in the following field"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.ColorCodeToUATI104.{i}.ColorCode"; + } + leaf uati104 { + type binary { + length "0..13"; + } + description + "The UATI104 of the AT that accesses with the ColorCode field"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.ColorCodeToUATI104.{i}.UATI104"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.ColorCodeToUATI104.{i}."; + } + + grouping fap-control-cdma2000-hrpd-a13-hrpd-subnet-to-ip-g { + description + "This object contains attributes related to A13 Session Transfer"; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.HRPDSubnetToIP.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.HRPDSubnetToIP.{i}.Alias"; + } + leaf hrpd-subnet-length { + type uint8 { + range "1..104"; + } + units "bits"; + config false; + description + "The number of MSBs (in {{units}}) in the following field that is part of HRPDSubnet"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.HRPDSubnetToIP.{i}.HRPDSubnetLength"; + } + leaf hrpd-subnet { + type binary { + length "0..13"; + } + config false; + description + "The {{param|HRPDSubnetLength}} MSBs of this field contain the HRPD subnet that maps to the IP address in the following field"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.HRPDSubnetToIP.{i}.HRPDSubnet"; + } + leaf a13-ip-address { + type inet:ip-address; + description + "This field contains the IP address of A13 endpoint that corresponds to the HRPD subnet"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.HRPDSubnetToIP.{i}.A13IPAddress"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.FAPControl.CDMA2000.HRPD.A13.HRPDSubnetToIP.{i}."; + } + + grouping access-mgmt-g { + description + "This object contains parameters relating to Access Management for the different radio technologies."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt."; + } + + grouping access-mgmt-umts-g { + description + "This object contains parameters relating to Access Management for UMTS FAP (ACL, CSG, LIPA). Closed Subscriber Group (CSG) service behavior is specified in {{bibref|3GPP-TS.22.011}}. Note: Cell barring and 3GPP access class parameters are contained in {{object|.CellConfig.UMTS.RAN.CellRestriction.}} (UMTS FAP)."; + leaf access-mode { + type enumeration { + enum "open access" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.AccessMode - Open Access"; + } + enum "closed access" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.AccessMode - Closed Access"; + } + enum "hybrid access" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.AccessMode - Hybrid Access"; + } + } + default "open access"; + config false; + description + "Indicates the type of access mode the FAP operates in. {{enum}} When the value is not {{enum|Open Access}} non-CSG-capable UE are handled according to {{param|NonCSGUEAccessDecision}}. Note: This parameter controls the setting of the CSGindicator bit, specified in MIB in {{bibref|3GPP-TS.25.331}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.AccessMode"; + } + leaf non-csgue-access-decision { + type enumeration { + enum "local" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.NonCSGUEAccessDecision - Local"; + } + enum "query fap-gw" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.NonCSGUEAccessDecision - Query FAPGW"; + } + enum "by core" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.NonCSGUEAccessDecision - By Core"; + } + } + default "local"; + config false; + description + "Indicates how the access decision is made for non-CSG-capable UE. Parameter is ignored when {{param|AccessMode}} is {{enum|Open Access|AccessMode}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.NonCSGUEAccessDecision"; + } + leaf csg-membership-determined-locally { + type boolean; + default "false"; + config false; + description + "Indicates how the access decision is made for CSG-capable UE. Parameter is ignored when {{param|AccessMode}} is {{enum|Open Access|AccessMode}}. If {{true}} access decision is determined the same way as for {{param|NonCSGUEAccessDecision}}. (E.g. if core network doesn't (yet) support full CSG functionality.) If {{false}} FAP always allows access for CSG-capable UE. CSG enforcement is performed by MSC/SGSN (with support from HSS), or by FGW. {{bibref|3GPP-TS.22.011}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.CSGMembershipDeterminedLocally"; + } + leaf max-u-es-served { + type int64; + default "-1"; + config false; + description + "Maximum number of concurrent UEs allowed at a cell. Valid for any {{param|AccessMode}}. A value of -1 allows an unlimited number of concurrent UEs up to the limit of FAP capacity. The setting does not affect emergency calls."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MaxUEsServed"; + } + leaf max-csg-members { + type int64; + default "-1"; + config false; + description + "Maximum number of concurrent CSG member UEs allowed at a hybrid or closed cell. A value of -1 allows an unlimited number of CSG members up to the limit of FAP capacity. The setting cannot be larger than the value of {{param|MaxUEsServed}}. The setting does not affect emergency calls. {{bibref|3GPP-TS.22.011}}, {{bibref|3GPP-TS.22.220}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MaxCSGMembers"; + } + leaf max-non-csg-members { + type int64; + default "-1"; + config false; + description + "Maximum number of concurerent non-CSG member UEs allowed at a hybrid cell. Valid only if {{param|AccessMode}} is {{enum|Hybrid Access|AccessMode}}. The setting cannot be larger than the value of {{param|MaxUEsServed}}. The setting does not affect emergency calls."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MaxNonCSGMembers"; + } + leaf max-resource-non-csg-members { + type uint8 { + range "0..100"; + } + config false; + description + "Maximum percentage of physical resource that can be assigned to non-CSG members aggregately at one time. In UMTS FAP, this applies to RB resource."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MaxResourceNonCSGMembers"; + } + leaf hnb-name { + type string { + length "0..48"; + } + config false; + description + "Home NodeB name. An operator-defined string that is broadcast by a CSG cell or a hybrid cell and displayed on the UE for the purpose of manual cell selection or indication that the UE is camped on the cell as specified in {{bibref|3GPP-TS.22.220|Section 5.4.2}}. Corresponds to parameter 'hnb-Name' specified in SIB20 in {{bibref|3GPP-TS.25.331|Section 10.2.48.8.23}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.HNBName"; + } + leaf csgid { + type uint32 { + range "0..134217727"; + } + config false; + description + "Defines the Closed Subscriber Group of the Access Control List. The UMTS FAP broadcasts this CSG ID in SIB3 depending on the AccessMode. The LTE FAP broadcasts this in SIB1, and corresponds to parameter csg-Identity in SIB1 in {{bibref|3GPP-TS.36.331}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.CSGID"; + } + leaf-list access-control-list { + type string { + length "0..15"; + } + config false; + max-elements "1024"; + description + "{{list}} Each entry is an IMSI."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.AccessControlList"; + } + leaf max-member-detail-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.AccessMgmt.UMTS.MemberDetail.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MaxMemberDetailEntries"; + } + leaf member-detail-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MemberDetailNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS."; + } + + grouping access-mgmt-umts-member-detail-g { + description + "Details for CSG and Non-CSG members."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the MemberDetail entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MemberDetail.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MemberDetail.{i}.Alias"; + } + leaf imsi { + type string { + length "0..15"; + } + description + "International Mobile Subscriber Identity of the UE."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MemberDetail.{i}.IMSI"; + } + leaf msisdn { + type string { + length "0..15"; + } + config false; + description + "Mobile Station International Subscriber Identity Number. Set to {{empty}} if unknown."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MemberDetail.{i}.MSISDN"; + } + leaf membership-expires { + type yang:date-and-time; + config false; + description + "Time when the ACL membership expires. An Unknown Time value, as defined in {{bibref|TR-106a2|Section 3.2}}, indicates that the membership doesn't expire. Upon expiry the FAP MUST remove the IMSI from the {{param|.AccessMgmt.UMTS.AccessControlList}}, but the entry in {{object|.AccessMgmt.UMTS.MemberDetail.{i}.}} remains. {{bibref|3GPP-TS.22.011}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MemberDetail.{i}.MembershipExpires"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.MemberDetail.{i}."; + } + + grouping access-mgmt-umts-local-ip-access-g { + description + "Local IP access for UMTS FAP."; + leaf enable { + type boolean; + default "false"; + config false; + description + "Enables/disables the Local IP Access (LIPA) functionality."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.LocalIPAccess.Enable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.UMTS.LocalIPAccess."; + } + + grouping access-mgmt-lte-g { + description + "This object contains parameters relating to Access Management, as defined in {{bibref|3GPP-TS.32.592}}/ Closed Subscriber Group (CSG) service behavior is specified in {{bibref|3GPP-TS.22.011}}. Note: Cell barring and 3GPP access class parameters are contained in SIB1 in {{bibref|3GPP-TS.36.331}}."; + leaf access-mode { + type enumeration { + enum "open access" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.AccessMode - Open Access"; + } + enum "closed access" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.AccessMode - Closed Access"; + } + enum "hybrid access" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.AccessMode - Hybrid Access"; + } + } + default "open access"; + config false; + description + "Indicates the type of access mode the FAP operates in. {{enum}} Note: This parameter controls the setting of the CSGindicator bit, specified in SIB1 in {{bibref|3GPP-TS.36.331}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.AccessMode"; + } + leaf max-u-es-served { + type int64; + default "-1"; + config false; + description + "Maximum number of concurrent UEs allowed at a cell. Valid for any {{param|AccessMode}}. A value of -1 allows an unlimited number of concurrent UEs up to the limit of FAP capacity. The setting does not affect emergency calls."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.MaxUEsServed"; + } + leaf max-csg-members { + type int64; + default "-1"; + config false; + description + "Maximum number of concurrent CSG member UEs allowed at a hybrid or closed cell. A value of -1 allows an unlimited number of CSG members up to the limit of FAP capacity. The setting cannot be larger than the value of {{param|MaxUEsServed}}. The setting does not affect emergency calls. {{bibref|3GPP-TS.22.011}}, {{bibref|3GPP-TS.22.220}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.MaxCSGMembers"; + } + leaf max-non-csg-members { + type int64; + default "-1"; + config false; + description + "Maximum number of concurerent non-CSG member UEs allowed at a hybrid cell. Valid only if {{param|AccessMode}} is {{enum|Hybrid Access|AccessMode}}. The setting cannot be larger than the value of {{param|MaxUEsServed}}. The setting does not affect emergency calls."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.MaxNonCSGMembers"; + } + leaf max-resource-non-csg-members { + type uint8 { + range "0..100"; + } + config false; + description + "Maximum percentage of physical resource that can be assigned to non-CSG members aggregately at one time. This applies to PDSCH physical resource blocks."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.MaxResourceNonCSGMembers"; + } + leaf csgid { + type uint32 { + range "0..134217727"; + } + config false; + description + "Defines the Closed Subscriber Group of the Access Control List. The LTE FAP broadcasts this in SIB1, and corresponds to parameter csg-Identity in SIB1 in {{bibref|3GPP-TS.36.331}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.CSGID"; + } + leaf hnb-name { + type string { + length "0..48"; + } + config false; + description + "Home NodeB name. An operator-defined string that is broadcast by a CSG cell or a hybrid cell and displayed on the UE for the purpose of manual cell selection or indication that the UE is camped on the cell as specified in {{bibref|3GPP-TS.22.220|Section 5.4.2}}. Corresponds to parameter 'hnb-Name' specified in SIB9 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.HNBName"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE."; + } + + grouping access-mgmt-lte-local-ip-access-g { + description + "Local IP access for LTE FAP."; + leaf enable { + type boolean; + default "false"; + config false; + description + "Enables/disables the Local IP Access (LIPA) functionality."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.LocalIPAccess.Enable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.LTE.LocalIPAccess."; + } + + grouping access-mgmt-cdma2000-g { + description + "This object contains configurable and observable attributes related to CDMA2000 Access and Admission Control of the FAP."; + leaf access-mode { + type uint8 { + range "0 | 1 | 3"; + } + config false; + description + "Defines the access control mode of FAP. Allowed modes are Open, Closed, and Signaling Association (refer to {{bibref|3GPP2-A.S0024}}). AccessMode 2 (Hybrid) is not applicable to CDMA2000 FAPs. 0- Open,1-Closed, 2-Reserved, 3-Signaling Association."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.AccessMode"; + } + leaf max-total-active-calls-allowed { + type uint16 { + range "1..1024"; + } + config false; + description + "Total number of active calls allowed."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MaxTotalActiveCallsAllowed"; + } + leaf access-control-list { + type string { + length "0..1024"; + } + config false; + description + "{{list}} (maximum item length 15). Each entry is an IMSI."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.AccessControlList"; + } + leaf max-member-detail-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.AccessMgmt.CDMA2000.MemberDetail.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MaxMemberDetailEntries"; + } + leaf member-detail-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MemberDetailNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000."; + } + + grouping access-mgmt-cdma2000-member-detail-g { + description + "At most one enabled entry in this table can exist with a given value for IMSI and HRPDIdentifierValue. The IMSI field may be empty."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MemberDetail.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MemberDetail.{i}.Alias"; + } + leaf imsi { + type string { + length "0..15"; + } + description + "International Mobile Subscriber Identity of the UE."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MemberDetail.{i}.IMSI"; + } + leaf hrpd-identifier-type { + type int64; + config false; + description + "Type of identifier used for the HRPD AT. 0-invalid 1-ESN 2-MEID 3-A12NAI. If IMSI in this record is valid, then this attribute is set to 0."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MemberDetail.{i}.HRPDIdentifierType"; + } + leaf hrpd-identifier-value { + type string { + length "0..128"; + } + config false; + description + "The value of this attribute depends on {{param|HRPDIdentifierType}}. ESN and MEID shall be defined as Hex."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MemberDetail.{i}.HRPDIdentifierValue"; + } + leaf membership-expires { + type yang:date-and-time; + config false; + description + "The time that the current ACL membership expires."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MemberDetail.{i}.MembershipExpires"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.MemberDetail.{i}."; + } + + grouping access-mgmt-cdma2000-local-ip-access-g { + description + "Local IP access support as defined in 3GPP2"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess."; + } + + grouping access-mgmt-cdma2000-local-ip-access-hrpd-g { + description + "Local IP access support as defined in 3GPP2"; + leaf filter-type { + type uint8 { + range "0..3"; + } + config false; + description + "Value of '0' indicates that the FAP shall allow only IP packets with destination address matching the local IP subnet on Local IP access interface. Value of '1' indicates that the FAP shall allow any IP packets with destination address matching either the local IP subnet or the subnets listed in Local IP egress filter parameter on Local IP access interface. Value of '2' indicates that the FAP shall allow any IP packets with destination addresses that do not match the Local IP egress filter parameter on Local IP access interface.Value of '3' indicates that the FAP shall allow any IP packets on the local IP address interface."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.FilterType"; + } + leaf filter-in-use { + type string { + length "0..256"; + } + description + "This parameter is set to the IPCP Vendor Specific Option which the FAP uses to send Local IP access packet filter on AN-PPP interface."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.FilterInUse"; + } + leaf egress-filter-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.EgressFilterNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD."; + } + + grouping access-mgmt-cdma2000-local-ip-access-hrpd-egress-filter-g { + description + "HRPD LIPA Egress Filter Table entries."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.EgressFilter.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.EgressFilter.{i}.Alias"; + } + leaf subnet { + type inet:ipv4-address; + description + "The IP subnet of the egress filter to be installed to the AT. The meaning of this field depends on the {{param|.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.FilterType}} field."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.EgressFilter.{i}.Subnet"; + } + leaf subnet-mask { + type uint8 { + range "0..32"; + } + description + "The length of the IP subnetmask associated with the IP subnet in the previous field."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.EgressFilter.{i}.SubnetMask"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.CDMA2000.LocalIPAccess.HRPD.EgressFilter.{i}."; + } + + grouping access-mgmt-legacy-g { + description + "This object contains configurable and observable attributes related to Access and Admission Control of the FAP, which are not not covered by 3GPP and 3GPP2 specifications."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy."; + } + + grouping access-mgmt-legacy-local-ip-access-g { + description + "Old Local IP access object, included on special request."; + leaf enable { + type boolean; + default "false"; + config false; + description + "Enables/disables the Local IP Access (LIPA) functionality."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Enable"; + } + leaf max-rules-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.MaxRulesEntries"; + } + leaf rule-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.RuleNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess."; + } + + grouping access-mgmt-legacy-local-ip-access-rule-g { + description + "Policy for selecting traffic for local IP access. Originated traffic will be NAT'ed. The rule is bi-directional, i.e. return traffic is allowed. Rules do NOT affect traffic to/from the FAP itself (such as TR-069 or control). The rules are applied to the mobile station data traffic (PS-domain) via deep packet inspection or similar method."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the forwarding entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.Alias"; + } + leaf dest-ip-address { + type inet:ip-address; + description + "Destination IP Address. {{empty}} indicates no destination address is specified. An entry for which {{param}} and {{param|DestSubnetMask}} are both {{empty}} is a default route."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.DestIPAddress"; + } + leaf dest-subnet-mask { + type inet:ip-address; + description + "Destination subnet mask (IPv4) or prefix (IPv6). {{empty}} indicates no destination subnet mask or prefix is specified. If a destination subnet mask or prefix is specified, {{param}} is ANDed with the destination address before comparing with {{param|DestIPAddress}}. Otherwise, the full destination address is used as-is. An entry for which {{param|DestIPAddress}} and {{param}} are both {{empty}} is a default route."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.DestSubnetMask"; + } + leaf protocol { + type int64; + description + "IP Protocol Identifier. -1 matches any protocol."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.Protocol"; + } + leaf action { + type enumeration { + enum "tunnel" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.Action - Tunnel"; + } + enum "napt" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.Action - NAPT"; + } + } + config false; + description + "Action to be taken for traffic matching this rule."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.Action"; + } + leaf interface { + type string { + length "0..256"; + } + config false; + description + "Specifies the egress interface when {{param|Action}} is set to {{enum|NAPT|Action}}. {{reference}} layer-3 connection object. Example: InternetGatewayDevice.LANDevice.{i}.LANEthernetInterfaceConfig.{i}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}.Interface"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.AccessMgmt.Legacy.LocalIPAccess.Rule.{i}."; + } + + grouping cell-config-g { + description + "This object contains parameters relating to configuring the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig."; + } + + grouping umts-g { + description + "This object contains parameters relating to configuring UMTS system specific information."; + leaf tunnel-instance { + type string { + length "0..256"; + } + config false; + description + "This is the reference to the IPsec tunnel instance used by the UMTS FAP. For all root data models, which use the tunnel definition provided in {{bibref|TR-262}} (InternetGatewayDevice:1 {{bibref|TR-098}} and Device:1 {{bibref|TR-181i1}}) the {{param}} MUST point to a row in the 'FAP.Tunnel.IKESA.{i}.' table, defined in {{bibref|TR-262}}. If the root data model used is Device:2 {{bibref|TR-181i2}} than the {{param}} MUST point to IPsec tunnel instance defined in {{bibref|TR-181i2}}. If the referenced object is deleted, the parameter value MUST be set to an empty string. In case of a multiple-radio-technology FAP product, each radio technology can have its own tunnels or share common tunnels. In the former case, {{param}} can contain a unique instance number. In the latter case, {{param}} under all radio technologies can have the same instance number."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.TunnelInstance"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS."; + } + + grouping umts-cn-g { + description + "This object contains parameters relating to configuring UMTS CN."; + leaf plmn-type { + type enumeration { + enum "gsm-map" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.PLMNType - GSM-MAP"; + } + enum "ansi-41" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.PLMNType - ANSI-41"; + } + } + config false; + description + "Type of Public Land Mobile Network (PLMN)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.PLMNType"; + } + leaf plmnid { + type string { + length "0..6"; + } + config false; + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.PLMNID"; + } + leaf-list equiv-plmnid { + type string { + length "0..6"; + } + config false; + max-elements "64"; + description + "{{list}} Each item is a PLMNID. PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of the PLMNID is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.EquivPLMNID"; + } + leaf sac { + type uint16 { + range "0..65535"; + } + config false; + description + "Service Area Code (SAC) {{bibref|3GPP-TS.23.003}}. The concatenation of PLMN ID (MCC+MNC), LAC, and SAC uniquely identifies the Service Area ID (SAI)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.SAC"; + } + leaf broadcast-sac { + type uint16 { + range "0..65535"; + } + config false; + description + "Service Area Code (SAC) for broadcast. The format of this parameter is the same with {{param|SAC}}, and it uniquely identifies the Service Area ID (SAI) for Earthquake and Tsunami Warning Services (ETWS) {{bibref|3GPP-TS.25.469|Section 9.1.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.BroadcastSAC"; + } + leaf-list lacrac { + type string; + config false; + max-elements "256"; + description + "{{list}} Each item is a LAC/RAC combination expressed in the following format: :<LAC or LACrange>':'<RAC or RACrange> Where LAC and RAC are single values, while LACrange and RACrange are inclusive and can be expressed in the following format: :<Start-value>\"..\"<End-value> Location Area Code (LAC) consists of up to 5 numerical characters. The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}. Routing Area Code (RAC) consists of up to 3 numerical characters. The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the Routing Area ID (RAI). {{bibref|3GPP-TS.23.003|Section 4.2}} {{bibref|3GPP-TS.25.413|Section 9.2.3.7}}. The FAP is to select one LAC and RAC from the combination(s) expressed in this parameter for use in {{param|LACInUse}} and {{param|RACInUse}} respectively. If a LAC occurs more than once in the list, this shall not increase the chance that it is selected over other LAC values in the list. The following are examples of the valid LACRAC combination formats: :\"64000:210\" ::(one list item with single value for LAC and RAC) :\"64000..64100:210, 64101:211\" ::(two list items, first item has a LAC range) :\"64000:210..214, 64001:215..219\" ::(two list items, both items have a RAC range for a specific LAC value) :\"64000..64100:210..214\" ::(one list item both have a LAC range and a RAC range)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.LACRAC"; + } + leaf lac-in-use { + type uint16 { + range "0..65535"; + } + description + "The LAC being used by the FAP. Self-configuration for LAC is controlled by {{param|.Capabilities.UMTS.SelfConfig.LACRACURAConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.LACRACURASelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in {{param|LACRAC}}. If the self-configuration capability is not available or not enabled, then this parameter contains the first LAC value in {{param|LACRAC}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.LACInUse"; + } + leaf rac-in-use { + type uint8 { + range "0..255"; + } + description + "The RAC being used by the FAP. Self-configuration for RAC is controlled by {{param|.Capabilities.UMTS.SelfConfig.LACRACURAConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.LACRACURASelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in {{param|LACRAC}}. If the self-configuration capability is not available or not enabled, then this parameter contains the first RAC value in {{param|LACRAC}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.RACInUse"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN."; + } + + grouping umts-cn-cs-domain-g { + description + "This object contains parameters relating to configuring the CS domain of the UMTS CN."; + leaf t3212 { + type uint32 { + range "0..91800"; + } + units "seconds"; + config false; + description + "T3212 timeout value specified in {{units}} {{bibref|3GPP-TS.24.008|section 10.5.1.12.2}}. The values are implemented by steps of 360 {{units}}, which aligns with values in decihours in {{bibref|3GPP-TS.24.008}}. The value of 0 is used for infinite timeout value i.e. periodic updating shall not be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.CSDomain.T3212"; + } + leaf imsi-attach-detach-enable { + type boolean; + config false; + description + "Indicates the UE behavior regarding IMSI attach/detach procedure to the CN {{bibref|3GPP-TS.24.008}}. If {{true}} UE SHALL apply IMSI attach and detach procedure If {{false}} UE SHALL NOT apply IMSI attach and detach procedure"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.CSDomain.IMSIAttachDetachEnable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.CSDomain."; + } + + grouping umts-cn-ps-domain-g { + description + "This object contains parameters relating to configuring the PS domain of the UMTS CN."; + leaf network-mode-operation-combined { + type boolean; + config false; + description + "Network Mode of Operation of the CN. {{bibref|3GPP-TS.23.060}} {{bibref|3GPP-TS.24.008}} If {{true}} (Network Mode of Operation II) Combined procedures between CS and PS domain are not supported (i.e. Gs interface is not present). If {{false}} (Network Mode of Operation I) Combined procedures between CS and PS domain are supported (i.e. Gs interface is present)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.PSDomain.NetworkModeOperationCombined"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.CN.PSDomain."; + } + + grouping umts-ran-g { + description + "This object contains parameters relating to the RAN-level configuration."; + leaf-list ura-list { + type uint16 { + range "0..65535"; + } + config false; + min-elements 1; + max-elements "50"; + description + "{{list}} Each item is a URA (UTRAN Registration Area) to which the FAP belongs. The order of the URA values has no significance. {{bibref|3GPP-TS.25.331|Section 10.3.2.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.URAList"; + } + leaf ura-in-use { + type uint16 { + range "0..65535"; + } + description + "The URA being used by the FAP. Self-configuration for URA is controlled by {{param|.Capabilities.UMTS.SelfConfig.LACRACURAConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.LACRACURASelfConfigEnable}} from an enabled perspective. If the FAP's self-configuration capability for URA is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in {{param|URAList}}. If the self-configuration capability is not available or not enabled, then this parameter contains the first URA value in {{param|URAList}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.URAInUse"; + } + leaf rncid { + type uint16 { + range "0..65535"; + } + config false; + description + "RNC-ID allocated to the FAP. It uniquely identifies an RNC within a PLMN. Normally, RNC-ID consists of 12 bits (i.e. a range of [0:4095]). However, if the value is larger than 4095, then Extended RNC-ID (range of [4096:65535]) is used in RANAP. The RNC-ID and Extended RNC-ID are combined into a single parameter here as there is no explicit need to have them separated. {{bibref|3GPP-TS.25.413|Section 9.2.1.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RNCID"; + } + leaf cell-id { + type uint32 { + range "0..268435455"; + } + config false; + description + "Cell Identity. {{bibref|3GPP-TS.25.401|Section 6.1.5}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellID"; + } + leaf t-rat-c { + type uint64; + units "seconds"; + config false; + description + "Guard period in {{units}} before sending a \"RANAP:RESET ACKNOWLEDGE\" message towards the Femto GW. {{bibref|3GPP-TS.25.413|Section 9.5}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.TRatC"; + } + leaf t-raf-c { + type uint64; + units "seconds"; + config false; + description + "Maximum amount of time in {{units}} that the FAP SHOULD wait for receiving a \"RANAP:RESET ACKNOWLEDGE\" message from the Femto GW after sending a Reset to the Femto GW. {{bibref|3GPP-TS.25.413|Section 9.5}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.TRafC"; + } + leaf n-raf-c { + type uint64 { + range "1..max"; + } + config false; + description + "Maximum number for RESET procedure that can be repeated in FAP. {{bibref|3GPP-TS.25.413|Section 8.26.3.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NRafC"; + } + leaf tig-or { + type uint64; + units "seconds"; + config false; + description + "Amount of time in {{units}} used to determine when the additional level of traffic reduction in CN overload SHOULD take place. While this timer is running all OVERLOAD messages or signalling pointing to congested information received by the FAP are ignored. {{bibref|3GPP-TS.25.413|Section 9.5}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.TigOR"; + } + leaf tin-tr { + type uint64; + units "seconds"; + config false; + description + "Amount of time in {{units}} used to determine when the CN overload can be considered cleared. While this timer is running, the FAP is not allowed to increase traffic. {{bibref|3GPP-TS.25.413|Section 9.5}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.TinTR"; + } + leaf t-data-fwd { + type uint64; + units "seconds"; + config false; + description + "Maximum amount of time in {{units}} for Data Forwarding at FAP. Timer is started when a \"RANAP:SRNS Data Forward Command\" message (or a \"RANAP:Relocation Command\" message) is received. At timer expiry the \"SRNS Data Forwarding\" procedure is completed. {{bibref|3GPP-TS.25.413|Section 9.5}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.TDataFwd"; + } + leaf t-reloc-prep { + type uint64; + units "seconds"; + config false; + description + "Maximum amount of time in {{units}} for the Relocation Preparation procedure. Timer is started when a \"RANAP:Relocation Required\" message is sent. Timer is stopped when a \"RANAP:Relocation Command\" or a \"RANAP:Relocation Preparation Failure\" message is received. {{bibref|3GPP-TS.25.413|Section 9.5}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.TRelocPrep"; + } + leaf t-reloc-overall { + type uint64; + units "seconds"; + config false; + description + "Maximum amount of time in {{units}} for protection of the overall Relocation procedure. Timer is started when a \"RANAP:Relocation Command\" message is received. Timer is stopped when a \"RANAP:Iu Release Command\" is received or the relocation procedure is cancelled. {{bibref|3GPP-TS.25.413|Section 9.5}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.TRelocOverall"; + } + leaf hnbid-realm { + type string { + length "0..182"; + } + config false; + description + "The \"realm\" portion of the HNB-ID where HNB-ID is defined in {{bibref|3GPP-TS.25.469}} and is shown as follows: 0<IMSI>@<realm> Or 1<OUI>-<SerialNumber>@<realm> The other identifiers before \"@\" are device dependent values. Both <OUI> and <SerialNumber> are defined in {{bibref|TR-069a2|Table 36}}. <IMSI> is obtained from the USIM if it is equipped in the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.HNBIDRealm"; + } + leaf hs-flag { + type boolean; + config false; + description + "Enables/disables the HSDPA function in the FAP. If {{true}} HSDPA is enabled (this is equivalent to a \"1\" in {{bibref|3GPP-TS.32.642|Section 6.3.9}}) If {{false}} HSDPA is disabled (this is equivalent to a \"0\" in {{bibref|3GPP-TS.32.642|Section 6.3.9}})"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.HSFlag"; + } + leaf hs-enable { + type boolean; + config false; + description + "Enables or disables HSDPA in the cell. If {{true}} HSDPA is enabled (this is equivalent to a \"1\" in {{bibref|3GPP-TS.32.642|Section 6.3.9}}) If {{false}} HSDPA is not enabled (this is equivalent to a \"0\" in {{bibref|3GPP-TS.32.642|Section 6.3.9}}) If {{param|HSFlag}} is {{false}} then this value MUST be {{false}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.HSEnable"; + } + leaf num-of-hspdsc-hs { + type uint8 { + range "0..15"; + } + config false; + description + "The number of codes at the defined spreading factor (SF=16), within the complete code tree. {{bibref|3GPP-TS.32.642|Section 6.3.9}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NumOfHSPDSCHs"; + } + leaf num-of-hsscc-hs { + type uint64; + config false; + description + "The number of HS-SCCHs for one cell. {{bibref|3GPP-TS.32.642|Section 6.3.9}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NumOfHSSCCHs"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN."; + } + + grouping umts-ran-csg-g { + description + "This object contains parameters relating to the Closed Subscriber Group (CSG)."; + leaf csg-indicator { + type boolean; + description + "The CSG-indicator Information Element (IE) in the Master Information Block reflects the access mode of the CSG cell. It is hence dependent on the value of {{param|.AccessMgmt.UMTS.AccessMode}}. If {{true}} the CSG-indicator IE is present, reflecting access to the CSG cell is closed. If {{false}} the CSG-indicator IE is absent, reflecting access to the CSG cell is not closed. {{bibref|3GPP-TS.25.331|Section 10.2.48.8.1}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGIndicator"; + } + leaf-list uarfcndl-list { + type uint16 { + range "0..16383"; + } + config false; + max-elements "128"; + description + "{{list}} Each item is a UTRA Absolute Radio Frequency Channel Number (UARFCN) in the DL direction dedicated to the CSG cells. {{param}} is broadcast in SIB 11bis {{bibref|3GPP-TS.25.331|Section 10.2.48.8.14a}}. The corresponding UTRA Absolute Radio Frequency Channel Number (UARFCN) in the UL direction is derived based on the fixed offset applicable for the frequency band."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.UARFCNDLList"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG."; + } + + grouping umts-ran-csg-csgpsc-split-info-g { + description + "This object contains parameters relating to the Primary Scrambling Code (PSC) split information for the CSG. Defined in SIB3/11bis {{bibref|3GPP-TS.25.331|Section 10.3.2.8 and 10.3.2.9}}."; + leaf start-psc-range1-coefficient { + type uint8 { + range "0..63"; + } + config false; + description + "The value of this Information Element (IE) multiplied by 8 specifies the start PSC value of the first PSC range as specified in {{bibref|3GPP-TS.25.331|Section 8.6.2.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.StartPSCRange1Coefficient"; + } + leaf number-of-ps-cs { + type enumeration { + enum "5" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 5"; + } + enum "10" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 10"; + } + enum "15" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 15"; + } + enum "20" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 20"; + } + enum "30" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 30"; + } + enum "40" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 40"; + } + enum "50" { + value 7; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 50"; + } + enum "64" { + value 8; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 64"; + } + enum "80" { + value 9; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 80"; + } + enum "120" { + value 10; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 120"; + } + enum "160" { + value 11; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 160"; + } + enum "256" { + value 12; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - 256"; + } + enum "alltherest" { + value 13; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - alltherest"; + } + enum "spare3" { + value 14; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - spare3"; + } + enum "spare2" { + value 15; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - spare2"; + } + enum "spare1" { + value 16; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs - spare1"; + } + } + config false; + description + "This Information Element (IE) specifies the number of PSCs reserved for CSG cells in each PSC range."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.NumberOfPSCs"; + } + leaf psc-range2-offset { + type uint8 { + range "0..63"; + } + config false; + description + "If this Information Element (IE) is included, the UE shall calculate the second PSC range as specified in {{bibref|3GPP-TS.25.331|Section 8.6.2.4}}. If this Information Element (IE) is not included, the UE shall consider the second PSC range to be not present."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo.PSCRange2Offset"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CSG.CSGPSCSplitInfo."; + } + + grouping umts-ran-cell-selection-g { + description + "This object contains parameters related to cell selection and reselection."; + leaf quality-measure-cpich { + type enumeration { + enum "ec/no" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QualityMeasureCPICH - Ec/No"; + } + enum "rscp" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QualityMeasureCPICH - RSCP"; + } + } + config false; + description + "Which mechanism to use when doing CPICH quality measurements. {{bibref|3GPP-TS.25.331|Section 10.3.7.47}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QualityMeasureCPICH"; + } + leaf qqual-min { + type int64; + units "dB"; + config false; + description + "Minimum required quality measure, specified in {{units}}. {{bibref|3GPP-TS.25.331|Section 10.3.2.3 and Section 10.3.2.4}} This value is only meaningful if {{param|QualityMeasureCPICH}} has the value {{enum|Ec/No|QualityMeasureCPICH}} and it MUST otherwise be ignored."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QqualMin"; + } + leaf qqual-min-offset { + type uint8 { + range "1..16"; + } + units "dB"; + default "1"; + config false; + description + "Offset for {{param|QqualMin}} specified in {{units}}. {{bibref|3GPP-TS.25.331|Section 10.3.2.3}} This value is only meaningful if {{param|QualityMeasureCPICH}} has the value {{enum|Ec/No|QualityMeasureCPICH}} and it MUST otherwise be ignored."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QqualMinOffset"; + } + leaf q-rx-lev-min { + type int64; + units "dBm"; + config false; + description + "Minimum required RX level in the cell, specified in {{units}}. {{bibref|3GPP-TS.25.331|Section 10.3.2.3}} Only odd values are valid, use of an even value MUST be rejected by the CPE. This value is only meaningful if {{param|QualityMeasureCPICH}} has the value {{enum|RSCP|QualityMeasureCPICH}} and it MUST otherwise be ignored."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QRxLevMin"; + } + leaf delta-q-rx-lev-min { + type int64; + units "dB"; + config false; + description + "Delta for the minimum required RX level in the cell, specified in {{units}}. {{bibref|3GPP-TS.25.331|Section 10.3.2.3 and Section 10.3.2.4}} The actual value of {{param|QRxLevMin}} = {{param|QRxLevMin}} + {{param}} This value is only meaningful if {{param|QualityMeasureCPICH}} has the value {{enum|RSCP|QualityMeasureCPICH}} and it MUST otherwise be ignored."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.DeltaQRxLevMin"; + } + leaf q-rx-lev-min-offset { + type uint8 { + range "2 | 4 | 6 | 8 | 10 | 12 | 14 | 16"; + } + units "dB"; + default "2"; + config false; + description + "Offset for {{param|QRxLevMin}}, specified in {{units}}. {{bibref|3GPP-TS.25.331|Section 10.3.2.3}} This value is only meaningful if {{param|QualityMeasureCPICH}} has the value {{enum|RSCP|QualityMeasureCPICH}} and it MUST otherwise be ignored."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QRxLevMinOffset"; + } + leaf q-hyst1s { + type uint8 { + range "0..40"; + } + config false; + description + "GSM and FDD Cell reselection hysteresis 1. {{bibref|3GPP-TS.25.331|Section 10.3.2.3}} Only even values are valid, use of an odd value MUST be rejected by the CPE."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QHyst1s"; + } + leaf q-hyst2s { + type uint8 { + range "0..40"; + } + config false; + description + "FDD Cell reselection hysteresis 2. {{bibref|3GPP-TS.25.331|Section 10.3.2.3}} Only even values are valid, use of an odd value MUST be rejected by the CPE. This value is only meaningful if {{param|QualityMeasureCPICH}} has the value {{enum|Ec/No|QualityMeasureCPICH}} and it MUST otherwise be ignored. By default when {{param|QHyst1s}} is set and {{param}} is not, then the value for {{param}} SHOULD match the value of {{param|QHyst1s}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QHyst2s"; + } + leaf t-reselections { + type uint8 { + range "0..31"; + } + units "seconds"; + config false; + description + "A member of the set of parameters used for cell reselection functionality. A UE triggers the reselection of a new cell if the cell reselection criteria are fulfilled during the time interval in {{units}}. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TReselections"; + } + leaf s-intrasearch { + type int64; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the threshold for intra-frequency measurements, and for the HCS measurement rules. Only even values are valid, use of an odd value MUST be rejected by the CPE. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.SIntrasearch"; + } + leaf s-intersearch { + type int64; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the threshold for inter-frequency measurements, and for the HCS measurement rules. Only even values are valid, use of an odd value MUST be rejected by the CPE. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.SIntersearch"; + } + leaf s-search-hcs { + type int64; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the threshold for intrafrequency and interfrequency measurement rules in HCS. Below this limit in the serving cell, the UE initiates measurements of all intrafrequency and interfrequency neighbouring cells of the serving cell. Only odd values are valid, use of an even value MUST be rejected by the CPE. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.SSearchHCS"; + } + leaf s-search-rat { + type int64; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the RAT (GSM) specific threshold for inter-RAT measurement rules. Only even values are valid, use of an odd value MUST be rejected by the CPE. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.SSearchRAT"; + } + leaf shcsrat { + type int64; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the RAT (GSM) specific threshold for inter-RAT measurement rules in HCS. Only odd values are valid, use of an even value MUST be rejected by the CPE. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.SHCSRAT"; + } + leaf s-limit-search-rat { + type int64; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the threshold for skipping inter-RAT measurement rules in HCS. Above this RAT (GSM) specific threshold in the serving UTRA cell, the UE does not need to perform any inter-RAT measurements. Only even values are valid, use of an odd value MUST be rejected by the CPE. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.SLimitSearchRAT"; + } + leaf non-hcstcr-max { + type enumeration { + enum "not used" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMax - not used"; + } + enum "30" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMax - 30"; + } + enum "60" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMax - 60"; + } + enum "120" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMax - 120"; + } + enum "180" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMax - 180"; + } + enum "240" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMax - 240"; + } + } + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the duration in seconds for evaluating the allowed amount of cell reselections. If the number of cell reselections during the time period defined by {{param}} exceeds {{param|NonHCSNCR}}, high mobility has been detected. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMax"; + } + leaf non-hcsncr { + type uint8 { + range "1..16"; + } + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the maximum number of cell reselections. If the number of cell reselections during the {{param|NonHCSTCRMax}} time period exceeds the value of {{param}}, high mobility has been detected. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSNCR"; + } + leaf non-hcstcr-max-hyst { + type enumeration { + enum "not used" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst - not used"; + } + enum "10" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst - 10"; + } + enum "20" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst - 20"; + } + enum "30" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst - 30"; + } + enum "40" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst - 40"; + } + enum "50" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst - 50"; + } + enum "60" { + value 7; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst - 60"; + } + enum "70" { + value 8; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst - 70"; + } + } + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the cell reselection hysteresis for reverting from UE high-mobility measurements. The additional time period in seconds before UE reverts to low-mobility measurements. When the number of cell reselections during the time period defined by {{param|TCRMax}} no longer exceeds {{param|NCR}}, UE continues measurements during the time period defined by {{param|TCRMaxHyst}}. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.2.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NonHCSTCRMaxHyst"; + } + leaf qhcs { + type uint8 { + range "0..99"; + } + default "0"; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the quality threshold levels for applying prioritised hierarchical cell reselection. {{bibref|3GPP-TS.25.331|Section 10.3.7.12 and Section 10.3.7.54a}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.QHCS"; + } + leaf use-of-hcs { + type boolean; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Indicate whether HCS is used in this cell or not. {{bibref|3GPP-TS.25.331|Section 10.3.7.47}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.UseOfHCS"; + } + leaf hcs-prio { + type uint8 { + range "0..7"; + } + default "0"; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the HCS priority of this cell. {{bibref|3GPP-TS.25.331|Section 10.3.7.12}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.HCSPrio"; + } + leaf tcr-max { + type enumeration { + enum "not used" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMax - not used"; + } + enum "30" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMax - 30"; + } + enum "60" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMax - 60"; + } + enum "120" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMax - 120"; + } + enum "180" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMax - 180"; + } + enum "240" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMax - 240"; + } + } + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the duration in seconds for evaluating the allowed amount of cell reselections. If the number of cell reselections during the time period defined by {{param}} exceeds {{param|NCR}}, high mobility has been detected. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.7.12}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMax"; + } + leaf ncr { + type uint8 { + range "1..16"; + } + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the maximum number of cell reselections. If the number of cell reselections during the {{param|TCRMax}} time period exceeds the value of {{param}}, high mobility has been detected. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.7.12}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.NCR"; + } + leaf tcr-max-hyst { + type enumeration { + enum "not used" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst - not used"; + } + enum "10" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst - 10"; + } + enum "20" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst - 20"; + } + enum "30" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst - 30"; + } + enum "40" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst - 40"; + } + enum "50" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst - 50"; + } + enum "60" { + value 7; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst - 60"; + } + enum "70" { + value 8; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst - 70"; + } + } + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the cell reselection hysteresis for reverting from UE high-mobility measurements. The additional time period in seconds before UE reverts to low-mobility measurements. When the number of cell reselections during the time period defined by {{param|TCRMax}} no longer exceeds {{param|NCR}}, UE continues measurements during the time period defined by {{param}}. Parameter defined in SIB3 {{bibref|3GPP-TS.25.331|Section 10.3.7.12}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.TCRMaxHyst"; + } + leaf ue-tx-pwr-max-rach { + type int64; + units "dBm"; + config false; + description + "A member of the set of parameters used for cell reselection functionality. Defines the maximum transmit power level, specified in {{units}}, that an UE MAY use when accessing the cell on RACH. Used to calculate Pcompensation, which is: max(UE_TXPWR_MAX_RACH - P_MAX, 0), where UE_TXPWR_MAX_RACH is {{param}} and P_MAX is the max transmit power for a UE. {{bibref|3GPP-TS.25.331|Section 10.3.2.3}} {{bibref|3GPP-TS.25.304|Section 5.2.3}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection.UETxPwrMaxRACH"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellSelection."; + } + + grouping umts-ran-rrc-timers-g { + description + "This object contains parameters related to miscellaneous RRC timers and constants."; + leaf t300 { + type uint16 { + range "100..8000"; + } + units "milliseconds"; + default "1000"; + config false; + description + "Timer measured in {{units}}. Only the following values are considered valid: :100, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 3000, 4000, 6000, and 8000 Any value other than those and the CPE MUST reject the request. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T300"; + } + leaf t301 { + type uint16 { + range "100..8000"; + } + units "milliseconds"; + default "2000"; + config false; + description + "Timer measured in {{units}}. Only the following values are considered valid: :100, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 3000, 4000, 6000, and 8000 Any value other than those and the CPE MUST reject the request. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T301"; + } + leaf t302 { + type uint16 { + range "100..8000"; + } + units "milliseconds"; + default "4000"; + config false; + description + "Timer measured in {{units}}. Only the following values are considered valid: :100, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 3000, 4000, 6000, and 8000 Any value other than those and the CPE MUST reject the request. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T302"; + } + leaf t304 { + type uint16 { + range "100 | 200 | 400 | 1000 | 2000"; + } + units "milliseconds"; + default "2000"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T304"; + } + leaf t305 { + type int64; + units "minutes"; + default "30"; + config false; + description + "Timer measured in {{units}}. -1 indicates an unbounded timer in which there is no update. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T305"; + } + leaf t307 { + type uint8 { + range "5 | 10 | 15 | 20 | 30 | 40 | 50"; + } + units "seconds"; + default "30"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T307"; + } + leaf t308 { + type uint16 { + range "40 | 80 | 160 | 320"; + } + units "milliseconds"; + default "160"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T308"; + } + leaf t309 { + type uint8 { + range "1..8"; + } + units "seconds"; + default "5"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T309"; + } + leaf t310 { + type uint16 { + range "40 | 80 | 120 | 160 | 200 | 240 | 280 | 320"; + } + units "milliseconds"; + default "160"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T310"; + } + leaf t311 { + type uint16 { + range "250 | 500 | 750 | 1000 | 1250 | 1500 | 1750 | 2000"; + } + units "milliseconds"; + default "2000"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T311"; + } + leaf t312 { + type uint8 { + range "0..15"; + } + units "seconds"; + default "1"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T312"; + } + leaf t313 { + type uint8 { + range "0..15"; + } + units "seconds"; + default "3"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T313"; + } + leaf t314 { + type uint8 { + range "0 | 2 | 4 | 6 | 8 | 12 | 16 | 20"; + } + units "seconds"; + default "12"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T314"; + } + leaf t315 { + type uint16 { + range "0 | 10 | 30 | 60 | 180 | 600 | 1200 | 1800"; + } + units "seconds"; + default "180"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T315"; + } + leaf t316 { + type int64; + units "seconds"; + default "30"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}. -1 indicates an unbounded timer in which there is no update."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T316"; + } + leaf t317 { + type uint16 { + range "0 | 10 | 30 | 60 | 180 | 600 | 1200 | 1800"; + } + units "seconds"; + config false; + description + "Timer measured in {{units}}. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.T317"; + } + leaf n300 { + type uint8 { + range "0..7"; + } + default "3"; + config false; + description + "Counter. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.N300"; + } + leaf n301 { + type uint8 { + range "0..7"; + } + default "2"; + config false; + description + "Counter. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.N301"; + } + leaf n302 { + type uint8 { + range "0..7"; + } + default "3"; + config false; + description + "Counter. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.N302"; + } + leaf n304 { + type uint8 { + range "0..7"; + } + default "2"; + config false; + description + "Counter. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.N304"; + } + leaf n310 { + type uint8 { + range "0..7"; + } + default "4"; + config false; + description + "Counter. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.N310"; + } + leaf n312 { + type uint16 { + range "1..1000"; + } + default "1"; + config false; + description + "Counter. Only the following values are considered valid: 1, 2, 4, 10, 20, 50, 100, 200, 400, 600, 800, and 1000. Any value other than those and the CPE MUST reject the request. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.44}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.N312"; + } + leaf n313 { + type uint8 { + range "1 | 2 | 4 | 10 | 20 | 50 | 100 | 200"; + } + default "20"; + config false; + description + "Counter. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.N313"; + } + leaf n315 { + type uint16 { + range "1..1000"; + } + default "1"; + config false; + description + "Counter. Only the following values are considered valid: :1, 2, 4, 10, 20, 50, 100, 200, 400, 600, 800, and 1000. Any value other than those and the CPE MUST reject the request. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 13.1 and Section 10.3.3.43}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.N315"; + } + leaf wait-time { + type uint8 { + range "0..15"; + } + units "seconds"; + config false; + description + "Time period the UE has to wait before repeating the rejected procedure. This is an IE used when sending RRC connection reject, redirecting the requesting UE to another frequency. 0 indicates that repetition is not allowed. {{bibref|3GPP-TS.25.331|Section 10.3.3.50}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers.WaitTime"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RRCTimers."; + } + + grouping umts-ran-drx-g { + description + "This object contains parameters related to DRX parameters."; + leaf drx-cycle-length-coefficient-cs { + type uint8 { + range "6..9"; + } + config false; + description + "Defines the DRX cycle length coefficient for CS domain to optimize paging in idle mode. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 10.3.3.6}}. {{param}} refers to 'k' in the formula as specified in {{bibref|3GPP-TS.25.304}}, Discontinuous reception. Used by the CN CS domain to count paging occasions for discontinuous reception in Idle Mode. The duration of the DRX cycle is 2 <power> k frames, where 'k' is the used DRX cycle length coefficient for CN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.DRX.DRXCycleLengthCoefficientCS"; + } + leaf drx-cycle-length-coefficient-ps { + type uint8 { + range "6..9"; + } + config false; + description + "Defines the DRX cycle length coefficient for PS domain to optimize paging in idle mode. Defined in SIB1 {{bibref|3GPP-TS.25.331|Section 10.3.3.6}}. {{param}} refers to 'k' in the formula as specified in {{bibref|3GPP-TS.25.304}}, Discontinuous reception. Used by the CN PS domain to count paging occasions for discontinuous reception in Idle Mode. The duration of the DRX cycle is 2 <power> k frames, where 'k' is the used DRX cycle length coefficient for CN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.DRX.DRXCycleLengthCoefficientPS"; + } + leaf utrandrx-cycle-length-coefficient { + type uint8 { + range "3..9"; + } + config false; + description + "Defines the DRX cycle length used by UTRAN to count paging occasions for discontinuous reception in Connected Mode. The duration of the DRX cycle is 2 <power> k frames, where 'k' is the used DRX cycle length coefficient for UTRAN. {{param}} SHOULD be used by the UTRAN/FAP for UEs in Cell_PCH/Cell_FACH state. {{bibref|3GPP-TS.25.331|Section 10.3.3.49}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.DRX.UTRANDRXCycleLengthCoefficient"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.DRX."; + } + + grouping umts-ran-power-control-g { + description + "This object contains parameters related to power control and RACH."; + leaf constant-value { + type int64; + units "dB"; + config false; + description + "Used by the UE to calculate the initial output power, specified in {{units}}, on PRACH according to the open loop power control procedure. Parameter in SIB5. {{bibref|3GPP-TS.25.331|Section 10.3.6.11}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.PowerControl.ConstantValue"; + } + leaf power-ramp-step-up { + type uint8 { + range "1..8"; + } + units "dB"; + config false; + description + "Used for the Uplink Common Channel. Defines the Power ramp setup, specified in {{units}}, on PRACH preamble when no acquisition indicator (AI) is detected by the UE. Parameter in SIB5. {{bibref|3GPP-TS.25.331|Section 10.3.6.54}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.PowerControl.PowerRampStepUp"; + } + leaf preamble-retrans-max { + type uint8 { + range "1..64"; + } + config false; + description + "Used for the Uplink Common Channel. Defines the maximum number of preambles allowed in one preamble ramping cycle. PRACH Preamble Retrans Max is part of \"PRACH power offset\" which is part of \"PRACH system information list\". Parameter in SIB5. {{bibref|3GPP-TS.25.331|Section 10.3.6.54}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.PowerControl.PreambleRetransMax"; + } + leaf persistence-scale-factor { + type uint8 { + range "2..9"; + } + config false; + description + "Persistence Scaling Factor for overload control. Parameter in SIB5. The value is the scaling factor multiplied by 10, e.g. 2 is a scaling factor of 0.2"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.PowerControl.PersistenceScaleFactor"; + } + leaf m-max { + type uint8 { + range "1..32"; + } + config false; + description + "Maximum number of RACH preamble cycles. Defines how many times the PRACH preamble ramping procedure can be repeated before UE MAC reports a failure on RACH transmission to higher layers. Maximum number of RACH preamble cycles is part of \"RACH transmission parameters\" which is part of \"PRACH system information list\" which is part of SIB5. {{bibref|3GPP-TS.25.331|Section 10.3.6.67}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.PowerControl.MMax"; + } + leaf nb01-min { + type uint8 { + range "0..50"; + } + config false; + description + "RACH random back-off lower bound. {{param}} is the lower bound of the waiting time in 10 millisecond increments (i.e. 1 corresponds to 10 ms and 50 corresponds to 500 ms). {{param}} is part of \"RACH transmission parameters\" which is part of \"PRACH system information list\" which is part of SIB5. {{bibref|3GPP-TS.25.331|Section 10.3.6.67}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.PowerControl.NB01Min"; + } + leaf nb01-max { + type uint8 { + range "0..50"; + } + config false; + description + "RACH random back-off upper bound. {{param}} is the Upper bound of the waiting time in 10 millisecond increments (i.e. 1 corresponds to 10 ms and 50 corresponds to 500 ms). {{param}} is part of \"RACH transmission parameters\" which is part of \"PRACH system information list\" which is part of SIB5. {{bibref|3GPP-TS.25.331|Section 10.3.6.67}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.PowerControl.NB01Max"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.PowerControl."; + } + + grouping umts-ran-cell-restriction-g { + description + "This object contains parameters related to cell access restriction."; + leaf cell-barred { + type boolean; + config false; + description + "Indicates whether the FAP is barred from service or not. {{bibref|3GPP-TS.25.331|Section 10.3.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellRestriction.CellBarred"; + } + leaf intra-freq-cell-reselection-indicator { + type boolean; + config false; + description + "When {{param|CellBarred}} is {{true}}, this indicates whether the intra-frequency cell re-selection is allowed or not. {{param}} has no meaning if {{param|CellBarred}} is {{false}} and MUST be ignored in such cases. {{true}} means that intra-frequency cell re-selection is allowed. {{false}} means that intra-frequency cell re-selection is not allowed. {{bibref|3GPP-TS.25.331|Section 10.3.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellRestriction.IntraFreqCellReselectionIndicator"; + } + leaf t-barred { + type uint16 { + range "10 | 20 | 40 | 80 | 160 | 320 | 640 | 1280"; + } + units "seconds"; + config false; + description + "The time period in {{units}} during which the UE is barred from accessing the FAP. {{bibref|3GPP-TS.25.331|Section 10.3.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellRestriction.TBarred"; + } + leaf-list access-class-barred-list-cs { + type uint8 { + range "0..15"; + } + config false; + description + "{{list}} Each entry is an Access Class that is barred from CS service. The order of the list has no significance. {{bibref|3GPP-TS.25.331|Section 10.3.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellRestriction.AccessClassBarredListCS"; + } + leaf-list access-class-barred-list-ps { + type uint8 { + range "0..15"; + } + config false; + description + "{{list}} Each entry is an Access Class that is barred from PS service. The order of the list has no significance. {{bibref|3GPP-TS.25.331|Section 10.3.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellRestriction.AccessClassBarredListPS"; + } + leaf cell-reserved-for-operator-use { + type boolean; + config false; + description + "Indicates whether the FAP is reserved for operator use or not. {{bibref|3GPP-TS.25.331|Section 10.3.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellRestriction.CellReservedForOperatorUse"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.CellRestriction."; + } + + grouping umts-ran-intra-freq-meas-g { + description + "This object contains parameters relating to the intra-freq HO control parameters."; + leaf measurement-quantity { + type enumeration { + enum "cpich ec/no" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.MeasurementQuantity - CPICH Ec/No"; + } + enum "cpich rscp" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.MeasurementQuantity - CPICH RSCP"; + } + enum "pathloss" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.MeasurementQuantity - Pathloss"; + } + } + config false; + description + "Defines the measurement quantity for intra-freq HO measurement when the UE is in Cell-DCH state. Enumeration of: {{enum}} {{bibref|3GPP-TS.25.331|Section 10.3.7.38}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.MeasurementQuantity"; + } + leaf filter-coefficient { + type uint8 { + range "0..9 | 11 | 13 | 15 | 17 | 19"; + } + config false; + description + "Defines the equivalent time constant of the low pass filter applied to the CPICH quality measurements, or {{enum|CPICH Ec/No|MeasurementQuantity}}. {{bibref|3GPP-TS.25.331|Section 8.6.7.2 and Section 10.3.7.9}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.FilterCoefficient"; + } + leaf-list intra-frequency-event-identity { + type string; + config false; + max-elements "32"; + description + "{{list}} Each entry is an Event ID from the list of: 1a, 1b, 1c, 1d, 1e, 1f, 1g, 1h, 1i Defines the identity of the event used to trigger UE reporting (in case of event-triggered reporting). {{bibref|3GPP-TS.25.331|Section 10.3.7.34}} Since the FAP can determine this on its own, it might not be necessary to configure it."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.IntraFrequencyEventIdentity"; + } + leaf-list triggering-condition2-event1a { + type enumeration { + enum "active" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1a - Active"; + } + enum "monitored" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1a - Monitored"; + } + enum "active and monitored" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1a - Active and Monitored"; + } + enum "detected" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1a - Detected"; + } + enum "detected and monitored" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1a - Detected and Monitored"; + } + } + config false; + description + "{{list}} Indicates which cells can trigger Event 1a. {{enum}} {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1a"; + } + leaf-list triggering-condition1-event1b { + type enumeration { + enum "active" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition1Event1b - Active"; + } + enum "monitored" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition1Event1b - Monitored"; + } + enum "active and monitored" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition1Event1b - Active and Monitored"; + } + } + config false; + description + "{{list}} Indicates which cells can trigger Event 1b. {{enum}} {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition1Event1b"; + } + leaf-list triggering-condition2-event1e { + type enumeration { + enum "active" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1e - Active"; + } + enum "monitored" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1e - Monitored"; + } + enum "active and monitored" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1e - Active and Monitored"; + } + enum "detected" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1e - Detected"; + } + enum "detected and monitored" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1e - Detected and Monitored"; + } + } + config false; + description + "{{list}} Indicates which cells can trigger Event 1e. {{enum}} {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition2Event1e"; + } + leaf-list triggering-condition1-event1f { + type enumeration { + enum "active" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition1Event1f - Active"; + } + enum "monitored" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition1Event1f - Monitored"; + } + enum "active and monitored" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition1Event1f - Active and Monitored"; + } + } + config false; + description + "{{list}} Indicates which cells can trigger Event 1f. {{enum}} {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TriggeringCondition1Event1f"; + } + leaf reporting-range-event1a { + type uint8 { + range "0..29"; + } + units "dB"; + config false; + description + "Defines a constant in the inequality criterion that needs to be satisfied for an Event 1a to occur. Actual values of the range are 0.0 to 14.5 {{units}} in steps of 0.5 {{units}}. The value of {{param}} divided by 2 yields the actual value of the range. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ReportingRangeEvent1a"; + } + leaf reporting-range-event1b { + type uint8 { + range "0..29"; + } + units "dB"; + config false; + description + "Defines a constant in the inequality criterion that needs to be satisfied for an Event 1b to occur. Actual values of the range are 0.0 to 14.5 {{units}} in steps of 0.5 {{units}}. The value of {{param}} divided by 2 yields the actual value of the range. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ReportingRangeEvent1b"; + } + leaf weighting-factor-event1a { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.WeightingFactorEvent1a"; + } + leaf weighting-factor-event1b { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.WeightingFactorEvent1b"; + } + leaf report-deactivation-threshold-event1a { + type uint8 { + range "0..7"; + } + config false; + description + "Defines the maximum number of cells allowed in the \"active cell set\" for Event 1a to occur. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ReportDeactivationThresholdEvent1a"; + } + leaf reporting-amount-event1a { + type int64; + config false; + description + "Defines the maximum number of MEASUREMENT REPORT messages sent by the UE in case of periodic reporting triggered by an Event 1a The value -1 is used to represent an unbounded maximum. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ReportingAmountEvent1a"; + } + leaf reporting-amount-event1c { + type int64; + config false; + description + "Defines the maximum number of MEASUREMENT REPORT messages sent by the UE in case of periodic reporting triggered by an Event 1c The value -1 is used to represent an unbounded maximum. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ReportingAmountEvent1c"; + } + leaf reporting-interval-event1a { + type uint16 { + range "0 | 250 | 500 | 1000 | 2000 | 4000 | 8000 | 16000"; + } + units "milliseconds"; + config false; + description + "Defines the transmission period in {{units}} of MEASUREMENT REPORT messages sent by the UE in case of periodic reporting triggered by an Event 1a. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ReportingIntervalEvent1a"; + } + leaf reporting-interval-event1c { + type uint16 { + range "0 | 250 | 500 | 1000 | 2000 | 4000 | 8000 | 16000"; + } + units "milliseconds"; + config false; + description + "Defines the transmission period in {{units}} of MEASUREMENT REPORT messages sent by the UE in case of periodic reporting triggered by an Event 1c. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ReportingIntervalEvent1c"; + } + leaf hysteresis-event1a { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 14.1.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.HysteresisEvent1a"; + } + leaf hysteresis-event1b { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 14.1.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.HysteresisEvent1b"; + } + leaf hysteresis-event1c { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 14.1.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.HysteresisEvent1c"; + } + leaf hysteresis-event1d { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 14.1.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.HysteresisEvent1d"; + } + leaf hysteresis-event1e { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 14.1.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.HysteresisEvent1e"; + } + leaf hysteresis-event1f { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 14.1.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.HysteresisEvent1f"; + } + leaf time-to-trigger-event1a { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for intra-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TimeToTriggerEvent1a"; + } + leaf time-to-trigger-event1b { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for intra-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TimeToTriggerEvent1b"; + } + leaf time-to-trigger-event1c { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for intra-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TimeToTriggerEvent1c"; + } + leaf time-to-trigger-event1d { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for intra-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TimeToTriggerEvent1d"; + } + leaf time-to-trigger-event1e { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for intra-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TimeToTriggerEvent1e"; + } + leaf time-to-trigger-event1f { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for intra-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.TimeToTriggerEvent1f"; + } + leaf threshold-used-frequency-event1e { + type int64; + config false; + description + "Defines the reporting threshold for intra-freq HO measurement when the UE is in Cell-DCH state. This is the \"Threshold used frequency\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.39}}. Each valid value of {{param|MeasurementQuantity}} has a different valid range. {{enum|CPICH RSCP|MeasurementQuantity}} has a range of -120 dBm to -25 dBm {{enum|CPICH Ec/No|MeasurementQuantity}} has a range of -24 dB to 0 dB {{enum|Pathloss|MeasurementQuantity}} has a range of 30 dB to 165 dB"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ThresholdUsedFrequencyEvent1e"; + } + leaf threshold-used-frequency-event1f { + type int64; + config false; + description + "Defines the reporting threshold for intra-freq HO measurement when the UE is in Cell-DCH state. This is the \"Threshold used frequency\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.39}}. Each valid value of {{param|MeasurementQuantity}} has a different valid range. {{enum|CPICH RSCP|MeasurementQuantity}} has a range of -120 dBm to -25 dBm {{enum|CPICH Ec/No|MeasurementQuantity}} has a range of -24 dB to 0 dB {{enum|Pathloss|MeasurementQuantity}} has a range of 30 dB to 165 dB"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ThresholdUsedFrequencyEvent1f"; + } + leaf replacement-activation-threshold-event1c { + type uint8 { + range "0..7"; + } + config false; + description + "Defines the minimum number of cells allowed in the \"active cell set\" for Event 1c to occur. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.ReplacementActivationThresholdEvent1c"; + } + leaf instance-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.InstanceNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas."; + } + + grouping umts-ran-intra-freq-meas-instance-g { + description + "Table containing parameters relating to a particular instance of intra-freq events."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.Alias"; + } + leaf intra-frequency-event-identity { + type enumeration { + enum "1a" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 1a"; + } + enum "1b" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 1b"; + } + enum "1c" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 1c"; + } + enum "1d" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 1d"; + } + enum "1e" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 1e"; + } + enum "1f" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 1f"; + } + } + description + "Each entry is an Event ID from the list of: {{enum}} Defines the identity of the event used to trigger UE reporting (in case of event-triggered reporting). {{bibref|3GPP-TS.25.331|Section 10.3.7.34}} This attribute is readable, as it is highly dependent on how the FAP makes use of the event."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.IntraFrequencyEventIdentity"; + } + leaf event-description { + type string { + length "0..256"; + } + description + "A free-form description of the way the event instance is meant to be used. E.g. \"hand-out to macro cells\", \"addition of enterprise HNB cell to Active Set\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.EventDescription"; + } + leaf measurement-quantity { + type enumeration { + enum "cpich ec/no" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.MeasurementQuantity - CPICH Ec/No"; + } + enum "cpich rscp" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.MeasurementQuantity - CPICH RSCP"; + } + enum "pathloss" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.MeasurementQuantity - Pathloss"; + } + } + config false; + description + "Defines the measurement quantity for intra-freq HO measurement when the UE is in Cell-DCH state. Enumeration of: {{enum}} {{bibref|3GPP-TS.25.331|Section 10.3.7.38}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.MeasurementQuantity"; + } + leaf filter-coefficient { + type uint8 { + range "0..9 | 11 | 13 | 15 | 17 | 19"; + } + config false; + description + "Defines the equivalent time constant of the low pass filter applied to the CPICH quality measurements, or {{enum|CPICH Ec/No|MeasurementQuantity}}. {{bibref|3GPP-TS.25.331|Section 8.6.7.2 and Section 10.3.7.9}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.FilterCoefficient"; + } + leaf-list triggering-condition { + type enumeration { + enum "active" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.TriggeringCondition - Active"; + } + enum "monitored" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.TriggeringCondition - Monitored"; + } + enum "active and monitored" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.TriggeringCondition - Active and Monitored"; + } + enum "detected" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.TriggeringCondition - Detected"; + } + enum "detected and monitored" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.TriggeringCondition - Detected and Monitored"; + } + } + config false; + description + "{{list}} Indicates which cells can trigger the event instance. {{enum}} {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.TriggeringCondition"; + } + leaf reporting-range { + type uint8 { + range "0..29"; + } + units "dB"; + config false; + description + "Applicable to events 1a, 1b, otherwise not needed. Defines a constant in the inequality criterion that needs to be satisfied for an Event 1b to occur. Actual values of the range are 0.0 to 14.5 {{units}} in steps of 0.5 {{units}}. The value of {{param}} divided by 2 yields the actual value of the range. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.ReportingRange"; + } + leaf weighting-factor { + type uint8 { + range "0..20"; + } + config false; + description + "Applicable to events 1a, 1b, otherwise not needed. Defines the weighting factor for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.WeightingFactor"; + } + leaf report-deactivation-threshold { + type uint8 { + range "0..7"; + } + config false; + description + "Applicable to events 1a, otherwise not needed. Defines the maximum number of cells allowed in the \"active cell set\" for Event 1a to occur. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.ReportDeactivationThreshold"; + } + leaf reporting-amount { + type int64; + config false; + description + "Applicable to events 1a, 1c, otherwise not needed. Defines the maximum number of MEASUREMENT REPORT messages sent by the UE in case of periodic reporting triggered by an Event 1a The value -1 is used to represent an unbounded maximum. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.ReportingAmount"; + } + leaf reporting-interval { + type uint16 { + range "0 | 250 | 500 | 1000 | 2000 | 4000 | 8000 | 16000"; + } + units "milliseconds"; + config false; + description + "Applicable to events 1a, 1c, otherwise not needed. Defines the transmission period in {{units}} of MEASUREMENT REPORT messages sent by the UE in case of periodic reporting triggered by an Event 1a. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.ReportingInterval"; + } + leaf hysteresis { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for intra-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 14.1.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.Hysteresis"; + } + leaf time-to-trigger { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for intra-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.TimeToTrigger"; + } + leaf threshold-used-frequency { + type int64; + config false; + description + "Applicable to events 1e, 1f, otherwise not needed. Defines the reporting threshold for intra-freq HO measurement when the UE is in Cell-DCH state. This is the \"Threshold used frequency\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.39}}. Each valid value of {{param|MeasurementQuantity}} has a different valid range. {{enum|CPICH RSCP|MeasurementQuantity}} has a range of -120 dBm to -25 dBm {{enum|CPICH Ec/No|MeasurementQuantity}} has a range of -24 dB to 0 dB {{enum|Pathloss|MeasurementQuantity}} has a range of 30 dB to 165 dB"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.ThresholdUsedFrequency"; + } + leaf replacement-activation-threshold { + type uint8 { + range "0..7"; + } + config false; + description + "Applicable only to event 1c Defines the minimum number of cells allowed in the \"active cell set\" for Event 1c to occur. {{bibref|3GPP-TS.25.331|Section 14.1.2 and Section 10.3.7.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}.ReplacementActivationThreshold"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.IntraFreqMeas.Instance.{i}."; + } + + grouping umts-ran-inter-freq-meas-g { + description + "This object contains parameters relating to the inter-freq HO related control parameters."; + leaf measurement-quantity { + type enumeration { + enum "cpich ec/no" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.MeasurementQuantity - CPICH Ec/No"; + } + enum "cpich rscp" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.MeasurementQuantity - CPICH RSCP"; + } + } + config false; + description + "Defines the measurement quantity for inter-freq HO measurement when the UE is in Cell-DCH state. Enumeration of: {{enum}} {{bibref|3GPP-TS.25.331|Section 10.3.7.18}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.MeasurementQuantity"; + } + leaf filter-coefficient { + type uint8 { + range "0..9 | 11 | 13 | 15 | 17 | 19"; + } + config false; + description + "Defines the filter coefficient for inter-freq HO measurement when the UE is in Cell-DCH state. {{bibref|3GPP-TS.25.331|Section 10.3.7.9 and Section 10.3.7.18}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.FilterCoefficient"; + } + leaf-list inter-frequency-event-identity { + type string; + config false; + max-elements "32"; + description + "{{list}} Each entry is an Event ID from the list of: 2a, 2b, 2c, 2d, 2e,2f Defines the identity of the event used to trigger inter-frequency UE reporting (in case of event-triggered reporting). {{bibref|3GPP-TS.25.331|Section 10.3.7.14}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.InterFrequencyEventIdentity"; + } + leaf weighting-factor-event2a { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.WeightingFactorEvent2a"; + } + leaf weighting-factor-event2b { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.WeightingFactorEvent2b"; + } + leaf weighting-factor-event2d { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.WeightingFactorEvent2d"; + } + leaf weighting-factor-event2f { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.WeightingFactorEvent2f"; + } + leaf hysteresis-event2a { + type uint8 { + range "0..29"; + } + config false; + description + "Defines the hysteresis for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 14.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.HysteresisEvent2a"; + } + leaf hysteresis-event2b { + type uint8 { + range "0..29"; + } + config false; + description + "Defines the hysteresis for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 14.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.HysteresisEvent2b"; + } + leaf hysteresis-event2d { + type uint8 { + range "0..29"; + } + config false; + description + "Defines the hysteresis for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 14.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.HysteresisEvent2d"; + } + leaf hysteresis-event2f { + type uint8 { + range "0..29"; + } + config false; + description + "Defines the hysteresis for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 14.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.HysteresisEvent2f"; + } + leaf time-to-trigger-event2a { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for inter-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.19 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.TimeToTriggerEvent2a"; + } + leaf time-to-trigger-event2b { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for inter-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.19 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.TimeToTriggerEvent2b"; + } + leaf time-to-trigger-event2d { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for inter-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.19 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.TimeToTriggerEvent2d"; + } + leaf time-to-trigger-event2f { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for inter-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.19 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.TimeToTriggerEvent2f"; + } + leaf threshold-used-frequency-event2b { + type int64; + config false; + description + "Defines the reporting threshold for inter-freq HO measurement when the UE is in Cell-DCH state. This is the \"Threshold used frequency\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}. Each valid value of {{param|MeasurementQuantity}} has a different valid range. {{enum|CPICH RSCP|MeasurementQuantity}} has a range of -120 dBm to -25 dBm {{enum|CPICH Ec/No|MeasurementQuantity}} has a range of -24 dB to 0 dB"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.ThresholdUsedFrequencyEvent2b"; + } + leaf threshold-used-frequency-event2d { + type int64; + config false; + description + "Defines the reporting threshold for inter-freq HO measurement when the UE is in Cell-DCH state. This is the \"Threshold used frequency\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}. Each valid value of {{param|MeasurementQuantity}} has a different valid range. {{enum|CPICH RSCP|MeasurementQuantity}} has a range of -120 dBm to -25 dBm {{enum|CPICH Ec/No|MeasurementQuantity}} has a range of -24 dB to 0 dB"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.ThresholdUsedFrequencyEvent2d"; + } + leaf threshold-used-frequency-event2f { + type int64; + config false; + description + "Defines the reporting threshold for inter-freq HO measurement when the UE is in Cell-DCH state. This is the \"Threshold used frequency\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}. Each valid value of {{param|MeasurementQuantity}} has a different valid range. {{enum|CPICH RSCP|MeasurementQuantity}} has a range of -120 dBm to -25 dBm {{enum|CPICH Ec/No|MeasurementQuantity}} has a range of -24 dB to 0 dB"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.ThresholdUsedFrequencyEvent2f"; + } + leaf instance-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.InstanceNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas."; + } + + grouping umts-ran-inter-freq-meas-instance-g { + description + "Table containing parameters relating to a particular instance of inter-freq events."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.Alias"; + } + leaf intra-frequency-event-identity { + type enumeration { + enum "2a" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 2a"; + } + enum "2b" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 2b"; + } + enum "2c" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 2c"; + } + enum "2d" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 2d"; + } + enum "2e" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 2e"; + } + enum "2f" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.IntraFrequencyEventIdentity - 2f"; + } + } + description + "Each entry is an Event ID from the list of: {{enum}} Defines the identity of the event used to trigger UE reporting (in case of event-triggered reporting). {{bibref|3GPP-TS.25.331|Section 10.3.7.14}} This attribute is readable, as it is highly dependent on how the FAP makes use of the event."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.IntraFrequencyEventIdentity"; + } + leaf event-description { + type string { + length "0..256"; + } + description + "A free-form description of the way the event instance is meant to be used. E.g. \"detecting cell edge to prepare for hand-out\", \"cancel hand-out preparation\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.EventDescription"; + } + leaf measurement-quantity { + type enumeration { + enum "cpich ec/no" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.MeasurementQuantity - CPICH Ec/No"; + } + enum "cpich rscp" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.MeasurementQuantity - CPICH RSCP"; + } + } + config false; + description + "Defines the measurement quantity for inter-freq HO measurement when the UE is in Cell-DCH state. Enumeration of: {{enum}} {{bibref|3GPP-TS.25.331|Section 10.3.7.18}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.MeasurementQuantity"; + } + leaf filter-coefficient { + type uint8 { + range "0..9 | 11 | 13 | 15 | 17 | 19"; + } + config false; + description + "Defines the filter coefficient for inter-freq HO measurement when the UE is in Cell-DCH state. {{bibref|3GPP-TS.25.331|Section 10.3.7.9 and Section 10.3.7.18}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.FilterCoefficient"; + } + leaf weighting-factor { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.WeightingFactor"; + } + leaf hysteresis { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for inter-freq HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 14.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.Hysteresis"; + } + leaf time-to-trigger { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for inter-freq HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.TimeToTrigger"; + } + leaf threshold-used-frequency { + type int64; + config false; + description + "Applicable to events 2b, 2d, 2f, otherwise not needed. Defines the reporting threshold for inter-freq HO measurement when the UE is in Cell-DCH state. This is the \"Threshold used frequency\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}. Each valid value of {{param|MeasurementQuantity}} has a different valid range. {{enum|CPICH RSCP|MeasurementQuantity}} has a range of -120 dBm to -25 dBm {{enum|CPICH Ec/No|MeasurementQuantity}} has a range of -24 dB to 0 dB"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.ThresholdUsedFrequency"; + } + leaf threshold-non-used-frequency { + type int64; + config false; + description + "Applicable to events 2a, 2b, 2c, 2e otherwise not needed. Defines the reporting threshold for inter-freq HO measurement when the UE is in Cell-DCH state. This is the \"Threshold non used frequency\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.19}}. Each valid value of {{param|MeasurementQuantity}} has a different valid range. {{enum|CPICH RSCP|MeasurementQuantity}} has a range of -120 dBm to -25 dBm {{enum|CPICH Ec/No|MeasurementQuantity}} has a range of -24 dB to 0 dB"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}.ThresholdNonUsedFrequency"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterFreqMeas.Instance.{i}."; + } + + grouping umts-ran-inter-rat-meas-g { + description + "This object contains parameters relating to the inter-RAT HO related control parameters. This is specifically for GERAN system."; + leaf gsm-filter-coefficient { + type uint8 { + range "0..9 | 11 | 13 | 15 | 17 | 19"; + } + config false; + description + "Defines the filter coefficient for inter-RAT HO measurement when the UE is in Cell-DCH state. {{bibref|3GPP-TS.25.331|Section 10.3.7.9 and Section 10.3.7.29}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.GSMFilterCoefficient"; + } + leaf bsic-verification-required { + type boolean; + config false; + description + "Indicates whether the BSIC verification is required or not for inter-RAT HO measurement when the UE is in Cell-DCH state. {{bibref|3GPP-TS.25.331|Section 10.3.7.29}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.BSICVerificationRequired"; + } + leaf weighting-factor { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for inter-RAT HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.30}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.WeightingFactor"; + } + leaf hysteresis { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for inter-RAT HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.30}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Hysteresis"; + } + leaf time-to-trigger { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for inter-RAT HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.TimeToTrigger"; + } + leaf threshold-own-system { + type int64; + config false; + description + "Defines the reporting threshold for inter-RAT HO measurement when the UE is in Cell-DCH state. This is the \"Threshold own system\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.30}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.ThresholdOwnSystem"; + } + leaf threshold-other-system { + type int64; + config false; + description + "Defines the reporting threshold for inter-RAT HO measurement when the UE is in Cell-DCH state. This is the \"Threshold other system\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.30}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.ThresholdOtherSystem"; + } + leaf instance-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.InstanceNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas."; + } + + grouping umts-ran-inter-rat-meas-instance-g { + description + "Table containing parameters relating to a particular instance of inter-freq events."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.Alias"; + } + leaf inter-rat-event-identity { + type enumeration { + enum "3a" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.InterRATEventIdentity - 3a"; + } + enum "3b" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.InterRATEventIdentity - 3b"; + } + enum "3c" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.InterRATEventIdentity - 3c"; + } + enum "3d" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.InterRATEventIdentity - 3d"; + } + } + description + "Each entry is an Event ID from the list of: {{enum}} Defines the identity of the event used to trigger UE reporting (in case of event-triggered reporting). {{bibref|3GPP-TS.25.331|Section 10.3.7.14}} This attribute is readable, as it is highly dependent on how the FAP makes use of the event."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.InterRATEventIdentity"; + } + leaf event-description { + type string { + length "0..256"; + } + description + "A free-form description of the way the event instance is meant to be used. E.g. \"hand-out to GSM macrocell\", \"cancel hand-out preparation due to decreasing macrocell quality\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.EventDescription"; + } + leaf filter-coefficient { + type uint8 { + range "0..9 | 11 | 13 | 15 | 17 | 19"; + } + config false; + description + "Defines the filter coefficient for inter-freq HO measurement when the UE is in Cell-DCH state. {{bibref|3GPP-TS.25.331|Section 10.3.7.9 and Section 10.3.7.18}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.FilterCoefficient"; + } + leaf bsic-verification-required { + type boolean; + config false; + description + "Applicable only to GSM events. Indicates whether the BSIC verification is required or not for inter-RAT HO measurement when the UE is in Cell-DCH state. {{bibref|3GPP-TS.25.331|Section 10.3.7.29}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.BSICVerificationRequired"; + } + leaf weighting-factor { + type uint8 { + range "0..20"; + } + config false; + description + "Defines the weighting factor for inter-RAT HO measurement when the UE is in Cell-DCH state. Actual values of the weighting factor are 0.0 to 2.0 in steps of 0.1. The value of {{param}} divided by 10 yields the actual value of the weighting factor. {{bibref|3GPP-TS.25.331|Section 10.3.7.30}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.WeightingFactor"; + } + leaf hysteresis { + type uint8 { + range "0..15"; + } + config false; + description + "Defines the hysteresis for inter-RAT HO measurement when the UE is in Cell-DCH state. Actual values of the range are 0.0 to 7.5 in steps of 0.5. The value of {{param}} divided by 2 yields the actual value of the hysteresis. {{bibref|3GPP-TS.25.331|Section 10.3.7.30}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.Hysteresis"; + } + leaf time-to-trigger { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the time-to-trigger in {{units}} for inter-RAT HO measurement when the UE is in Cell-DCH state. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.39 and Section 10.3.7.64}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.TimeToTrigger"; + } + leaf threshold-own-system { + type int64; + config false; + description + "Applicable only to event 3a, otherwise not needed. Defines the reporting threshold for inter-RAT HO measurement when the UE is in Cell-DCH state. This is the \"Threshold own system\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.30}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.ThresholdOwnSystem"; + } + leaf threshold-other-system { + type int64; + config false; + description + "Applicable to events 3a, 3b, 3c, otherwise not needed. Defines the reporting threshold for inter-RAT HO measurement when the UE is in Cell-DCH state. This is the \"Threshold other system\" as defined in {{bibref|3GPP-TS.25.331|Section 10.3.7.30}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}.ThresholdOtherSystem"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.InterRATMeas.Instance.{i}."; + } + + grouping umts-ran-ue-internal-meas-g { + description + "This object contains parameters relating to the UE internal measurement control parameters."; + leaf filter-coefficient { + type uint8 { + range "0..9 | 11 | 13 | 15 | 17 | 19"; + } + config false; + description + "Defines the filter coefficient for UE internal measurement. {{bibref|3GPP-TS.25.331|Section 10.3.7.9 and Section 10.3.7.79}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.UEInternalMeas.FilterCoefficient"; + } + leaf ue-tx-pwr-threshold-event6a { + type int64; + units "dBm"; + config false; + description + "Defines the threshold for UE transmit power above which Event 6a is reported. {{bibref|3GPP-TS.25.331|Section 10.3.7.80}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.UEInternalMeas.UETxPwrThresholdEvent6a"; + } + leaf time-to-trigger-event6a { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the period in {{units}} between detection of Event 6a and sending of Measurement Report. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.80}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.UEInternalMeas.TimeToTriggerEvent6a"; + } + leaf ue-tx-pwr-threshold-event6b { + type int64; + units "dBm"; + config false; + description + "Defines the threshold for UE transmit power above which Event 6b is reported. {{bibref|3GPP-TS.25.331|Section 10.3.7.80}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.UEInternalMeas.UETxPwrThresholdEvent6b"; + } + leaf time-to-trigger-event6b { + type uint16 { + range "0 | 10 | 20 | 40 | 60 | 80 | 100 | 120 | 160 | 200 | 240 | 320 | 640 | 1280 | 2560 | 5000"; + } + units "milliseconds"; + config false; + description + "Defines the period in {{units}} between detection of Event 6b and sending of Measurement Report. Only the specified values are considered valid, any value other than those and the CPE MUST reject the request. {{bibref|3GPP-TS.25.331|Section 10.3.7.80}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.UEInternalMeas.TimeToTriggerEvent6b"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.UEInternalMeas."; + } + + grouping umts-ran-rf-g { + description + "This object contains parameters relating to the RF configuration."; + leaf-list uarfcndl { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a DL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433|Section 9.2.1.65}} Self-configuration for UARFCN is controlled by {{param|.Capabilities.UMTS.SelfConfig.UARFCNConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.UARFCNSelfConfigEnable}} from an enabled perspective. If the FAP's self-configuration capability for UARFCN is available and enabled, this parameter MAY contain more than one item and the FAP is expected to select one from the list for {{param|UARFCNDLInUse}}. If the self-configuration capability is not available or not enabled, then this parameter SHOULD contain only a single item. The UARFCN values supplied to the list are derived based on the formula defined in {{bibref|3GPP-TS.25.104|Section 5.4.3}} The order of the UARFCN entries has no significance. The carrier spacing in FDD mode is fixed as defined in {{bibref|3GPP-TS.25.104}}. Therefore, the FAP can unambiguously derive the UL UARFCN value based on the selected DL UARFCN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.UARFCNDL"; + } + leaf uarfcndl-in-use { + type uint64; + description + "The DL UARFCN being used by the FAP. Self-configuration for UARFCN is controlled by {{param|.Capabilities.UMTS.SelfConfig.UARFCNConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.UARFCNSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in {{param|UARFCNDL}}. If the self-configuration capability is not available or not enabled, then this parameter contains the first value in {{param|UARFCNDL}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.UARFCNDLInUse"; + } + leaf uarfcnul-in-use { + type uint64; + description + "The UL UARFCN being used by the FAP. The UL UARFCN that corresponds to {{param|UARFCNDLInUse}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.UARFCNULInUse"; + } + leaf-list uarfcndl-to-protect { + type string; + config false; + max-elements "64"; + description + "{{list}} Each item is a DL UARFCNs to be protected from adjacent channel interference. \"Adjacent channel\" in this context means offset from the FAP's UARFCN by 5MHz. {{bibref|3GPP-TS.25.104|Section 6.4.6}} If any of the items in the list are adjacent to the FAP's own DL channel, the FAP MUST take the Primary CPICH code power measured on these channels into account as part of its maximum transmit power self-configuration. The UARFCNs in the list can belong to any operator, allowing for protection of the FAP operator's own macro layer as well as that of other operators (only the latter is mandated by the {{bibref|3GPP-TS.25.104}} requirements). The list SHOULD take into account the ability of the FAP to self-configure its own DL UARFCN and so SHOULD include any channels (requiring protection) which can potentially be adjacent to the UARFCN selected by the FAP. For example, if only adjacent operator protection is required and the FAP has the ability to self-configure to any channel owned by its operator, this list would be populated with the UARFCNs immediately above and below the range of channels owned by the FAP operator. Adjacent channel protection can cause the FAP transmit power to be reduced down to as low as 8dBm. If {{empty}} then it indicates that there are no channels adjacent to the FAP that require protection, or that self-configuration of the FAP transmit power is not enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.UARFCNDLToProtect"; + } + leaf-list primary-scrambling-code { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a Primary DL Scrambling Code used by the FDD mode cell with a numeric range between 0 and 511 inclusive. {{bibref|3GPP-TS.25.433|Section 9.2.2.34}} Self-configuration for PSC is controlled by {{param|.Capabilities.UMTS.SelfConfig.PrimaryScramblingCodeConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.PrimaryScramblingCodeSelfConfigEnable}} from an enabled perspective. If the FAP's self-configuration capability for {{param}} is available and enabled, this parameter MAY contain more than one item and the FAP is expected to select one from the list for {{param|PrimaryScramblingCodeInUse}}. If the self-configuration capability is not available or not enabled, then this parameter SHOULD contain only a single item. The multiplicity of the PSC values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. The following are examples of valid PSC string: :\"20\" ::(explicitly specifies a single PSC value) :\"20,30,40\" ::(specifies 3 possible PSC values to select from) \"20..40\" ::(specifies 21 possible values between 20 and 40, inclusive) \"20..40,50\" ::(specifies 22 possible values between 20 and 40 inclusive and a single value 50) The order of the items has no significance."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.PrimaryScramblingCode"; + } + leaf primary-scrambling-code-in-use { + type uint64; + description + "The PSC being used by the FAP. Self-configuration for PSC is controlled by {{param|.Capabilities.UMTS.SelfConfig.PrimaryScramblingCodeConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.PrimaryScramblingCodeSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in {{param|PrimaryScramblingCode}}. If the self-configuration capability is not available or not enabled, then this parameter contains the first value in {{param|PrimaryScramblingCode}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.PrimaryScramblingCodeInUse"; + } + leaf maxfap-tx-power-expanded { + type string { + length "0..64"; + } + config false; + description + "Defines the maximum transmission power allowed on the FAP, maximum value for the linear sum of the power of all downlink physical channels, that is allowed to be used in a cell. {{param}} is expressed as a range of allowed maximum power levels with \"..\" (two periods) between the upper and lower values, i.e. \"<Pmax_low>..<Pmax_high>\". {{param}} identifies the limits between which the FAP can self-configure its maximum transmit power. Self-configuration for maximum transmission power is controlled by {{param|.Capabilities.UMTS.SelfConfig.MaxFAPTxPowerExpandedConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.MaxFAPTxPowerExpandedSelfConfigEnable}} from an enabled perspective. <Pmax_low> and <Pmax_high> are measured in dBm and have a range of -30.0 to 20.0 incremented by 0.1 dB. {{bibref|3GPP-TS.32.642|Section 6.3.9}} {{bibref|3GPP-TS.25.104|Section 6.2.1}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.MaxFAPTxPowerExpanded"; + } + leaf maxfap-tx-power-in-use-expanded { + type int64; + units "dBm"; + description + "The maximum transmission power measured in {{units}} currently used by the FAP. Actual values of the maximum transmission power are -30.0 {{units}} to 20.0 {{units}} in steps of 0.1 dB. The value of {{param}} divided by 10 yields the actual value of the maximum transmission power. Self-configuration for maximum transmission power is controlled by {{param|.Capabilities.UMTS.SelfConfig.MaxFAPTxPowerExpandedConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.MaxFAPTxPowerExpandedSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the range provided in {{param|MaxFAPTxPowerExpanded}}. If the self-configuration capability is not available or not enabled, then this parameter contains a value selected by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.MaxFAPTxPowerInUseExpanded"; + } + leaf max-ul-tx-power { + type string { + length "0..64"; + } + config false; + description + "Defines the maximum transmission power level a UE can use on PRACH. {{param}} is expressed as a range of allowed maximum power levels with \"..\" (two periods) between the upper and lower values, i.e. \"<Pmax_low>..<Pmax_high>\". {{param}} identifies the limits between which the FAP can self-configure its maximum transmit power. Self-configuration for maximum transmission power is controlled by {{param|.Capabilities.UMTS.SelfConfig.MaxULTxPowerConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.MaxULTxPowerSelfConfigEnable}} from an enabled perspective. <Pmax_low> and <Pmax_high> are measured in dBm and have a range of -50 to 33 incremented by 1. {{bibref|3GPP-TS.25.331|Section 10.3.6.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.MaxULTxPower"; + } + leaf max-ul-tx-power-in-use { + type int64; + units "dBm"; + description + "The maximum transmission power level a UE can use on PRACH. Self-configuration for maximum transmission power is controlled by {{param|.Capabilities.UMTS.SelfConfig.MaxULTxPowerConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.MaxULTxPowerSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the range provided in {{param|MaxULTxPower}}. If the self-configuration capability is not available or not enabled, then this parameter contains a value selected by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.MaxULTxPowerInUse"; + } + leaf pcpich-power { + type string { + length "0..64"; + } + config false; + description + "The value of the transmission power of the Primary Common PIlot CHannel (P-CPICH). The P-CPICH physical channel carries the common pilots of the cell. Parameter in SIB5. {{param}} is expressed as a range of allowed transmission power levels with \"..\" (two periods) between the upper and lower values, i.e. \"<Pmax_low>..<Pmax_high>\". {{param}} identifies the limits between which the FAP can self-configure its transmission power. Self-configuration for transmission power is controlled by {{param|.Capabilities.UMTS.SelfConfig.PCPICHPowerConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.PCPICHPowerSelfConfigEnable}} from an enabled perspective. <Pmax_low> and <Pmax_high> are measured in dBm and have a range of -10.0 to 20.0 incremented by 0.1 dB. {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.104|Section 6.2.1}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.PCPICHPower"; + } + leaf pcpich-power-in-use { + type int64; + units "dBm"; + description + "The P-CPICH power measured in {{units}} currently used by the FAP. Actual values of the maximum transmission power are -10.0 {{units}} to 20.0 {{units}} in steps of 0.1 dB. The value of {{param}} divided by 10 yields the actual value of the maximum transmission power. Self-configuration for transmission power is controlled by {{param|.Capabilities.UMTS.SelfConfig.PCPICHPowerConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.PCPICHPowerSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the range provided in {{param|PCPICHPower}}. If the self-configuration capability is not available or not enabled, then this parameter contains a value selected by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.PCPICHPowerInUse"; + } + leaf power-offset-pilot-dpdch { + type uint8 { + range "0..24"; + } + units "dB"; + config false; + description + "Defines the power offset between pilot channel and DPDCH. Actual values of the offset are 0.0 {{units}} to 6.0 {{units}} in steps of 0.25 {{units}}. The value of {{param}} divided by 4 yields the actual value of the offset. {{bibref|3GPP-TS.25.331|Section 10.3.6.18}} {{bibref|3GPP-TS.25.214|Section 5.2.1}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.PowerOffsetPilotDPDCH"; + } + leaf fap-coverage-target { + type uint8 { + range "50..150"; + } + units "dB"; + config false; + description + "Defines the target value measured in {{units}} for the range of the FAP's DL coverage, in terms of RF propagation loss. This value can be used by the FAP's self-configuration algorithms to help derive transmit power levels in the presence of co-channel and adjacent channel interference. {{bibref|3GPP-TS.25.967|Section 7.2.1}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.FAPCoverageTarget"; + } + leaf fap-quality-target-ec-io { + type int64; + units "dB"; + config false; + description + "Defines the target value measured in dB for the downlink signal quality of the FAP in terms of CPICH Ec/Io, thereby clarifying the meaning of \"FAPCoverageTarget\". Actual values of the FAPQualityTargetEcIo are -20 dB to 0 dB in steps of 0.1 dB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.FAPQualityTargetEcIo"; + } + leaf psch-power { + type int64; + units "dB"; + config false; + description + "Defines the transmission power offset measured in {{units}} of the Primary SCH relative to the Primary CPICH power. Actual values of the transmission power offset are -35.0 {{units}} to 15.0 {{units}} in steps of 0.1 {{units}}. The value of {{param}} divided by 10 yields the actual value of the transmission power offset. {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.433|Section 9.1.24 and Section 9.2.1.21}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.PSCHPower"; + } + leaf ssch-power { + type int64; + units "dB"; + config false; + description + "Defines the transmission power offset measured in {{units}} of the Secondary SCH relative to the Primary CPICH power. Actual values of the transmission power offset are -35.0 {{units}} to 15.0 {{units}} in steps of 0.1 {{units}}. The value of {{param}} divided by 10 yields the actual value of the transmission power offset. {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.433|Section 9.1.24 and Section 9.2.1.21}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.SSCHPower"; + } + leaf pich-power { + type int64; + units "dB"; + config false; + description + "Defines the maximum transmission power offset measured in {{units}} of the PICH channel relative to the Primary CPICH transmission power. {{bibref|3GPP-TS.32.642|Section 6.3.9}} {{bibref|3GPP-TS.25.433|Section 9.2.1.49A}} {{bibref|3GPP-TS.25.331|Section 10.3.6.50}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.PICHPower"; + } + leaf pch-power { + type int64; + units "dB"; + config false; + description + "Defines the transmission power offset measured in {{units}} of the PCH relative to the Primary CPICH power. Actual values of the transmission power offset are -35.0 {{units}} to 15.0 {{units}} in steps of 0.1 {{units}}. The value of {{param}} divided by 10 yields the actual value of the transmission power offset. {{bibref|3GPP-TS.32.642|Section 6.3.9}} {{bibref|3GPP-TS.25.433|Section 9.1.3.1 and Section 9.2.1.21}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.PCHPower"; + } + leaf fach-power { + type int64; + units "dB"; + config false; + description + "Defines the transmission power offset measured in {{units}} of the FACH relative to the Primary CPICH power. Actual values of the transmission power offset are -35.0 {{units}} to 15.0 {{units}} in steps of 0.1 {{units}}. The value of {{param}} divided by 10 yields the actual value of the transmission power offset. {{bibref|3GPP-TS.32.642|Section 6.3.9}} {{bibref|3GPP-TS.25.433|Section 9.1.6.1 and Section 9.2.1.21}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.FACHPower"; + } + leaf bch-power { + type int64; + units "dB"; + config false; + description + "Defines the transmission power offset measured in {{units}} of the BCH relative to the Primary CPICH power. Actual values of the transmission power offset are -35.0 {{units}} to 15.0 {{units}} in steps of 0.1 {{units}}. The value of {{param}} divided by 10 yields the actual value of the transmission power offset. {{bibref|3GPP-TS.32.642|Section 9.3.11}} {{bibref|3GPP-TS.25.433|Section 9.1.24 and Section 9.2.1.21}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.BCHPower"; + } + leaf aich-power { + type int64; + units "dB"; + config false; + description + "Defines the transmission power offset measured in {{units}} of one AICH relative to the Primary CPICH power. Parameter defined in SIB5 {{bibref|3GPP-TS.25.331|Section 10.3.6.3}}. Transmission power level of AICH, AP-AICH and CD/CA-ICH channels compared to CPICH. {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.433|Section 9.2.2.D}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.AICHPower"; + } + leaf ctch-allocation-period { + type uint8 { + range "1..255"; + } + config false; + description + "The value defines 'N' multiples of M(TTI) for CBS DRX calculations at the UE side."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.CTCHAllocationPeriod"; + } + leaf cbs-frame-offset { + type uint8 { + range "0..255"; + } + config false; + description + "Value of CBS frame offset (CTCH) on DL FACH. Parameter in SIB5"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.CBSFrameOffset"; + } + leaf max-tti { + type uint8 { + range "1..255"; + } + config false; + description + "Defines the number of radio frames in the TTI of the FACH used for CTCH (MTTI)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.MaxTTI"; + } + leaf noise-rise-limit-lower-value { + type uint16 { + range "0..500"; + } + config false; + description + "Defines the lower value of the Noise Rise Limit range that UMTS FAP is allowed to pick from. The value is measured in dB and has a range of 0.0 to 50.0 incremented by 0.1 dB. the value MUST not exceed the value of {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitUpperValue}} The Noise Rise Limit range identifies the limits between which the FAP can self-configure its uplink noise rise limit. Self-configuration for noise rise limit is controlled by {{param|.Capabilities.UMTS.SelfConfig.NoiseRiseLimitConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.NoiseRiseLimitConfigEnable}} from an enabled perspective."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.NoiseRiseLimitLowerValue"; + } + leaf noise-rise-limit-upper-value { + type uint16 { + range "0..500"; + } + config false; + description + "Defines the upper value of the Noise Rise Limit range that UMTS FAP is allowed to pick from. The value is measured in dB and has a range of 0.0 to 50.0 incremented by 0.1 dB. the value MUST not be below the value of {{param|.CellConfig.UMTS.RAN.RF.NoiseRiseLimitLowerValue}} NoiseRiseLimit identifies the limits between which the FAP can self-configure its uplink noise rise limit. Self-configuration for noise rise limit is controlled by {{param|.Capabilities.UMTS.SelfConfig.NoiseRiseLimitConfig}} from an availability perspective and {{param|.FAPControl.UMTS.SelfConfig.NoiseRiseLimitConfigEnable}} from an enabled perspective."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.NoiseRiseLimitUpperValue"; + } + leaf noise-rise-limit-in-use { + type uint16 { + range "0..500"; + } + description + "Actual value of the Noise Rise Limit that the FAP uses. The value is measured in dB and has a range of 0.0 to 50.0 incremented by 0.1 dB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF.NoiseRiseLimitInUse"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.RF."; + } + + grouping umts-ran-neighbor-list-g { + description + "This object contains parameters relating to the neighbor list."; + leaf max-intra-freq-cell-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.MaxIntraFreqCellEntries"; + } + leaf max-inter-freq-cell-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.MaxInterFreqCellEntries"; + } + leaf intra-freq-cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCellNumberOfEntries"; + } + leaf inter-freq-cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCellNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList."; + } + + grouping umts-ran-neighbor-list-intra-freq-cell-g { + description + "Table containing the intra-frequency cell list provided by the ACS. The table contents MAY be added/deleted/modified during operation, in which case these changes shall be reflected in the broadcast information as soon as possible."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.Alias"; + } + leaf must-include { + type boolean; + config false; + description + "Indicates whether this instance of the neighbor shall be included or excluded in the FAP's NL configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.MustInclude"; + } + leaf plmnid { + type string { + length "0..6"; + } + config false; + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.PLMNID"; + } + leaf rncid { + type uint16 { + range "0..65535"; + } + config false; + description + "RNC-ID of an intra-freq neighbor cell. It uniquely identifies an RNC within a PLMN. Normally, RNC-ID consists of 12 bits (i.e. a range of [0:4095]). However, if the value is larger than 4095, then Extended RNC-ID (range of [4096:65535]) is used in RANAP. The RNC-ID and Extended RNC-ID are combined into a single parameter here as there is no explicit need to have them separated. {{bibref|3GPP-TS.25.413|Section 9.2.1.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.RNCID"; + } + leaf cid { + type uint16 { + range "0..65535"; + } + config false; + description + "Cell Identifier (C-id) that identifies a cell within an RNS. This Cell Identifier together with the controlling RNC (RNC-ID) constitutes the UTRAN Cell ID (UC-ID) and is used to identify a cell uniquely within UTRAN. C-ID is either 12-bit or 16-bit value. {{bibref|3GPP-TS.25.401|Section 6.1.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.CID"; + } + leaf lac { + type uint16 { + range "1..65533 | 65535"; + } + config false; + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.LAC"; + } + leaf rac { + type uint8 { + range "0..255"; + } + config false; + description + "Routing Area Code (RAC). The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the Routing Area ID (RAI). {{bibref|3GPP-TS.23.003|Section 4.2}} {{bibref|3GPP-TS.25.413|Section 9.2.3.7}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.RAC"; + } + leaf ura { + type uint16 { + range "0..65535"; + } + config false; + description + "UTRAN Registration Area (URA) {{bibref|3GPP-TS.23.401}}. Indicates to the UE which {{param}} it shall use in case of overlapping URAs. {{bibref|3GPP-TS.25.331|Section 10.3.2.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.URA"; + } + leaf pcpich-scrambling-code { + type uint16 { + range "0..511"; + } + description + "Primary CPICH scrambling code."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.PCPICHScramblingCode"; + } + leaf pcpich-tx-power { + type int64; + units "dBm"; + config false; + description + "Primary CPICH Tx power in {{units}}. Actual values of the power are -10.0 {{units}} to 50.0 {{units}} in steps of 0.1 dB. The value of {{param}} divided by 10 yields the actual value of the power. {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.433|Section 2.2.33}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.PCPICHTxPower"; + } + leaf collocated-inter-freq-cell { + type uint32 { + range "0..268435455"; + } + config false; + description + "Provides identity of collocated inter-frequency Cell. Needed for pathloss estimation, in case the femto environment masks intra-frequency neighbor. Cell Identity. {{bibref|3GPP-TS.25.331|Section 10.3.2.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.CollocatedInterFreqCell"; + } + leaf max-tx-power { + type int64; + units "0.1 dBm"; + config false; + description + "Cell Max Tx Power. Parameter needed in HNB power calibration, for protection of neighbour cells. Actual values of the power are -30.0 dBm to 60.0 dBm in steps of 0.1 dB. The value of MaxTxPower divided by 10 yields the actual value of the power. C.f {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.104|Section 6.2.1}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.MaxTxPower"; + } + leaf max-dpc-htx-power { + type int64; + units "0.1 dBm"; + config false; + description + "Maximum DL DPCH Tx Power per UE configured in the cell (for CS UEs). Parameter may be used by FAP to protect the DL budget allocated to neighbouring UEs served by neighbour cells. C.f (max 10 dB below max Tx power) {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.104|Section 6.2.1}} Actual values of the power are -40.0 dBm to 50.0 dBm in steps of 0.1 dB. The value of MaxDPCHtxPower divided by 10 yields the actual value of the power."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.MaxDPCHtxPower"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}."; + } + + grouping umts-ran-neighbor-list-inter-freq-cell-g { + description + "Table containing the inter-frequency cell list provided by the ACS. The table contents MAY be added/deleted/modified during operation, in which case these changes shall be reflected in the broadcast information as soon as possible."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.Alias"; + } + leaf must-include { + type boolean; + config false; + description + "Indicates whether this instance of the neighbor shall be included or excluded in the FAP's NL configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.MustInclude"; + } + leaf plmnid { + type string { + length "0..6"; + } + config false; + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.PLMNID"; + } + leaf rncid { + type uint16 { + range "0..65535"; + } + config false; + description + "RNC-ID of an intra-freq neighbor cell. It uniquely identifies an RNC within a PLMN. Normally, RNC-ID consists of 12 bits (i.e. a range of [0:4095]). However, if the value is larger than 4095, then Extended RNC-ID (range of [4096:65535]) is used in RANAP. The RNC-ID and Extended RNC-ID are combined into a single parameter here as there is no explicit need to have them separated. {{bibref|3GPP-TS.25.413|Section 9.2.1.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.RNCID"; + } + leaf cid { + type uint16 { + range "0..65535"; + } + config false; + description + "Cell Identifier (C-id) that identifies a cell within an RNS. This Cell Identifier together with the controlling RNC (RNC-ID) constitutes the UTRAN Cell ID (UC-ID) and is used to identify a cell uniquely within UTRAN. C-ID is either 12-bit or 16-bit value. {{bibref|3GPP-TS.25.401|Section 6.1.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.CID"; + } + leaf lac { + type uint16 { + range "1..65533 | 65535"; + } + config false; + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.LAC"; + } + leaf rac { + type uint8 { + range "0..255"; + } + config false; + description + "Routing Area Code (RAC). The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the Routing Area ID (RAI). {{bibref|3GPP-TS.23.003|Section 4.2}} {{bibref|3GPP-TS.25.413|Section 9.2.3.7}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.RAC"; + } + leaf ura { + type uint16 { + range "0..65535"; + } + config false; + description + "UTRAN Registration Area (URA) {{bibref|3GPP-TS.23.401}}. Indicates to the UE which {{param}} it shall use in case of overlapping URAs. {{bibref|3GPP-TS.25.331|Section 10.3.2.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.URA"; + } + leaf uarfcnul { + type uint16 { + range "0..16383"; + } + config false; + description + "The UL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.UARFCNUL"; + } + leaf uarfcndl { + type uint16 { + range "0..16383"; + } + description + "The DL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.UARFCNDL"; + } + leaf pcpich-scrambling-code { + type uint16 { + range "0..511"; + } + description + "Primary CPICH scrambling code."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.PCPICHScramblingCode"; + } + leaf pcpich-tx-power { + type int64; + units "dBm"; + config false; + description + "Primary CPICH Tx power in {{units}}. Actual values of the power are -10.0 {{units}} to 50.0 {{units}} in steps of 0.1 dB. The value of {{param}} divided by 10 yields the actual value of the power. {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.433|Section 2.2.33}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.PCPICHTxPower"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}."; + } + + grouping umts-ran-neighbor-list-inter-rat-cell-g { + description + "The inter-RAT cell lists separated by technology. {{bibref|3GPP-TS.25.331|Section 10.3.7.23}}"; + leaf max-gsm-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.MaxGSMEntries"; + } + leaf gsm-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSMNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell."; + } + + grouping umts-ran-neighbor-list-inter-rat-cell-gsm-g { + description + "Table containing the inter-RAT cell list for GSM provided by the ACS. The table contents MAY be added/deleted/modified during operation, in which case these changes shall be reflected in the broadcast information as soon as possible."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.Alias"; + } + leaf must-include { + type boolean; + config false; + description + "Indicates whether this instance of the neighbor shall be included or excluded in the FAP's NL configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.MustInclude"; + } + leaf plmnid { + type string { + length "0..6"; + } + config false; + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.PLMNID"; + } + leaf lac { + type uint16 { + range "0..65535"; + } + config false; + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.LAC"; + } + leaf bsic { + type uint8 { + range "0..255"; + } + config false; + description + "BSIC of the cell per {{bibref|3GPP-TS.23.003}}, consisting of: :Bit 7:6 - not used (\"00\") :Bit 5:3 - NCC (PLMN Color Code) :Bit 2:0 - BCC (BS color code) For example, if NCC is 7 and BCC is 2 you would have 00111010 (binary) or 0x3A (hex), and the value of this parameter would be 58."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.BSIC"; + } + leaf ci { + type uint16 { + range "0..65535"; + } + config false; + description + "Cell ID of the cell per {{bibref|3GPP-TS.23.003|Section 4.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.CI"; + } + leaf band-indicator { + type enumeration { + enum "gsm 850" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator - GSM 850"; + } + enum "gsm 900" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator - GSM 900"; + } + enum "dcs 1800" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator - DCS 1800"; + } + enum "pcs 1900" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator - PCS 1900"; + } + } + config false; + description + "Indicates how to interpret the BCCH ARFCN. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator"; + } + leaf bccharfcn { + type uint16 { + range "0..1023"; + } + description + "ARFCN of this cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.BCCHARFCN"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}."; + } + + grouping umts-ran-neighbor-list-in-use-g { + description + "This object contains parameters relating to the neighbor list used by the FAP based on its self-configuration capability and {{object|.CellConfig.UMTS.RAN.NeighborList.}} configuration of adding and excluding cells."; + leaf max-intra-freq-cell-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.UMTS.RAN.NeighborList.IntraFreqCell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.MaxIntraFreqCellEntries"; + } + leaf max-inter-freq-cell-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.UMTS.RAN.NeighborList.InterFreqCell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.MaxInterFreqCellEntries"; + } + leaf intra-freq-cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCellNumberOfEntries"; + } + leaf inter-freq-cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCellNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse."; + } + + grouping umts-ran-neighbor-list-in-use-intra-freq-cell-g { + description + "Table containing the intra-frequency cell list."; + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}.PLMNID"; + } + leaf rncid { + type uint16 { + range "0..65535"; + } + description + "RNC-ID of an intra-freq neighbor cell. It uniquely identifies an RNC within a PLMN. Normally, RNC-ID consists of 12 bits (i.e. a range of [0:4095]). However, if the value is larger than 4095, then Extended RNC-ID (range of [4096:65535]) is used in RANAP. The RNC-ID and Extended RNC-ID are combined into a single parameter here as there is no explicit need to have them separated. {{bibref|3GPP-TS.25.413|Section 9.2.1.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}.RNCID"; + } + leaf cid { + type uint16 { + range "0..65535"; + } + description + "C-ID of the intra-freq neighbour cell {{bibref|3GPP-TS.25.401|Section 6.1.5}}. If {{param|RNCID}} is larger than 4095, then {{param}} will be 12 bits (i.e. a range of [0:4095]), else {{param}} is 16 bits long (i.e. range of [4096:65535]). This is needed to facilitate Femto to Macro handover. Used in {{bibref|3GPP-TS.25.413|Section 9.2.1.28}} as part of Target Cell ID."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}.CID"; + } + leaf lac { + type uint16 { + range "1..65533 | 65535"; + } + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}.LAC"; + } + leaf rac { + type uint8 { + range "0..255"; + } + description + "Routing Area Code (RAC). The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the Routing Area ID (RAI). {{bibref|3GPP-TS.23.003|Section 4.2}} {{bibref|3GPP-TS.25.413|Section 9.2.3.7}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}.RAC"; + } + leaf ura { + type uint16 { + range "0..65535"; + } + description + "UTRAN Registration Area (URA) {{bibref|3GPP-TS.23.401}}. Indicates to the UE which {{param}} it shall use in case of overlapping URAs. {{bibref|3GPP-TS.25.331|Section 10.3.2.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}.URA"; + } + leaf pcpich-scrambling-code { + type uint16 { + range "0..511"; + } + description + "Primary CPICH scrambling code."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}.PCPICHScramblingCode"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.IntraFreqCell.{i}."; + } + + grouping umts-ran-neighbor-list-in-use-inter-freq-cell-g { + description + "Table containing the inter-frequency cell list."; + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.PLMNID"; + } + leaf rncid { + type uint16 { + range "0..65535"; + } + description + "RNC-ID of an intra-freq neighbor cell. It uniquely identifies an RNC within a PLMN. Normally, RNC-ID consists of 12 bits (i.e. a range of [0:4095]). However, if the value is larger than 4095, then Extended RNC-ID (range of [4096:65535]) is used in RANAP. The RNC-ID and Extended RNC-ID are combined into a single parameter here as there is no explicit need to have them separated. {{bibref|3GPP-TS.25.413|Section 9.2.1.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.RNCID"; + } + leaf cid { + type uint16 { + range "0..65535"; + } + description + "C-ID of the intra-freq neighbour cell {{bibref|3GPP-TS.25.401|Section 6.1.5}}. If {{param|RNCID}} is larger than 4095, then {{param}} will be 12 bits (i.e. a range of [0:4095]), else {{param}} is 16 bits long (i.e. range of [4096:65535]). This is needed to facilitate Femto to Macro handover. Used in {{bibref|3GPP-TS.25.413|Section 9.2.1.28}} as part of Target Cell ID."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.CID"; + } + leaf lac { + type uint16 { + range "1..65533 | 65535"; + } + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.LAC"; + } + leaf rac { + type uint8 { + range "0..255"; + } + description + "Routing Area Code (RAC). The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the Routing Area ID (RAI). {{bibref|3GPP-TS.23.003|Section 4.2}} {{bibref|3GPP-TS.25.413|Section 9.2.3.7}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.RAC"; + } + leaf ura { + type uint16 { + range "0..65535"; + } + description + "UTRAN Registration Area (URA) {{bibref|3GPP-TS.23.401}}. Indicates to the UE which {{param}} it shall use in case of overlapping URAs. {{bibref|3GPP-TS.25.331|Section 10.3.2.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.URA"; + } + leaf uarfcnul { + type uint16 { + range "0..16383"; + } + description + "The UL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.UARFCNUL"; + } + leaf uarfcndl { + type uint16 { + range "0..16383"; + } + description + "The DL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.UARFCNDL"; + } + leaf pcpich-scrambling-code { + type uint16 { + range "0..511"; + } + description + "Primary CPICH scrambling code."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}.PCPICHScramblingCode"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterFreqCell.{i}."; + } + + grouping umts-ran-neighbor-list-in-use-inter-rat-cell-g { + description + "The inter-RAT cell lists separated by technology. {{bibref|3GPP-TS.25.331|Section 10.3.7.23}}"; + leaf max-gsm-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.UMTS.RAN.NeighborList.InterRATCell.GSM.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.MaxGSMEntries"; + } + leaf gsm-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSMNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell."; + } + + grouping umts-ran-neighbor-list-in-use-inter-rat-cell-gsm-g { + description + "Table containing the inter-RAT cell list for GSM."; + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.PLMNID"; + } + leaf lac { + type uint16 { + range "0..65535"; + } + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.LAC"; + } + leaf bsic { + type uint8 { + range "0..255"; + } + description + "BSIC of the cell per {{bibref|3GPP-TS.23.003}}, consisting of: :Bit 7:6 - not used (\"00\") :Bit 5:3 - NCC (PLMN Color Code) :Bit 2:0 - BCC (BS color code) For example, if NCC is 7 and BCC is 2 you would have 00111010 (binary) or 0x3A (hex), and the value of this parameter would be 58."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BSIC"; + } + leaf ci { + type uint16 { + range "0..65535"; + } + description + "Cell ID of the cell per {{bibref|3GPP-TS.23.003|Section 4.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.CI"; + } + leaf band-indicator { + type enumeration { + enum "gsm 850" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator - GSM 850"; + } + enum "gsm 900" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator - GSM 900"; + } + enum "dcs 1800" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator - DCS 1800"; + } + enum "pcs 1900" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator - PCS 1900"; + } + } + description + "Indicates how to interpret the BCCH ARFCN. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator"; + } + leaf bccharfcn { + type uint16 { + range "0..1023"; + } + description + "ARFCN of this cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BCCHARFCN"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAN.NeighborListInUse.InterRATCell.GSM.{i}."; + } + + grouping umts-rab-g { + description + "This object contains parameters relating to Radio Access layers {{bibref|3GPP-TS.32.405}}"; + leaf rab-succ-estab-cs { + type uint64; + description + "The number of successfully established RABs (with or without queueing) for CS domain."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.RABSuccEstabCS"; + } + leaf rab-fail-estab-cs { + type uint64; + description + "The number of RAB establishment failures for CS domain."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.RABFailEstabCS"; + } + leaf rab-succ-estab-ps { + type uint64; + description + "The number of successfully established RABs for PS domain."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.RABSuccEstabPS"; + } + leaf rab-fail-estab-ps { + type uint64; + description + "The number of RABs failed to establish for PS domain."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.RABFailEstabPS"; + } + leaf rabcs-setup-time-mean { + type uint64; + units "milliseconds"; + description + "The mean time in {{units}} for a FAP to establish a RAB CS connection. This measurement is obtained by accumulating the time intervals for each successful RAB establishment between the receipt by the FAP of a RANAP \"RAB ASSIGNMENT REQUEST\" message to establish a RAB for CS domain, and the first corresponding (based on RAB ID) transmission by the FAP of a RANAP \"RAB ASSIGNMENT RESPONSE\" message for successfully established RABs over a granularity period (Sample Interval {{bibref|3GPP-TS.32.582|Section 6.3.2}}). This end value of the time will then be divided by the number of successfully established RABs observed in the granularity period to give the arithmetic mean. The accumulator SHALL be reinitialized at the beginning of each granularity period."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.RABCSSetupTimeMean"; + } + leaf rabcs-setup-time-max { + type uint64; + units "milliseconds"; + description + "The maximum time in {{units}} for a FAP to establish a RAB CS connection. This measurement is obtained by monitoring the time intervals for each successful RAB establishment between the receipt by the FAP of a RANAP \"RAB ASSIGNMENT REQUEST\" message to establish a RAB for CS domain, and the first corresponding (based on RAB ID) transmission by the FAP of a RANAP \"RAB ASSIGNMENT RESPONSE\" message for successfully established RABs. The high tide mark of this time will be stored in a gauge; the gauge SHALL be reinitialized at the beginning of each granularity period (Sample Interval {{bibref|3GPP-TS.32.582|Section 6.3.2}})."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.RABCSSetupTimeMax"; + } + leaf rabps-setup-time-mean { + type uint64; + units "milliseconds"; + description + "The mean time in {{units}} for a FAP to establish a RAB PS connection. This measurement is obtained by accumulating the time intervals for each successful RAB establishment between the receipt by the FAP of a RANAP \"RAB ASSIGNMENT REQUEST\" message to establish a RAB for PS domain, and the first corresponding (based on RAB ID) transmission by the FAP of a RANAP \"RAB ASSIGNMENT RESPONSE\" message for successfully established RABs over a granularity period (Sample Interval {{bibref|3GPP-TS.32.582|Section 6.3.2}}). This end value of the time will then be divided by the number of successfully established RABs observed in the granularity period to give the arithmetic mean. The accumulator SHALL be reinitialized at the beginning of each granularity period."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.RABPSSetupTimeMean"; + } + leaf rabps-setup-time-max { + type uint64; + units "milliseconds"; + description + "The maximum time in {{units}} for a FAP to establish a RAB PS connection. This measurement is obtained by monitoring the time intervals for each successful RAB establishment between the receipt by the FAP of a RANAP \"RAB ASSIGNMENT REQUEST\" message to establish a RAB for PS domain, and the first corresponding (based on RAB ID) transmission by the FAP of a RANAP \"RAB ASSIGNMENT RESPONSE\" message for successfully established RABs. The high tide mark of this time will be stored in a gauge; the gauge SHALL be reinitialized at the beginning of each granularity period (Sample Interval {{bibref|3GPP-TS.32.582|Section 6.3.2}})."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.RABPSSetupTimeMax"; + } + leaf fail-ho { + type uint64; + description + "The number of failed Handovers."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.FailHO"; + } + leaf succ-ho { + type uint64; + description + "The number of successful Handovers."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB.SuccHO"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.UMTS.RAB."; + } + + grouping lte-g { + description + "This object contains parameters relating to configuring the LTE FAP."; + leaf tunnel-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.TunnelNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE."; + } + + grouping lte-tunnel-g { + description + "This object contains a table of all tunnel instances configured for the LTE FAP."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.Tunnel.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.Tunnel.{i}.Alias"; + } + leaf tunnel-ref { + type string { + length "0..256"; + } + description + "This is the reference to an IPsec tunnel instance used by the LTE FAP. For all root data models, which use the tunnel definition provided in {{bibref|TR-262}} (InternetGatewayDevice:1 {{bibref|TR-098}} and Device:1 {{bibref|TR-181i1}}) the {{param}} MUST point to a row in the 'FAP.Tunnel.IKESA.{i}.' table, defined in {{bibref|TR-262}}. If the root data model used is Device:2 {{bibref|TR-181i2}} than the {{param}} MUST point to IPsec tunnel instance defined in {{bibref|TR-181i2}}. If the referenced object is deleted, the parameter value MUST be set to an empty string. In case of a multiple-radio-technology FAP product, each radio technology can have its own tunnels or share common tunnels. In the former case, {{param}} can contain a unique instance number. In the latter case, {{param}} under all radio technologies can have the same instance number."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.Tunnel.{i}.TunnelRef"; + } + leaf-list plmnid { + type string { + length "0..256"; + } + config false; + description + "{{list}} Optional list of PLMM IDs associated with the tunnel, which can be used for selecting the tunnel. Each PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.Tunnel.{i}.PLMNID"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.Tunnel.{i}."; + } + + grouping lte-epc-g { + description + "This object contains parameters relating to configuring LTE EPC."; + leaf-list allowed-ciphering-algorithm-list { + type enumeration { + enum "eea0" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.AllowedCipheringAlgorithmList - EEA0"; + } + enum "128-eea1" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.AllowedCipheringAlgorithmList - 128-EEA1"; + } + enum "128-eea2" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.AllowedCipheringAlgorithmList - 128-EEA2"; + } + } + config false; + min-elements 1; + description + "{{list}} Each item is a ciphering algorithm allowed to be used for RRC and UP confidentiality protection as defined in {{bibref|3GPP-TS.33.401}}. If the list contains more than 1 item, it is in the order of the preferred algorithm to be used. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.AllowedCipheringAlgorithmList"; + } + leaf-list allowed-integrity-protection-algorithm-list { + type enumeration { + enum "128-eia1" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.AllowedIntegrityProtectionAlgorithmList - 128-EIA1"; + } + enum "128-eia2" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.AllowedIntegrityProtectionAlgorithmList - 128-EIA2"; + } + } + config false; + min-elements 1; + description + "{{list}} Each item is a integrity protection algorithm allowed to be used for RRC as defined in {{bibref|3GPP-TS.33.401}}. If the list contains more than 1 item, it is in the order of the preferred algorithm to be used. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.AllowedIntegrityProtectionAlgorithmList"; + } + leaf tac { + type uint16 { + range "0..65535"; + } + config false; + description + "TAC (Tracking Area Code) for LTE FAP as specified in SystemInformationBlockType1 message in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.TAC"; + } + leaf eaid { + type uint32 { + range "0..16777216"; + } + config false; + description + "Emergency Area ID that uniquely identifies the area of emergency for Earthquake and Tsunami Warning Services (ETWS). Corresponds to Emergency Area ID in {{bibref|3GPP-TS.36.413|Section 9.2.1.47}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.EAID"; + } + leaf max-plmn-list-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.CellConfig.LTE.EPC.PLMNList.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.MaxPLMNListEntries"; + } + leaf plmn-list-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.PLMNListNumberOfEntries"; + } + leaf max-qo-s-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.EPC.QoS.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.MaxQoSEntries"; + } + leaf qo-s-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoSNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC."; + } + + grouping lte-epc-plmn-list-g { + description + "This object contains parameters relating to list of PLMN identity specific to LTE EPC definition, called PLMN-IdentityList, as specified in SystemInformationBlockType1 message in {{bibref|3GPP-TS.36.331|Section 6.2.2}}. Each instance in this object is a PLMN-IdentityInfo which consists of plmn-Identity and cellReservedForOperatorUse IEs. At minimum 1 item MUST be present in this list, and maximum of 6 items."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.PLMNList.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.PLMNList.{i}.Alias"; + } + leaf is-primary { + type boolean; + config false; + description + "Indicates whether this {{param|PLMNID}} is a primary PLMN or not. If there is more than one instance in {{object|.CellConfig.LTE.EPC.PLMNList.{i}.}} table, then ACS MUST set this {{param}} set to {{true}} in only one instance."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.PLMNList.{i}.IsPrimary"; + } + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.PLMNList.{i}.PLMNID"; + } + leaf cell-reserved-for-operator-use { + type boolean; + config false; + description + "Indicates whether the cell is reserved for operator use or not. If {{true}}, it is reserved. If {{false}}, it is not reserved. Corresponds to \"reserved\" \"notReserved\" respectively as defined in PLMN-IdentityInfo in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.PLMNList.{i}.CellReservedForOperatorUse"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.PLMNList.{i}."; + } + + grouping lte-epc-qo-s-g { + description + "This object contains parameters relating to configuring QoS in LTE EPC."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}.Alias"; + } + leaf qci { + type uint8 { + range "1..20"; + } + description + "QoS class identity as defined in {{bibref|3GPP-TS.23.203|Section 6.1.7.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}.QCI"; + } + leaf type { + type enumeration { + enum "gbr" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}.Type - GBR"; + } + enum "non-gbr" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}.Type - Non-GBR"; + } + } + config false; + description + "Defines the type of the QoS class as defined in {{bibref|3GPP-TS.23.203|Section 6.1.7.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}.Type"; + } + leaf priority { + type uint8 { + range "1..20"; + } + config false; + description + "Priority of the QoS class as defined in {{bibref|3GPP-TS.23.203|Section 6.1.7.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}.Priority"; + } + leaf packet-delay-budget { + type uint16 { + range "50 | 100 | 150 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 1000 | 1500 | 2000"; + } + units "milliseconds"; + config false; + description + "Defines the Packet delay budget, specified in {{units}}, as defined in {{bibref|3GPP-TS.23.203|Section 6.1.7.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}.PacketDelayBudget"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.EPC.QoS.{i}."; + } + + grouping lte-ran-g { + description + "This object contains parameters relating to the LTE RAN level configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN."; + } + + grouping lte-ran-common-g { + description + "This object contains parameters relating to the common configuration in LTE RAN."; + leaf cell-identity { + type uint32 { + range "0..268435455"; + } + config false; + description + "Cell Identity as specified in {{bibref|3GPP-TS.36.331|Section 6.3.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Common.CellIdentity"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Common."; + } + + grouping lte-ran-s1-ap-g { + description + "This object contains parameters relating to the S1AP configuration."; + leaf-list t-reloc-prep { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a maximum time for the Handover Preparation procedure in the source LTE FAP, specified in seconds, with a numeric range between 0 and 300 inclusive. Only values in multiple of 5 are valid; use of other values within the defined range MUST be rejected by the CPE. In case there is more than one item in the list, the first item contains the most preferred value. The value of {{param}} divided by 10 yields the actual value. The timer is started when the LTE FAP sends the HANDOVER REQUIRED message. Upon reception of the HANDOVER COMMAND message the LTE FAP shall stop the timer. Corresponds to parameter TS1RELOCprep defined in {{bibref|3GPP-TS.36.413|Section 8.4.1.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If the LTE FAP supports self-configuration capability for {{param}} and more than one item is configured, then the LTE FAP is expected to select one from the list and overwrite this parameter containing only the one selected. If the LTE FAP does not support self-configuration capability for {{param}} and more than one item is configured, then the LTE FAP accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of LTE FAP, LTE FAP accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.S1AP.TRelocPrep"; + } + leaf-list t-reloc-overall { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a maximum time for the protection of the overall handover procedure in the source LTE FAP, specified in seconds, with a numeric range between 0 and 300 inclusive. Only values in multiple of 5 are valid; use of other values within the defined range MUST be rejected by the CPE. In case there is more than one item in the list, the first item contains the most preferred value. The value of {{param}} divided by 10 yields the actual value. The timer is started reception of the HANDOVER COMMAND message. Corresponds to parameter TS1RELOCOverall defined in {{bibref|3GPP-TS.36.413|Section 8.4.1.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If LTE FAP supports self-configuration capability for {{param}} and more than one item is configured, then LTE FAP is expected to select one from the list and overwrite this parameter containing only the one selected. If LTE FAP does not support self-configuration capability for {{param}} and more than one item is configured, then LTE FAP accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of LTE FAP, LTE FAP accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.S1AP.TRelocOverall"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.S1AP."; + } + + grouping lte-ran-s1-u-g { + description + "This object contains parameters relating to the S1-U configuration."; + leaf gtpu-echo-interval { + type uint8 { + range "0 | 60..max"; + } + units "seconds"; + config false; + description + "Defines the interval in {{units}} between each GTP-U Echo Request that LTE FAP sends to the GTP-U peer, as specified in {{bibref|3GPP-TS.29.281|Section 7.2.1}}. If the value of {{param}} is equal to 0, then this functionality is supressed and thus LTE FAP does not send GTP-U Echo Request. If there is no GTP-U path in use, then no Echo Request is sent regardless of the value of {{param}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.S1U.GTPUEchoInterval"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.S1U."; + } + + grouping lte-ran-rf-g { + description + "This object contains parameters relating to the RF, see {{bibref|3GPP-TS.32.592|Section 6.1.7.1}}."; + leaf-list earfcndl { + type uint16 { + range "0..65535"; + } + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is an E-UTRA Absolute Radio Frequency Channel Number in the downlink direction. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter NDL specified in {{bibref|3GPP-TS.36.104|Table 5.7.3.1}}. If LTE FAP supports self-configuration capability for {{param}} and more than one item is configured, then LTE FAP is expected to select one from the list and overwrite this parameter containing only the one selected. If LTE FAP does not support self-configuration capability for {{param}} and more than one item is configured, then LTE FAP accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of LTE FAP, LTE FAP accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.EARFCNDL"; + } + leaf-list earfcnul { + type uint16 { + range "0..65535"; + } + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is an E-UTRA Absolute Radio Frequency Channel Number in the uplink direction. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter NUL specified in {{bibref|3GPP-TS.36.104|Table 5.7.3.1}}. If LTE FAP supports self-configuration capability for {{param}} and more than one item is configured, then LTE FAP is expected to select one from the list and overwrite this parameter containing only the one selected. If LTE FAP does not support self-configuration capability for {{param}} and more than one item is configured, then LTE FAP accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of LTE FAP, LTE FAP accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.EARFCNUL"; + } + leaf freq-band-indicator { + type uint8 { + range "1..40"; + } + config false; + description + "Frequency band indicator. Corresponds to parameter freqBandIndicator in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.FreqBandIndicator"; + } + leaf-list dl-bandwidth { + type uint8 { + range "6 | 15 | 25 | 50 | 75 | 100"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a downlink transmission bandwidth, specified in number of Resource Blocks. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter dl_Bandwidth in MIB (Master Information Block) in {{bibref|3GPP-TS.36.331|Section 6.2.2}}. and to parameter NRB in {{bibref|3GPP-TS.36.101|Table 5.6-1}}. If LTE FAP supports self-configuration capability for {{param}} and more than one item is configured, then LTE FAP is expected to select one from the list and overwrite this parameter containing only the one selected. If LTE FAP does not support self-configuration capability for {{param}} and more than one item is configured, then LTE FAP accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of LTE FAP, LTE FAP accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.DLBandwidth"; + } + leaf-list ul-bandwidth { + type uint8 { + range "6 | 15 | 25 | 50 | 75 | 100"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is an uplink transmission bandwidth, specified in number of Resource Blocks. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter ul_Bandwidth in SIB2 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}. and to parameter NRB in {{bibref|3GPP-TS.36.101|Table 5.6-1}}. If LTE FAP supports self-configuration capability for {{param}} and more than one item is configured, then LTE FAP is expected to select one from the list and overwrite this parameter containing only the one selected. If LTE FAP does not support self-configuration capability for {{param}} and more than one item is configured, then LTE FAP accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of LTE FAP, LTE FAP accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.ULBandwidth"; + } + leaf-list reference-signal-power { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a downlink reference-signal transmit power, specified in dBm, with a numeric range between -60 and 50 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Defined as the linear average over the power contributions (in W) of all resource elements that carry cell-specific reference signals within the operating system bandwidth. Corresponds to parameter referenceSignalPower in PDSCH-Config IE in {{bibref|3GPP-TS.36.331|Section 6.3.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If LTE FAP supports self-configuration capability for {{param}} and more than one item is configured, then LTE FAP is expected to select one from the list and overwrite this parameter containing only the one selected. If LTE FAP does not support self-configuration capability for {{param}} and more than one item is configured, then LTE FAP accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of LTE FAP, LTE FAP accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.ReferenceSignalPower"; + } + leaf-list phy-cell-id { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a physical cell ID with a numeric range between 0 and 503 inclusive. Represents the list of physical cell identities LTE FAP to choose from. In case there is more than one item in the list, the first item contains the most preferred value. As specified in {{bibref|3GPP-TS.36.211|Section 6.11}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If LTE FAP supports self-configuration capability for {{param}} and more than one item is configured, then LTE FAP is expected to select one from the list and overwrite this parameter containing only the one selected. If LTE FAP does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.PhyCellID"; + } + leaf-list psch-power-offset { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a power offset, specified in dB, of the Primary Synchronization Channel with respect to the ReferenceSignalPower, with a numeric range between -350 and 150 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of {{param}} divided by 10 yields the actual value. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.PSCHPowerOffset"; + } + leaf-list ssch-power-offset { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a power offset, specified in dB, of the Secondary Synchronization Channel with respect to the ReferenceSignalPower, with a numeric range between -350 and 150 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of {{param}} divided by 10 yields the actual value. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.SSCHPowerOffset"; + } + leaf-list pbch-power-offset { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a power offset, specified in dB, of the Physical Broadcast Channel with respect to the ReferenceSignalPower, with a numeric range between -350 and 150 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of {{param}} divided by 10 yields the actual value. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF.PBCHPowerOffset"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RF."; + } + + grouping lte-ran-phy-g { + description + "This object contains parameters relating to the physical layer level configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY."; + } + + grouping lte-ran-phy-antenna-info-g { + description + "This object contains parameters relating to the antenna configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.1}})."; + leaf antenna-ports-count { + type uint8 { + range "1 | 2 | 4"; + } + description + "Defines the number of cell specific antenna ports according to {{bibref|3GPP-TS.36.211|Section 6.2.1}}. A UE in IDLE mode acquires the information about the number of transmit antenna ports according to {{bibref|3GPP-TS.36.212|Section 5.3.1.1}}. Corresponds to antennaPortsCount IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.AntennaInfo.AntennaPortsCount"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.AntennaInfo."; + } + + grouping lte-ran-phy-pdsch-g { + description + "This object contains parameters relating to the PDSCH (Physical Downlink Shared Channel) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.2}})."; + leaf-list pb { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a Eb/Ea value with a numeric range between 0 and 3 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of this parameter is the same for all UEs in the cell. Eb repsents EPRE of PDSCH REs type B, i.e. REs in OFDM symbols that include reference symbols, as specified in {{bibref|3GPP-TS.36.213|Section 5.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PDSCH.Pb"; + } + leaf-list pa { + type int64; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a Ea/Ers value. In case there is more than one item in the list, the first item contains the most preferred value. Ea represents EPRE of PDSCH REs type A, i.e. REs in OFDM symbols that do not include reference symbols. Ers represents EPRE of reference symbols REs. Specified in {{bibref|3GPP-TS.36.213|Section 5.2}}. Actual values of range are -6.00 to 3.00dB. The value of each item in {{param}} divided by 100 yields the actual value. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PDSCH.Pa"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PDSCH."; + } + + grouping lte-ran-phy-srs-g { + description + "This object contains parameters relating to the UL SRS (Sounding Reference Signal) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.3}})."; + leaf srs-enabled { + type boolean; + config false; + description + "Indicates whether UL SRS (Sounding RS) is enabled or not. If {{true}}, UL Sounding RS is enabled. If {{false}}, UL Sounding RS is disabled. Corresponds to SoundingRS-UL-ConfigCommonIE defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.SRS.SRSEnabled"; + } + leaf-list srs-bandwidth-config { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a index into tables of cell specific SRS Bandwidth Configuration, with a numeric range between 0 and 7 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. SRS Bandwidth Configuration tables are specified in {{bibref|3GPP-TS.36.211|Table 5.5.3.2-1, 5.5.3.2-2, 5.5.3.2-3 and 5.5.3.2– 4}}. Corresponds to srs-BandwidthConfig IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.SRS.SRSBandwidthConfig"; + } + leaf srs-max-up-pts { + type boolean; + config false; + description + "Defines whether reconfiguration of SRS applies to UpPTS or not. If {{true}}, SRS applies to UpPTS. If {{false}}, SRS does not apply to UpPTS. Corresponds to srs-MaxUpPts specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and srsMaxUpPts specified in {{bibref|3GPP-TS.36.211|Section 5.5.3.2}}. This parameter is applicable to TDD mode only."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.SRS.SRSMaxUpPTS"; + } + leaf ack-nack-srs-simultaneous-transmission { + type boolean; + config false; + description + "Defines whether a UE can simultaneously transmit SRS and HARQ ACK/NACK or not. If {{true}}, simultaneous transmission is allowed. If {{false}}, simultaneous transmission is not allowed. Corresponds to ackNackSRS-SimultaneousTransmission specfied in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and Simultaneous-AN-and-SRS specified in {{bibref|3GPP-TS.36.213|Section 8.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.SRS.AckNackSRSSimultaneousTransmission"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.SRS."; + } + + grouping lte-ran-phy-prach-g { + description + "This object contains parameters relating to the PRACH (Physical Random Access Channel) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.4}})."; + leaf-list root-sequence-index { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a Logical root sequence index with a numeric range between 0 and 837 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Logical root sequence index is used to determine 64 physical RACH preamble sequences available in the cell. Corresponds to RACH_ROOT_SEQUENCE parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and {{bibref|3GPP-TS.36.211|Section 5.7.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRACH.RootSequenceIndex"; + } + leaf-list configuration-index { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is an index to the table defining PRACH resources within the frame with a numeric range between 0 and 63 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to PRACH-Configuration-Index parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and {{bibref|3GPP-TS.36.211|Section 5.7.1}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRACH.ConfigurationIndex"; + } + leaf high-speed-flag { + type boolean; + config false; + description + "Indicates whether restricted set or unrestricted set of preambles is used. If {{true}}, indicates restricted set. If {{false}}, indicates unrestricted set. Corresponds to highSpeedFlag parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and high-speed-flag parameter defined in {{bibref|3GPP-TS.36.211|Section 5.7.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRACH.HighSpeedFlag"; + } + leaf-list zero-correlation-zone-config { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a value used for preamble sequence generation with a numeric range between 0 and 15 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Each item corresponds to zeroCorrelationZoneConfig parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and to NCS parameter defined in {{bibref|3GPP-TS.36.211|Section 5.7.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRACH.ZeroCorrelationZoneConfig"; + } + leaf-list freq-offset { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item represents the first available physical resource block number for PRACH. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to prach-FreqOffset parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and nPRBoffsetRA parameter defined {{bibref|3GPP-TS.36.211|Section 5.7.1}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRACH.FreqOffset"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRACH."; + } + + grouping lte-ran-phy-pucch-g { + description + "This object contains parameters relating to the PUCCH (Physical Uplink Control Channel) configuration. (see {{bibref|3GPP-TS.32.592|Section 6.1.1.5}})"; + leaf delta-pucch-shift { + type enumeration { + enum "ds1" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.DeltaPUCCHShift - ds1"; + } + enum "ds2" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.DeltaPUCCHShift - ds2"; + } + enum "ds3" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.DeltaPUCCHShift - ds3"; + } + } + config false; + description + "Defines the cyclic shift used for PUCCH formats 1/1a/1b in a resource block used for a mix of formats 1/1a/1b and 2/2a/2b. It is an integer multiple of deltaPUCCHShift within the range of {0, 1, ., 7} . Corresponds to deltaPUCCH-Shift parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and Delta-shiftPUCCH parameter defined {{bibref|3GPP-TS.36.211|Section 5.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.DeltaPUCCHShift"; + } + leaf-list nrbcqi { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a value that defines the bandwidth in terms of resource blocks available for use by PUCCH formats 2/2a/2b transmission in each slot, with a numeric range between 0 and 98 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to nRB-CQI parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and NRB(2) parameter defined {{bibref|3GPP-TS.36.211|Section 5.4}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive.If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.NRBCQI"; + } + leaf ncsan { + type uint8 { + range "0..7"; + } + description + "Defines the number of cyclic shift used for PUCCH formats 1/1a/1b in a resource block used for a mix of formats 1/1a/1b and 2/2a/2b. The value is an integer multiple of deltaPUCCHShift within the range of {0, 1, ., 7}. Corresponds to nCS-AN parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and NRB(1) parameter defined {{bibref|3GPP-TS.36.211|Section 5.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.NCSAN"; + } + leaf-list n1-pucchan { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a value that determines resources used for transmission of PUCCH format 1/1a/1b and 2/2a/2b, with a numeric range between 0 and 2047 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to n1PUCCH-AN parameter defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and NPUCCH(1) parameter defined {{bibref|3GPP-TS.36.213|Section 10.1}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.N1PUCCHAN"; + } + leaf-list cqipucch-resource-index { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a value that indicates the position of PUCCH, with a numeric range between 0 and 1185 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. . Corresponds to the cqi-PUCCH-ResourceIndex IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}. and to parameter nPUCCH(2) specified in {{bibref|3GPP-TS.36.213|Section 7.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.CQIPUCCHResourceIndex"; + } + leaf k { + type uint8 { + range "1..4"; + } + units "Resource Blocks"; + description + "Sub-band size for sub-band reporting mode expressed in units of physical {{units}}, see {{bibref|3GPP-TS.36.213|Section 7.2.2}}. This parameter corresponds to the K IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH.K"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUCCH."; + } + + grouping lte-ran-phy-pusch-g { + description + "This object contains parameters relating to the PUSCH (Physical Uplink Shared Channel) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.6}})."; + leaf nsb { + type uint8 { + range "1..4"; + } + config false; + description + "Defines the number of sub-bands. This parameter corresponds to n-SB parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and NSB parameter specified in {{bibref|3GPP-TS.36.211|Section 5.3.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.NSB"; + } + leaf hopping-mode { + type enumeration { + enum "inter-sub-frame" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.HoppingMode - InterSubFrame"; + } + enum "intra-and-inter-sub-frame" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.HoppingMode - IntraAndInterSubFrame"; + } + } + config false; + description + "Indicates if hopping is \"inter-subframe\" or \"intra and inter-subframe\". Corresponds to hoppingMode parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and Hopping-mode parameter specified in {{bibref|3GPP-TS.36.211|Section 5.3.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.HoppingMode"; + } + leaf-list hopping-offset { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a value to compute the set of physical resource blocks to be used for transmission on PUSCH if uplink frequency hopping mode is enabled, with a numeric range between 0 and 98 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. This parameter corresponds to pusch-HoppingOffset parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and NRBHO parameter specified in {{bibref|3GPP-TS.36.211|Section 5.3.4}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.HoppingOffset"; + } + leaf enable64-qam { + type boolean; + description + "Indicates whether 64QAM is allowed or not. If {{true}}, 64QAM is allowed. If {{false}}, 64QAM is not allowed. Corresponds to enable64QAM parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.Enable64QAM"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH."; + } + + grouping lte-ran-phy-pusch-ulrs-g { + description + "This object contains parameters relating to the ULRS (Uplink Reference Signal) of PUSCH (Physical Uplink Shared Channel) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.6.1}})."; + leaf group-hopping-enabled { + type boolean; + config false; + description + "Indicates whether group hopping is enabled or not. If {{true}}, group hopping is enabled. If {{false}}, group hopping is not enabled. Corresponds to groupHoppingEnabled parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}.and in {{bibref|3GPP-TS.36.211|Section 5.5.1.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.ULRS.GroupHoppingEnabled"; + } + leaf group-assignment-pusch { + type uint8 { + range "0..29"; + } + description + "Corresponds to parameter groupAssignmentPUSCH specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.ULRS.GroupAssignmentPUSCH"; + } + leaf sequence-hopping-enabled { + type boolean; + config false; + description + "Indicates whether sequence hopping is enabled or not. If {{true}}, sequence hopping is enabled. If {{false}}, sequence hopping is not enabled. Corresponds to sequenceHoppingEnabled parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}.and in {{bibref|3GPP-TS.36.211|Section 5.5.1.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.ULRS.SequenceHoppingEnabled"; + } + leaf cyclic-shift { + type uint8 { + range "0..7"; + } + description + "Corresponds to parameter cyclcShift specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.ULRS.CyclicShift"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PUSCH.ULRS."; + } + + grouping lte-ran-phy-ul-power-control-g { + description + "This object contains parameters relating to the uplink power control configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.7}})."; + leaf-list p0-nominal-pusch { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a value to compute the UL UE transmit power for transmission on PUSCH for semi-persistant grants, with a numeric range between -126 and 24 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to p0-NominalPUSCH parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and PO_NOMINAL_PUSCH(0) parameter specified in {{bibref|3GPP-TS.36.211|Section 5.1.1.1}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.P0NominalPUSCH"; + } + leaf-list alpha { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a value used to compute the UL UE transmit power for transmission on PUSCH, from the list of 0, 4, 5, 6, 7, 8, 9, 100. In case there is more than one item in the list, the first item contains the most preferred value. Actual values of range are from 0.00 to 1.00. The value of {{param}} divided by 100 yields the actual value. Corresponds to alpha parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and to α parameter specified in {{bibref|3GPP-TS.36.211|Section 5.1.1.1}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.Alpha"; + } + leaf-list p0-nominal-pucch { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item is a value to compute the UL UE transmit power for transmission on PUCCH, with a numeric range between -126 and 24 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to p0-NominalPUCCH parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and PO_NOMINAL_PUCCH parameter specified in {{bibref|3GPP-TS.36.211|Section 5.1.2.1}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.P0NominalPUCCH"; + } + leaf delta-fpucch-format1 { + type int64; + units "dB"; + description + "Defines deltaF-PUCCH-Format1 to derive the UE transmit power. Corresponds to parameter ?F_PUCCH(1) in {{units}} as specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.213|Section 5.1.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.DeltaFPUCCHFormat1"; + } + leaf delta-fpucch-format1b { + type uint8 { + range "1 | 3 | 5"; + } + units "dB"; + description + "Defines deltaF-PUCCH-Format1b to derive the UE transmit power. Corresponds to parameter ?F_PUCCH(1b) in {{units}} dB as specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.213|Section 5.1.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.DeltaFPUCCHFormat1b"; + } + leaf delta-fpucch-format2 { + type int64; + units "dB"; + description + "Defines deltaF-PUCCH-Format2 to derive the UE transmit power. Corresponds to parameter ?F_PUCCH(2) in {{units}} as specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.213|Section 5.1.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.DeltaFPUCCHFormat2"; + } + leaf delta-fpucch-format2a { + type int64; + units "dB"; + description + "Defines deltaF-PUCCH-Format2a to derive the UE transmit power. Corresponds to parameter ?F_PUCCH(2a) in {{units}} as specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.213|Section 5.1.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.DeltaFPUCCHFormat2a"; + } + leaf delta-fpucch-format2b { + type int64; + units "dB"; + description + "Defines deltaF-PUCCH-Format2b to derive the UE transmit power. Corresponds to parameter ?F_PUCCH(2b) in {{units}} as specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.213|Section 5.1.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.DeltaFPUCCHFormat2b"; + } + leaf delta-preamble-msg3 { + type int64; + units "dB"; + description + "Defines the parameter in {{units}} used to compute the UL UE transmit power for transmission of random access response grant. This parameter corresponds to deltaPreambleMsg3 parameter specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and to ?PREAMBLE_Msg3 parameter specified in {{bibref|3GPP-TS.36.213|Section 5.1.1.1}}. Actual value is 2x the value of this parameter."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl.DeltaPreambleMsg3"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.ULPowerControl."; + } + + grouping lte-ran-phy-mbsfn-g { + description + "This object contains parameters relating to the MBSFN (Multimedia Broadcast multicast service Single Frequency Network) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.8}})."; + leaf neigh-cell-config { + type uint8 { + range "0..3"; + } + config false; + description + "Defines the information related to MBSFN and TDD UL/DL configuration of neighbour cells. Corresponds to NeighCellConfig IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.6}}. Value 0: Not all neighbour cells have the same MBSFN sub-frame allocation as serving cell. Value 1: No MBSFN sub-frames are present in all neighbour cells. Value 2: The MBSFN sub-frame allocations of all neighbour cells are identical to or subsets of that in the serving cell. Value 3: Different UL/DL allocation in neighbouring cells for TDD compared to the serving cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.NeighCellConfig"; + } + leaf max-sf-config-list-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.MaxSFConfigListEntries"; + } + leaf sf-config-list-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigListNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN."; + } + + grouping lte-ran-phy-mbsfn-sf-config-list-g { + description + "This object contains parameters relating to the sub-frame that are reserved for MBSFN (Multimedia Broadcast multicast service Single Frequency Network) in downlink direction. For FDD mode, only one entry can exist in this table. For TDD mode, at most one entry can exist with a given value of stratumID (see {{bibref|3GPP-TS.32.592|Section 6.1.1.8}})."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}.Alias"; + } + leaf sync-stratum-id { + type uint8 { + range "1..8"; + } + config false; + description + "This parameter is applicable to TDD mode only. Defines the synchronization stratum level to which the MBSFN configuration applies."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}.SyncStratumID"; + } + leaf radio-frame-allocation-period { + type uint8 { + range "1..2 | 4 | 8 | 16 | 32"; + } + description + "Defines the period where MBSFN sub-frames occur in the radio frames. Radio frames contain MBSFN sub-frame when the following condition is met: ((SFN mod {{param}}) = {{param|RadioframeAllocationOffset}}). The value of 1 and 2 are only meaningful when the value of {{param|RadioFrameAllocationSize}} parameter is 1. Corresponds to radioFrameAllocationPeriod IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}.RadioFrameAllocationPeriod"; + } + leaf radioframe-allocation-offset { + type uint8 { + range "0..7"; + } + description + "Defines the offset where MBSFN sub-frames occur in the radio frames. Radio frames contain MBSFN sub-frame when the following condition is met: ((SFN mod {{param|RadioFrameAllocationPeriod}}) = {{param}}). Corresponds to radioFrameAllocationOffset IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}.RadioframeAllocationOffset"; + } + leaf radio-frame-allocation-size { + type uint8 { + range "1 | 4"; + } + description + "Defines the number of connsecutive frames that the MBSFN allocation pertains to defined by the combination of {{param|RadioFrameAllocationPeriod}} and {{param|RadioframeAllocationOffset}} parameters."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}.RadioFrameAllocationSize"; + } + leaf-list sub-frame-allocations { + type uint8 { + range "0 | 1"; + } + config false; + max-elements "64"; + description + "{{list}} The value of \"1\" indicates the position of sub-frames that is allocated to MBSFN within the radio frame. First item defines the MBSFN allocation for sub-frame #1, second item for #2, third item for #3, fourth item for #6, fifth item for #7, sixth item for #8. If the value of {{param|RadioFrameAllocationSize}} is 4, then this pattern repeats in the sequence of the four radio frames. The actual size of this parameter depends on the value of {{param|RadioFrameAllocationSize}} parameter. If the value of {{param|RadioFrameAllocationSize}} is 1, then the size of this parameter is 6; if the size {{param|RadioFrameAllocationSize}} is 4, then the size of this parameter is 24. Corresponds to subframeAllocation IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}.SubFrameAllocations"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.MBSFN.SFConfigList.{i}."; + } + + grouping lte-ran-phy-prs-g { + description + "This object contains parameters relating to the PRS (Positioning Reference Signal) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.9}})."; + leaf num-prs-resource-blocks { + type uint64; + units "Resource Blocks"; + config false; + description + "Defines the number of RBs ({{units}}) used for PRS. Corresponds to the parameter NRBPRS in {{bibref|3GPP-TS.36.211|Section 6.10.4.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRS.NumPRSResourceBlocks"; + } + leaf prs-configuration-index { + type uint16 { + range "0..4095"; + } + config false; + description + "Corresponds to the PRS configuration index defined as parameter IPRS in {{bibref|3GPP-TS.36.211|Section 6.10.4.3 and Table 6.10.4.3.-1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRS.PRSConfigurationIndex"; + } + leaf num-consecutive-prs-subfames { + type uint8 { + range "1..2 | 4 | 6"; + } + config false; + description + "Defines the number of consecutive positioning sub-frames. Corresponds to the parameter NPRS in {{bibref|3GPP-TS.36.211|Section 6.10.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRS.NumConsecutivePRSSubfames"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.PRS."; + } + + grouping lte-ran-phy-tdd-frame-g { + description + "This object is applicable to TDD mode only. This object contains parameters relating to the TDD frame structure configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.1.10}})."; + leaf sub-frame-assignment { + type uint8 { + range "0..6"; + } + config false; + description + "Defines the DL/UL sub-frame configuration. Corresponds to subframAssignment specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and {{bibref|3GPP-TS.36.211|Table 4.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.TDDFrame.SubFrameAssignment"; + } + leaf special-subframe-patterns { + type uint8 { + range "0..8"; + } + config false; + description + "Defines the configuration of the special sub-frame that contains the guard period between the downlink and uplink transmissions. Corresponds to the specialSubframePatterns specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and {{bibref|3GPP-TS.36.211|Table 4.2.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.TDDFrame.SpecialSubframePatterns"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.PHY.TDDFrame."; + } + + grouping lte-ran-mac-g { + description + "This object contains parameters relating to the MAC (Medium Access Control) configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC."; + } + + grouping lte-ran-mac-rach-g { + description + "This object contains parameters relating to the RACH (Random Access Channel) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.2.1}})."; + leaf-list number-of-ra-preambles { + type uint8 { + range "4..64"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a number of non-dedicated random access preambles. Only values in multiple of 4 are valid (i.e. 4, 8, 12, 16,...64); use of other values within the defined range MUST be rejected by the CPE. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter numberOfRA-Preambles specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.1.1}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.NumberOfRaPreambles"; + } + leaf-list size-of-ra-group-a { + type uint8 { + range "4..60"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a number of non-dedicated random access preambles in Random Acces Preambles group A. Only values in multiple of 4 are valid (i.e. 4, 8, 12, 16,...60); use of other values within the defined range MUST be rejected by the CPE. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter sizeOfRA-PreamblesGroupA specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.1.1}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.SizeOfRaGroupA"; + } + leaf-list message-size-group-a { + type uint16 { + range "56 | 144 | 208 | 256"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a threshold for preamble selection, specified in bits. In case there is more than one item in the list, the first item contains the most preferred value. Defined in {{bibref|3GPP-TS.36.321|Section 5.1.2}}. Corresponds to parameter messageSizeGroupA specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.MessageSizeGroupA"; + } + leaf-list message-power-offset-group-b { + type int64; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a threshold for preamble selection, specified in dB. In case there is more than one item in the list, the first item contains the most preferred value. Defined in {{bibref|3GPP-TS.36.321|Section 5.1.2}}. Corresponds to parameter messagePowerOffsetGroupB specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}. Value of -1 indicates \"minusinfinity.\" If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.MessagePowerOffsetGroupB"; + } + leaf-list power-ramping-step { + type uint8 { + range "0 | 2 | 4 | 6"; + } + config false; + min-elements 1; + max-elements "16"; + description + "{{list}} Each item is a power increase factor between subsequent random access preamble transmissions, specified in dB. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter powerRampingStep specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.1.3}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.PowerRampingStep"; + } + leaf-list preamble-initial-received-target-power { + type int64; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a value used as the baseline for computation for random access transmission power, specified in dBm. Also used as a parameter in the criteria for preamble selection. Only even values are valid (i.e. -120, -118, -116,...-90); use of other values within the defined range MUST be rejected by the CPE. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter preambleInitialReceivedTargetPower specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.1.2}}. and section 5.1.3. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.PreambleInitialReceivedTargetPower"; + } + leaf-list preamble-trans-max { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a maximum number of random access preamble transmissions, from the list of 3, 4, 5, 6, 7, 8, 10, 20, 50, 100, 200. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter preambleTransMax specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.1.4 and section 5.1.5}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.PreambleTransMax"; + } + leaf-list response-window-size { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a duration of the random access response window, specified in sub-frames, with a numeric range between 2 and 10 inclusive (except value of 9). In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter ra-ResponseWindowSize specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.1.4}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.ResponseWindowSize"; + } + leaf-list contention-resolution-timer { + type uint8 { + range "8..64"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a contention resolution timer, specified in sub-frames. Only values multiple of 8 are valid (i.e. 8, 16, 24,...64); use of other values within the defined range MUST be rejected by the CPE. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter mac-ContentionResolutionTimer specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.1.5}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.ContentionResolutionTimer"; + } + leaf-list max-harq-msg3-tx { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a maximum number of Msg3 HARQ transmissions by RRC, with a numeric range between 1 and 8 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter maxHARQ-Msg3Tx specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.4.2.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH.MaxHARQMsg3Tx"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.RACH."; + } + + grouping lte-ran-mac-drx-g { + description + "This object contains parameters relating to the DRX (Discontinuous Reception) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.2.2}})."; + leaf drx-enabled { + type boolean; + config false; + description + "Specifies whether DRX operation is enabled or not. If {{true}}, DRX operation is enabled. If {{false}}, DRX operation is not enabled. Corresponds to drx-Configuration IE defined in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX.DRXEnabled"; + } + leaf-list on-duration-timer { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is the DRX cycle during which UE actively monitors PDCCH, specified in number of PDCCH sub-frames, from the list of 1, 2, 3, 4, 5, 6, 8, 10, 20, 30, 40, 50, 60, 80, 100, 200. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter onDurationTimer specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX.OnDurationTimer"; + } + leaf-list drx-inactivity-timer { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item defines the number of inactive consecutive PDCCH sub-frame(s) that will activate short DRX cycle, specified in number of PDCCH sub-frames, from the list of 1, 2, 3, 4, 5, 6, 8, 10, 20, 30, 40, 50, 60, 80, 100, 200, 300, 500, 750, 1280, 1920, 2560. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter drx-InactivityTimer specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX.DRXInactivityTimer"; + } + leaf-list drx-retransmission-timer { + type uint8 { + range "1 | 2 | 4 | 6 | 8 | 16 | 24 | 33"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item defines the maximum number of consecutive PDCCH sub-frame(s) UE MUST remain active expecting a DL retransmission, specified in number of PDCCH sub-frames. In case there is more than one item in the list, the first item contains the most preferred value. The timer is started when a HARQ RTT Timer expires and the data in the soft buffer of the corresponding HARQ process was not successfully decoded. There is one timer for each active HARQ process. Corresponds to parameter drx-RetransmissionTimer specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.7}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX.DRXRetransmissionTimer"; + } + leaf-list long-drx-cycle { + type uint16 { + range "10 | 20 | 32 | 40 | 64 | 80 | 128 | 160 | 256 | 320 | 512 | 640 | 1024 | 1280 | 2048 | 2560"; + } + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is long DRX Cycle value, specified in number of sub-frames. In case there is more than one item in the list, the first item contains the most preferred value. If shortDRX-Cycle is configured, this value MUST be a multiple of the {{param|ShortDRXCycle}} value. Corresponds to longDRX-Cycle parameter specified in {{bibref|3GPP-TS.36.321|Section 5.7}} and longDRX-CycleStartOffset specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX.LongDRXCycle"; + } + leaf-list drx-start-offset { + type string; + config false; + min-elements 1; + max-elements "512"; + description + "{{list}} Each item defines the starting frame of the DRX cycle within the long DRX cycle, with a numeric range between 0 and 2559 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The valid value range is dependent on {{param|LongDRXCycle}} parameter which defines the upper bound of this range, i.e., range definition is [0: ({{param|LongDRXCycle}}-1)]. Corresponds to drxStartOffset parameter specified in {{bibref|3GPP-TS.36.321|Section 5.7}}. Use of values bigger than ({{param|LongDRXCycle}}-1) MUST be rejected by the CPE. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX.DRXStartOffset"; + } + leaf-list short-drx-cycle { + type uint16 { + range "2 | 5 | 8 | 10 | 16 | 20 | 32 | 40 | 64 | 80 | 128 | 160 | 256 | 320 | 512 | 640"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is the short DRX Cycle value, specified in number of sub-frames. In case there is more than one item in the list, the first item contains the most preferred value. If shortDRX-Cycle is configured, the value of {{param|LongDRXCycle}} MUST be a multiple of the {{param}} value. Corresponds to shortDRX-Cycle parameter specified in {{bibref|3GPP-TS.36.321|Section 5.7}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX.ShortDRXCycle"; + } + leaf-list drx-short-cycle-timer { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item defined the duration of the short DRX cycle in multiples of {{param|ShortDRXCycle}} parameter, specified in number of sub-frames, with a numeric range between 1 and 16 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Denotes the number of consecutive sub-frame(s)the UE shall follow the short DRX cycle after the DRX Inactivity Timer has expired. Corresponds to drxShortCycleTimer parameter specified in {{bibref|3GPP-TS.36.321|Section 5.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX.DRXShortCycleTimer"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.DRX."; + } + + grouping lte-ran-mac-ulsch-g { + description + "This object contains parameters relating to the ULSCH (Uplink Shared Channel) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.2.3}})."; + leaf max-harq-tx { + type uint8 { + range "1..8 | 10 | 12 | 16 | 20 | 24 | 28"; + } + description + "Maximum number of UL HARQ transmissions. Corresponds to parameter maxHARQ-Tx specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.4.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.ULSCH.MaxHARQTx"; + } + leaf periodic-bsr-timer { + type uint16 { + range "0 | 5 | 10 | 16 | 20 | 32 | 40 | 64 | 80 | 128 | 160 | 320 | 640 | 1280 | 2560"; + } + units "subframes"; + description + "Timer for Periodic BSR (Buffer Status Report) reporting, specified in number of {{units}}. UE transmits periodic BSR at the expiration of this timer. Corresponds to parameter periodicBSR-Timer specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.4.5}}. Value of 0 indicates \"infinity.\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.ULSCH.PeriodicBSRTimer"; + } + leaf retx-bsr-timer { + type uint16 { + range "320 | 640 | 1280 | 2560 | 5120 | 10240"; + } + units "subframes"; + description + "Timer for Regular BSR reporting, specified in number of {{units}}. UE transmits a Regular BSR at the expiration of this timer if data is available in the buffer. Corresponds to parameter retxBSR-Timer specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.ULSCH.RetxBSRTimer"; + } + leaf tti-bundling { + type boolean; + description + "Enables/disables TTI bundling. If {{true}}, TTI bundling is enabled. If {{false}}, TTI bundling is disabled. Corresponds to parameter ttiBundling specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.321|Section 5.4.2.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.ULSCH.TTIBundling"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.MAC.ULSCH."; + } + + grouping lte-ran-rlc-g { + description + "This object contains parameters relating to the RLC (Radio Link Control) configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC."; + } + + grouping lte-ran-rlc-srb1-g { + description + "This object contains parameters relating to the SRB1 (Signaling Radio Bearer 1) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.3.1}})."; + leaf default-configuration { + type boolean; + config false; + description + "Indicates the whether default RLC configuration for SRB1 is used or not. If {{true}}, the default RLC configuration is used as specified in {{bibref|3GPP-TS.36.331|Section 9.2.1.1}}. In this case, rest of the parameters defined under the current object are ignored by the CPE. If {{false}}, rest of the parameters defined under the current object are used by the CPE for RLC configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1.DefaultConfiguration"; + } + leaf-list t-poll-retransmit { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a timer between successive poll transmissions, specified in milliseconds, specified in milliseconds, with a numeric range between 5 and 500 inclusive. Only the multiple of 5 are valid in the range between 5 and 250 inclusive (i.e. 5, 10, 15, 20,... 250), and only the multiple of 50 are valid in the range between 300 and 500 inclusive (i.e., 300, 350, 400, 450, 500). If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to t-PollRetransmit IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1.TPollRetransmit"; + } + leaf-list poll-pdu { + type uint16 { + range "0 | 4 | 8 | 16 | 32 | 64 | 128 | 256"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a counter of PDUs between successive poll transmissions, specified in the number of PDUs. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to pollPDU IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.2.1}}. Value of 0 indicates \"infinity.\" If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1.PollPDU"; + } + leaf-list poll-byte { + type uint16 { + range "0 | 25 | 50 | 75 | 100 | 125 | 250 | 375 | 500 | 750 | 1000 | 1250 | 1500 | 2000 | 3000"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a counter of PDU bytes transmitted between successive poll transmissions, specified in kilobytes. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to pollByte IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.2.1}}. Value of 0 indicates infinite amount of kilobytes. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1.PollByte"; + } + leaf-list max-retx-threshold { + type uint8 { + range "1..4 | 6 | 8 | 16 | 32"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item defines the maximum number of transmission retry used by the RLC entity to limit the number of retransmissions of an AMD PDU. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to maxRetxThreshold IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.1}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1.MaxRetxThreshold"; + } + leaf-list t-reordering { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item defines a timer used by the receiving side of an RLC entity in order to detect loss of RLC PDUs at lower layer, specified in milliseconds, with a numeric range between 0 and 200 inclusive. Only the multiple of 5 are valid in the range between 0 and 100 inclusive (i.e. 0, 5, 10, 15,...,100), and only the multiple of 10 are valid in the range between 110 and 200 inclusive (110, 120, 130,...,200). If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to t-Reordering IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.1.2.2. and 5.1.3.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1.TReordering"; + } + leaf-list t-status-prohibit { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item defines a timer used by the receiving side of an AM RLC entity in order to prohibit transmission of a STATUS PDU, specified in milliseconds, with a numeric range between 0 and 500 inclusive. Only the multiple of 5 are valid in the range between 0 and 250 inclusive (i.e. 0, 5, 10, 15,...,250), and only the multiple of 50 are valid in the range between 300 and 500 inclusive (i.e. 300, 350, 400, 450, 500). If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to t-StatusProhibit IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.3}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1.TStatusProhibit"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB1."; + } + + grouping lte-ran-rlc-srb2-g { + description + "This object contains parameters relating to the SRB2 (Signaling Radio Bearer 2) configuration (see {{bibref|3GPP-TS.32.592|Section 6.1.3.1}})."; + leaf default-configuration { + type boolean; + config false; + description + "Indicates the whether default RLC configuration for SRB1 is used or not. If {{true}}, the default RLC configuration is used as specified in {{bibref|3GPP-TS.36.331|Section 9.2.1.1}}. In this case, rest of the parameters defined under the current object are ignored by the CPE. If {{false}}, rest of the parameters defined under the current object are used by the CPE for RLC configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2.DefaultConfiguration"; + } + leaf-list t-poll-retransmit { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a timer between successive poll transmissions, specified in milliseconds, with a numeric range between 5 and 500 inclusive. Only the multiple of 5 are valid in the range between 5 and 250 inclusive (i.e. 5, 10, 15, 20,... 250), and only the multiple of 50 are valid in the range between 300 and 500 inclusive (i.e., 300, 350, 400, 450, 500). If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to t-PollRetransmit IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2.TPollRetransmit"; + } + leaf-list poll-pdu { + type uint16 { + range "0 | 4 | 8 | 16 | 32 | 64 | 128 | 256"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a counter of PDUs between successive poll transmissions, specified in the number of PDUs. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to pollPDU IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.2.1}}. Value of 0 indicates \"infinity.\" If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2.PollPDU"; + } + leaf-list poll-byte { + type uint16 { + range "0 | 25 | 50 | 75 | 100 | 125 | 250 | 375 | 500 | 750 | 1000 | 1250 | 1500 | 2000 | 3000"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a counter of PDU bytes transmitted between successive poll transmissions, specified in kilobytes. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to pollByte IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.2.1}}. Value of 0 indicates infinite amount of kilobytes. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2.PollByte"; + } + leaf-list max-retx-threshold { + type uint8 { + range "1..4 | 6 | 8 | 16 | 32"; + } + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item defines the maximum number of transmission retry used by the RLC entity to limit the number of retransmissions of an AMD PDU. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to maxRetxThreshold IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.1}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2.MaxRetxThreshold"; + } + leaf-list t-reordering { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item defines a timer used by the receiving side of an RLC entity in order to detect loss of RLC PDUs at lower layer, specified in milliseconds, with a numeric range between 0 and 200 inclusive. Only the multiple of 5 are valid in the range between 0 and 100 inclusive (i.e. 0, 5, 10, 15,...,100), and only the multiple of 10 are valid in the range between 110 and 200 inclusive (110, 120, 130,...,200). If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to t-Reordering IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.1.2.2. and 5.1.3.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2.TReordering"; + } + leaf-list t-status-prohibit { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item defines a timer used by the receiving side of an AM RLC entity in order to prohibit transmission of a STATUS PDU, specified in milliseconds, with a numeric range between 0 and 500 inclusive. Only the multiple of 5 are valid in the range between 0 and 250 inclusive (i.e. 0, 5, 10, 15,...,250), and only the multiple of 50 are valid in the range between 300 and 500 inclusive (i.e. 300, 350, 400, 450, 500). If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. This parameter is valid only if {{param|DefaultConfiguration}} paramter under the current object is set to {{false}}. Corresponds to t-StatusProhibit IE specified in {{bibref|3GPP-TS.36.331|Section 6.3.2}} and in {{bibref|3GPP-TS.36.322|Section 5.2.3}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2.TStatusProhibit"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RLC.SRB2."; + } + + grouping lte-ran-rrc-timers-g { + description + "This object contains parameters relating to the RRC timers and constants (see {{bibref|3GPP-TS.32.592|Section 6.1.6.1}}) and (see {{bibref|3GPP-TS.32.592|Section 6.1.6.2}})."; + leaf-list t300 { + type uint16 { + range "100 | 200 | 300 | 400 | 600 | 1000 | 1500 | 2000"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is an interval, in milliseconds, between subsequent transmissions of RRCConnectionRequest. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t300 specified in UE-TimersAndConstants IE in {{bibref|3GPP-TS.36.331|Section 6.3.6}}. Start/stop/expirary condition is defined in {{bibref|3GPP-TS.36.331|Section 7.3}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.T300"; + } + leaf-list t301 { + type uint16 { + range "100 | 200 | 300 | 400 | 600 | 1000 | 1500 | 2000"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is an interval, in milliseconds, between subsequent transmissions of RRCConnectionReestablishmentRequest. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t301 specified in UE-TimersAndConstants IE in {{bibref|3GPP-TS.36.331|Section 6.3.6}}. Start/stop/expirary condition is defined in {{bibref|3GPP-TS.36.331|Section 7.3}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.T301"; + } + leaf t302 { + type uint16 { + range "100 | 200 | 300 | 400 | 600 | 1000 | 1500 | 2000"; + } + units "milliseconds"; + config false; + description + "Time to wait in {{units}} for cell re-selection or RRConnectionSetup after RRCConnectionReject. Start/stop/expirary condition is defined in {{bibref|3GPP-TS.36.331|Section 7.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.T302"; + } + leaf-list t304-eutra { + type uint16 { + range "50 | 100 | 150 | 200 | 500 | 1000 | 2000"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a HO failure timer, in milliseconds. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to t304 defined within IE MobilityControlInfo in RRCConnectionReconfiguration message in {{bibref|3GPP-TS.36.331|Section 5.3.5.4 and Section 6.3.4}}. Start/stop/expirary condition is defined in {{bibref|3GPP-TS.36.331|Section 7.3}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.T304EUTRA"; + } + leaf-list t304-irat { + type uint16 { + range "100 | 200 | 500 | 1000 | 2000 | 4000 | 8000"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a HO failure timer, in milliseconds. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to t304 defined within IE CellChangeOrder in MobilityFromEUTRACommand message in {{bibref|3GPP-TS.36.331|Section 6.2.2}}. Start/stop/expirary condition is defined in {{bibref|3GPP-TS.36.331|Section 7.3}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.T304IRAT"; + } + leaf-list t310 { + type uint16 { + range "0 | 50 | 100 | 200 | 500 | 1000 | 2000"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a RLF declaration timer, in milliseconds. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t310 specified in RLF-TimersAndConstants IE in {{bibref|3GPP-TS.36.331|Section 6.3.6}}. Start/stop/expirary condition is defined in {{bibref|3GPP-TS.36.331|Section 7.3}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.T310"; + } + leaf-list t311 { + type uint16 { + range "1000 | 3000 | 5000 | 10000 | 15000 | 20000 | 30000"; + } + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a RLF recovery timer, in milliseconds. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t311 specified in RLF-TimersAndConstants IE in {{bibref|3GPP-TS.36.331|Section 6.3.6}}. Start/stop/expirary condition is defined in {{bibref|3GPP-TS.36.331|Section 7.3}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.T311"; + } + leaf t320 { + type uint8 { + range "5 | 10 | 20 | 30 | 60 | 120 | 180"; + } + units "minutes"; + config false; + description + "Time in {{units}} after RRCConnection Release in which cell re-selection priority info supplied in RRCConnectionRelease MUST be observed. Start/stop/expirary condition is defined in {{bibref|3GPP-TS.36.331|Section 7.3}}. Corresponds to parameter t320 specified in RRCConnectionRelease message in {{bibref|3GPP-TS.36.331|Section 6.2.2}}. S"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.T320"; + } + leaf n310 { + type uint8 { + range "1..4 | 6 | 8 | 10 | 20"; + } + config false; + description + "Number of consecutive \"out-of-sync\" indications received from lower layers that triggers timer T310. Corresponds to parameter n310 specified in UE-TimersAndConstants IE in {{bibref|3GPP-TS.36.331|Section 6.3.6 and Section 7.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.N310"; + } + leaf n311 { + type uint8 { + range "1..6 | 8 | 10"; + } + config false; + description + "Number of consecutive \"in-sync\" indications received from lower layers that stops timer T310. Corresponds to parameter n311 specified in UE-TimersAndConstants IE in {{bibref|3GPP-TS.36.331|Section 6.3.6 and Section 7.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers.N311"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.RRCTimers."; + } + + grouping lte-ran-cell-restriction-g { + description + "This object contains parameters relating to the cell restriction configuration."; + leaf cell-barred { + type boolean; + config false; + description + "Indicates whether the is barred or not. If {{true}}, the cell is barred. If {{false}}, the cell is not barred. Corresponds to parameter CellBarred specified in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.CellRestriction.CellBarred"; + } + leaf cell-reserved-for-operator-use { + type boolean; + config false; + description + "Indicates whether the is reserved for operator's use or not. If {{true}}, the cell is reserved for operator use. If {{false}}, the cell is not reserved for operator use. Corresponds to parameter cellReservedForOperatorUse specified in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.CellRestriction.CellReservedForOperatorUse"; + } + leaf barring-for-emergency { + type boolean; + config false; + description + "Indicates whether the is barred for Access Class 10 or not. If {{true}}, the cell is barred for Access Class 10. If {{false}}, the cell is not barred for Access Class 10. Corresponds to parameter ac-BarringForEmergency specified in SIB2 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.CellRestriction.BarringForEmergency"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.CellRestriction."; + } + + grouping lte-ran-mobility-g { + description + "This object contains parameters relating to the UE's mobility configuration. It covers both idle mode and connected mode."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility."; + } + + grouping lte-ran-mobility-idle-mode-g { + description + "This object contains parameters relating to the UE's mobility while it is in idle mode (cell (re-)selection). Parameters under this object determines the content in the SIB (System Information Block) that is broadcast by LTE ."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode."; + } + + grouping lte-ran-mobility-idle-mode-common-g { + description + "This object contains parameters relating to the idle mode mobility configuration that is common to all cell re-selection scenarios (intra/inter-freq, inter-RAT to UTRA (UMTS), GERAN (GSM) and CDMA2000) (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.1}})."; + leaf-list qhyst { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a hysteresis value applied to serving cell for evaluating cell ranking criteria specified in dB, with a numeric range between 0 and 24 inclusive. For the value greater than 6, only even numbers are valid. If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter q-Hyst specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common.Qhyst"; + } + leaf q-hyst-sf-medium { + type int64; + units "dB"; + config false; + description + "Speed-dependent scaling factor for Qhyst in Medium-mobility state, specified in {{units}}. Corresponds to parameter q-HystSF:sf-Medium specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common.QHystSFMedium"; + } + leaf q-hyst-sf-high { + type int64; + units "dB"; + config false; + description + "Speed-dependent scaling factor for Qhyst in High-mobility state, specified in {{units}}. Corresponds to parameter q-HystSF:sf-High specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common.QHystSFHigh"; + } + leaf t-evaluation { + type uint8 { + range "30 | 60 | 120 | 180 | 240"; + } + units "seconds"; + config false; + description + "Duration for evaluating allowed amount of cell re-selection(s) required to enter mobility states, specified in {{units}}. Corresponds to parameter t-Evaluation specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.4}} and to parameter TCRmax specified in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common.TEvaluation"; + } + leaf t-hyst-normal { + type uint8 { + range "30 | 60 | 120 | 180 | 240"; + } + units "seconds"; + config false; + description + "Additional duration for evaluating criteria to enter normal mobility state, specified in {{units}}. Specifies the additional time period for evaluating criteria to enter Normal-mobility state. Corresponds to parameter t-HystNormal specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.4}} and to parameter TCRmaxHyst specified in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common.THystNormal"; + } + leaf n-cell-change-medium { + type uint8 { + range "1..16"; + } + config false; + description + "Defines the number of cell re-selections within TEvaluation to enter Medium-mobility state. Corresponds to parameter n-cellChangeMedium specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.4}} and to parameter NCR_M specified in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common.NCellChangeMedium"; + } + leaf n-cell-change-high { + type uint8 { + range "1..16"; + } + config false; + description + "Defines the number of cell re-selections within TEvaluation to enter High-mobility state. Corresponds to parameter n-cellChangeHigh specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.4}} and to parameter NCR_H specified in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common.NCellChangeHigh"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.Common."; + } + + grouping lte-ran-mobility-idle-mode-intra-freq-g { + description + "This object contains parameters relating to the idle mode mobility configuration for intra-freq re-selection scenario (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.2}})."; + leaf-list q-rx-lev-min-sib1 { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a required minimum received RSRP level of a E-UTRA cell for cell selection, specified in dBm, with a numeric range between -70 and -22 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter q-rxLevMin in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}} and in {{bibref|3GPP-TS.36.304|Section 5.2.3.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.QRxLevMinSIB1"; + } + leaf-list q-rx-lev-min-sib3 { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a required minimum received RSRP level for intra-frequency E-UTRA cell re-selection, specified in dBm, with a numeric range between -70 and -22 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter q-rxLevMin in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.3.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.QRxLevMinSIB3"; + } + leaf q-rx-lev-min-offset { + type uint8 { + range "1..8"; + } + units "dBm"; + config false; + description + "Defines offset with respect to QrxLevMin, specified in {{units}}. This offset is taken into account in the computation of Srxlev for cell selection evaluation of cells detected during a periodic search for a higher priority PLMN while camped normally in a VPLMN. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter q-rxLevMinOffset in SIB1 specified in {{bibref|3GPP-TS.36.331|Section 6.2.2}} and in {{bibref|3GPP-TS.36.304|Section 5.2.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.QRxLevMinOffset"; + } + leaf-list s-intra-search { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a threshold for intra-frequency measurements, specified in dB, with a numeric range between 0 and 31 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter s-IntraSearch specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.SIntraSearch"; + } + leaf-list t-reselection-eutra { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a cell re-selection timer for intra-frequency E-UTRA cell re-selection, specified in seconds, with a numeric range between 0 and 7 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t-ReselectionEUTRA specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.TReselectionEUTRA"; + } + leaf-list s-non-intra-search { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a threshold for inter-frequency and inter-RAT measurements with lower or equal priority, specified in dB, with a numeric range between 0 and 31 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter s-NonIntraSearch specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.SNonIntraSearch"; + } + leaf cell-reselection-priority { + type uint8 { + range "0..7"; + } + config false; + description + "Absolute priority of the E-UTRAN serving carrier frequency used in the inter-frequency and inter-RAT cell re-selection procedure. Corresponds to parameter CellReselectionPriority specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.CellReselectionPriority"; + } + leaf p-max { + type int64; + units "dBm"; + config false; + description + "Used to limit the allowed UE uplink transmission power on the serving frequency, specified in {{units}}. It is used to calculate the parameter Pcompensation defined in {{bibref|3GPP-TS.36.304|Section 5.2.3.2}}. Corresponds to parameter p-Max specified in SIB1 and SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1 and Section 6.3.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.PMax"; + } + leaf thresh-serving-low { + type uint8 { + range "0..31"; + } + units "dB"; + config false; + description + "Threshold for serving frequency used in evaluation of re-selection towards lower priority E-UTRAN frequency or inter-RAT, specified in {{units}}. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshServingLow specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.ThreshServingLow"; + } + leaf t-reselection-eutrasf-medium { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for intra-frequency TreselectionEUTRA in Medium-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionEUTRA-SF:sf-Medium specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.TReselectionEUTRASFMedium"; + } + leaf t-reselection-eutrasf-high { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for intra-frequency TreselectionEUTRA in High-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionEUTRA-SF:sf-High specified in SIB3 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq.TReselectionEUTRASFHigh"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IntraFreq."; + } + + grouping lte-ran-mobility-idle-mode-inter-freq-g { + description + "This object contains parameters relating to the idle mode mobility configuration for inter-freq re-selection scenario ."; + leaf max-carrier-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.MaxCarrierEntries"; + } + leaf carrier-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.CarrierNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq."; + } + + grouping lte-ran-mobility-idle-mode-inter-freq-carrier-g { + description + "This object contains parameters relating to the carrier information for inter-freq re-selection scenario (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.3}})."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.Alias"; + } + leaf eutra-carrier-arfcn { + type uint16 { + range "0..65535"; + } + description + "Indicates the ARFCN of this frequency carrier. Corresponds to parameter dl-CarrierFreq in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.EUTRACarrierARFCN"; + } + leaf-list q-rx-lev-min-sib5 { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a required minimum received RSRP level on this E-UTRA frequency carrier, spcified in dBm, with a numeric range between -70 and -22 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter q-rxLevMin in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.3.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.QRxLevMinSIB5"; + } + leaf-list q-offset-freq { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is an offset applicable between serving and this frequency carrier, specified in dBm, with a numeric range between -24 and 24 inclusive. For values less than or equal to -6, or values greater than or equal to 6, only the even values are valid. If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter q-OffsetFreq in SIB5 specified in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.4.2.6}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.QOffsetFreq"; + } + leaf-list t-reselection-eutra { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a cell re-selection timer for inter-frequency cell re-selection to this E-UTRA frequency carrier, specified in seconds, with a numeric range between 0 and 7 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t-ReselectionEUTRA specified in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.TReselectionEUTRA"; + } + leaf cell-reselection-priority { + type uint8 { + range "0..7"; + } + config false; + description + "Absolute priority of this E-UTRA frequency carrier, as used by the inter-frequency cell re-selection procedure. Corresponds to parameter CellReselectionPriority specified in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.CellReselectionPriority"; + } + leaf thresh-x-high { + type uint8 { + range "0..31"; + } + units "dB"; + config false; + description + "Threshold used when re-selecting from a lower priority E-UTRAN frequency, specified in {{units}}. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshX-High specified in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.ThreshXHigh"; + } + leaf thresh-x-low { + type uint8 { + range "0..31"; + } + units "dB"; + config false; + description + "Threshold used when re-selecting from a higher priority E-UTRAN frequency, specified in {{units}}. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshX-Low specified in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.ThreshXLow"; + } + leaf p-max { + type int64; + units "dBm"; + config false; + description + "Used to limit the allowed UE uplink transmission power on this carrier frequency, specified in {{units}}. It is used to calculate the parameter Pcompensation defined in {{bibref|3GPP-TS.36.304|Section 5.2.3.2}}. Corresponds to parameter p-Max specified in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.PMax"; + } + leaf t-reselection-eutrasf-medium { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for TreselectionEUTRA for inter-frequency re-selection to this frequency carrier in Medium-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionEUTRA-SF:sf-Medium specified in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.TReselectionEUTRASFMedium"; + } + leaf t-reselection-eutrasf-high { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for TreselectionEUTRA for inter-frequency re-selection to this frequency carrier in High-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionEUTRA-SF:sf-High specified in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}.TReselectionEUTRASFHigh"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.InterFreq.Carrier.{i}."; + } + + grouping lte-ran-mobility-idle-mode-irat-g { + description + "This object contains parameters relating to the idle mode mobility configuration for inter-RAT (Radio Access Technology) re-selection scenario."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT."; + } + + grouping lte-ran-mobility-idle-mode-irat-utra-g { + description + "This object contains parameters relating to the idle mode mobility configuration for inter-RAT (Radio Access Technology) re-selection, specifically for re-selection to UTRA (UMTS) scenario (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.4}})."; + leaf-list t-reselection-utra { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a cell re-selection timer for re-selection to a UTRA frequency carrier, specified in seconds, with a numeric range between 0 and 7 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t-ReselectionUTRA specified in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.TReselectionUTRA"; + } + leaf t-reselection-utrasf-medium { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for TreselectionUTRA for inter-RAT re-selection to UTRA in Medium-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionUTRA-SF:sf-Medium specified in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.TReselectionUTRASFMedium"; + } + leaf t-reselection-utrasf-high { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for TreselectionEUTRA for inter-frequency re-selection to this frequency carrier in High-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionUTRA-SF:sf-High specified in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.TReselectionUTRASFHigh"; + } + leaf max-utranfdd-freq-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.MaxUTRANFDDFreqEntries"; + } + leaf utranfdd-freq-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreqNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA."; + } + + grouping lte-ran-mobility-idle-mode-irat-utra-utranfdd-freq-g { + description + "This object contains parameters relating to the channel frequncy related information of UTRA (UMTS) system (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.5, 6.1.5.1.6}})."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.Alias"; + } + leaf utra-carrier-arfcn { + type uint16 { + range "0..16383"; + } + description + "Indicates the ARFCN of the frequency carrier. Corresponds to parameter CarrierFreq in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.UTRACarrierARFCN"; + } + leaf-list q-rx-lev-min { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a required minimum received RSCP level on this UTRA frequency carrier, specified in dBm, with a numeric range between -60 and -13 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of ({{param}} * 2 + 1) yields the actual value. Corresponds to parameter q-RxLevMin in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.25.304|Section 5.2.3.1.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.QRxLevMin"; + } + leaf-list q-qual-min { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a required minimum received Ec/Io level on this UTRA FDD carrier, specified in dB, with a numeric range between -24 and 0 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter q-QualMin in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.25.304|Section 5.2.3.1.2}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.QQualMin"; + } + leaf cell-reselection-priority { + type uint8 { + range "0..7"; + } + config false; + description + "Absolute priority of this UTRA FDD frequency carrier, as used by the inter-frequency cell re-selection procedure. Corresponds to parameter CellReselectionPriority specified in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.CellReselectionPriority"; + } + leaf thresh-x-high { + type uint8 { + range "0..31"; + } + units "dB"; + config false; + description + "Threshold used when re-selecting towards a higher priority UTRA FDD frequency, specified in {{units}}. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshX-High specified in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.ThreshXHigh"; + } + leaf thresh-x-low { + type uint8 { + range "0..31"; + } + units "dB"; + config false; + description + "Threshold used when re-selecting towards a lower priority UTRA FDD frequency, specified in {{units}}. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshX-Low specified in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.ThreshXLow"; + } + leaf p-max-utra { + type int64; + units "dBm"; + config false; + description + "Used to limit the allowed UE uplink transmission power on this UTRA FDD carrier frequency, specified in {{units}}. It is used to calculate the parameter Pcompensation defined in {{bibref|3GPP-TS.25.304|Section 5.2.3.1.2}}. Corresponds to parameter p-MaxUTRA specified in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}.PMaxUTRA"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.UTRA.UTRANFDDFreq.{i}."; + } + + grouping lte-ran-mobility-idle-mode-irat-geran-g { + description + "This object contains parameters relating to the idle mode mobility configuration for inter-RAT (Radio Access Technology) re-selection, specifically for re-selection to GERAN (GSM) scenario (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.6}})."; + leaf-list t-reselection-geran { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a cell re-selection timer for re-selection to a GERAN frequency carrier, specified in seconds, with a numeric range between 0 and 7 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t-ReselectionGERAN specified in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and to TreselectionGERA in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.TReselectionGERAN"; + } + leaf t-reselection-geransf-medium { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for TreselectionGERAN for inter-RAT re-selection to GERAN in Medium-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionGERAN-SF:sf-Medium specified in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.TReselectionGERANSFMedium"; + } + leaf t-reselection-geransf-high { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for TreselectionGERAN for inter-RAT re-selection to GERAN in High-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionGERAN-SF:sf-High specified in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.TReselectionGERANSFHigh"; + } + leaf max-geran-freq-group-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.MaxGERANFreqGroupEntries"; + } + leaf geran-freq-group-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroupNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN."; + } + + grouping lte-ran-mobility-idle-mode-irat-geran-geran-freq-group-g { + description + "This object contains parameters relating to the channel frequncy related information of GERAN (GSM) system (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.7}})."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.Alias"; + } + leaf band-indicator { + type enumeration { + enum "gsm850" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.BandIndicator - GSM850"; + } + enum "gsm900" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.BandIndicator - GSM900"; + } + enum "dcs1800" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.BandIndicator - DCS1800"; + } + enum "pcs1900" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.BandIndicator - PCS1900"; + } + } + config false; + description + "Indicates how to interpret the BCCH ARFCN. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.BandIndicator"; + } + leaf bccharfcn { + type uint16 { + range "0..1023"; + } + description + "ARFCN of this cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.BCCHARFCN"; + } + leaf-list q-rx-lev-min { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is a required minimum received RSSI level on this GERAN frequency carrier for re-selection to this UTRA FDD carrier, specified in dBm, with a numeric range between 0 and 63 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. The value of ({{param}} * 2 - 115) yields the actual value. Corresponds to parameter q-rxLevMin in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and to RXLEV_ACCESS_MIN in {{bibref|3GPP-TS.45.008}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.QRxLevMin"; + } + leaf cell-reselection-priority { + type uint8 { + range "0..7"; + } + config false; + description + "Absolute priority of this GERAN frequency group, as used by the inter-frequency cell re-selection procedure. Corresponds to parameter CellReselectionPriority specified in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.CellReselectionPriority"; + } + leaf thresh-x-high { + type uint8 { + range "0..31"; + } + units "dB"; + config false; + description + "Threshold used when re-selecting towards a higher priority GERAN frequency group than current serving E-UTRA frequency, specified in {{units}}. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshX-High specified in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.ThreshXHigh"; + } + leaf thresh-x-low { + type uint8 { + range "0..31"; + } + units "dB"; + config false; + description + "Threshold used when re-selecting towards a lower priority GERAN frequency group than current serving E-UTRA frequency, specified in {{units}} dB. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshX-Low specified in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}.ThreshXLow"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.GERAN.GERANFreqGroup.{i}."; + } + + grouping lte-ran-mobility-idle-mode-irat-cdma2000-g { + description + "This object contains parameters relating to the idle mode mobility configuration for inter-RAT (Radio Access Technology) re-selection, specifically for re-selection to CDMA2000 system scenario (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.8}})."; + leaf-list search-window-size { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a CDMA2000 parameter affecting the search for neighbouring pilots, with a numeric range between 0 and 15 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter searchWindowSize in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP2-C.S0005-A|Table 2.6.6.2.1-1}} and {{bibref|3GPP2-C.S0024-A|Table 8.7.6.2-4}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.SearchWindowSize"; + } + leaf-list t-reselection-cdma2000 { + type string; + config false; + min-elements 1; + max-elements "32"; + description + "{{list}} Each item is a cell re-selection timer for a CDMA2000 band, specified in seconds, with a numeric range between 0 and 7 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter t-ReselectionCDMA2000 specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and to TreselectionCDMA_HRPD or TreselectionCDMA_1xRTT in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.TReselectionCDMA2000"; + } + leaf t-reselection-cdma2000-sf-medium { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for TReselectionCDMA2000 for inter-RAT re-selection to CDMA2000 in Medium-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionCDMA2000-SF:sf-Medium specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.TReselectionCDMA2000SFMedium"; + } + leaf t-reselection-cdma2000-sf-high { + type uint8 { + range "25 | 50 | 75 | 100"; + } + config false; + description + "Scaling factor for TReselectionCDMA2000 for inter-RAT re-selection to CDMA2000 in High-mobility state. The value of {{param}} divided by 100 yields the actual SF value. Corresponds to parameter t-ReselectionCDMA2000-SF:sf-High specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.TReselectionCDMA2000SFHigh"; + } + leaf max-cdma2000-band-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.MaxCDMA2000BandEntries"; + } + leaf cdma2000-band-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000BandNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000."; + } + + grouping lte-ran-mobility-idle-mode-irat-cdma2000-cdma2000-band-g { + description + "This object contains parameters relating to the channel frequncy related information of CDMA2000 system (see {{bibref|3GPP-TS.32.592|Section 6.1.5.1.8}})."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}.Alias"; + } + leaf band-class { + type uint8 { + range "0..17"; + } + units "bandclass number"; + description + "Defines the CDMA2000 band in which the CDMA2000 carrier frequency can be found, specified in {{units}}. BandClass is defined in 3GPP2 C.S0057-B Table 1.5-1. Corresponds to parameter bandClass specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}.BandClass"; + } + leaf cell-reselection-priority { + type uint8 { + range "0..7"; + } + config false; + description + "Absolute priority of this CDMA2000 band used by the inter-frequency cell re-selection procedure. Corresponds to parameter CellReselectionPriority specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.7}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}.CellReselectionPriority"; + } + leaf thresh-x-high { + type uint8 { + range "0..63"; + } + units "dB"; + config false; + description + "Threshold used when re-selecting towards a higher priority CDMA2000 band than current serving E-UTRA frequency, specified in {{units}}. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshX-High specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}.ThreshXHigh"; + } + leaf thresh-x-low { + type uint8 { + range "0..63"; + } + units "dB"; + config false; + description + "Threshold used when re-selecting towards a lower priority CDMA2000 band than current serving E-UTRA frequency, specified in {{units}}. The value of ({{param}} * 2) yields the actual value. Corresponds to parameter threshX-Low specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}} and in {{bibref|3GPP-TS.36.304|Section 5.2.4.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}.ThreshXLow"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.IdleMode.IRAT.CDMA2000.CDMA2000Band.{i}."; + } + + grouping lte-ran-mobility-conn-mode-g { + description + "This object contains parameters relating to the UE's mobility while it is in connected mode (handover). Parameters under this object determines the content in the SIB (System Information Block) that is broadcast by LTE ."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode."; + } + + grouping lte-ran-mobility-conn-mode-eutra-g { + description + "This object contains parameters relating to the connected mode mobility (handover) configuration within LTE system (see {{bibref|3GPP-TS.32.592|Section 6.1.5.2.1}})."; + leaf-list filter-coefficient-rsrp { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a filtering coefficient used for RSRP measurements, with a numeric range between 0 and 19 inclusive. For values greater than 9, only odd values are valid. If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to filterCoefficientRSRP parameter specified in QuantityConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.FilterCoefficientRSRP"; + } + leaf-list filter-coefficient-rsrq { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a filtering coefficient used for RSRQ measurements, with a numeric range between 0 and 19 inclusive. For values greater than 9, only odd values are valid. If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to filterCoefficientRSRQ parameter specified in QuantityConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.FilterCoefficientRSRQ"; + } + leaf a1-threshold-rsrp { + type uint8 { + range "0..97"; + } + config false; + description + "Threshold to be used in EUTRA measurement report triggering condition for event A1. Valid only if {{param|TriggerQuantity}} is {{enum|RSRP|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133|Table 9.1.4-1}}. Corresponds to parameter a1-Threshold:threshold-RSRP specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A1ThresholdRSRP"; + } + leaf a1-threshold-rsrq { + type uint8 { + range "0..34"; + } + config false; + description + "Threshold to be used in EUTRA measurement report triggering condition for event A1. Valid only if {{param|TriggerQuantity}} is {{enum|RSRQ|TriggerQuantity}}. Mapping to actual values is specified in 3GPP TS 36.133}} table 9.1.7-1. Corresponds to parameter a1-Threshold:threshold-RSRQ specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A1ThresholdRSRQ"; + } + leaf a2-threshold-rsrp { + type uint8 { + range "0..97"; + } + config false; + description + "Threshold to be used in EUTRA measurement report triggering condition for event A2. Valid only if {{param|TriggerQuantity}} is {{enum|RSRP|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133|Table 9.1.4-1}}. Corresponds to parameter a2-Threshold:threshold-RSRP specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A2ThresholdRSRP"; + } + leaf a2-threshold-rsrq { + type uint8 { + range "0..34"; + } + config false; + description + "Threshold to be used in EUTRA measurement report triggering condition for event A2. Valid only if {{param|TriggerQuantity}} is {{enum|RSRQ|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133|Table 9.1.7-1}}. Corresponds to parameter a2-Threshold:threshold-RSRQ specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A2ThresholdRSRQ"; + } + leaf-list a3-offset { + type string; + config false; + min-elements 1; + max-elements "256"; + description + "{{list}} Each item is an offset to be used in evaluation of EUTRA measurement report triggering condition for event A3, with a numeric range between -30 and 30 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133}}. Corresponds to parameter a3-Offset specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A3Offset"; + } + leaf report-on-leave { + type boolean; + config false; + description + "Indicates whether or not the UE shall initiate the measurement reporting procedure when the leaving condition is met for event A3 for a cell in cellsTriggeredList, as specified in {{bibref|3GPP-TS.36.331|Section 5.5.4.1 and Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.ReportOnLeave"; + } + leaf a4-threshold-rsrp { + type uint8 { + range "0..97"; + } + config false; + description + "Threshold to be used in EUTRA measurement report triggering condition for event A4. Valid only if {{param|TriggerQuantity}} is {{enum|RSRP|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133}}. Corresponds to parameter a4-Threshold:threshold-RSRP specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A4ThresholdRSRP"; + } + leaf a4-threshold-rsrq { + type uint8 { + range "0..34"; + } + config false; + description + "Threshold to be used in EUTRA measurement report triggering condition for event A4. Valid only if {{param|TriggerQuantity}} is {{enum|RSRQ|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133}}. Corresponds to parameter a4-Threshold:threshold-RSRQ specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A4ThresholdRSRQ"; + } + leaf a5-threshold1-rsrp { + type uint8 { + range "0..97"; + } + config false; + description + "Threshold1 to be used in EUTRA measurement report triggering condition for event A5. Valid only if {{param|TriggerQuantity}} is {{enum|RSRP|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133}}. Corresponds to parameter a5-Threshold1:threshold-RSRP specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A5Threshold1RSRP"; + } + leaf a5-threshold1-rsrq { + type uint8 { + range "0..34"; + } + config false; + description + "Threshold1 to be used in EUTRA measurement report triggering condition for event A5. Valid only if {{param|TriggerQuantity}} is {{enum|RSRQ|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133}}. Corresponds to parameter a5-Threshold1:threshold-RSRQ specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A5Threshold1RSRQ"; + } + leaf a5-threshold2-rsrp { + type uint8 { + range "0..97"; + } + config false; + description + "Threshold2 to be used in EUTRA measurement report triggering condition for event A5. Valid only if {{param|TriggerQuantity}} is {{enum|RSRP|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133}}. Corresponds to parameter a5-Threshold2:threshold-RSRP specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A5Threshold2RSRP"; + } + leaf a5-threshold2-rsrq { + type uint8 { + range "0..34"; + } + config false; + description + "Threshold2 to be used in EUTRA measurement report triggering condition for event A5. Valid only if {{param|TriggerQuantity}} is {{enum|RSRQ|TriggerQuantity}}. Mapping to actual values is specified in {{bibref|3GPP-TS.36.133}}. Corresponds to parameter a5-Threshold2:threshold-RSRQ specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.A5Threshold2RSRQ"; + } + leaf-list hysteresis { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a hysteresis value applied to entry and leave condition of a report triggering event, with a numeric range between 0 and 30 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter hysteresis specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.Hysteresis"; + } + leaf-list time-to-trigger { + type uint16 { + range "0 | 40 | 64 | 80 | 100 | 128 | 160 | 256 | 320 | 480 | 512 | 640 | 1024 | 1280 | 2560 | 5120"; + } + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a time period during which measurement report triggering condition needs to be met in order to trigger a measurement report, specified in milliseconds. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter timeToTrigger specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.TimeToTrigger"; + } + leaf trigger-quantity { + type enumeration { + enum "rsrp" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.TriggerQuantity - RSRP"; + } + enum "rsrq" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.TriggerQuantity - RSRQ"; + } + } + config false; + description + "Quantities used to evaluate a measurement report triggering condition. Corresponds to parameter triggerQuantity specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.TriggerQuantity"; + } + leaf report-quantity { + type enumeration { + enum "same-as-trigger-quantity" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.ReportQuantity - SameAsTriggerQuantity"; + } + enum "both" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.ReportQuantity - Both"; + } + } + config false; + description + "Measrument quantities to be included in the measurement report. Corresponds to parameter reportQuantity specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. The value {{enum|Both}} specifies that both the RSRP and RSRQ quantities are to be included in the measurement report."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.ReportQuantity"; + } + leaf max-report-cells { + type uint8 { + range "1..8"; + } + description + "Maximum number of cells that can be included in a measurement report. Corresponds to parameter maxReportCells specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.MaxReportCells"; + } + leaf report-interval { + type uint32 { + range "120 | 240 | 480 | 640 | 1024 | 2048 | 5120 | 10240 | 60000 | 360000 | 720000 | 1800000 | 3600000"; + } + units "milliseconds"; + config false; + description + "Interval between successive measurement reports, specified in {{units}}. Corresponds to parameter reportInterval specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.ReportInterval"; + } + leaf report-amount { + type uint8 { + range "0..2 | 4 | 8 | 16 | 32 | 64"; + } + config false; + description + "Number of times a measurement report is sent. Corresponds to parameter reportAmount specified in ReportConfigEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. Value of 0 indicates \"infinity.\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA.ReportAmount"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.EUTRA."; + } + + grouping lte-ran-mobility-conn-mode-irat-g { + description + "This object contains parameters relating to the connected mode mobility (handover) configuration that is common to all inter-RAT handover scenarios (UTRA (UMTS), GERAN (GSM) and CDMA2000) (see {{bibref|3GPP-TS.32.592|Section 6.1.5.2.2}})."; + leaf-list qoffsett-utra { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a UTRA-specific offset to be applied when evaluating triggering conditions for measurement reporting in connected mode, with a numeric range between -15 and 15 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter offsetFreq included in the IE MeasObjectUTRA specified in {{bibref|3GPP-TS.36.331}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.QoffsettUTRA"; + } + leaf-list filter-coefficient-utra { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a filtering coefficient used for UTRA measurements, with a numeric range between 0 and 19 inclusive. For values greater than 9, only odd values are valid. If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to filterCoefficient parameter specified in QuantityConfigUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.FilterCoefficientUTRA"; + } + leaf meas-quantity-utrafdd { + type enumeration { + enum "cpich-rscp" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.MeasQuantityUTRAFDD - CPICH-RSCP"; + } + enum "cpich-ec-n0" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.MeasQuantityUTRAFDD - CPICH-EcN0"; + } + } + config false; + description + "Measurement quantity used for UTRA measurements. Corresponds to measQuantityUTRA-FDD parameter specified in QuantityConfigUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.MeasQuantityUTRAFDD"; + } + leaf b1-threshold-utrarscp { + type int64; + units "dBm"; + config false; + description + "RSCP threshold to be used in UTRA measurement report triggering condition for event B1. Mapping to actual {{units}} values is specified in 3GPP TS 25.133}}. Corresponds to parameter b1-ThresholdUTRA:utra-RSCP specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.B1ThresholdUTRARSCP"; + } + leaf b1-threshold-utra-ec-n0 { + type uint8 { + range "0..49"; + } + units "dBm"; + config false; + description + "EcNo threshold to be used in UTRA measurement report triggering condition for event B1. Mapping to actual {{units}} values is specified in 3GPP TS 25.133}}. Corresponds to parameter b1-ThresholdUTRA:utra-EcNo specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.B1ThresholdUTRAEcN0"; + } + leaf-list qoffset-geran { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a GERAN-specific offset to be applied when evaluating triggering conditions for measurement reporting in connected mode, with a numeric range between -15 and 15 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter offsetFreq included in the IE MeasObjectGERAN specified in {{bibref|3GPP-TS.36.331}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.QoffsetGERAN"; + } + leaf-list filter-coefficient-geran { + type string; + config false; + min-elements 1; + max-elements "64"; + description + "{{list}} Each item is a filtering coefficient used for GERAN measurements, with a numeric range between 0 and 19 inclusive. For values greater than 9, only odd values are valid. If the value is other than these, the CPE MUST reject the value. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to filterCoefficient parameter specified in QuantityConfigGERAN IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.FilterCoefficientGERAN"; + } + leaf b1-threshold-geran { + type uint8 { + range "0..63"; + } + units "dBm"; + config false; + description + "Threshold to be used in GERAN measurement report triggering condition for event B1. Mapping to actual {{units}} values is specified in 3GPP TS 45.008}}. Corresponds to parameter b1-ThresholdGERAN specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.B1ThresholdGERAN"; + } + leaf-list qoffset-cdma2000 { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a CDMA2000-specific offset to be applied when evaluating triggering conditions for measurement reporting in connected mode, with a numeric range between -15 and 15 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter offsetFreq included in the IE MeasObjectCDMA2000 specified in {{bibref|3GPP-TS.36.331}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.QoffsetCDMA2000"; + } + leaf meas-quantity-cdma2000 { + type enumeration { + enum "pilot-strength" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.MeasQuantityCDMA2000 - PilotStrength"; + } + enum "pilot-pn-phase-and-pilot-strength" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.MeasQuantityCDMA2000 - PilotPnPhaseAndPilotStrength"; + } + } + config false; + description + "Measurement quantity used for CDMA2000 measurements. Corresponds to measQuantityCDMA2000 parameter specified in QuantityConfigCDMA2000 IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.MeasQuantityCDMA2000"; + } + leaf b1-threshold-cdma2000 { + type uint8 { + range "0..63"; + } + units "dBm"; + config false; + description + "Threshold to be used in CDMA2000 measurement report triggering condition for event B1. Mapping to actual {{units}} values is specified in {{bibref|3GPP-TS.45.008}}. Corresponds to parameter b1-ThresholdCDMA2000 specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.B1ThresholdCDMA2000"; + } + leaf b2-threshold2-utrarscp { + type int64; + units "dBm"; + config false; + description + "RSCP threshold to be used in UTRA measurement report triggering condition for event B2. Mapping to actual {{units}} values is specified in {{bibref|3GPP-TS.25.133}}. Corresponds to parameter b2-Threshold2UTRA:utra-RSCP specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.B2Threshold2UTRARSCP"; + } + leaf b2-threshold2-utra-ec-n0 { + type uint8 { + range "0..49"; + } + units "dBm"; + config false; + description + "EcNo threshold to be used in UTRA measurement report triggering condition for event B2. Mapping to actual {{units}} values is specified in 3GPP TS 25.133}}. Corresponds to parameter b2-Threshold2UTRA:utra-EcNo specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.B2Threshold2UTRAEcN0"; + } + leaf b2-threshold2-geran { + type uint8 { + range "0..63"; + } + units "dBm"; + config false; + description + "Threshold to be used in GERAN measurement report triggering condition for event B2. Mapping to actual {{units}} values is specified in 3GPP TS 45.008}}. Corresponds to parameter b2-Threshold2GERAN specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.B2Threshold2GERAN"; + } + leaf b2-threshold2-cdma2000 { + type uint8 { + range "0..63"; + } + units "dBm"; + config false; + description + "Threshold to be used in CDMA2000 measurement report triggering condition for event B2. Mapping to actual {{units}} values is specified in 3GPP TS 45.008}}. Corresponds to parameter b2-Threshold2CDMA2000 specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.B2Threshold2CDMA2000"; + } + leaf-list hysteresis { + type string; + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a hysteresis value applied to entry and leave condition of an IRAT report triggering event, with a numeric range between 0 and 30 inclusive. In case there is more than one item in the list, the first item contains the most preferred value. Corresponds to parameter hysteresis specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. The multiplicity of the {{param}} values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. If this notation is used, then the list contains at least 2 items: \"<preferred-value>,<lower-bound>..<upper-bound>\". If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.Hysteresis"; + } + leaf-list time-to-trigger { + type uint16 { + range "0 | 40 | 64 | 80 | 100 | 128 | 160 | 256 | 320 | 480 | 512 | 640 | 1024 | 1280 | 2560 | 5120"; + } + config false; + min-elements 1; + max-elements "128"; + description + "{{list}} Each item is a time period during which IRAT measurement report triggering condition needs to be met in order to trigger IRAT measurement report, specified in milliseconds. In case there is more than one item in the list, the first item contains the most preferred value.. Corresponds to parameter timeToTrigger specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. If supports self-configuration capability for {{param}} and more than one item is configured, then is expected to select one from the list and overwrite this parameter containing only the one selected. If does not support self-configuration capability for {{param}} and more than one item is configured, then accepts the first value and ignore the rest. If only one item is configured regardless of the self-configuration capability of , accepts the value as an explicit configuration by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.TimeToTrigger"; + } + leaf max-report-cells { + type uint8 { + range "1..8"; + } + description + "Maximum number of IRAT cells that can be included in a measurement report. Corresponds to parameter maxReportCells specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.MaxReportCells"; + } + leaf report-interval { + type uint32 { + range "120 | 240 | 480 | 640 | 1024 | 2048 | 5120 | 10240 | 60000 | 360000 | 720000 | 1800000 | 3600000"; + } + units "milliseconds"; + config false; + description + "Interval between successive IRAT measurement reports, specified in {{units}}. Corresponds to parameter reportInterval specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.ReportInterval"; + } + leaf report-amount { + type uint8 { + range "0..2 | 4 | 8 | 16 | 32 | 64"; + } + config false; + description + "Number of times an IRAT measurement report is sent. Corresponds to parameter reportAmount specified in ReportConfigInterRAT IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. Value of 0 indicates \"infinity.\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT.ReportAmount"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.Mobility.ConnMode.IRAT."; + } + + grouping lte-ran-neighbor-list-g { + description + "This object contains parameters relating to the neighbor list."; + leaf max-lte-cell-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.MaxLTECellEntries"; + } + leaf lte-cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECellNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList."; + } + + grouping lte-ran-neighbor-list-lte-cell-g { + description + "Table containing the E-UTRA (i.e. intra-RAT) cell list provided by the ACS. The table contents MAY be added/deleted/modified during operation, in which case these changes shall be reflected in the broadcast information as soon as possible."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.Alias"; + } + leaf must-include { + type boolean; + config false; + description + "Indicates whether this instance of the neighbor shall be included or excluded in the FAP's NL configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.MustInclude"; + } + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.PLMNID"; + } + leaf cid { + type uint32 { + range "0..268435455"; + } + description + "Cell Identity. {{bibref|3GPP-TS.36.331|Section 6.3.4}}. Combination of {{param|PLMNID}} and {{param}} constitutes the Cell Global ID (CGI)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.CID"; + } + leaf eutra-carrier-arfcn { + type uint16 { + range "0..65535"; + } + config false; + description + "Indicates the ARFCN of this carrier frequency. Corresponds to parameter dl-CarrierFreq in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}, and and parameter NDL in {{bibref|3GPP-TS.36.101|Section 5.7.3}}. If the value of {{param}} is the same with the one currently being used by the, then it implies that this neighbor cell is an intra-frequency cell; otherwise, it is an inter-frequency cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.EUTRACarrierARFCN"; + } + leaf phy-cell-id { + type uint16 { + range "0..503"; + } + config false; + description + "Physical cell ID, as specified in {{bibref|3GPP-TS.36.211|Section 6.11}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.PhyCellID"; + } + leaf q-offset { + type int64; + config false; + description + "Indicate a cell-specific offset applicable to a specific neighbouring cell. It is used for evaluating the cell as a candidate for cell re-selection in idle mode. Corresponds to parameter q-OffsetCell broadcast in SIB4 for intra-frequency cells and in SIB5 for inter-frequency cells, specified in {{bibref|3GPP-TS.36.331|Section 6.3.1}}. For the value less than or equal to -8, and bigger than or equal to 8, only even numbers are valid. If the value is other than these, the CPE MUST reject the value."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.QOffset"; + } + leaf cio { + type int64; + config false; + description + "Cell individual offset applicable to a specific neighbouring cell. It is used for evaluating triggering conditions for measurement reporting in connected mode. Specified by cellIndividualOffset in MeasObjectEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}. For the value less than or equal to -8, and bigger than or equal to 8, only even numbers are valid. If the value is other than these, the CPE MUST reject the value."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.CIO"; + } + leaf rs-tx-power { + type int64; + units "dBm"; + config false; + description + "The downlink reference-signal transmit power, specified in {{units}}. Defined as the linear average over the power contributions (in W) of all resource elements that carry cell-specific reference signals within the operating system bandwidth. Corresponds to parameter referenceSignalPower in SIB4 as a part of PDSCH-Config IE in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.RSTxPower"; + } + leaf blacklisted { + type boolean; + config false; + description + "Indicates whether this neighbor cell is allowed for UEs as handover target or not. If {{true}}, handover is prohibited towards this cell. If {{false}}, handover is allowed toward this cell. The {{param}} parameter allows this cell to be prohibited as a handover target, while still allowing this cell to be included in the BCCH SIB4 or 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}.Blacklisted"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.LTECell.{i}."; + } + + grouping lte-ran-neighbor-list-inter-rat-cell-g { + description + "The inter-RAT cell lists separated by technology. {{bibref|3GPP-TS.36.331|Section 6.3.1 (SIB6, 7, 8)}}."; + leaf max-umts-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.}} table. There can be maximum of 16 UTRAN (UMTS) neighbor cells, as specified by carrierFreqListUTRA-FDD in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.MaxUMTSEntries"; + } + leaf max-gsm-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.}} table. There can be maximum of 16 GERAN (GSM) neighbor cells, as specified by carrierFreqsInfoList in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.MaxGSMEntries"; + } + leaf max-cdma2000-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.}} table. There can be maximum of 32 bandclasses. In each bandclass, there can be maximum of 16 CDMA2000 carrier frequencies. In each carrier, there can be maximum of 16 CDMA2000 neighbor cells (PN offset). It is specified by neighCellList in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.MaxCDMA2000Entries"; + } + leaf umts-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTSNumberOfEntries"; + } + leaf gsm-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSMNumberOfEntries"; + } + leaf cdma2000-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000NumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell."; + } + + grouping lte-ran-neighbor-list-inter-rat-cell-umts-g { + description + "Table containing the inter-RAT cell list for UTRA (UMTS) provided by the ACS. The table contents MAY be added/deleted/modified during operation, in which case these changes shall be reflected in the broadcast information as soon as possible."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.Alias"; + } + leaf must-include { + type boolean; + config false; + description + "Indicates whether this instance of the neighbor shall be included or excluded in the FAP's NL configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.MustInclude"; + } + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.PLMNID"; + } + leaf rncid { + type uint16 { + range "0..65535"; + } + config false; + description + "RNC-ID of an intra-RAT UMTS neighbor cell. It uniquely identifies an RNC within a PLMN. Normally, RNC-ID consists of 12 bits (i.e. a range of [0:4095]). However, if the value is larger than 4095, then Extended RNC-ID (range of [4096:65535]) is used in RANAP. The RNC-ID and Extended RNC-ID are combined into a single parameter here as there is no explicit need to have them separated. {{bibref|3GPP-TS.25.413|Section 9.2.1.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.RNCID"; + } + leaf cid { + type uint16 { + range "0..65535"; + } + description + "Cell Identifier (C-id) that identifies a cell within an RNS. This Cell Identifier together with the controlling RNC (RNC-ID) constitutes the UTRAN Cell ID (UC-ID) and is used to identify a cell uniquely within UTRAN. C-ID is either 12-bit or 16-bit value. {{bibref|3GPP-TS.25.401|Section 6.1.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.CID"; + } + leaf lac { + type uint16 { + range "1..65533 | 65535"; + } + config false; + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.LAC"; + } + leaf rac { + type uint8 { + range "0..255"; + } + config false; + description + "Routing Area Code (RAC). The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the Routing Area ID (RAI). {{bibref|3GPP-TS.23.003|Section 4.2}} {{bibref|3GPP-TS.25.413|Section 9.2.3.7}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.RAC"; + } + leaf ura { + type uint16 { + range "0..65535"; + } + config false; + description + "UTRAN Registration Area (URA) {{bibref|3GPP-TS.23.401}}. Indicates to the UE which {{param}} it shall use in case of overlapping URAs. {{bibref|3GPP-TS.25.331|Section 10.3.2.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.URA"; + } + leaf uarfcnul { + type uint16 { + range "0..16383"; + } + config false; + description + "The UL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.UARFCNUL"; + } + leaf uarfcndl { + type uint16 { + range "0..16383"; + } + config false; + description + "The DL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.UARFCNDL"; + } + leaf pcpich-scrambling-code { + type uint16 { + range "0..511"; + } + config false; + description + "Primary CPICH scrambling code."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.PCPICHScramblingCode"; + } + leaf pcpich-tx-power { + type int64; + units "dBm"; + config false; + description + "Primary CPICH Tx power in {{units}}. Actual values of the power are -10.0 {{units}} to 50.0 {{units}} in steps of 0.1 dB. The value of {{param}} divided by 10 yields the actual value of the power. {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.433|Section 2.2.33}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}.PCPICHTxPower"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.UMTS.{i}."; + } + + grouping lte-ran-neighbor-list-inter-rat-cell-gsm-g { + description + "Table containing the inter-RAT cell list for GERAN (GSM) provided by the ACS. The table contents MAY be added/deleted/modified during operation, in which case these changes shall be reflected in the broadcast information as soon as possible."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.Alias"; + } + leaf must-include { + type boolean; + config false; + description + "Indicates whether this instance of the neighbor shall be included or excluded in the FAP's NL configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.MustInclude"; + } + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.PLMNID"; + } + leaf lac { + type uint16 { + range "0..65535"; + } + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.LAC"; + } + leaf bsic { + type uint8 { + range "0..255"; + } + config false; + description + "BSIC of the cell per {{bibref|3GPP-TS.23.003}}, consisting of: :Bit 7:6 - not used (\"00\") :Bit 5:3 - NCC (PLMN Color Code) :Bit 2:0 - BCC (BS color code) For example, if NCC is 7 and BCC is 2 you would have 00111010 (binary) or 0x3A (hex), and the value of this parameter would be 58."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.BSIC"; + } + leaf ci { + type uint16 { + range "0..65535"; + } + description + "Cell ID of the cell per {{bibref|3GPP-TS.23.003|Section 4.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.CI"; + } + leaf band-indicator { + type enumeration { + enum "gsm850" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator - GSM850"; + } + enum "gsm900" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator - GSM900"; + } + enum "dcs1800" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator - DCS1800"; + } + enum "pcs1900" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator - PCS1900"; + } + } + config false; + description + "Indicates how to interpret the BCCH ARFCN. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.BandIndicator"; + } + leaf bccharfcn { + type uint16 { + range "0..1023"; + } + config false; + description + "ARFCN of this cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}.BCCHARFCN"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.GSM.{i}."; + } + + grouping lte-ran-neighbor-list-inter-rat-cell-cdma2000-g { + description + "Table containing the inter-RAT cell list for CDMA2000 provided by the ACS. The table contents MAY be added/deleted/modified during operation, in which case these changes shall be reflected in the broadcast information as soon as possible."; + leaf enable { + type boolean; + config false; + description + "Enables or disables this entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.Alias"; + } + leaf must-include { + type boolean; + config false; + description + "Indicates whether this instance of the neighbor shall be included or excluded in the FAP's NL configuration."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.MustInclude"; + } + leaf band-class { + type uint8 { + range "0..17"; + } + config false; + description + "Defines the CDMA2000 band in which the CDMA2000 frequency carrier can be found, specified in bandclass number. BandClass is defined in {{bibref|3GPP2-C.S0057-B}} Table 1.5-1. Corresponds to parameter bandClass specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.BandClass"; + } + leaf arfcn { + type uint16 { + range "0..2047"; + } + config false; + description + "Defines the CDMA2000 frequency carrier within a CDMA2000 band, as specified by ARFCN-ValueCDMA2000 in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}, and {{bibref|3GPP2-C.S0002-A}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.ARFCN"; + } + leaf pn-offset { + type uint16 { + range "0..511"; + } + config false; + description + "Defines the PN offset that represents the \"Physical cell identity\" in CDMA2000 system, as specified by PhysCellIdCDMA2000 in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.PNOffset"; + } + leaf type { + type enumeration { + enum "1x-rtt" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.Type - 1xRTT"; + } + enum "hrpd" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.Type - HRPD"; + } + } + config false; + description + "Indicates the type of the cell. This parameter determines the length of the CID parameter."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.Type"; + } + leaf cid { + type string { + length "0..16"; + } + description + "Defines the global cell identity of the cell. For a 1xRTT cell, the cell identity is a binary string 47 bits long. For a HRPD cell, the cell identity is a binary string 128 bits long. The value of {{param}} parameter is interpreted as 128-bit long unsigned integer. If {{param|Type}} is {{enum|1xRTT|Type}}, the first 47 bits (6 octet) is used and the rest of this {{param}} parameter MUST be ignored by the CPE. If {{param|Type}} is {{enum|HRPD|Type}}, the entire 16 octet is used as {{param}}. Corresponds to IE CellGlobalIdCDMA2000 specified in {{bibref|3GPP-TS.36.331|Section 6.3.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}.CID"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborList.InterRATCell.CDMA2000.{i}."; + } + + grouping lte-ran-neighbor-list-in-use-g { + description + "This object contains parameters relating to the neighbor list used by the FAP based on its self-configuration capability and {{object|.CellConfig.LTE.RAN.NeighborList.}} configuration of adding and excluding cells."; + leaf max-lte-cell-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.MaxLTECellEntries"; + } + leaf lte-cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECellNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse."; + } + + grouping lte-ran-neighbor-list-in-use-lte-cell-g { + description + "Table containing the LTE EUTRA (i.e. intra-RAT) cell list."; + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.PLMNID"; + } + leaf cid { + type uint32 { + range "0..268435455"; + } + description + "Cell Identity. {{bibref|3GPP-TS.36.331|Section 6.3.4}}. Combination of {{param|PLMNID}} and {{param}} constitutes the Cell Global ID (CGI)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.CID"; + } + leaf eutra-carrier-arfcn { + type uint16 { + range "0..65535"; + } + description + "Indicates the ARFCN of this carrier frequency. Corresponds to parameter dl-CarrierFreq in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}, and and parameter NDL in {{bibref|3GPP-TS.36.101|Section 5.7.3}}. If the value of {{param}} is the same with the one currently being used by the, then it implies that this neighbor cell is an intra-frequency cell; otherwise, it is an inter-frequency cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.EUTRACarrierARFCN"; + } + leaf phy-cell-id { + type uint16 { + range "0..503"; + } + description + "Physical cell ID, as specified in {{bibref|3GPP-TS.36.211|Section 6.11}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.PhyCellID"; + } + leaf q-offset { + type int64; + description + "Indicate a cell-specific offset applicable to a specific neighbouring cell. It is used for evaluating the cell as a candidate for cell re-selection in idle mode. Corresponds to parameter q-OffsetCell broadcast in SIB4 for intra-frequency cells and in SIB5 for inter-frequency cells, specified in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.QOffset"; + } + leaf cio { + type int64; + description + "Cell individual offset applicable to a specific neighbouring cell. It is used for evaluating triggering conditions for measurement reporting in connected mode. Specified by cellIndividualOffset in MeasObjectEUTRA IE in {{bibref|3GPP-TS.36.331|Section 6.3.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.CIO"; + } + leaf rs-tx-power { + type int64; + units "dBm"; + description + "The downlink reference-signal transmit power, specified in {{units}}. Defined as the linear average over the power contributions (in W) of all resource elements that carry cell-specific reference signals within the operating system bandwidth. Corresponds to parameter referenceSignalPower in SIB4 as a part of PDSCH-Config IE in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.RSTxPower"; + } + leaf blacklisted { + type boolean; + description + "Indicates whether this neighbor cell is allowed for UEs as handover target or not. If {{true}}, handover is prohibited towards this cell. If {{false}}, handover is allowed toward this cell. The {{param}} parameter allows this cell to be prohibited as a handover target, while still allowing this cell to be included in the BCCH SIB4 or 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}.Blacklisted"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.LTECell.{i}."; + } + + grouping lte-ran-neighbor-list-in-use-inter-rat-cell-g { + description + "Table containing the inter-RAT cell lists separated by technology. {{bibref|3GPP-TS.36.331|Section 6.3.1 (SIB6, 7, 8)}}."; + leaf max-umts-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.}} table. There can be maximum of 16 UTRAN (UMTS) neighbor cells, as specified by carrierFreqListUTRA-FDD in SIB6 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.MaxUMTSEntries"; + } + leaf max-gsm-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.}} table. There can be maximum of 16 GERAN (GSM) neighbor cells, as specified by carrierFreqsInfoList in SIB7 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.MaxGSMEntries"; + } + leaf max-cdma2000-entries { + type uint64; + description + "The maximum number of entries in the {{object|.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}.}} table. There can be maximum of 32 banclasses. In each bandclass, there can be maximum of 16 CDMA2000 carrier frequencies. In each carrier, there can be maximum of 16 CDMA2000 neighbor cells (PN offset). It is specified by neighCellList in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.MaxCDMA2000Entries"; + } + leaf umts-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTSNumberOfEntries"; + } + leaf gsm-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSMNumberOfEntries"; + } + leaf cdma2000-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000NumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell."; + } + + grouping lte-ran-neighbor-list-in-use-inter-rat-cell-umts-g { + description + "Table containing the inter-RAT cell list for UTRA (UMTS) cell."; + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.PLMNID"; + } + leaf rncid { + type uint16 { + range "0..65535"; + } + description + "RNC-ID of an intra-RAT UMTS neighbor cell. It uniquely identifies an RNC within a PLMN. Normally, RNC-ID consists of 12 bits (i.e. a range of [0:4095]). However, if the value is larger than 4095, then Extended RNC-ID (range of [4096:65535]) is used in RANAP. The RNC-ID and Extended RNC-ID are combined into a single parameter here as there is no explicit need to have them separated. {{bibref|3GPP-TS.25.413|Section 9.2.1.39}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.RNCID"; + } + leaf cid { + type uint16 { + range "0..65535"; + } + description + "Cell Identifier (C-id) that identifies a cell within an RNS. This Cell Identifier together with the controlling RNC (RNC-ID) constitutes the UTRAN Cell ID (UC-ID) and is used to identify a cell uniquely within UTRAN. C-ID is either 12-bit or 16-bit value. {{bibref|3GPP-TS.25.401|Section 6.1.5}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.CID"; + } + leaf lac { + type uint16 { + range "1..65533 | 65535"; + } + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.LAC"; + } + leaf rac { + type uint8 { + range "0..255"; + } + description + "Routing Area Code (RAC). The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the Routing Area ID (RAI). {{bibref|3GPP-TS.23.003|Section 4.2}} {{bibref|3GPP-TS.25.413|Section 9.2.3.7}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.RAC"; + } + leaf ura { + type uint16 { + range "0..65535"; + } + description + "UTRAN Registration Area (URA) {{bibref|3GPP-TS.23.401}}. Indicates to the UE which {{param}} it shall use in case of overlapping URAs. {{bibref|3GPP-TS.25.331|Section 10.3.2.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.URA"; + } + leaf uarfcnul { + type uint16 { + range "0..16383"; + } + description + "The UL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.UARFCNUL"; + } + leaf uarfcndl { + type uint16 { + range "0..16383"; + } + description + "The DL UTRA Absolute Radio Frequency Channel Number (UARFCN) in an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.UARFCNDL"; + } + leaf pcpich-scrambling-code { + type uint16 { + range "0..511"; + } + description + "Primary CPICH scrambling code."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.PCPICHScramblingCode"; + } + leaf pcpich-tx-power { + type int64; + units "dBm"; + description + "Primary CPICH Tx power in {{units}}. Actual values of the power are -10.0 {{units}} to 50.0 {{units}} in steps of 0.1 dB. The value of {{param}} divided by 10 yields the actual value of the power. {{bibref|3GPP-TS.32.642|Section 6.3.11}} {{bibref|3GPP-TS.25.433|Section 2.2.33}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}.PCPICHTxPower"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.UMTS.{i}."; + } + + grouping lte-ran-neighbor-list-in-use-inter-rat-cell-gsm-g { + description + "Table containing the inter-RAT cell list for GERAN (GSM) cell."; + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.PLMNID"; + } + leaf lac { + type uint16 { + range "0..65535"; + } + description + "Location Area Code (LAC). The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the Location Area ID (LAI). {{bibref|3GPP-TS.23.003|Section 4.1}} {{bibref|3GPP-TS.25.413|Section 9.2.3.6}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.LAC"; + } + leaf bsic { + type uint8 { + range "0..255"; + } + description + "BSIC of the cell per {{bibref|3GPP-TS.23.003}}, consisting of: :Bit 7:6 - not used (\"00\") :Bit 5:3 - NCC (PLMN Color Code) :Bit 2:0 - BCC (BS color code) For example, if NCC is 7 and BCC is 2 you would have 00111010 (binary) or 0x3A (hex), and the value of this parameter would be 58."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BSIC"; + } + leaf ci { + type uint16 { + range "0..65535"; + } + description + "Cell ID of the cell per {{bibref|3GPP-TS.23.003|Section 4.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.CI"; + } + leaf band-indicator { + type enumeration { + enum "gsm850" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator - GSM850"; + } + enum "gsm900" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator - GSM900"; + } + enum "dcs1800" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator - DCS1800"; + } + enum "pcs1900" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator - PCS1900"; + } + } + description + "Indicates how to interpret the BCCH ARFCN. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BandIndicator"; + } + leaf bccharfcn { + type uint16 { + range "0..1023"; + } + description + "ARFCN of this cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}.BCCHARFCN"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.GSM.{i}."; + } + + grouping lte-ran-neighbor-list-in-use-inter-rat-cell-cdma2000-g { + description + "Table containing the inter-RAT cell list for CDMA2000 cell."; + leaf band-class { + type uint8 { + range "0..17"; + } + description + "Defines the CDMA2000 band in which the CDMA2000 frequency carrier can be found, specified in bandclass number. BandClass is defined in {{bibref|3GPP2-C.S0057-B|Table 1.5-1}}. Corresponds to parameter bandClass specified in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}.BandClass"; + } + leaf arfcn { + type uint16 { + range "0..2047"; + } + description + "Defines the CDMA2000 frequency carrier within a CDMA2000 band, as specified by ARFCN-ValueCDMA2000 in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}, and {{bibref|3GPP2-C.S0002-A}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}.ARFCN"; + } + leaf pn-offset { + type uint16 { + range "0..511"; + } + description + "Defines the PN offset that represents the \"Physical cell identity\" in CDMA2000 system, as specified by PhysCellIdCDMA2000 in SIB8 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}.PNOffset"; + } + leaf type { + type enumeration { + enum "1x-rtt" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}.Type - 1xRTT"; + } + enum "hrpd" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}.Type - HRPD"; + } + } + description + "Indicates the type of the cell. This parameter determines the length of the CID parameter."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}.Type"; + } + leaf cid { + type string { + length "0..16"; + } + description + "Defines the global cell identity of the cell. For a 1xRTT cell, the cell identity is a binary string 47 bits long. For a HRPD cell, the cell identity is a binary string 128 bits long. The value of {{param}} parameter is interpreted as 128-bit long unsigned integer. If {{param|Type}} is {{enum|1xRTT|Type}}, the first 47 bits (6 octet) is used and the rest of this {{param}} parameter MUST be ignored by the CPE. If {{param|Type}} is {{enum|HRPD|Type}}, the entire 16 octet is used as {{param}}. Corresponds to IE CellGlobalIdCDMA2000 specified in {{bibref|3GPP-TS.36.331|Section 6.3.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}.CID"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.LTE.RAN.NeighborListInUse.InterRATCell.CDMA2000.{i}."; + } + + grouping cdma2000-g { + description + "This object contains parameters relating to configuring the CDMA2000 FAP."; + leaf tunnel-instance { + type string { + length "0..256"; + } + config false; + description + "This is the reference to the IPsec tunnel instance used by the CDMA2000 FAP. For all root data models, which use the tunnel definition provided in {{bibref|TR-262}} (InternetGatewayDevice:1 {{bibref|TR-098}} and Device:1 {{bibref|TR-181i1}}) the {{param}} MUST point to a row in the 'FAP.Tunnel.IKESA.{i}.' table, defined in {{bibref|TR-262}}. If the root data model used is Device:2 {{bibref|TR-181i2}} than the {{param}} MUST point to IPsec tunnel instance defined in {{bibref|TR-181i2}}. If the referenced object is deleted, the parameter value MUST be set to an empty string. In case of a multiple-radio-technology FAP product, each radio technology can have its own tunnels or share common tunnels. In the former case, {{param}} can contain a unique instance number. In the latter case, {{param}} under all radio technologies can have the same instance number."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.TunnelInstance"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000."; + } + + grouping cdma2000-one-x-g { + description + "This object contains parameters relating to configuring the CDMA2000 1x FAP."; + leaf pcfpdsn-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSNNumberOfEntries"; + } + leaf max-batch-pcfpdsn-entries { + type uint64; + description + "Maximum number of entries in the {{object|.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.MaxBatchPCFPDSNEntries"; + } + leaf batch-pcfpdsn-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSNNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX."; + } + + grouping cdma2000-one-x-ran-g { + description + "This object contains parameters relating to RAN configuring the CDMA2000 1x FAP."; + leaf one-x-sector-nid { + type int64; + config false; + description + "SID for 1x. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.OneXSectorNID"; + } + leaf one-x-sector-sid { + type int64; + config false; + description + "NID for 1x . See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.OneXSectorSID"; + } + leaf one-xpzid { + type int64; + config false; + description + "packet Zone ID for 1x packet calls"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.OneXPZID"; + } + leaf base-id { + type int64; + config false; + description + "Base station ID (needed in SPM). This is also the CellID. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.BaseID"; + } + leaf max-neighbor-list-entries { + type uint64; + description + "Maximum number of entries avaiable in {{object|.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.MaxNeighborListEntries"; + } + leaf neighbor-list-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborListNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN."; + } + + grouping cdma2000-one-x-ran-rf-g { + description + "This object contains parameters relating to RF configuration of the FAP."; + leaf-list rfcnfl { + type string { + length "0..256"; + } + config false; + min-elements 1; + description + "{{list}} Each item is a pair of 2-digit Band class number (as defined in {{bibref|3GPP2-C.S0057}}) followed by 4-digit FL Radio Frequency Channel Number (RFCN). Self-configuration for RFCN is controlled by {{param|.FAPControl.CDMA2000.OneX.SelfConfig.RFCNFLSelfConfigEnable}}. If the FAP's self-configuration capability for RFCN is available and enabled, this parameter MAY contain more than one item and the FAP is expected to select one from the list for RFCNFLInUse. If the self-configuration capability is not available or not enabled, then this parameter SHOULD contain only a single item. An example value is \"010001, 030500\". If multiple items are specified, they are done in the order of preference."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.RFCNFL"; + } + leaf rfcnfl-band-in-use { + type string { + length "0..16"; + } + description + "The FL Band being used by the FAP. Self-configuration for Band and RFCN is controlled by {{param|.Capabilities.CDMA2000.OneX.SelfConfig.RFCNFLConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.OneX.SelfConfig.RFCNFLSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in RFCNFL. If the self-configuration capability is not available or not enabled, then this parameter contains the first band class value in RFCNFL."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.RFCNFLBandInUse"; + } + leaf rfcnfl-in-use { + type uint64; + description + "The FL RFCN being used by the FAP. Self-configuration for RFCN is controlled by {{param|.Capabilities.CDMA2000.OneX.SelfConfig.RFCNFLConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.OneX.SelfConfig.RFCNFLSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in RFCNFL. If the self-configuration capability is not available or not enabled, then this parameter contains the first RFCN value in RFCNFL."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.RFCNFLInUse"; + } + leaf-list pilot-pn { + type string { + length "0..256"; + } + config false; + description + "{{list}} Each item is a pilot PN offset in units of 64 PN chips. Self-configuration for pilot PN is controlled by {{param|.Capabilities.CDMA2000.OneX.SelfConfig.PilotPNConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.OneX.SelfConfig.PilotPNSelfConfigEnable}} from an enabled perspective. If the FAP's self-configuration capability for Pilot PN Offset is available and enabled, this parameter MAY contain more than one item and the FAP is expected to select one from the list for PilotPNInUse. If the self-configuration capability is not available or not enabled, then this parameter SHOULD contain only a single item. The multiplicity of the PN offset values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. The order of the items has no significance."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.PilotPN"; + } + leaf pilot-pn-in-use { + type uint16 { + range "0..511"; + } + units "64 PN chips"; + description + "The Pilot PN Offset being used by the FAP in {{units}}. Self-configuration for Pilot PN Offset is controlled by {{param|.Capabilities.CDMA2000.OneX.SelfConfig.PilotPNConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.OneX.SelfConfig.PilotPNSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in PilotPN. If the self-configuration capability is not available or not enabled, then this parameter contains the first value in PilotPN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.PilotPNInUse"; + } + leaf maxfap-tx-power { + type string { + length "0..64"; + } + config false; + description + "Defines the maximum transmission power allowed on the FAP. MaxFAPTxPower is expressed as a range of allowed maximum power levels with \"..\" (two periods) between the upper and lower values, i.e. \"<Pmax_low>;..<Pmax_high>;\". {{param}} identifies the limits between which the FAP can self-configure its maximum transmit power. Self-configuration for maximum transmission power is controlled by {{param|.Capabilities.CDMA2000.OneX.SelfConfig.MaxFAPTxPowerConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.OneX.SelfConfig.MaxFAPTxPowerSelfConfigEnable}} from an enabled perspective. <Pmax_low>; and <Pmax_high>; are measured in dBm and have a range of -40.0 to 20.0 incremented by 0.1 dB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.MaxFAPTxPower"; + } + leaf maxfap-tx-power-in-use { + type int64; + units "0.1 dBm"; + description + "The maximum transmission power measured in {{units}} currently used by the FAP. Actual values of the maximum transmission power are -40.0 dBm to 20.0 dBm in steps of 0.1 dB. The value of {{param}} divided by 10 yields the actual value of the maximum transmission power. Self-configuration for maximum transmission power is controlled by {{param|.Capabilities.CDMA2000.OneX.SelfConfig.MaxFAPTxPowerConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.OneX.SelfConfig.MaxFAPTxPowerSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the range provided in {{param|MaxFAPTxPower}}. If the self-configuration capability is not available or not enabled, then this parameter contains a value selected by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.MaxFAPTxPowerInUse"; + } + leaf pch-pwr-percentage { + type uint32 { + range "1000..1000000"; + } + units "0.001 percent"; + config false; + description + "Percentage of Max Sector Power Used By Paging Channel (expressed in {{units}}). For example, 93333 means 93.333% of the max sector power."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.PchPwrPercentage"; + } + leaf pilot-pwr-percentage { + type uint32 { + range "1000..1000000"; + } + units "0.001 percent"; + config false; + description + "Percentage of Max Sector Power Used By Pilot Channel (expressed in {{units}}). For example, 19950 means 19.95% of total."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.PilotPwrPercentage"; + } + leaf sync-pwr-percentage { + type uint32 { + range "1000..1000000"; + } + units "0.001 percent"; + config false; + description + "Percentage of Max Sector Power Used By Sync Channel (expressed in {{units}}). For example, 23458 means 23.4% of the max sector power."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF.SyncPwrPercentage"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.RF."; + } + + grouping cdma2000-one-x-ran-network-listen-mode-config-g { + description + "This object contains parameters relating to self-configuration of the MaxFAPTxPower of the FAP."; + leaf rfcnfl-margin { + type uint64; + config false; + description + "If self-configuration of RFCNFL is enabled, this value indicates the total received signal strength margin to be applied to the entries in RFCNFL when the FAP decides on the RFCNInUse in order to bias the selection of the most preferred frequency."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig.RFCNFLMargin"; + } + leaf fap-coverage-target { + type string { + length "0..32"; + } + config false; + description + "Defines the target value measured in dB for the range of the FAP's FL coverage, in terms of RF propagation loss. This value can be used by the FAP's selfconfiguration algorithms to help derive transmit power levels in the presence of co-channel and adjacent channel interference. {{param}} is expressed as a range of the minimum coverage path loss and the maximum coverage path loss with \"..\" (two periods) between the minimum and maximum values, i.e., \"<FAPCoverageTarget_min>..<FAPCoverageTarget_max>\". These values can be used by the FAP's selfconfiguration algorithms to help derive transmit power levels in the presence of co-channel and adjacent channel interference. <FAPCoverageTarget_min> and <FAPCoverageTarget_max> are measured in dB and have a range of [50,150] incremented by 1 dB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig.FAPCoverageTarget"; + } + leaf fap-beacon-coverage-target { + type string { + length "0..32"; + } + config false; + description + "Defines the target value measured in dB for the range of the FAP's FL Beacon coverage, in terms of RF propagation loss. This value can be used by the FAP's selfconfiguration algorithms to help derive beacon transmit power levels. {{param}} is expressed as a range of the minimum coverage path loss and the maximum coverage path loss with \"..\" (two periods) between the minimum and maximum values, i.e., \"<BeaconCoverageTarget_min>..<BeaconCoverageTarget_max>\". These values can be used by the FAP's selfconfiguration algorithms to help derive transmit power levels for the beacon(s) in the presence of co-channel and adjacent channel interference.\" <BeaconCoverageTarget_min> and <BeaconCoverageTarget_max> are measured in dB and have a range of [50,150] incremented by 1 dB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig.FAPBeaconCoverageTarget"; + } + leaf max-coverage-edge-pilot-strength { + type int64; + units "0.1 dB"; + config false; + description + "The maximum strength of the received pilot energy per chip, Ec, to total received spectral density, Io (signal and noise) desired for FAP users at the edge of the FAP coverage target in units of {{units}}. This value can be used by the FAP's self configuration algorithms to help prevent aggressive transmit power level settings ."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig.MaxCoverageEdgePilotStrength"; + } + leaf max-allowable-pilot-strength-degradation { + type int64; + units "0.1 dB"; + config false; + description + "The maximum amount in dB by which the strength of the received pilot energy per chip, Ec, to total received spectral density, Io (signal and noise) for alien users can be degraded in the presence of FAP interference at the edge of FAP coverage, in {{units}} units."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig.MaxAllowablePilotStrengthDegradation"; + } + leaf-list rfcnfl-to-protect { + type string { + length "0..256"; + } + config false; + description + "{{list}} Each item is a FL RFCN corresponding to a CDMA2000 carrier that is adjacent to the RFCNFLInUse to be protected from adjacent channel interference. If any of the items in the list are adjacent to the FAP's own FL channel, the FAP MUST take the PilotStrength and total received power spectral density (Io) measured on these channels into account as part of its maximum transmit power selfconfiguration. The RFCNs in the list can belong to any operator, allowing for protection of the FAP operator's own macro layer as well as that of other operators. The list should take into account the ability of the FAP to self-configure its own FL RFCN and so SHOULD include any channels (requiring protection) which can potentially be adjacent to the RFCN selected by the FAP. For example, if only adjacent operator protection is needed and the FAP has the ability to self-configure to any channel owned by its operator, this list would be populated with the RFCNs immediately above and below the range of channels owned by the FAP operator. If an empty string then it indicates that there are no channels adjacent to the FAP that require protection, or that self-configuration of the FAP transmit power is not enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig.RFCNFLToProtect"; + } + leaf fap-allowed-adj-chan-coverage-hole { + type uint8 { + range "30..150"; + } + units "dB"; + config false; + description + "Defines the maximum allowed coverage hole created on carriers listed in RFCNFLToProtect by the FAP transmission, measured in {{units}}, in terms of RF propagation loss such that the {{param|MaxAllowablePilotStrengthDegradation}} is maintained outside the {{param}} for MS on that {{param|RFCNFLToProtect}}. This value can be used by the FAP's self configuration algorithms to help derive transmit power levels."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig.FAPAllowedAdjChanCoverageHole"; + } + leaf acir { + type uint64; + units "dB"; + config false; + description + "AdjacentChannelInterferenceRatio value in {{units}} to be used when determining the coverage hole created on adjacent channels due to leakage."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig.ACIR"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NetworkListenModeConfig."; + } + + grouping cdma2000-one-x-ran-access-parameters-g { + description + "The object used for configuring access parameter messages for 1x. See {{bibref|3GPP2-C.S0005}}."; + leaf nom-pwr { + type int64; + config false; + description + "Nominal power correction factor used by the mobile in open loop power adjustment. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.NomPwr"; + } + leaf init-pwr { + type int64; + config false; + description + "Initial power offset used by the mobile in open loop power adjustment. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.InitPwr"; + } + leaf pwr-step-indb { + type uint8 { + range "0..7"; + } + config false; + description + "Power step increment in successive access probes. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.PwrStepIndb"; + } + leaf nom-pwr-ext { + type uint8 { + range "0..1"; + } + units "dBm"; + config false; + description + "{{param}} should be zero for BC0 and BC1. For other band classes, {{param}} is 1 if Mobile's correction factor is between -24dBm and -9dBm. Otherwise {{param}} is zero. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.NomPwrExt"; + } + leaf apm-auth { + type uint8 { + range "0..1"; + } + config false; + description + "Enabling/disabling global authentication. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.APMAuth"; + } + leaf apm-rand-update-prd { + type uint16 { + range "16..14400"; + } + units "seconds"; + config false; + description + "The period (in {{units}}) that the BSS updates the RAND value sent via APM. Only 2 second multiples accepted."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.APMRandUpdatePrd"; + } + leaf initialpwr { + type uint8 { + range "0..31"; + } + units "dB"; + config false; + description + "Initial power offset for access. The base station shall set this field to the correction factor to be used by mobile stations in the open loop power estimate for the initial transmission on an Access Channel, expressed as a two's complement value in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Initialpwr"; + } + leaf pwr-step { + type uint8 { + range "0..7"; + } + units "dB"; + config false; + description + "Power increment. The base station shall set this field to the value by which mobile stations are to increase their transmit power between successive access probes in an access probe sequence, in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.PwrStep"; + } + leaf num-step { + type uint8 { + range "0..15"; + } + config false; + description + "Number of access probes. The base station shall set this field to one less than the maximum number of access probes mobile stations are to transmit in a single access probe sequence."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.NumStep"; + } + leaf max-cap-size { + type uint8 { + range "0..7"; + } + config false; + description + "Maximum Access Channel message capsule size. The base station shall set this field to the value in the range 0 to 7. {{param}} is set to three less than the maximum number of Access Channel frames in an Access Channel message capsule."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.MaxCapSize"; + } + leaf preamble-size { + type uint8 { + range "0..15"; + } + config false; + description + "Access Channel preamble length. The base station shall set this field to one less than the number of Access Channel frames that mobile stations are to transmit in each Access Channel preamble."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.PreambleSize"; + } + leaf psist09 { + type uint8 { + range "0..63"; + } + config false; + description + "Persistence value for access probes sent by mobiles with Access Overload calls values of 0 - 9. A value of 63 indicates such mobiles are not allowed to send access probes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Psist09"; + } + leaf psist10 { + type uint8 { + range "0..7"; + } + config false; + description + "Persistence value for access probes sent by mobiles with Access Overload calls values of 10 (test Mobile). A value of 7 indicates such mobiles are not allowed to send access probes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Psist10"; + } + leaf psist11 { + type uint8 { + range "0..7"; + } + config false; + description + "Persistence value for access probes sent by mobiles with Access Overload calls values of 11 (emergency Mobile). A value of 7 indicates such mobiles are not allowed to send access probes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Psist11"; + } + leaf psist12 { + type uint8 { + range "0..7"; + } + config false; + description + "Persistence value for access probes sent by mobiles with Access Overload calls values of 12. A value of 7 indicates such mobiles are not allowed to send access probes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Psist12"; + } + leaf psist13 { + type uint8 { + range "0..7"; + } + config false; + description + "Persistence value for access probes sent by mobiles with Access Overload calls values of 13. A value of 7 indicates such mobiles are not allowed to send access probes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Psist13"; + } + leaf psist14 { + type uint8 { + range "0..7"; + } + config false; + description + "Persistence value for access probes sent by mobiles with Access Overload calls values of 14. A value of 7 indicates such mobiles are not allowed to send access probes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Psist14"; + } + leaf psist15 { + type uint8 { + range "0..7"; + } + config false; + description + "Persistence value for access probes sent by mobiles with Access Overload calls values of 15. A value of 7 indicates such mobiles are not allowed to send access probes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Psist15"; + } + leaf msg-psist { + type uint8 { + range "0..7"; + } + config false; + description + "Persistence modifier for access channel attempts transmitting a message."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.MsgPsist"; + } + leaf reg-psist { + type uint8 { + range "0..7"; + } + config false; + description + "Persistence modifier for registration message transmission."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.RegPsist"; + } + leaf probe-pn-ran { + type uint8 { + range "0..9"; + } + config false; + description + "Time randomization for access channel probes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.ProbePNRan"; + } + leaf acc-tmo { + type uint8 { + range "0..15"; + } + units "80 ms slots"; + config false; + description + "Access transmission timeout. Two less than the time the mobile has to wait before determining that the probe is not received by the BSS. It is in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.AccTmo"; + } + leaf probe-bkoff { + type uint8 { + range "0..15"; + } + units "frames"; + config false; + description + "One less than maximum number for randomized delay between successive access probes in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.ProbeBkoff"; + } + leaf bkoff { + type uint8 { + range "0..15"; + } + units "80 ms slots"; + config false; + description + "One less than maximum number for randomized delay between successive access sequences in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.Bkoff"; + } + leaf max-req-seq { + type uint8 { + range "0..15"; + } + config false; + description + "Maximum number of access probe sequences for an access request."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.MaxReqSeq"; + } + leaf max-rsp-seq { + type uint8 { + range "0..15"; + } + config false; + description + "Maximum number of access probe sequences for an access response"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters.MaxRspSeq"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.AccessParameters."; + } + + grouping cdma2000-one-x-ran-system-parameters-g { + description + "The object used for configuring system parameter messages for 1x"; + leaf reg-zone { + type uint16 { + range "0..4095"; + } + config false; + description + "registration zone number (refer to Section 2.6.5.1.5 of {{bibref|3GPP2-C.S0005}})"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.RegZone"; + } + leaf total-zones { + type uint8 { + range "0..7"; + } + config false; + description + "Total number of zones the mobile shall retain for zone based registration. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.TotalZones"; + } + leaf zone-timer { + type uint8 { + range "0..7"; + } + config false; + description + "timer value to be used by the mobile in the zone registration timer. Refer to table 3.7.2.3.2.1-1 of the standard {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.ZoneTimer"; + } + leaf reg-period { + type uint8 { + range "29..85"; + } + config false; + description + "Registration period for timer based registration. Registration period is calculated from the formula 2^(REG_PRD/4) x 0.08 seconds. Thus a value of 59 corresponds to 1853.6 seconds (~ 1/2 hour). See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.RegPeriod"; + } + leaf srch-win-a { + type uint8 { + range "0..15"; + } + config false; + description + "Search window size to be used ny the mobile for active set and candidate set. Refer to table 2.6.6.2.1-1 of {{bibref|3GPP2-C.S0005}}. For example, 11 corresponds to 130 chips"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.SrchWinA"; + } + leaf srch-win-n { + type uint8 { + range "0..15"; + } + config false; + description + "Search window size to be used by the mobile for neighbor set. Refer to table 2.6.6.2.1-1 of {{bibref|3GPP2-C.S0005}}. For example, 8 corresponds to 60 chips"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.SrchWinN"; + } + leaf srch-win-r { + type uint8 { + range "0..15"; + } + config false; + description + "Search window size to be used by the mobile for remaining set. Refer to table 2.6.6.2.1-1 of {{bibref|3GPP2-C.S0005}}. For example, 8 corresponds to 60 chips"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.SrchWinR"; + } + leaf nghbr-max-age { + type uint8 { + range "0..15"; + } + config false; + description + "neighbor set maximum age beyond which the mobiles are supposed to drop a neighbor. This is the count of neighbout list updat or extended neighbor list updates a mobile shall receive before removing a neighbor from the neighbor list. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.NghbrMaxAge"; + } + leaf pwr-rep-thresh { + type uint8 { + range "0..31"; + } + config false; + description + "Power control reporting threshold. Number of bad frames a mobile should receive before sending a PMRM message. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.PwrRepThresh"; + } + leaf pwr-rep-frames { + type uint8 { + range "0..15"; + } + config false; + description + "Duration (in number of frames) for measuring bad frames - given by equation 2^(PWR_REP_FRAMES/2) x 5 frames. For example, 6 corresponds to 40 frames. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.PwrRepFrames"; + } + leaf pwr-thresh-enable { + type uint8 { + range "0..1"; + } + config false; + description + "enable/disable power measurement report message. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.PwrThreshEnable"; + } + leaf pwr-period-enable { + type uint8 { + range "0..1"; + } + config false; + description + "enable/disable periodic power measurement report message. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.PwrPeriodEnable"; + } + leaf pwr-rep-delay { + type uint8 { + range "0..32"; + } + config false; + description + "Delay (in unit of four frames) following a PMRM before the mobile restarts counting bad frames for power control measuremnt. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.PwrRepDelay"; + } + leaf rescan { + type uint8 { + range "0..1"; + } + config false; + description + "If {{param}} is set to 1, the mobiles should restart and reinitialize the System Parameters message. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.Rescan"; + } + leaf tadd { + type uint8 { + range "0..63"; + } + units "dB"; + config false; + description + "Power threshold (in {{units}}) for transferring a neighbor from neighbor set or remaining set to active set. For example, a value of 26 corresponds to -13 dB. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.Tadd"; + } + leaf tdrop { + type uint8 { + range "0..63"; + } + units "dB"; + config false; + description + "Drop threshold (in {{units}}) to start a handoff timer to drop a neighbor from active or candidate set. For example, 30 corresponds to -15dB. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.Tdrop"; + } + leaf tcomp { + type uint8 { + range "0..15"; + } + units "0.5 dB"; + config false; + description + "If a pilot in condidate set exceeds the power of a pilot in active set by threshold, the mobile shall send a power strenght measurement report message. This threshold is defined in unit of {{units}}. For example, 5 corresponds to a threshold of 2.5 dB. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.Tcomp"; + } + leaf t-tdrop { + type uint8 { + range "0..15"; + } + config false; + description + "Timer value for which an action is taken by the mobile for a neighbor in candidate set or in active set. Refer to Table 2.6.6.2.3-1 of the {{bibref|3GPP2-C.S0005}} for details. For example, 3 corresponds to four seconds"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.TTdrop"; + } + leaf in-traffic-tadd { + type uint8 { + range "0..63"; + } + units "dB"; + config false; + description + "T-ADD value (in {{units}}) used for in-traffic system parameter message. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.InTrafficTadd"; + } + leaf in-traffic-tdrop { + type uint8 { + range "0..63"; + } + units "dB"; + config false; + description + "T-Drop value (in {{units}}) used in in-traffic system parameter message. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.InTrafficTdrop"; + } + leaf in-traffic-tcomp { + type uint8 { + range "0..15"; + } + units "dB"; + config false; + description + "T_Comp value (in {{units}}) used for in-traffic system parameter message. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.InTrafficTcomp"; + } + leaf in-traffic-ttdrop { + type uint8 { + range "0..15"; + } + config false; + description + "T_Tdrop timer value value used for in-traffic system parameter message. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters.InTrafficTtdrop"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.SystemParameters."; + } + + grouping cdma2000-one-x-ran-extended-system-parameters-g { + description + "The object used for configuring extended system parameter messages for 1x"; + leaf prev { + type uint8 { + range "0..255"; + } + config false; + description + "protocol revision"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.Prev"; + } + leaf p-min-rev { + type uint8 { + range "0..255"; + } + config false; + description + "minimum protocol revision"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.PMinRev"; + } + leaf delete-for-tmsi { + type uint8 { + range "0..1"; + } + config false; + description + "Delete Foreign TMSI. The base station shall set this field to '1' to cause the mobile station to delete its TMSI if the TMSI was assigned in a different TMSI zone from that specified by the TMSI_ZONE field of this message; otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.DeleteForTMSI"; + } + leaf use-tmsi { + type uint8 { + range "0..1"; + } + config false; + description + "Use TMSI indicator. The base station shall set this field to the value shown next field corresponding to the type of MSID that the mobile station is to use on the Access Channel."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.UseTMSI"; + } + leaf pref-msid-type { + type uint8 { + range "0..3"; + } + config false; + description + "Preferred Access Channel Mobile Station Identifier Type. F294. The base station shall set this field to the value shown as below corresponding to the type of MSDI that the mobile station is to use on the Access Channel. [useTMSI] [prefMSIDType] [description] 0 00 IMSI_S and ESN 0 10 IMSI 0 11 IMSI and ESN 1 10 TMSI; IMSI 1 11 TMSI; IMSI and ESN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.PrefMSIDType"; + } + leaf mcc { + type uint16 { + range "0..1023"; + } + config false; + description + "Mobile Country Code. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.MCC"; + } + leaf imsi1112 { + type uint8 { + range "0..255"; + } + config false; + description + "11th and 12th digits of IMSI. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.IMSI1112"; + } + leaf tmsi-zone-len { + type uint8 { + range "1..8"; + } + config false; + description + "TMSI zone length. The base station shall set this field to the number of octets included in the TMSI_ZONE. The base station shall set this field to a value in the range 1 to 8 inclusive."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.TMSIZoneLen"; + } + leaf tmsi-zone { + type uint16 { + range "0..65535"; + } + config false; + description + "TMSI zone. The base station shall set this field to the TMSI zone number as specified in {{bibref|3GPP2-N.S0010}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.TMSIZone"; + } + leaf bcast-index { + type uint8 { + range "0..7"; + } + config false; + description + "Broadcast slot cycle index. To enable periodic broadcast paging, the base station shall set this field to and unsigned 3-bit number in the range 1-7, equal to the broadcast slot cycle index. To disable periodic broadcast paging, the base station shall set this field to '000'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.BcastIndex"; + } + leaf imsit-supported { + type int64; + config false; + description + "1: IMISI_T is supported, 0: IMSI_T is not supported. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.IMSITSupported"; + } + leaf soft-slope { + type uint8 { + range "0..63"; + } + config false; + description + "The slope in the inequality criterion for adding a pilot to the Active Set, or dropping a pilot from the Active Set. The base station shall set this field as an unsigned binary number."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.SoftSlope"; + } + leaf add-intercept { + type uint8 { + range "0..63"; + } + units "dB"; + config false; + description + "The intercept in the inequality criterion for adding a pilot to the Active Set. The base station shall set this field as a two's complement signed binary number, in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.AddIntercept"; + } + leaf drop-intercept { + type uint8 { + range "0..63"; + } + units "dB"; + config false; + description + "The intercept in the inequality criterion for dropping a pilot from the Active Set. The base station shall set this field as a two's complement signed binary number, in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.DropIntercept"; + } + leaf max-num-alt-so { + type uint8 { + range "0..7"; + } + config false; + description + "Maximum number of alternative service options. The base station shall set this field to the maximum number of alternative service option numbers that the mobile station is allowed to include in the Origination Message or the Page Response Message. For mobile stations with MOB_P_REVs less than seven, the alternative service options are those service options defined in TSB-58B and related to SERVICE_OPTION in Origination Message and the Page Response Message. For mobile stations with MOB_P_REVs equal to or greater than seven, the alternative service options are those service options defined in TSB-58B without service group number assigned and related to SERVICE_OPTION in Origination Message and the Page Response Message. The base station sets this field to a value greater than zero, in addition, the base station shall allow the mobile station with MOB_P_REVs equal to or greater than 7 to include - a 4 or 8-bit service option bitmap in the Origination Message and the Page Response Message; - alternative service option numbers, not limited to MAX_ALT_SO_NUM, in the Enhanced Origination Message."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.MaxNumAltSo"; + } + leaf reselected-included { + type uint8 { + range "0..1"; + } + config false; + description + "System reselection parameters included. If the base station is including system reselection parameters, the base station shall set this field to '1'; otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.ReselectedIncluded"; + } + leaf ec-thresh { + type uint64; + units "dBm"; + config false; + description + "Pilot power threshold. If RESELECTINCLUDED is set to '1', the base station shall include the field EC_THRESH and set this field to: [ (pilot_power_threshold + 115 ) ] where pilot_power_threshold is the pilot power, Ec, in {{units}}/1.23 MHz, below which the mobile station is to perform system reselection; otherwise, the base station shall omit this field."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.EcThresh"; + } + leaf ec-io-thresh { + type uint64; + config false; + description + "Pilot Ec / Io threshold. If RESELECTINCLUDED is set to '1', the base station shall include the field EC_I0_THRESH and set this field to: [ - 20 x log10 (pilot_threshold) ] where pilot_threshold is the pilot Ec/Io below which the mobile station is to perform system reselection; otherwise, the base station shall omit this field."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.EcIoThresh"; + } + leaf pilot-report { + type uint8 { + range "0..1"; + } + config false; + description + "Pilot reporting indicator. The base station shall set this field to '1' if the mobile station is to report the additional pilots which have pilot strength exceeding T_ADD in all Access Channel messages. The base station shall set this field to '0' if the mobile station is to report the additional pilots which have pilot strengths exceeding T_ADD only in the Origination Message and the Page Response Message."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.PilotReport"; + } + leaf nghbr-set-entry-info { + type uint8 { + range "0..1"; + } + config false; + description + "Neighbor Set access entry handoff information included indicator. If the base station is including information on the Neighbor Set access entry handoff, the base station shall set this field to '1'; otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.NghbrSetEntryInfo"; + } + leaf access-ho-order { + type uint8 { + range "0..1"; + } + config false; + description + "Access entry handoff permitted indicator. If NghbrSetEntryInfo is set to '1', the base station shall set this field to '1' if the mobile station is permitted to perform an access entry handoff after receiving a message while performing the Mobile Station Order and Message Processing Operation in the Mobile Station Idle State; otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.AccessHOOrder"; + } + leaf nghbr-set-access-info { + type uint8 { + range "0..1"; + } + config false; + description + "Neighbor Set access handoff included indicator. If the base station is including information on the Neighbor Set access handoff or access probe handoff, the base station shall set this field to '1', otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.NghbrSetAccessInfo"; + } + leaf access-ho { + type uint8 { + range "0..1"; + } + config false; + description + "Access handoff permitted indicator. If NghbrSetEntryInfo is set to '1', the base station shall set this field to '1' if the mobile station is permitted to perform an access handoff; otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.AccessHO"; + } + leaf access-ho-msg-rsp { + type uint8 { + range "0..1"; + } + config false; + description + "Access handoff permitted for message response indicator. If AccessHO is set to '1', the base station shall include this field and set it as described below; otherwise, the base station shall omit this field. The base station shall set this field to '1' if the mobile station is permitted to perform an access handoff after receiving a message and before responding to that message in the System Access State; otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.AccessHOMsgRsp"; + } + leaf access-probe-ho { + type uint8 { + range "0..1"; + } + config false; + description + "Access probe handoff permitted indicator. If NghbrSetEntryInfo is set to '1', the base station shall set this field to '1' if the base station is permitted to perform an access probe handoff; otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.AccessProbeHO"; + } + leaf acc-ho-list-upd { + type uint8 { + range "0..1"; + } + config false; + description + "Access handoff list update permitted indicator. If AccessProbeHO is included and is set to '1', the base station shall set this field to '1' if the mobile station is permitted to update the access handoff list during an access attempt; otherwise, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.AccHOListUpd"; + } + leaf acc-probe-ho-other-msg { + type uint8 { + range "0..1"; + } + config false; + description + "Access probe handoff permitted for messages other than the Origination Message and the Page Response Message. If AccessProbeHO is set to '1', the base station shall set this field to '1' if the mobile station is permitted to perform an access probe handoff for messages other than the Origination Message and the Page Response. The base station shall set this field to '0' if the mobile station is permitted to perform an access probe handoff only for the Origination Message and the Page Response Message."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.AccProbeHOOtherMsg"; + } + leaf max-num-probe-ho { + type uint8 { + range "0..3"; + } + config false; + description + "Maximum number of times that mobile station is permitted to perform an access probe handoff. If AccessProbeHO is set to '1', the base station shall set this field to the maximum number of times the mobile station is allowed to perform an access probe handoff within an access attempt minus one."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.MaxNumProbeHO"; + } + leaf brdcast-gps-assit { + type uint8 { + range "0..1"; + } + config false; + description + "If {{param}} is set to 1, then Braodcast GPS assist is supported. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.BrdcastGPSAssit"; + } + leaf qpch-supported { + type uint8 { + range "0..1"; + } + config false; + description + "Quick Paging Channel Supported Indication. If the base station supports Quick Paging Channel operation, the base station shall set this field to '1'; otherwise the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.QPCHSupported"; + } + leaf num-qpch { + type uint8 { + range "1..3"; + } + config false; + description + "Number of Quick Paging Channels. If the base station sets QPCHSUPPORTED to '1', the base station shall include this field and set it as described below; otherwise, the base station shall omit this field. The base station shall set this field to the number of Quick Paging Channels on this CDMA Channel. The base station shall not set this field to '00'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.NumQPCH"; + } + leaf qpch-rate { + type uint8 { + range "0..1"; + } + config false; + description + "Quick Paging Channel indicator rate. See {{bibref|3GPP2-C.S0005}}. {{param}} is set as follows: 0: 4800bps; 1: 9600bps."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.QPCHRate"; + } + leaf qpch-pwr-level-page { + type uint8 { + range "0..7"; + } + config false; + description + "Quick Paging Channel paging indicator transmit power level. {{param}} is set as follows: 0: 5 dB below; 1: 4 dB below; 2: 3 dB below; 3: 2 dB below; 4: 1 dB below; 5: Same; 6: 1 dB above; 7: 2dB above."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.QPCHPwrLevelPage"; + } + leaf qpc-hcci-supported { + type uint8 { + range "0..1"; + } + config false; + description + "Quick Paging Channel configuration change indicator supported. {{param}} is set as follows: if the base station is to support configuration change indicators on the Quick Paging Channel, {{param}} to '1'; otherwise {{param}} is set to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.QPCHcciSupported"; + } + leaf qpch-pwr-level-config { + type uint8 { + range "0..255"; + } + config false; + description + "Quick Paging Channel configuration change indicator CONFIG transmit power level. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.QPCHPwrLevelConfig"; + } + leaf sdb-supported { + type uint8 { + range "0..1"; + } + config false; + description + "Short Data Burst supported indicator. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.SDBSupported"; + } + leaf r-lgain-traffic-pilot { + type uint8 { + range "0..63"; + } + units "0.125 dB"; + config false; + description + "Gain adjustment of the Reverse Traffic Channel relative to the Reverse Pilot Channel for Radio Configurations greater than 2. {{param}} is set to the correction factor to be used by mobile stations in setting the power of a reverse traffic channel, expressed as a two's complement value in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.RLgainTrafficPilot"; + } + leaf rvs-pwr-ctrl-delay-incl { + type uint8 { + range "0..1"; + } + config false; + description + "Reverse Power Control Delay included indicator. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.RvsPwrCtrlDelayIncl"; + } + leaf rvs-pwr-ctrl-delay { + type uint8 { + range "0..3"; + } + units "1.25 ms"; + config false; + description + "The reverse power control delay. {{param}} is setto the closed-loop reverse power control delay minus one (the closed-loop reverse power control delay is the time between the end of a gated-on reverse PCG and the beginning of the Forward Power Control Subchannel in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters.RvsPwrCtrlDelay"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ExtendedSystemParameters."; + } + + grouping cdma2000-one-x-ran-forward-pwr-ctr-g { + description + "The object used for configuring extended channel assignment messages for 1x"; + leaf fpcfch-init-setpt { + type int64; + units "0.125 dB"; + config false; + description + "Initial Fundamental Channel outer loop Eb/Nt setpoint in {{units}}. For example, 56 corresponds to 7 dB. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ForwardPwrCtr.FPCFCHInitSetpt"; + } + leaf fpc-subchan-gain { + type int64; + units "0.25 dB"; + config false; + description + "Forward power control subchannel relative to fwd traffic channel in {{units}}. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ForwardPwrCtr.FPCSubchanGain"; + } + leaf rl-gain-adj { + type int64; + units "dB"; + config false; + description + "Reverse Traffic Channel power relative to access power in {{units}}. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ForwardPwrCtr.RLGainAdj"; + } + leaf fpcfchfer { + type uint8 { + range "0..31"; + } + config false; + description + "Fundamental Channel target frame error rate. Refer to table 3.7.3.3.2.25-2 of {{bibref|3GPP2-C.S0005}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ForwardPwrCtr.FPCFCHFER"; + } + leaf fpcfch-min-setpt { + type int64; + units "0.125 dB"; + config false; + description + "Minimum Fundamental Channel Outer Loop Eb/Nt setpoint in {{units}}. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ForwardPwrCtr.FPCFCHMinSetpt"; + } + leaf fpcfch-max-setpt { + type int64; + units "0.125 dB"; + config false; + description + "Maximum Fundamental Channel Outer Loop Eb/Nt setpoint in {{units}}. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ForwardPwrCtr.FPCFCHMaxSetpt"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.ForwardPwrCtr."; + } + + grouping cdma2000-one-x-ran-hard-handoff-g { + description + "This object provides configurable parameters for 1x Handout"; + leaf handout-enable { + type boolean; + config false; + description + "Enabling handout operation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.HandoutEnable"; + } + leaf ho-pilot-power-thresh { + type int64; + units "dB"; + config false; + description + "Pilot power threshold (in {{units}} relative to the FAP pilot power) for handout declaration"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.HOPilotPowerThresh"; + } + leaf ho-pilot-duration { + type uint8 { + range "20..50"; + } + units "100ms"; + config false; + description + "Timethreshold for handout declaration (in {{units}})"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.HOPilotDuration"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff."; + } + + grouping cdma2000-one-x-ran-hard-handoff-stats-g { + description + "This object contains statistics for all Handouts of the 1x FAP."; + leaf tx-ho-required { + type uint32 { + range "0..4294967295"; + } + description + "Total number of Handout Required messages sent to the MSC"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.TxHORequired"; + } + leaf rx-ho-command { + type uint32 { + range "0..4294967295"; + } + description + "Total number of Handout Command messegaes received from the MSC"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.RxHOCommand"; + } + leaf ho-required-rejected { + type uint32 { + range "0..4294967295"; + } + description + "Total number of HO required requests rejected by the MSC"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.HORequiredRejected"; + } + leaf ho-required-unanswered { + type uint32 { + range "0..4294967295"; + } + description + "Total number of HO required requests for which no response received from the MSC"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.HORequiredUnanswered"; + } + leaf tx-uhdm { + type uint32 { + range "0..4294967295"; + } + description + "Total number UHDMs sent to mobiles"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.TxUHDM"; + } + leaf rx-ns-ack { + type uint32 { + range "0..4294967295"; + } + description + "Total number of MSAcks received from the mobile in response to UHDM"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.RxNSAck"; + } + leaf ho-failure-count { + type uint32 { + range "0..4294967295"; + } + description + "Total number of Handout attempts declared as failure"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.HOFailureCount"; + } + leaf call-drop-count { + type uint32 { + range "0..4294967295"; + } + description + "Total numer of call drops after a HO attempt. RTC lost without MSack"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.CallDropCount"; + } + leaf tx-ho-commence { + type uint32 { + range "0..4294967295"; + } + description + "Number of Handout Commenced messages sent to MSC"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.TxHOCommence"; + } + leaf rx-ho-session-clear { + type uint32 { + range "0..4294967295"; + } + description + "Number of session clear commands received form the core"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.RxHOSessionClear"; + } + leaf return-on-failure-count { + type uint32 { + range "0..4294967295"; + } + description + "Total number of times a Return On Handoff failure was declared"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.ReturnOnFailureCount"; + } + leaf one-pilot-report-count { + type uint32 { + range "0..4294967295"; + } + description + "Number of times only one pilot was reported in HO Required message"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.OnePilotReportCount"; + } + leaf two-pilot-report-count { + type uint32 { + range "0..4294967295"; + } + description + "Number of times only two pilot was reported in HO Required message"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.TwoPilotReportCount"; + } + leaf three-pilot-report-count { + type uint32 { + range "0..4294967295"; + } + description + "Number of times only three pilot was reported in HO Required message"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats.ThreePilotReportCount"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.HardHandoff.Stats."; + } + + grouping cdma2000-one-x-ran-power-control-g { + description + "Configuration Managed Object for OTA power control attribute."; + leaf one-xpcfpc-incl { + type int64; + config false; + description + "Whether Forward power control information included in Power Control message"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCFPCIncl"; + } + leaf one-xpcfpcfch-min-setpt { + type int64; + units "0.125 dB"; + config false; + description + "The value for the minimum Fundamental Channel Outer Loop Eb/Nt setpoint, in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCFPCFCHMinSetpt"; + } + leaf one-xpcfpcfch-max-setpt { + type int64; + units "0.125 dB"; + config false; + description + "The value for the maximum Fundamental Channel Outer Loop Eb/Nt setpoint, in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCFPCFCHMaxSetpt"; + } + leaf one-xpcrpc-incl { + type int64; + config false; + description + "Whether reverse Power control information included in the Power Control Message."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCRPCIncl"; + } + leaf one-xpcfch-chan-adj-gain { + type int64; + units "0.125 dB"; + config false; + description + "Channel adjustment gain (in {{units}}) for Reverse Fundamental Channel."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCFCHChanAdjGain"; + } + leaf one-xpc-pwr-rep-thresh { + type uint8 { + range "0..31"; + } + config false; + description + "The number of bad frames to be received in a measurement period on the channel which carries the Power Control Subchannel before mobile stations are to generate a Power easurement Report Message"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCPwrRepThresh"; + } + leaf one-xpc-pwr-rep-frames { + type uint8 { + range "0..15"; + } + config false; + description + "Power control reporting frame count. Number of frames over which the mobile station measures frame errors. For example, 7 corresponds to 55 frames. Refer to {{bibref|3GPP2-C.S0005}} for mapping between this value and the actual frame count."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCPwrRepFrames"; + } + leaf one-x-pwr-thresh-enable { + type int64; + config false; + description + "Threshold report mode indicator. If the mobile station is to generate threshold Power Measurement Report Messages, the base station shall set this field to '1'. If the mobile station is not to generate threshold Power Measurement Report Messages, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPwrThreshEnable"; + } + leaf one-xpc-pwr-period-enable { + type int64; + config false; + description + "Periodic report mode indicator. If the mobile station is to generate periodic Power Measurement Report Messages, the base station shall set this field to '1'. If the mobile station is not to generate periodic Power Measurement Report Messages, the base station shall set this field to '0'."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCPwrPeriodEnable"; + } + leaf one-xpc-pwr-rep-delay { + type uint8 { + range "0..31"; + } + units "4 frames"; + config false; + description + "Power report delay. The period that the mobile station waits following a Power Measurement Report Message before restarting frame counting for power control purposes. The base station shall set this field to the power report delay values in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl.OneXPCPwrRepDelay"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.PowerControl."; + } + + grouping cdma2000-one-x-ran-neighbor-list-g { + description + "This object contains information common to all neighbors of a sector. This object has only one instance."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.Alias"; + } + leaf pilot-inc { + type int64; + config false; + description + "pilot increment policy for this network. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.PilotInc"; + } + leaf one-x-neighbor-index { + type int64; + description + "Macro neighbour index. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.OneXNeighborIndex"; + } + leaf neighbor-config { + type enumeration { + enum "same-config" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborConfig - SameConfig"; + } + enum "same-paging" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborConfig - SamePaging"; + } + enum "diff-paging" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborConfig - DiffPaging"; + } + enum "unknown" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborConfig - Unknown"; + } + } + config false; + description + "Neighbor configuration in terms of number of frequencies having paging channels as defined in Section 3.7.2.3.2 of the {{bibref|3GPP2-C.S0005}} standard"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborConfig"; + } + leaf neighbor-pn { + type int64; + description + "PN offset of the neighbor. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborPN"; + } + leaf search-priority { + type enumeration { + enum "low" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.SearchPriority - Low"; + } + enum "medium" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.SearchPriority - Medium"; + } + enum "high" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.SearchPriority - High"; + } + enum "very-high" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.SearchPriority - VeryHigh"; + } + } + config false; + description + "priority level for serching this neighbor. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.SearchPriority"; + } + leaf neighbor-band { + type enumeration { + enum "0" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborBand - 0"; + } + enum "1" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborBand - 1"; + } + enum "2" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborBand - 2"; + } + enum "3" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborBand - 3"; + } + enum "4" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborBand - 4"; + } + enum "5" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborBand - 5"; + } + enum "6" { + value 7; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborBand - 6"; + } + } + config false; + description + "Neighbor band class. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborBand"; + } + leaf neighbor-frequency { + type int64; + config false; + description + "frequency of neighbor. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.NeighborFrequency"; + } + leaf frequency-included { + type int64; + config false; + description + "Flag to indicate if the channel id included. See {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.FrequencyIncluded"; + } + leaf in-traffic { + type int64; + config false; + description + "whether this neighbor can be used for in-traffic neighborlist message"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.InTraffic"; + } + leaf overhead-msg { + type int64; + config false; + description + "whether this neighbor can be used for overhead neighborlist message"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.OverheadMsg"; + } + leaf base-identifier { + type int64; + config false; + description + "unique identifire of the neighboring cell (optional)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.BaseIdentifier"; + } + leaf air-interface { + type enumeration { + enum "one-x" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.AirInterface - OneX"; + } + enum "is95" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.AirInterface - IS95"; + } + enum "hrpd" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.AirInterface - HRPD"; + } + enum "other" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.AirInterface - Other"; + } + } + config false; + description + "Air interface technology of the neighbor."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.AirInterface"; + } + leaf hand-out-capable { + type int64; + config false; + description + "Flag to indicate if the handOutCapability is possible."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.HandOutCapable"; + } + leaf one-x-neighbor-longitude { + type string { + length "0..16"; + } + config false; + description + "Longitude for this neighbor. Parameter is a string representing a floating point real number (+/- XXX.YY). Where + for East, - for West, XXX.Y ranges between 0.0 and 180.0 ."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.OneXNeighborLongitude"; + } + leaf one-x-neighbor-latitude { + type string { + length "0..16"; + } + config false; + description + "Lattitude for this neighbor. Parameter is a string representing a floating point number (+/-XX.Y). + for North, - for South, XX.Y ranges between 0.0 and 90.0."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.OneXNeighborLatitude"; + } + leaf one-x-neighbor-msc-id { + type uint32 { + range "0..16777215"; + } + config false; + description + "IOS MSCID of the neighbors. See {{bibref|3GPP2-A.S0014}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.OneXNeighborMSCId"; + } + leaf one-x-neighbor-ios-cell-id { + type uint16 { + range "0..65535"; + } + config false; + description + "Cell Identifier of the neighbor (formatted according to Cell Identification Discriminator = '0000 0010', i.e., 12-bit cell value and 4-bit sector value). See {{bibref|3GPP2-A.S0014}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.OneXNeighborIOSCellId"; + } + leaf force-in-overhead { + type boolean; + config false; + description + "If {{param}} is set to {{true}}, the FAP SHOULD include this Neighbor List entry in the Neighbor List overhead messages (see {{bibref|3GPP2-C.S0005}}. Otherwise, {{param}} is set to {{false}}, in which case the FAP MAY include this Neighbor List entry in the Neighbor List overhead messages."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.ForceInOverhead"; + } + leaf included-in-overhead { + type boolean; + description + "If {{param}} is set to {{true}}, the FAP is currently including this Neighbor List entry in the Neighbor List overhead messages (see {{bibref|3GPP2-C.S0005}}. Otherwise, {{param}} is set to {{false}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}.IncludedInOverhead"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.NeighborList.{i}."; + } + + grouping cdma2000-one-x-ran-apidm-g { + description + "This object can be configured only if {{param|.Capabilities.CDMA2000.OneX.FemtoOverheadMessagesCapable}} is set to {{true}}."; + leaf association-type { + type uint8 { + range "0..7"; + } + config false; + description + "The FAP shall set this field to the value shown in {{bibref|3GPP2-C.S0005}} corresponding to the configuration of the base station."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.AssociationType"; + } + leaf apidlen { + type uint8 { + range "0..15"; + } + config false; + description + "The FAP shall set this field to the length of the access point identification in units of 16 bits. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.APIDLEN"; + } + leaf apid { + type binary { + length "0..16"; + } + config false; + description + "Access Point Identification. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.APID"; + } + leaf apidmask { + type uint8 { + range "0..255"; + } + config false; + description + "Access Point identification Mask. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.APIDMASK"; + } + leaf iosmscid { + type uint32 { + range "0..16777215"; + } + config false; + description + "MSC_ID of the base station. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.IOSMSCID"; + } + leaf ioscellid { + type uint16 { + range "0..65535"; + } + config false; + description + "CELL_ID of the base station. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.IOSCELLID"; + } + leaf intrafreqhohysincl { + type boolean; + config false; + description + "This field indicates whether the INTRAFREQHOHYS field is valid and included in Access Point Identification message. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTRAFREQHOHYSINCL"; + } + leaf intrafreqhohys { + type uint8 { + range "0..127"; + } + config false; + description + "Intra Frequency Handoff Hysteresis. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTRAFREQHOHYS"; + } + leaf intrafreqhoslopeincl { + type boolean; + config false; + description + "This field indicates whether the INTRAFREQHOSLOPE field is valid and included in Access Point Identification message. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTRAFREQHOSLOPEINCL"; + } + leaf intrafreqhoslope { + type uint8 { + range "0..63"; + } + config false; + description + "Intra Frequency Handoff Slope. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTRAFREQHOSLOPE"; + } + leaf interfreqhohysincl { + type boolean; + config false; + description + "This field indicates whether the INTERFREQHOHYS field is valid and included in Access Point Identification message. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTERFREQHOHYSINCL"; + } + leaf interfreqhohys { + type uint8 { + range "0..127"; + } + config false; + description + "Inter frequency handoff hysteresis. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTERFREQHOHYS"; + } + leaf interfreqhoslopeincl { + type boolean; + config false; + description + "This field indicates whether the INTERFREQHOSLOPE field is valid and included in Access Point Identification message. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTERFREQHOSLOPEINCL"; + } + leaf interfreqhoslope { + type uint8 { + range "0..63"; + } + config false; + description + "Inter frequency handoff slope. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTERFREQHOSLOPE"; + } + leaf interfreqsrchthincl { + type boolean; + config false; + description + "This field indicates whether the INTERFREQSRCHTH field is valid and included in Access Point Identification message. Refer {{bibref|3GPP2-C.S0005}} for definition."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTERFREQSRCHTHINCL"; + } + leaf interfreqsrchth { + type uint8 { + range "0..31"; + } + config false; + description + "Inter-frequency search threshold. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM.INTERFREQSRCHTH"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDM."; + } + + grouping cdma2000-one-x-ran-apidtm-g { + description + "This object can be configured only if {{param|.Capabilities.CDMA2000.OneX.FemtoOverheadMessagesCapable}} is set to {{true}}."; + leaf apidtextcha-ri-len { + type uint16 { + range "0..256"; + } + config false; + description + "Access Point identification Text CHARi field Length ({{param|APIDTEXTCHARi}}). Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDTM.APIDTEXTCHARiLEN"; + } + leaf apidtextmsgencoding { + type uint8 { + range "0..31"; + } + config false; + description + "Access Point identification Text message encoding. Refer {{bibref|3GPP2-C.S0005}} and {{bibref|3GPP2-C.R1001}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDTM.APIDTEXTMSGENCODING"; + } + leaf apidtextcha-ri { + type string { + length "0..256"; + } + config false; + description + "Access Point Identification Text. Refer {{bibref|3GPP2-C.S0005}} and {{bibref|3GPP2-C.R1001}} for definitions."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDTM.APIDTEXTCHARi"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APIDTM."; + } + + grouping cdma2000-one-x-ran-appim-g { + description + "This object can be configured only if {{param|.Capabilities.CDMA2000.OneX.FemtoOverheadMessagesCapable}} is set to {{true}}."; + leaf lifetime { + type uint8 { + range "0..255"; + } + config false; + description + "Lifetime of the information in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.LIFETIME"; + } + leaf numappirec { + type uint16 { + range "0..511"; + } + config false; + description + "The number of entries for {{object|.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.NUMAPPIREC"; + } + leaf appirec-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIRECNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM."; + } + + grouping cdma2000-one-x-ran-appim-appirec-g { + description + "This object can be configured only if {{param|.Capabilities.CDMA2000.OneX.FemtoOverheadMessagesCapable}} is set to {{true}}."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.Alias"; + } + leaf apassntype { + type uint8 { + range "0..7"; + } + config false; + description + "Access point association type the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APASSNTYPE"; + } + leaf apsidsameasprevious { + type uint8 { + range "0..1"; + } + config false; + description + "SID same as previous indicator in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APSIDSAMEASPREVIOUS"; + } + leaf apnidsameasprevious { + type uint8 { + range "0..1"; + } + config false; + description + "NID same as previous indicator in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APNIDSAMEASPREVIOUS"; + } + leaf apbandsameasprevious { + type uint8 { + range "0..1"; + } + config false; + description + "Bandclass same as previous indicator in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APBANDSAMEASPREVIOUS"; + } + leaf apfreqsameasprevious { + type uint8 { + range "0..1"; + } + config false; + description + "Frequency same as previous indicator in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APFREQSAMEASPREVIOUS"; + } + leaf appnrecsameasprevious { + type uint8 { + range "0..1"; + } + config false; + description + "PN offset same as previous indicator in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APPNRECSAMEASPREVIOUS"; + } + leaf apsid { + type uint16 { + range "0..32767"; + } + description + "Access point SID in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APSID"; + } + leaf apnid { + type uint16 { + range "0..65535"; + } + description + "Access point NID in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APNID"; + } + leaf apband { + type uint8 { + range "0..31"; + } + description + "Access point bandclass in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APBAND"; + } + leaf apfreq { + type uint16 { + range "0..2047"; + } + description + "Access point frequency in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APFREQ"; + } + leaf appnrectype { + type uint8 { + range "0..7"; + } + description + "Access point PN offset in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APPNRECTYPE"; + } + leaf appnreclen { + type uint8 { + range "0..31"; + } + description + "Length in octets of the access point PN record ({{param|APPNREC}}) in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APPNRECLEN"; + } + leaf appnrec { + type binary { + length "0..31"; + } + description + "Access point PN Record in the access point pilot information record. Refer {{bibref|3GPP2-C.S0005}} for definitions"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}.APPNREC"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.RAN.APPIM.APPIREC.{i}."; + } + + grouping cdma2000-one-x-pcf-config-g { + description + "CDMA2000 1x PCF configuration information."; + leaf pcfpdsn-health-monitor-interval { + type uint8 { + range "0..180"; + } + units "seconds"; + config false; + description + "PDSN health check monitor interval in {{units}}. Setting the value to 0 disables the PDSN Health Monitoring Feature. Setting any non-zero value enables the PDSN Health Monitoring Feature and sets that non-zero value as the timer interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPDSNHealthMonitorInterval"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig."; + } + + grouping cdma2000-one-x-pcf-config-pcf-performance-stats-g { + description + "This object is used in obtaining the PCF stats"; + leaf a10-setup-failure-no-reason { + type uint64; + description + "Number of times the PCF was refused an A10 connection with an unspecified reason (A11 error code : 0x80)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10SetupFailureNoReason"; + } + leaf a10-setup-failure-admin-prohibit { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Admin Prohibited\" (A11 error code : 0x81)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10SetupFailureAdminProhibit"; + } + leaf a10-setup-failure-insuff-resources { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Insufficient Resources\" (A11 error code: 0x82)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10SetupFailureInsuffResources"; + } + leaf a10-setup-failure-failed-auth { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Mobile Node Authentication Failure\" (A11 error code: 0x83)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10SetupFailureFailedAuth"; + } + leaf a10-setup-failure-id-mismatch { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Id Mismatch\" (A11 error code: 0x85)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10SetupFailureIdMismatch"; + } + leaf a10-setup-failure-malformed-req { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Malformed Request\" (A11 error code: 0x86)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10SetupFailureMalformedReq"; + } + leaf a10-setup-failure-unknown-pdsn { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Unknown PDSN\" (A11 error code: 0x88)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10SetupFailureUnknownPDSN"; + } + leaf a10-setup-failure-unsupp-vend-id { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Unsupported Vendor Id\" (A11 error code: 0x89)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10SetupFailureUnsuppVendId"; + } + leaf total-a10-closed-by-rnc { + type uint64; + description + "Number of A10 closed by the FAP RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.TotalA10ClosedByRnc"; + } + leaf total-a10-closed-by-pdsn { + type uint64; + description + "Number of A10 closed by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.TotalA10ClosedByPDSN"; + } + leaf total-a10-success-pages { + type uint64; + description + "Numebr of A10 Pages initiated by PCFsucceeded."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.TotalA10SuccessPages"; + } + leaf total-a10-failed-pages { + type uint64; + description + "Numebr of A10 Pages initiated by PCF failed."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.TotalA10FailedPages"; + } + leaf total-a10-ingress-bytes { + type uint64; + units "bytes"; + description + "Number of {{units}} received from the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.TotalA10IngressBytes"; + } + leaf total-a10-egress-bytes { + type uint64; + units "bytes"; + description + "Number of {{units}} transmitted to the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.TotalA10EgressBytes"; + } + leaf a10-reg-update-received { + type uint64; + description + "Number of A10 Registration updates received by the FAP PCF"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.A10RegUpdateReceived"; + } + leaf total-a10-dropped-pages { + type uint64; + description + "Number of A10 Pages initiated by PCF dropped"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats.TotalA10DroppedPages"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFConfig.PCFPerformanceStats."; + } + + grouping cdma2000-one-x-batch-pcfpdsn-g { + description + "The Batch configuration Object used to configure PDSN table using a start and end IP address. The order of the address is used as part of PDSN selection algorithm, e.g., the first element is considered PDSN number 0. (Refer to {{bibref|3GPP2-A.S0013}}). To get individual PDSN entries use the {{object|.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.}}."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.Alias"; + } + leaf batch-table-number { + type int64; + description + "The BatchTable Number should be given only once during the creation of a Batch Table. This is the Key Attribute that uniquely identifies a BatchTable entry. This number indicates the index of this batch to determine the PDSN number in the PDSN selection algorithm ({{bibref|3GPP2-A.S0013}})."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableNumber"; + } + leaf batch-table-start-ip-address { + type inet:ip-address; + config false; + description + "Start IP address of the range of PDSNs."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableStartIPAddress"; + } + leaf batch-table-end-ip-address { + type inet:ip-address; + config false; + description + "End IP address of the range of PDSNs."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableEndIPAddress"; + } + leaf batch-table-security-parameter-index { + type uint32 { + range "0 | 256..4294967295"; + } + config false; + description + "Security Parameter Index to be used."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableSecurityParameterIndex"; + } + leaf batch-table-secret-key { + type binary { + length "0..16"; + } + config false; + description + "Secret key in 32-digit hexidecimal representation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableSecretKey"; + } + leaf batch-table-ios-version { + type enumeration { + enum "tia-878-ballot" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableIOSVersion - TIA-878-ballot"; + } + enum "tia-878-1" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableIOSVersion - TIA-878-1"; + } + enum "tia-878-a" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableIOSVersion - TIA-878-a"; + } + enum "tia-878-legacy" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableIOSVersion - TIA-878-legacy"; + } + } + config false; + description + "IOS Version of this PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTableIOSVersion"; + } + leaf batch-table-pdsn-admin-status { + type int64; + config false; + description + "Administrative status of this PDSN. 0- UP 1-DOWN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.BatchTablePDSNAdminStatus"; + } + leaf pdsn-type { + type enumeration { + enum "one-x" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.PDSNType - OneX"; + } + enum "hrpd-rev0" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.PDSNType - HRPDRev0"; + } + enum "hrpd-rev-a" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.PDSNType - HRPDRevA"; + } + } + config false; + description + "Indicates the PDSN type for this batch."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.PDSNType"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}."; + } + + grouping cdma2000-one-x-pcfpdsn-g { + description + "PCFPDSN Object configured for 1x. {{object|.CellConfig.CDMA2000.OneX.BatchPCFPDSN.{i}.}} table should be used to configure PDSN details."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.Alias"; + } + leaf pdsn-number { + type int64; + description + "Index of this PDSN object in the PCFPDSNCollection array. The index is used as PDSN number in PDSN selection algorithm. ({{bibref|3GPP2-A.S0013}})"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PDSNNumber"; + } + leaf security-parameter-index { + type uint32 { + range "0 | 256..4294967295"; + } + description + "Security Parameter Index used"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.SecurityParameterIndex"; + } + leaf security-key { + type binary { + length "0..16"; + } + description + "Secret key in 32-digit hexidecimal representation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.SecurityKey"; + } + leaf ios-version { + type enumeration { + enum "tia-878-ballot" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.IOSVersion - TIA-878-ballot"; + } + enum "tia-878-1" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.IOSVersion - TIA-878-1"; + } + enum "tia-878-a" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.IOSVersion - TIA-878-a"; + } + enum "tia-878-legacy" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.IOSVersion - TIA-878-legacy"; + } + } + config false; + description + "HRPD IOS Version of this PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.IOSVersion"; + } + leaf pds-nadmin-status { + type int64; + config false; + description + "Administrative status of this PDSN. 0- UP 1-DOWN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PDSNadminStatus"; + } + leaf pdsn-health-status { + type uint8 { + range "0..1"; + } + config false; + description + "Reachability status of this PDSN. 0-unreachable, 1-reachable."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PDSNHealthStatus"; + } + leaf pdsnip-address { + type inet:ip-address; + config false; + description + "IP address of the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PDSNIPAddress"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}."; + } + + grouping cdma2000-one-x-pcfpdsn-a11-reg-update-stats-g { + description + "This object is used in obtaining the A11 Registration Update stats for each PDSN"; + leaf pdsn-number-reg-update-perf { + type int64; + description + "The PDSN Number"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.PDSNNumberRegUpdatePerf"; + } + leaf pdsnip-address-reg-update-perf { + type inet:ip-address; + description + "The IP Address of the PDSN for which the A11 Reg Update stats is obtained"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.PDSNIPAddressRegUpdatePerf"; + } + leaf a11-reg-update-received-pdsn { + type uint64; + description + "Number of A10 Reg-update messages receieved from a PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateReceivedPDSN"; + } + leaf a11-reg-update-id-check-fail-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages receieved from a PDSN that failed ID validation"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateIDCheckFailPDSN"; + } + leaf a11-reg-update-auth-check-fail-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN that failed Authentication"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateAuthCheckFailPDSN"; + } + leaf a11-reg-update-for-unknown-psipdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with unknown PSI"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateForUnknownPSIPDSN"; + } + leaf a11-reg-update-unspecified-reason-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with unspecified reason code"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateUnspecifiedReasonPDSN"; + } + leaf a11-reg-update-ppp-timeout-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"PPP Timeout\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdatePppTimeoutPDSN"; + } + leaf a11-reg-update-registration-timeout-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"Registration Timeout\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateRegistrationTimeoutPDSN"; + } + leaf a11-reg-update-pdsn-error-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"PDSN Error\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdatePDSNErrorPDSN"; + } + leaf a11-reg-update-inter-pcf-handoff-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"Inter PCF Handoff\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateInterPCFHandoffPDSN"; + } + leaf a11-reg-update-inter-pdsn-handoff-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"Inter PDSN Handoff\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateInterPDSNHandoffPDSN"; + } + leaf a11-reg-update-pdsnoamp-intervention-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"PDSN OAMP Intervention\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdatePDSNOAMPInterventionPDSN"; + } + leaf a11-reg-update-accounting-error-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"Accounting Error\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateAccountingErrorPDSN"; + } + leaf a11-reg-update-user-failed-authentication-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"User Failed Authentication\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateUserFailedAuthenticationPDSN"; + } + leaf a11-reg-update-unknown-cause-code-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with Unknown Cause Code"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateUnknownCauseCodePDSN"; + } + leaf a11-reg-update-without-reason-code-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with PDSN Code Not Included"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateWithoutReasonCodePDSN"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.A11RegUpdateStats."; + } + + grouping cdma2000-one-x-pcfpdsn-pcfpdsn-stats-g { + description + "This object is used in obtaining the PCF PDSN stats for each PDSN"; + leaf a10-setup-attempts-pdsn { + type uint64; + description + "Number of attempts the PCF made to establish an A10 connection with PDSN. If PCF fails establishing such a connection on this PDSN and goes on to use another PDSN for that connection, it will be counted as two setup attempts."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A10SetupAttemptsPDSN"; + } + leaf a10-setup-successes-pdsn { + type uint64; + description + "Number of times PCF succeeded in establishing an A10 connection with this PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A10SetupSuccessesPDSN"; + } + leaf a10-setup-blocks-pdsn { + type uint64; + description + "Number of times PCF was blocked in establishing an A10 connection with this PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A10SetupBlocksPDSN"; + } + leaf a11-reg-req-denied-id-mismatch-pdsn { + type uint64; + description + "Number ofA11 Registration Request denied with a reason \"Id Mismatch\" (A11 error code: 0x85) by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedIdMismatchPDSN"; + } + leaf a11-reg-req-denied-unknown-pdsnpdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Unknown PDSN\" (A11 error code: 0x88)by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedUnknownPDSNPDSN"; + } + leaf a11-reg-req-denied-no-reason-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with no reason code by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedNoReasonPDSN"; + } + leaf a11-reg-req-denied-admin-prohibit-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Admin Prohibited\" (A11 error code : 0x81) by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedAdminProhibitPDSN"; + } + leaf a11-reg-req-denied-insuff-resources-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Insufficient Resources\" (A11 error code: 0x82) by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedInsuffResourcesPDSN"; + } + leaf a11-reg-req-denied-failed-auth-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Mobile Node Authentication Failure\" (A11 error code: 0x83) by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedFailedAuthPDSN"; + } + leaf a11-reg-req-denied-malformed-req-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Malformed Request\" (A11 error code: 0x86) by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedMalformedReqPDSN"; + } + leaf a11-reg-req-denied-unsupp-vend-id-pdsn { + type uint64; + description + "Number ofA11 Registration Request denied with a reason \"Unsupported Vendor Id\" (A11 error code: 0x8D)by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedUnsuppVendIdPDSN"; + } + leaf a11-reg-req-denied-reverse-tunnel-unavailable-pdsn { + type uint64; + description + "Number ofA11 Registration Request denied with a reason \"Reverse Tunnel Unavailable\" (A11 error code: 0x89)by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedReverseTunnelUnavailablePDSN"; + } + leaf a11-reg-req-denied-reverse-tunnel-tbit-not-set-pdsn { + type uint64; + description + "Number ofA11 Registration Request denied with a reason \"Reverse Tunnel Tbit Not Set\" (A11 error code: 0x8A)by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedReverseTunnelTbitNotSetPDSN"; + } + leaf a11-reg-req-denied-unknown-error-code-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with an unspecified reason (A11 error code : 0x80) by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedUnknownErrorCodePDSN"; + } + leaf a10-reg-req-for-registration-retransmissions-pdsn { + type uint64; + description + "Number of A11 Registration Requests retransmitted during A10 setup"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A10RegReqForRegistrationRetransmissionsPDSN"; + } + leaf a10-reg-req-for-re-registration-retransmissions-pdsn { + type uint64; + description + "Number of A11 Registration Requests retransmitted during A10 reregistration"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A10RegReqForReRegistrationRetransmissionsPDSN"; + } + leaf a10-reg-req-for-release-retransmissions-pdsn { + type uint64; + description + "Number of A11 Registration Requests retransmitted during A10 realease"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.A10RegReqForReleaseRetransmissionsPDSN"; + } + leaf pdsn-number-pdsn-perf { + type int64; + description + "The PDSN Number"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.PDSNNumberPDSNPerf"; + } + leaf pds-nip-address-pdsn-perf { + type inet:ip-address; + description + "The IP Address of the PDSN for which the PCF PDSN stats is obtained"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats.PDSNipAddressPDSNPerf"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.PCFPDSN.{i}.PCFPDSNStats."; + } + + grouping cdma2000-one-x-stats-g { + description + "This object contains 1x FAP statistics aggregated over all connections of all users over all sectors."; + leaf registration-attempts { + type uint32 { + range "0..4294967295"; + } + description + "Total number of registration attempts"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.RegistrationAttempts"; + } + leaf registration-fails { + type uint32 { + range "0..4294967295"; + } + description + "Total number of registrations failed"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.RegistrationFails"; + } + leaf registrations-blocked { + type uint32 { + range "0..4294967295"; + } + description + "Unauthorized registrations blocked by admission control"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.RegistrationsBlocked"; + } + leaf page-attempts { + type uint32 { + range "0..4294967295"; + } + description + "Total number of attemots to page requests received from the core"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.PageAttempts"; + } + leaf page-fails { + type uint32 { + range "0..4294967295"; + } + description + "Total number of page requests rejected or not responded"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.PageFails"; + } + leaf voice-call-attempts { + type uint32 { + range "0..4294967295"; + } + description + "Total number of voice call attempts"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.VoiceCallAttempts"; + } + leaf voice-call-failures { + type uint32 { + range "0..4294967295"; + } + description + "Total number of voice call attempts which failed for various reasons"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.VoiceCallFailures"; + } + leaf voice-calls-blocked { + type uint32 { + range "0..4294967295"; + } + description + "Total number of voice calls blocked due to lack of authorization"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.VoiceCallsBlocked"; + } + leaf voice-calls-dropped { + type uint32 { + range "0..4294967295"; + } + description + "Number of voice calls dropped due to various reasons other than a normal call release"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.VoiceCallsDropped"; + } + leaf data-call-attempts { + type uint32 { + range "0..4294967295"; + } + description + "Total number of data call attempts"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.DataCallAttempts"; + } + leaf data-call-failures { + type uint32 { + range "0..4294967295"; + } + description + "Total number of data call attemots failed for various reasons"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.DataCallFailures"; + } + leaf data-calls-blocked { + type uint32 { + range "0..4294967295"; + } + description + "Total number of data calls failed due to lack of authorization"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.DataCallsBlocked"; + } + leaf data-calls-dropped { + type uint32 { + range "0..4294967295"; + } + description + "Total number of data calls dropped due to reasons other than a normal release."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.DataCallsDropped"; + } + leaf average-voice-call { + type uint32 { + range "0..4294967295"; + } + units "milliseconds"; + description + "Average voice call duration in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.AverageVoiceCall"; + } + leaf average-data-call { + type uint32 { + range "0..4294967295"; + } + units "milliseconds"; + description + "Average data call duration in {{units}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.AverageDataCall"; + } + leaf average-session-in-sec { + type uint32 { + range "0..4294967295"; + } + units "seconds"; + description + "Average session duration in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.AverageSessionInSec"; + } + leaf total-voice-calls { + type uint32 { + range "0..4294967295"; + } + units "seconds"; + description + "Total number of successful voice calls"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.TotalVoiceCalls"; + } + leaf total-data-calls { + type uint32 { + range "0..4294967295"; + } + description + "Total number of successful data calls"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.TotalDataCalls"; + } + leaf fwd-voice-packet-drop-percentage { + type uint32 { + range "0..4294967295"; + } + description + "Percentage of voice packets dropped in MAC due to signaling"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.FwdVoicePacketDropPercentage"; + } + leaf rev-voice-packet-drop-percentage { + type uint32 { + range "0..4294967295"; + } + description + "Percentage of voice packets received with bad FQI"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.RevVoicePacketDropPercentage"; + } + leaf fwd-avg-data-rate { + type uint32 { + range "0..4294967295"; + } + description + "Average data rate of the scheduler on the forward link"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.FwdAvgDataRate"; + } + leaf rev-avg-data-rate { + type uint32 { + range "0..4294967295"; + } + description + "Average data rate of the scheduler on reverse link"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.RevAvgDataRate"; + } + leaf bc-index-zero-to-one-transitions { + type uint32 { + range "0..4294967295"; + } + description + "Num of times the bcIndex was changed from 0 to 1 in the Extended System Parameters Message."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.BcIndexZeroToOneTransitions"; + } + leaf bc-index-one-to-zero-transitions { + type uint32 { + range "0..4294967295"; + } + description + "Num of times the bcIndex was changed from 0 to 1 in the Extended System Parameters Message."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats.BcIndexOneToZeroTransitions"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Stats."; + } + + grouping cdma2000-one-x-redirect-g { + description + "CDMA2000 1x service redirection parameters."; + leaf redirect-channel-number { + type uint16 { + range "0..2047"; + } + config false; + description + "The channel number set from ACS that the FAP uses to redirect the MS in case of closed access or when exceeding session capacity. The ACS shall push this if the the operator has provided this information in a configuration file. If this is not configured, the FAP rejects the AT. The supported range is 0..2047."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Redirect.RedirectChannelNumber"; + } + leaf redirect-band-class { + type uint8 { + range "0..31"; + } + config false; + description + "The bandclass set from ACS that the FAP uses to redirect the MS incase of closed access or when exceeding session capacity. The ACS shall push this if the the operator has provided this information in a configuration file. If this is not configured, the FAP rejects the MS. The supported range is 0..9."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Redirect.RedirectBandClass"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.OneX.Redirect."; + } + + grouping cdma2000-hrpd-g { + description + "The object contains attributes related to HRPD."; + leaf pcfpdsn-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSNNumberOfEntries"; + } + leaf max-batch-pcfpdsn-entries { + type uint64; + description + "Maximum number of entries in the {{object|.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.MaxBatchPCFPDSNEntries"; + } + leaf batch-pcfpdsn-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSNNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD."; + } + + grouping cdma2000-hrpd-ran-g { + description + "The object contains attributes related to HRPD RAN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN."; + } + + grouping cdma2000-hrpd-ran-rf-g { + description + "Contains the details related to HRPD RF"; + leaf hrpd-car-band-class { + type uint8 { + range "0..31"; + } + config false; + description + "The Band Class this HRPD Carrier object is to operate on. Reference - {{bibref|3GPP2-C.S0057}}, Band Class Specification for CDMA2000 Spread Spectrum Systems."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.HRPDCarBandClass"; + } + leaf-list rfcnfl { + type string { + length "0..64"; + } + config false; + min-elements 1; + description + "{{list}} Each item is a FL Radio Frequency Channel Number (RFCN). Self-configuration for RFCNFL is controlled by {{param|.Capabilities.CDMA2000.HRPD.SelfConfig.RFCNFLConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.HRPD.SelfConfig.RFCNFLSelfConfigEnable}} from an enabled perspective. If the FAP's self-configuration capability for RFCNFL is available and enabled, this parameter MAY contain more than one item and the FAP is expected to select one from the list for {{param|RFCNFLInUse}}. If the self-configuration capability is not available or not enabled, then this parameter SHOULD contain only a single item. If multiple items are specified, they are done in the order of preference."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.RFCNFL"; + } + leaf rfcnfl-in-use { + type uint64; + description + "The FL RFCN being used by the FAP. Self-configuration for RFCNFL is controlled by {{param|.Capabilities.CDMA2000.HRPD.SelfConfig.RFCNFLConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.HRPD.SelfConfig.RFCNFLSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in {{param|RFCNFL}}. If the self-configuration capability is not available or not enabled, then this parameter contains the first value in {{param|RFCNFL}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.RFCNFLInUse"; + } + leaf-list pilot-pn { + type string { + length "0..64"; + } + config false; + description + "{{list}} (maximum length 32) (minimum 1 items) of strings. Each item is a pilot PN offset in units of 64 PN chips. Self-configuration for pilot PN is controlled by {{param|.Capabilities.CDMA2000.HRPD.SelfConfig.PilotPNConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.HRPD.SelfConfig.PilotPNSelfConfigEnable}} from an enabled perspective. If the FAP's self-configuration capability for Pilot PN Offset is available and enabled, this parameter MAY contain more than one item and the FAP is expected to select one from the list for {{param|PilotPNInUse}}. If the self-configuration capability is not available or not enabled, then this parameter SHOULD contain only a single item. The multiplicity of the PN offsets values can also be expressed by defining a range using \"..\" (two periods) between two values. In this case, the combination of two values defines the lower-bound and upper-bound of the range inclusive. The order of the items has no significance."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.PilotPN"; + } + leaf pilot-pn-in-use { + type uint64; + config false; + description + "The Pilot PN Offset being used by the FAP. Self-configuration for Pilot PN Offset is controlled by {{param|.Capabilities.CDMA2000.HRPD.SelfConfig.PilotPNConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.HRPD.SelfConfig.PilotPNSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the choices provided in {{param|PilotPN}}. If the self-configuration capability is not available or not enabled, then this parameter contains the first value in {{param|PilotPN}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.PilotPNInUse"; + } + leaf maxfap-tx-power { + type string { + length "0..64"; + } + config false; + description + "Defines the maximum transmission power allowed on the FAP. {{param}} is expressed as a range of allowed maximum power levels with \"..\" (two periods) between the upper and lower values, i.e. \"<;Pmax_low>..<;Pmax_high>\". {{param}} identifies the limits between which the FAP can self-configure its maximum transmit power. Self-configuration for maximum transmission power is controlled by {{param|.Capabilities.CDMA2000.HRPD.SelfConfig.MaxFAPTxPowerConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.HRPD.SelfConfig.MaxFAPTxPowerSelfConfigEnable}} from an enabled perspective. <;Pmax_low> and <;Pmax_high> are measured in dBm and have a range of -40.0 to 20.0 incremented by 0.1 dB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.MaxFAPTxPower"; + } + leaf maxfap-tx-power-in-use { + type int64; + units "0.1 dBm"; + config false; + description + "The maximum transmission power measured in {{units}} currently used by the FAP. Actual values of the maximum transmission power are -40.0 dBm to 20.0 dBm in steps of {{units}}. The value of {{param}} divided by 10 yields the actual value of the maximum transmission power. Self-configuration for maximum transmission power is controlled by {{param|.Capabilities.CDMA2000.HRPD.SelfConfig.MaxFAPTxPowerConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.HRPD.SelfConfig.MaxFAPTxPowerSelfConfigEnable}} from an enabled perspective. If the self-configuration capability is available and enabled, this parameter indicates the value selected by the FAP among the range provided in {{param|MaxFAPTxPower}}. If the self-configuration capability is not available or not enabled, then this parameter contains a value selected by the ACS."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.MaxFAPTxPowerInUse"; + } + leaf control-channel-rate { + type int64; + config false; + description + "The data rate of the Control Channel of this HRPD SectorElement object. Reference - {{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification, section-10.4.1.3.2.4"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.ControlChannelRate"; + } + leaf sync-capsule-offset { + type int64; + config false; + description + "The offset from the control channel cycle boundary at which the synchronous capsules are to be transmitted for this HRPD SectorElement object. Reference -{{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification, section-9.2.6.1.4.1.2"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.SyncCapsuleOffset"; + } + leaf rab-length { + type int64; + config false; + description + "The Reverse Activity Bit (RAB) length measured in slots for this HRPD SectorElement object. Reference -{{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification, section-7.8.6.2.2, Table 9.7.6.2-2."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.RabLength"; + } + leaf rab-offset { + type int64; + config false; + description + "The Reverse Activity Bit (RAB) offset for this HRPD SectorElement object. Reference - {{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification, section-7.8.6.2.2."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.RabOffset"; + } + leaf sector-id { + type binary { + length "16"; + } + config false; + description + "The 128 bit Sector ID for this HRPD SectorElement object. The Sector ID is used in the computation of the long code mask. See {{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.SectorID"; + } + leaf color-code { + type int64; + config false; + description + "The HRPD color code associated with this sector-element. Reference -{{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.ColorCode"; + } + leaf subnet-mask-length { + type int64; + units "bits"; + config false; + description + "{{param}} is the length of the HRPD SubnetMask in {{units}}. See {{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.SubnetMaskLength"; + } + leaf hrpd-sec-el-reverse-link-silence-duration { + type int64; + units "frames"; + config false; + description + "Duration of the Reverse Link Silence Interval in units of {{units}}. The duration of the silence interval to be maintained on the reverse link. Reference -{{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification. Section-9.4.6.1.4.1.1."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.HRPDSecElReverseLinkSilenceDuration"; + } + leaf hrpd-sec-el-reverse-link-silence-period { + type int64; + units "frames"; + config false; + description + "The Reverse Link Silence Interval is defined as the time interval of duration ReverseLinkSilenceDuration frames that starts at times T where T is the CDMA System Time in units of {{units}} and it satisfies the following equation: T mod (2048 x 2^(ReverseLinkSilencePeriod) - 1) = 0. The period in the access cycle duration for which the silence interval shall be maintained on the reverse link. {{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification. Section-9.4.6.1.4.1.1."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.HRPDSecElReverseLinkSilencePeriod"; + } + leaf open-loop-adjust { + type int64; + units "dB"; + config false; + description + "The open loop adjustment (in {{units}}) for the access parameters of this sector-element. FAP sets this field to the negative of the nominal power to be used by ATs in the open loop power estimate, expressed as an unsigned value in units of 1 dB. The value used by the AT is -1 times the value of this field. Reference -{{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification. Section-9.4.6.2.6"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.OpenLoopAdjust"; + } + leaf probe-initial-adjust { + type int64; + units "dB"; + config false; + description + "The probe initial adjustment (in {{units}}) for the access parameters of this sector-element. FAP sets this field to the correction factor to be used by ATs in the open loop power estimate for the initial transmission on the Access Channel, expressed as a two's complement value in units of 1 dB. Reference -{{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification. Section-9.4.6.2.6"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.ProbeInitialAdjust"; + } + leaf probe-num-steps { + type int64; + config false; + description + "The number of power level steps for access probes for the access parameters of this sector-element. FAP sets this field to the maximum number of access probes ATs are to transmit in a single access probe sequence. The access network shall set this field to a value in the range [1 ... 15]. Reference -{{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification. Section-9.4.6.2.6"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.ProbeNumSteps"; + } + leaf probe-power-step { + type int64; + units "0.5 dB"; + config false; + description + "The power step size (in {{units}}) applied to successive probes on the access channel associated with this sector-element. Probe power increase step. FAPsets this field to the increase in power between probes, in resolution of 0.5 dB. Reference -{{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification. Section-9.4.6.2.6"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.ProbePowerStep"; + } + leaf a-persistence { + type string { + length "0..16"; + } + config false; + description + "The A-Persistence vector, as per HRPD specification, for controlling contention access on the access channel associated with this sector-element. Reference - {{bibref|3GPP2-C.S0024-B}}, CDMA2000 High Rate Packet Data Air Interface Specification. Section-9.4.6.2.6. Format is \"0xAABBCCDD\", where AA, BB, CC, DD are in the range \"01\" through \"3F\" hex."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.APersistence"; + } + leaf rssirab-threshold { + type int64; + units "0.125 dBm"; + config false; + description + "RAB threshold for RSSI based RAB algorithm."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.RSSIRABThreshold"; + } + leaf load-rab-threshold { + type uint16 { + range "0..480"; + } + units "0.125 dB"; + config false; + description + "RAB threshold for Load based RAB algorithm in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.LoadRABThreshold"; + } + leaf connection-rate-limit { + type uint8 { + range "0..3"; + } + config false; + description + "4 different configurations."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.ConnectionRateLimit"; + } + leaf rfe-rl-balance-ratio { + type uint8 { + range "1..20"; + } + config false; + description + "Config Parameter for DRC based rate control"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF.RfeRLBalanceRatio"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RAN.RF."; + } + + grouping cdma2000-hrpd-pcf-config-g { + description + "CDMA2000 HRPD PCF configuration parameters."; + leaf pcfpdsn-health-monitor-interval { + type uint8 { + range "0..180"; + } + units "seconds"; + config false; + description + "PDSN health check monitor interval in {{units}}. Setting the value to 0 disables the PDSN Health Monitoring Feature. Setting any non-zero value enables the PDSN Health Monitoring Feature and sets that non-zero value as the timer interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPDSNHealthMonitorInterval"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig."; + } + + grouping cdma2000-hrpd-pcf-config-pcf-performance-stats-g { + description + "This object is used in obtaining the PCF stats"; + leaf a10-setup-failure-no-reason { + type uint64; + description + "Number of times the PCF was refused an A10 connection with an unspecified reason (A11 error code : 0x80)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10SetupFailureNoReason"; + } + leaf a10-setup-failure-admin-prohibit { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Admin Prohibited\" (A11 error code : 0x81)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10SetupFailureAdminProhibit"; + } + leaf a10-setup-failure-insuff-resources { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Insufficient Resources\" (A11 error code: 0x82)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10SetupFailureInsuffResources"; + } + leaf a10-setup-failure-failed-auth { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Mobile Node Authentication Failure\" (A11 error code: 0x83)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10SetupFailureFailedAuth"; + } + leaf a10-setup-failure-id-mismatch { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Id Mismatch\" (A11 error code: 0x85)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10SetupFailureIdMismatch"; + } + leaf a10-setup-failure-malformed-req { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Malformed Request\" (A11 error code: 0x86)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10SetupFailureMalformedReq"; + } + leaf a10-setup-failure-unknown-pdsn { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Unknown PDSN\" (A11 error code: 0x88)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10SetupFailureUnknownPDSN"; + } + leaf a10-setup-failure-unsupp-vend-id { + type uint64; + description + "Number of times the PCF was refused an A10 connection with a reason \"Unsupported Vendor Id\" (A11 error code: 0x89)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10SetupFailureUnsuppVendId"; + } + leaf total-a10-closed-by-rnc { + type uint64; + description + "Number of A10 closed by the FAP RNC"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.TotalA10ClosedByRnc"; + } + leaf total-a10-closed-by-pdsn { + type uint64; + description + "Number of A10 closed by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.TotalA10ClosedByPDSN"; + } + leaf total-a10-success-pages { + type uint64; + description + "Numebr of A10 Pages initiated by PCFsucceeded"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.TotalA10SuccessPages"; + } + leaf total-a10-failed-pages { + type uint64; + description + "Numebr of A10 Pages initiated by PCF failed"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.TotalA10FailedPages"; + } + leaf total-a10-ingress-bytes { + type uint64; + units "bytes"; + description + "Number of {{units}} received from the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.TotalA10IngressBytes"; + } + leaf total-a10-egress-bytes { + type uint64; + units "bytes"; + description + "Number of {{units}} transmitted to the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.TotalA10EgressBytes"; + } + leaf a10-reg-update-received { + type uint64; + description + "Number of A10 Registration updates received by the FAP PCF"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.A10RegUpdateReceived"; + } + leaf total-a10-dropped-pages { + type uint64; + description + "Number of A10 Pages initiated by PCF dropped"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats.TotalA10DroppedPages"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFConfig.PCFPerformanceStats."; + } + + grouping cdma2000-hrpd-batch-pcfpdsn-g { + description + "The Batch configuration Object used to configure PDSN table using a start and end IP address. The order of the address is used as part of PDSN selection algorithm, e.g., the first element is considered PDSN number 0 (refer to {{bibref|3GPP2-A.S0008}} and {{bibref|3GPP2-A.S0009}}). To get individual PDSN entries use the {{object|.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.}}."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.Alias"; + } + leaf batch-table-number { + type int64; + description + "The BatchTable Number should be given only once during the creation of a Batch Table. This is the Key Attribute that uniquely identifies a BatchTable entry"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableNumber"; + } + leaf batch-table-start-ip-address { + type inet:ip-address; + config false; + description + "Start IP address of the range of PDSNs"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableStartIPAddress"; + } + leaf batch-table-end-ip-address { + type inet:ip-address; + config false; + description + "End IP address of the range of PDSNs"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableEndIPAddress"; + } + leaf batch-table-security-parameter-index { + type uint32 { + range "0 | 256..4294967295"; + } + description + "Security Parameter Index to be used"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableSecurityParameterIndex"; + } + leaf batch-table-secret-key { + type binary { + length "0..16"; + } + description + "Secret key in 32-digit hexidecimal representation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableSecretKey"; + } + leaf batch-table-ios-version { + type enumeration { + enum "tia-878-ballot" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableIOSVersion - TIA-878-ballot"; + } + enum "tia-878-1" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableIOSVersion - TIA-878-1"; + } + enum "tia-878-a" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableIOSVersion - TIA-878-a"; + } + enum "tia-878-legacy" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableIOSVersion - TIA-878-legacy"; + } + } + config false; + description + "HRPD IOS Version of this PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTableIOSVersion"; + } + leaf batch-table-pdsn-admin-status { + type int64; + config false; + description + "Administrative status of this PDSN. 0- UP 1-DOWN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.BatchTablePDSNAdminStatus"; + } + leaf pdsn-type { + type string { + length "0..32"; + } + config false; + description + "Indicates the PDSN type for this batch."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.PDSNType"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}."; + } + + grouping cdma2000-hrpd-pcfpdsn-g { + description + "PCFPDSN Object configured for HRPD. {{object|.CellConfig.CDMA2000.HRPD.BatchPCFPDSN.{i}.}} table should be used to configure PDSN details."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.Alias"; + } + leaf pdsn-number { + type int64; + description + "Index of this PDSN object in the PCFPDSNCollection array. The index is used as PDSN number in PDSN selection algorithm (refer to {{bibref|3GPP2-A.S0008}} and {{bibref|3GPP2-A.S0009}})"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PDSNNumber"; + } + leaf security-parameter-index { + type uint32 { + range "256..4294967295"; + } + description + "Security Parameter Index used"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.SecurityParameterIndex"; + } + leaf security-key { + type binary { + length "0..16"; + } + description + "Secret key in 32-digit hexidecimal representation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.SecurityKey"; + } + leaf ios-version { + type enumeration { + enum "tia-878-ballot" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.IOSVersion - TIA-878-ballot"; + } + enum "tia-878-1" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.IOSVersion - TIA-878-1"; + } + enum "tia-878-a" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.IOSVersion - TIA-878-a"; + } + enum "tia-878-legacy" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.IOSVersion - TIA-878-legacy"; + } + } + config false; + description + "HRPD IOS Version of this PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.IOSVersion"; + } + leaf pds-nadmin-status { + type int64; + config false; + description + "Administrative status of this PDSN. 0- UP 1-DOWN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PDSNadminStatus"; + } + leaf pdsn-health-status { + type uint8 { + range "0..1"; + } + config false; + description + "Reachability status of this PDSN. 0-unreachable, 1-reachable."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PDSNHealthStatus"; + } + leaf pdsnip-address { + type inet:ip-address; + config false; + description + "IP address of the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PDSNIPAddress"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}."; + } + + grouping cdma2000-hrpd-pcfpdsn-a11-session-update-stats-g { + description + "This object is used in obtaining the A11 Session Update stats for each PDSN"; + leaf pdsn-number-session-update-perf { + type int64; + description + "The PDSN Number"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.PDSNNumberSessionUpdatePerf"; + } + leaf pdsnip-address-session-update-perf { + type inet:ip-address; + description + "The IP Address of the PDSN for which the A11 Session Update stats is obtained"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.PDSNIPAddressSessionUpdatePerf"; + } + leaf a11-session-update-received-pdsn { + type uint64; + description + "Number of A11 Session Updates received from a PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateReceivedPDSN"; + } + leaf a11-session-update-accepted-pdsn { + type uint64; + description + "Number of A11 Session Updates accepted for a PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateAcceptedPDSN"; + } + leaf a11-session-update-extended-apipdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN that contained extended API"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateExtendedAPIPDSN"; + } + leaf a11-session-update-for-unknown-psipdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN that conatained unknown PSI"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateForUnknownPSIPDSN"; + } + leaf a11-session-update-denied-id-check-fail-pdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN denied due to reason code \"ID Check Failed \""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateDeniedIDCheckFailPDSN"; + } + leaf a11-session-update-denied-auth-check-fail-pdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN denied due to reason code\"Auth Check Failed\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateDeniedAuthCheckFailPDSN"; + } + leaf a11-session-update-denied-reason-unspecified-pdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN denied due to reason code \"Unspecified Reason\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateDeniedReasonUnspecifiedPDSN"; + } + leaf a11-session-update-denied-poorly-formed-pdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN denied due to reason code \"Poorly Formed\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateDeniedPoorlyFormedPDSN"; + } + leaf a11-session-update-denied-session-params-not-updated-pdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN denied due to reason code \"Parameters Not Updated\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateDeniedSessionParamsNotUpdatedPDSN"; + } + leaf a11-session-update-denied-qo-s-profile-id-not-supported-pdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN denied due to reason code \"QoS Profile Id Not Updated\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateDeniedQoSProfileIdNotSupportedPDSN"; + } + leaf a11-session-update-denied-insufficient-resources-pdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN denied due to reason code \"Insufficient Resources\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateDeniedInsufficientResourcesPDSN"; + } + leaf a11-session-update-denied-handoff-in-progress-pdsn { + type uint64; + description + "Number of A11 Session Updates received from this PDSN denied due to reason code\"Handoff In Progress\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats.A11SessionUpdateDeniedHandoffInProgressPDSN"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11SessionUpdateStats."; + } + + grouping cdma2000-hrpd-pcfpdsn-a11-reg-update-stats-g { + description + "This object is used in obtaining the A11 Registration Update stats for each PDSN."; + leaf pdsn-number-reg-update-perf { + type int64; + description + "The PDSN Number"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.PDSNNumberRegUpdatePerf"; + } + leaf pdsnip-address-reg-update-perf { + type inet:ip-address; + description + "The IP Address of the PDSN for which the A11 Reg Update stats is obtained"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.PDSNIPAddressRegUpdatePerf"; + } + leaf a11-reg-update-received-pdsn { + type uint64; + description + "Number of A10 Reg-update messages receieved from a PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateReceivedPDSN"; + } + leaf a11-reg-update-id-check-fail-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages receieved from a PDSN that failed ID validation"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateIDCheckFailPDSN"; + } + leaf a11-reg-update-auth-check-fail-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN that failed Authentication"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateAuthCheckFailPDSN"; + } + leaf a11-reg-update-for-unknown-psipdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with unknown PSI"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateForUnknownPSIPDSN"; + } + leaf a11-reg-update-unspecified-reason-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with unspecified reason code"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateUnspecifiedReasonPDSN"; + } + leaf a11-reg-update-ppp-timeout-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"PPP Timeout\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdatePppTimeoutPDSN"; + } + leaf a11-reg-update-registration-timeout-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"Registration Timeout\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateRegistrationTimeoutPDSN"; + } + leaf a11-reg-update-pdsn-error-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"PDSN Error\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdatePDSNErrorPDSN"; + } + leaf a11-reg-update-inter-pcf-handoff-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"Inter PCF Handoff\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateInterPCFHandoffPDSN"; + } + leaf a11-reg-update-inter-pdsn-handoff-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"Inter PDSN Handoff\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateInterPDSNHandoffPDSN"; + } + leaf a11-reg-update-pdsnoamp-intervention-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"PDSN OAMP Intervention\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdatePDSNOAMPInterventionPDSN"; + } + leaf a11-reg-update-accounting-error-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"Accounting Error\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateAccountingErrorPDSN"; + } + leaf a11-reg-update-user-failed-authentication-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with reason code \"User Failed Authentication\""; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateUserFailedAuthenticationPDSN"; + } + leaf a11-reg-update-unknown-cause-code-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with Unknown Cause Code"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateUnknownCauseCodePDSN"; + } + leaf a11-reg-update-without-reason-code-pdsn { + type uint64; + description + "Number of A10 Reg-Update messages received from a PDSN with PDSN Code Not Included"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats.A11RegUpdateWithoutReasonCodePDSN"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.A11RegUpdateStats."; + } + + grouping cdma2000-hrpd-pcfpdsn-aux-a10-stats-g { + description + "This object is used in obtaining the Auxillary A10 Connection stats for each PDSN"; + leaf pdsn-number-aux-a10-perf { + type int64; + description + "The PDSN Number"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats.PDSNNumberAuxA10Perf"; + } + leaf pdsnip-address-aux-a10-perf { + type inet:ip-address; + description + "The IP Address of the PDSN for which the PCF PDSN stats is obtained"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats.PDSNIPAddressAuxA10Perf"; + } + leaf aux-a10-connections-created-in-first-reg-req-pdsn { + type uint64; + description + "Number of Auxillary A10 Connections Created in the First Registration Request Message to the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats.AuxA10ConnectionsCreatedInFirstRegReqPDSN"; + } + leaf aux-a10-connections-created-in-subsequent-reg-req-pdsn { + type uint64; + description + "Number of Auxillary A10 Connections Created in Subsequent Registration Request Messages to the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats.AuxA10ConnectionsCreatedInSubsequentRegReqPDSN"; + } + leaf aux-a10-fwd-ip-flows-created-pdsn { + type uint64; + description + "Number of Forward IP Flows created with this PDSN for the Auxillary A10s"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats.AuxA10FwdIpFlowsCreatedPDSN"; + } + leaf aux-a10-rev-ip-flows-created-pdsn { + type uint64; + description + "Number of Forward IP Flows created with this PDSN for the Auxillary A10s"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats.AuxA10RevIpFlowsCreatedPDSN"; + } + leaf aux-a10-ip-flow-accounting-reg-requests-pdsn { + type uint64; + description + "Number of IP flow Accounting Reg Requests sent to the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats.AuxA10IpFlowAccountingRegRequestsPDSN"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.AuxA10Stats."; + } + + grouping cdma2000-hrpd-pcfpdsn-pcfpdsn-stats-g { + description + "This object is used in obtaining the PCF PDSN stats for each PDSN"; + leaf a10-setup-attempts-pdsn { + type uint64; + description + "Number of attempts the PCF made to establish an A10 connection with PDSN. If PCF fails establishing such a connection on this PDSN and goes on to use another PDSN for that connection, it will be counted as two setup attempts."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A10SetupAttemptsPDSN"; + } + leaf a10-setup-successes-pdsn { + type uint64; + description + "Number of times PCF succeeded in establishing an A10 connection with this PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A10SetupSuccessesPDSN"; + } + leaf a10-setup-blocks-pdsn { + type uint64; + description + "Number of times PCF was blocked in establishing an A10 connection with this PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A10SetupBlocksPDSN"; + } + leaf a11-reg-req-denied-id-mismatch-pdsn { + type uint64; + description + "Number ofA11 Registration Request denied with a reason \"Id Mismatch\" (A11 error code: 0x85) by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedIdMismatchPDSN"; + } + leaf a11-reg-req-denied-unknown-pdsnpdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Unknown PDSN\" (A11 error code: 0x88)by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedUnknownPDSNPDSN"; + } + leaf a11-reg-req-denied-no-reason-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with no reason code by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedNoReasonPDSN"; + } + leaf a11-reg-req-denied-admin-prohibit-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Admin Prohibited\" (A11 error code : 0x81) by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedAdminProhibitPDSN"; + } + leaf a11-reg-req-denied-insuff-resources-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Insufficient Resources\" (A11 error code: 0x82) by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedInsuffResourcesPDSN"; + } + leaf a11-reg-req-denied-failed-auth-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Mobile Node Authentication Failure\" (A11 error code: 0x83) by the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedFailedAuthPDSN"; + } + leaf a11-reg-req-denied-malformed-req-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with a reason \"Malformed Request\" (A11 error code: 0x86) by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedMalformedReqPDSN"; + } + leaf a11-reg-req-denied-unsupp-vend-id-pdsn { + type uint64; + description + "Number ofA11 Registration Request denied with a reason \"Unsupported Vendor Id\" (A11 error code: 0x8D)by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedUnsuppVendIdPDSN"; + } + leaf a11-reg-req-denied-reverse-tunnel-unavailable-pdsn { + type uint64; + description + "Number ofA11 Registration Request denied with a reason \"Reverse Tunnel Unavailable\" (A11 error code: 0x89)by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedReverseTunnelUnavailablePDSN"; + } + leaf a11-reg-req-denied-reverse-tunnel-tbit-not-set-pdsn { + type uint64; + description + "Number ofA11 Registration Request denied with a reason \"Reverse Tunnel Tbit Not Set\" (A11 error code: 0x8A)by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedReverseTunnelTbitNotSetPDSN"; + } + leaf a11-reg-req-denied-unknown-error-code-pdsn { + type uint64; + description + "Number of A11 Registration Request denied with an unspecified reason (A11 error code : 0x80) by the PDSN"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A11RegReqDeniedUnknownErrorCodePDSN"; + } + leaf a10-reg-req-for-registration-retransmissions-pdsn { + type uint64; + description + "Number of A11 Registration Requests retransmitted during A10 setup"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A10RegReqForRegistrationRetransmissionsPDSN"; + } + leaf a10-reg-req-for-re-registration-retransmissions-pdsn { + type uint64; + description + "Number of A11 Registration Requests retransmitted during A10 reregistration"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A10RegReqForReRegistrationRetransmissionsPDSN"; + } + leaf a10-reg-req-for-release-retransmissions-pdsn { + type uint64; + description + "Number of A11 Registration Requests retransmitted during A10 realease"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.A10RegReqForReleaseRetransmissionsPDSN"; + } + leaf pdsn-number-pdsn-perf { + type int64; + description + "The PDSN Number"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.PDSNNumberPDSNPerf"; + } + leaf pds-nip-address-pdsn-perf { + type inet:ip-address; + description + "The IP Address of the PDSN for which the PCF PDSN stats is obtained"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats.PDSNipAddressPDSNPerf"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.PCFPDSN.{i}.PCFPDSNStats."; + } + + grouping cdma2000-hrpd-redirect-g { + description + "CDMA2000 HRPD service redirection parameters."; + leaf redirect-channel-number { + type uint16 { + range "0..2047"; + } + config false; + description + "The channel number set from ACS that the FAP uses to redirect the AT in case of closed access or when exceeding session capacity. The ACS shall push this if the the operator has provided this information in a configuration file. If this is not configured, the FAP rejects the AT. The supported range is 0..2047."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.Redirect.RedirectChannelNumber"; + } + leaf redirect-band-class { + type uint8 { + range "0..31"; + } + config false; + description + "The bandclass set from ACS that the FAP uses to redirect the AT incase of closed access or when exceeding session capacity. The ACS shall push this if the the operator has provided this information in a configuration file. If this is not configured, the FAP rejects the AT. The supported range is 0..9."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.Redirect.RedirectBandClass"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.Redirect."; + } + + grouping cdma2000-hrpd-call-control-stats-g { + description + "Details on call control stats"; + leaf num-session-setup-attempts { + type uint64; + description + "This parameter is a counter for the total number of session instances that are created on a specific FAP when a regular session setup attempt is initiated with an unknown RATI"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumSessionSetupAttempts"; + } + leaf num-session-setup-successful { + type uint64; + description + "This parameter is a counter for the total number of successful regular session setup attempts that are initiated with an unknown RATI"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumSessionSetupSuccessful"; + } + leaf num-current-sessions-established { + type uint64; + description + "This parameter is a counter for the total number of successfully established HRPD Sessions that exists on a specific picasso"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumCurrentSessionsEstablished"; + } + leaf num-page-messages-to-at { + type uint64; + description + "The number of times a Page Message was sent to the AT to facilitate the setup of a connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumPageMessagesToAt"; + } + leaf num-pages-succeeded { + type uint64; + description + "The total number of pages succeeded"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumPagesSucceeded"; + } + leaf num-connections-opened { + type uint64; + description + "Total HRPD Connections Opened"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumConnectionsOpened"; + } + leaf num-session-setups-failed-to-term-auth { + type uint64; + description + "This parameter is a counter for the total number of HRPD session setups that are aborted due to various failure reasons"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumSessionSetupsFailedToTermAuth"; + } + leaf num-forward-rlp-bytes { + type uint64; + units "bytes"; + description + "Number of HRPD packets(bytes) sent from PDSN to AT."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumForwardRLPBytes"; + } + leaf num-reverse-rlp-bytes { + type uint64; + units "bytes"; + description + "No. of HRPD packets(bytes) sent from AT to PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumReverseRLPBytes"; + } + leaf average-session-setup-time { + type uint64; + units "10 ms"; + description + "This parameter maintains a record of the average session setup time for all successfully setup sessions on a specific FAP. The average session setup time is in units of {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.AverageSessionSetupTime"; + } + leaf average-page-setup-time { + type uint64; + description + "The average connection setup time in response to a FAP initiated page. The time is from initiation of Page to the time the connection is declared open"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.AveragePageSetupTime"; + } + leaf num-conn-setups-aborted { + type uint64; + description + "The number of connection setups that were aborted"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumConnSetupsAborted"; + } + leaf num-forward-pre-rlp-dropped-pkts { + type uint64; + description + "Number of packets dropped at Pre-RLP queue due to overflow in forward direction. This counter will also be written to the performance log."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats.NumForwardPreRLPDroppedPkts"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.CallControlStats."; + } + + grouping cdma2000-hrpd-qo-s-stats-g { + description + "This object is used in obtaining the QoS Common Performance stats"; + leaf num-qo-s-subscriber-profile-updates-rcvd { + type uint64; + description + "Number of subscriber QoS profile updates received from the PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumQoSSubscriberProfileUpdatesRcvd"; + } + leaf num-pdsnip-flow-updates-msg-rcvd { + type uint64; + description + "Number of PDSN IP flow update messages received from PDSN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumPDSNIPFlowUpdatesMsgRcvd"; + } + leaf num-pdsnip-flow-updates-msg-failed { + type uint64; + description + "Number of PDSN IP Flow updates messages that failed per RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumPDSNIPFlowUpdatesMsgFailed"; + } + leaf num-qo-s-setup-requests-received { + type uint64; + description + "Number of QoS setup requests received from the AT."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumQoSSetupRequestsReceived"; + } + leaf num-qo-s-setup-requests-accepted { + type uint64; + description + "Number of QoS setup requests received from the AT that the FAP RNC accepted."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumQoSSetupRequestsAccepted"; + } + leaf num-qo-s-setup-requests-rejected { + type uint64; + description + "Number of QoS setup requests from the AT that the FAP RNC rejected."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumQoSSetupRequestsRejected"; + } + leaf num-reservation-on-requests-received { + type uint64; + description + "Number of ReservationOnRequest messages received from the AT."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumReservationOnRequestsReceived"; + } + leaf num-reservation-on-requests-accepted { + type uint64; + description + "Number of ReservationOnRequest messages received from the AT that the FAP RNC accepted."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumReservationOnRequestsAccepted"; + } + leaf num-reservation-on-requests-rejected { + type uint64; + description + "Number of ReservationOnRequest message received from the AT that the FAP RNC rejected."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumReservationOnRequestsRejected"; + } + leaf num-reservation-on-requests-failed { + type uint64; + description + "Number of ReservationOnRequest message received from the AT that the FAP RNC failed."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumReservationOnRequestsFailed"; + } + leaf num-fwd-reservation-on-messages-sent { + type uint64; + description + "Number of times the FAP RNC sent a FwdReservationOn message to the AT to activate a forward Reservation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumFwdReservationOnMessagesSent"; + } + leaf num-rev-reservation-on-messages-sent { + type uint64; + description + "Number of times the FAP RNC sent a RevReservationOn message to the AT to activate a reverse Reservation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumRevReservationOnMessagesSent"; + } + leaf num-reservation-off-requests-received { + type uint64; + description + "Number of ReservationOffRequest message is received from the AT."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumReservationOffRequestsReceived"; + } + leaf num-reservation-off-requests-accepted { + type uint64; + description + "Number of ReservationOffRequest messages received from the AT that the FAP RNC accepted."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumReservationOffRequestsAccepted"; + } + leaf num-reservation-off-requests-rejected { + type uint64; + description + "Number of ReservationOffRequest messages received from the AT that the FAP RNC rejected."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumReservationOffRequestsRejected"; + } + leaf num-fwd-reservation-off-messages-sent { + type uint64; + description + "Number of times the FAP RNC sent a FwdReservationOff message to the AT to deactivate a forward Reservation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumFwdReservationOffMessagesSent"; + } + leaf num-rev-reservation-off-messages-sent { + type uint64; + description + "Number of times the FAP RNC sent a RevReservationOff message to the AT to deactivate a reverse Reservation."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumRevReservationOffMessagesSent"; + } + leaf num-qo-s-release-requests-received { + type uint64; + description + "Number of QoS release requests received from the AT."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumQoSReleaseRequestsReceived"; + } + leaf num-connection-close-initiated-no-ran-rsr { + type uint64; + description + "Number of times FAP RNC initiated a connection close in response to the ReservationOnRequest because it did not have the RAN resources to satisfy one or more Reservations included in the request."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats.NumConnectionCloseInitiatedNoRANRsr"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.QoSStats."; + } + + grouping cdma2000-hrpd-rnc-sig-apps-stats-g { + description + "Stats for HRPD RNC signaling procedures."; + leaf c-num-page-requests { + type uint64; + description + "Number of HRPD Page requests made after data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumPageRequests"; + } + leaf s-num-page-requests { + type uint64; + description + "Number of HRPD Page requests made before data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumPageRequests"; + } + leaf s-num-connection-setup-attempts { + type uint64; + description + "Number of HRPD Connection setups attempted before data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumConnectionSetupAttempts"; + } + leaf c-num-connection-setup-attempts { + type uint64; + description + "Number of HRPD Connection setups attempted after data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumConnectionSetupAttempts"; + } + leaf s-num-connection-setup-success { + type uint64; + description + "Number of HRPD Connection setups succeeded before data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumConnectionSetupSuccess"; + } + leaf c-num-connection-setup-success { + type uint64; + description + "Number of HRPD Connection setups succeeded after data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumConnectionSetupSuccess"; + } + leaf s-num-normal-connection-closes { + type uint64; + description + "The number of HRPD connections that were closed normally before data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumNormalConnectionCloses"; + } + leaf c-num-normal-connection-closes { + type uint64; + description + "The number of HRPD connections that were closed normally after data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumNormalConnectionCloses"; + } + leaf s-num-total-connection-closes { + type uint64; + description + "The total number of HRPD connections closed, normally or abnormally, data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumTotalConnectionCloses"; + } + leaf c-num-total-connection-closes { + type uint64; + description + "The total number of HRPD connections closed, normally or abnormally, after data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumTotalConnectionCloses"; + } + leaf s-num-rf-related-drops { + type uint64; + description + "Number of HRPD connection close because of RTC loss or No FTC before data has flowed on the A10 connection"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumRFRelatedDrops"; + } + leaf c-num-rf-related-drops { + type uint64; + description + "Number of HRPD connection close because of RTC loss or No FTC after data has flowed on the A10 connection"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumRFRelatedDrops"; + } + leaf s-num-page-responses { + type uint64; + description + "Total number of successful responses to HRPD page requests that were received from the AT before the final page timeout and before data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumPageResponses"; + } + leaf c-num-page-responses { + type uint64; + description + "Total number of successful responses to HRPD page requests that were received from the AT before the final page timeout and after data has flowed on the A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumPageResponses"; + } + leaf s-num-rf-related-drops-rtc-lost { + type uint64; + description + "This statistic counts the number of times the HRPD connection was dropped before data has flowed on the A10 connection because a Reverse Traffic Channel (RTC) lost indication was received, and as a result, no reverse link for the connection were available."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumRFRelatedDropsRTCLost"; + } + leaf c-num-rf-related-drops-rtc-lost { + type uint64; + description + "This statistic counts the number of times the HRPD connection was dropped after data has flowed on the A10 connection because a Reverse Traffic Channel (RTC) lost indication was received, and as a result, no reverse link for the connection were available."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumRFRelatedDropsRTCLost"; + } + leaf s-num-rf-related-drops-no-ftc { + type uint64; + description + "This statistic counts the number of HRPD connections that were dropped before data has flowed on the A10 connection because of indications that there is no active Forward Traffic Channel (FTC) available."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumRFRelatedDropsNoFTC"; + } + leaf c-num-rf-related-drops-no-ftc { + type uint64; + description + "This statistic counts the number of HRPD connections that were dropped after data has flowed on the A10 connection because of indications that there is no active Forward Traffic Channel (FTC) available."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumRFRelatedDropsNoFTC"; + } + leaf s-num-network-error-drops { + type uint64; + description + "This statistic counts the number of HRPD connections that were closed before data has flowed on the A10 connection because the FAP closed the open A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumNetworkErrorDrops"; + } + leaf c-num-network-error-drops { + type uint64; + description + "This statistic counts the number of HRPD connections that were closed after data has flowed on the A10 connection because the FAP closed the open A10 connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumNetworkErrorDrops"; + } + leaf s-num-network-error-drops-rnc-internal { + type uint64; + description + "This statistic counts the number of open HRPD connections that were closed before data has flowed on the A10 connection because the FAP closed the A10 connection due to internal failures."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumNetworkErrorDropsRNCInternal"; + } + leaf c-num-network-error-drops-rnc-internal { + type uint64; + description + "This statistic counts the number of open HRPD connections that were closed after data has flowed on the A10 connection because the FAP closed the A10 connection due to internal failures."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumNetworkErrorDropsRNCInternal"; + } + leaf s-num-network-error-drops-rnc-external { + type uint64; + description + "This statistic counts the number of open HRPD connections that were closed before data has flowed on the A10 connection because the FAP closed the A10 connection due to the PDSN unreachablity."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumNetworkErrorDropsRNCExternal"; + } + leaf c-num-network-error-drops-rnc-external { + type uint64; + description + "This statistic counts the number of open HRPD connections that were closed after data has flowed on the A10 connection because the FAP closed the A10 connection due to the PDSN unreachablity."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumNetworkErrorDropsRNCExternal"; + } + leaf s-num-network-error-drops-a10-setup-fail { + type uint64; + description + "This statistic counts the number of open HRPD connections that were closed before data has flowed on the A10 connection because there was failure in the A10 connection set-up."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumNetworkErrorDropsA10SetupFail"; + } + leaf c-num-network-error-drops-a10-setup-fail { + type uint64; + description + "This statistic counts the number of open HRPD connections that were closed after data has flowed on the A10 connection because there was failure in the A10 connection set-up."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumNetworkErrorDropsA10SetupFail"; + } + leaf s-num-misc-drops-sector-down { + type uint64; + description + "This statistic counts the number of HRPD connections that were dropped before data has flowed on the A10 connection because there is only one pilot available for the connection and a sector down indication has been received for that pilot."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumMiscDropsSectorDown"; + } + leaf c-num-misc-drops-sector-down { + type uint64; + description + "This statistic counts the number of HRPD connections that were dropped after data has flowed on the A10 connection because there is only one pilot available for the connection and a sector down indication has been received for that pilot."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumMiscDropsSectorDown"; + } + leaf s-num-misc-drops-internal-error { + type uint64; + description + "This statistic counts the number of HRPD connections that were dropped before data has flowed on the A10 connection due to internal software errors."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumMiscDropsInternalError"; + } + leaf c-num-misc-drops-internal-error { + type uint64; + description + "This statistic counts the number of HRPD connections that were dropped after data has flowed on the A10 connection due to internal software errors."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumMiscDropsInternalError"; + } + leaf c-num-misc-drops-state-mismatch { + type uint64; + description + "This statistic counts the number of HRPD connections that were dropped after data has flowed on the A10 connection when the FAP finds a state mismatch between itself andthe AT. Such a mismatch is found when a connection request message is received from the AT, and the connection is already open as perceived by the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumMiscDropsStateMismatch"; + } + leaf s-num-misc-drops-state-mismatch { + type uint64; + description + "This statistic counts the number of connections that were dropped before the demarcation point when the FAP finds a state mismatch between itself and the AT. Such a mismatch is found when a connection request message is received from the AT, and the connection is already open as perceived by the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumMiscDropsStateMismatch"; + } + leaf s-num-misc-drops-due-to-rlp { + type uint64; + description + "This statistic counts the number of times the HRPD connection was dropped before data has flowed on the A10 connection at the request of the Radio Link Protocol. This request is generated when the HDR Fast Path component finds that the reset acknowledgment timeout has expired for the connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.SNumMiscDropsDueToRLP"; + } + leaf c-num-misc-drops-due-to-rlp { + type uint64; + description + "This statistic counts the number of times the HRPD connection was dropped after data has flowed on the A10 connection at the request of the Radio Link Protocol. This request is generated when the HDR Fast Path component finds that the reset acknowledgment timeout has expired for the connection."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats.CNumMiscDropsDueToRLP"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.RNCSigAppsStats."; + } + + grouping cdma2000-hrpd-access-auth-config-g { + description + "HRPD A12-related service stats."; + leaf a12-access-authentication-enable { + type int64; + config false; + description + "Flag to enable/Disable HRPD Access Authentication. {{true}} - Enabled, {{false}} - Disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthConfig.A12AccessAuthenticationEnable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthConfig."; + } + + grouping cdma2000-hrpd-access-auth-stats-g { + description + "This object is used in obtaining the Access Authentication related stats."; + leaf an-ppp-authentication-attempts-by-node { + type uint64; + description + "Number of AnPppAuthentications attempted by the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.AnPppAuthenticationAttemptsByNode"; + } + leaf a12-requests-sent-from-node { + type uint64; + description + "Number of A12 Access Requests Sent from the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12RequestsSentFromNode"; + } + leaf a12-rejects-received-by-node { + type uint64; + description + "Number of A12 Access Rejects received from the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12RejectsReceivedByNode"; + } + leaf a12-accepts-received-by-node { + type uint64; + description + "Number of A12 Access Accepts received by the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12AcceptsReceivedByNode"; + } + leaf a12-access-challenges-received-by-node { + type uint64; + description + "Number of A12 Access Challenges received by the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12AccessChallengesReceivedByNode"; + } + leaf a12-retransmits-sent-from-node { + type uint64; + description + "Number of A12 Access Requests retransmitted from the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12RetransmitsSentFromNode"; + } + leaf a12-timeouts-events-for-node { + type uint64; + description + "Number of A12 Timeout events occurred at the FAP due to unreachability of the AAA server/ no response from the AAA server."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12TimeoutsEventsForNode"; + } + leaf a12-malformedresponse-received-by-node { + type uint64; + description + "Number of Malformed A12 Access Response received by the FAP RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12MalformedresponseReceivedByNode"; + } + leaf a12-bad-authenticator-received-by-node { + type uint64; + description + "Number of A12 Access Response with Bad Authenticator received by the FAP RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12BadAuthenticatorReceivedByNode"; + } + leaf a12-unknown-type-received-by-node { + type uint64; + description + "Number of A12 Packet of unknown type received by the FAP RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12UnknownTypeReceivedByNode"; + } + leaf a12-unknown-pkt-received-by-node { + type uint64; + description + "Number of unknown A12 packets received by the FAP RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12UnknownPktReceivedByNode"; + } + leaf a12-unknown-server-received-by-node { + type uint64; + description + "Number of A12 packets received from unknown AAA server by the FAP RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12UnknownServerReceivedByNode"; + } + leaf a12-other-failure-occurences-in-node { + type uint64; + description + "Number of A12 packets failed due to other failure occurences in the AAA server."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12OtherFailureOccurencesInNode"; + } + leaf a12-by-pass-num-ats-with-unknown-mfr-code-by-node { + type uint64; + description + "Number of ATs with UnknowMfrCode detected in the FAP RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12ByPassNumAtsWithUnknownMfrCodeByNode"; + } + leaf a12-tx-path-fail-due-to-an-ppp-error-by-node { + type uint64; + description + "Number of times sending of A12 packet failed in Tx Path in the FAP RNC due to \"AnPPP Error\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12TxPathFailDueToAnPppErrorByNode"; + } + leaf a12-tx-path-fail-due-to-no-server-available-by-node { + type uint64; + description + "Number of times sending of A12 packet failed in Tx Path in the FAP RNC due to \"No Server Available\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12TxPathFailDueToNoServerAvailableByNode"; + } + leaf a12-tx-path-fail-due-to-internal-error-by-node { + type uint64; + description + "Number of times sending of A12 packet failed in Tx Path in the FAP RNC due to \"internal error\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12TxPathFailDueToInternalErrorByNode"; + } + leaf a12-tx-path-fail-due-to-no-packet-id-available-by-node { + type uint64; + description + "Number of times sending of A12 packet failed in Tx Path in the FAP RNC due to \"No packet id available\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12TxPathFailDueToNoPacketIdAvailableByNode"; + } + leaf a12-tx-path-fail-due-to-transmit-error-by-node { + type uint64; + description + "Number of times sending of A12 packet failed in Tx Path in the FAP RNC due to \"Transmit Error\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12TxPathFailDueToTransmitErrorByNode"; + } + leaf a12-svr-timeouts-for-node { + type uint64; + description + "Number of A12 server timeouts happened in the FAP RNC."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12SvrTimeoutsForNode"; + } + leaf a12-enh-ta-bypass-lcp-timeout-by-node { + type uint64; + description + "Number of LCP timeouts happened in the FAP RNC when Enhanced TA A12Bypass mode is enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12EnhTaBypassLcpTimeoutByNode"; + } + leaf a12-enh-ta-bypass-chap-timeout-by-node { + type uint64; + description + "Number of CHAP timeouts happened in the FAP RNC when Enhanced TA A12Bypass mode is enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12EnhTaBypassChapTimeoutByNode"; + } + leaf a12-enh-ta-bypass-chap-invalid-by-node { + type uint64; + description + "Number of CHAP Challenge response received from the AT when Enhanced TA A12Bypass mode is enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12EnhTaBypassChapInvalidByNode"; + } + leaf a12-enh-ta-bypass-chap-nai-matches-a12-bypass-list-by-node { + type uint64; + description + "Number of times the CHAP NAI received from the AT matches with A12Bypass List in the FAP RNC when Enhanced TA A12Bypass mode is enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12EnhTaBypassChapNaiMatchesA12BypassListByNode"; + } + leaf a12-session-ta-timeout-by-node { + type uint64; + description + "Number of times Session timeouts occurred due to TA."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.A12SessionTaTimeoutByNode"; + } + leaf access-auth-failed-due-to-session-close-total { + type uint64; + description + "Number of times the Access Authenticaiton failed due to Sesion close."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.AccessAuthFailedDueToSessionCloseTotal"; + } + leaf access-auth-succeeded { + type uint64; + description + "Number of times the Access Authenticaiton succeeded."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats.AccessAuthSucceeded"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.HRPD.AccessAuthStats."; + } + + grouping cdma2000-beacon-g { + description + "This object models the attributes to control the generalized beacon. The beacon is modeled as a beacon frame composed of multiple beacon intervals. The beacon frame start is time-aligned to the instant when 1x 80ms paging frames and HRPD control channel frames align (occurs once every 1.28s)."; + leaf beacon-admin-status { + type enumeration { + enum "locked" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconAdminStatus - Locked"; + } + enum "unlocked" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconAdminStatus - Unlocked"; + } + } + config false; + description + "Allows administrative control of beacon."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconAdminStatus"; + } + leaf beacon-oper-status { + type enumeration { + enum "locked" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconOperStatus - Locked"; + } + enum "unlocked" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconOperStatus - Unlocked"; + } + enum "fault" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconOperStatus - Fault"; + } + } + description + "Reports operational status of beacon."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconOperStatus"; + } + leaf hrpd-beacon-enable { + type boolean; + config false; + description + "If set to {{true}} the HRPD-specific beacon described by {{object|HRPDBeaconList}} object is enabled. If set to {{false}}, all HRPD beacons (if any) are contained in the BeaconList object."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconEnable"; + } + leaf period { + type uint16 { + range "0..32767"; + } + units "80 ms slots"; + config false; + description + "Length and periodicity of the beacon frame in {{units}}. Reference - {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.Period"; + } + leaf maxfap-beacon-tx-power { + type string { + length "0..64"; + } + config false; + description + "Maximum transmission power allowed on the FAP Beacon frequencies. {{param}} is expressed as a range of allowed maximum power levels with \"..\" (two periods) between the upper and lower values, i.e. \"<;Pmax_low>..<;Pmax_high>\". {{param}} identifies the limits between which the FAP can self-configure its maximum beacon transmit power. Self-configuration for maximum beacon transmission power is controlled by {{param|.Capabilities.CDMA2000.OneX.SelfConfig.MaxFAPBeaconTxPowerConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.OneX.SelfConfig.MaxFAPBeaconTxPowerSelfConfigEnable}} from an enabled perspective. <;Pmax_low> and <;Pmax_high> are measured in dBm and have a range of -40.0 to 20.0 incremented by 0.1 dB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.MaxFAPBeaconTxPower"; + } + leaf maxfap-beacon-tx-power-in-use { + type int64; + units "0.1 dBm"; + description + "Maximum beacon transmission power measured in {{units}} currently used by the FAP on any beacon frequency. Actual values of the maximum transmission power are -40.0 dBm to 20.0 dBm in steps of 0.1 dB. The value of {{param}} divided by 10 yields the actual value of the maximum transmission power."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.MaxFAPBeaconTxPowerInUse"; + } + leaf beacon-pch-pwr-percentage { + type int64; + units "0.001 percent"; + config false; + description + "Percentage of Max Sector Power Used By Paging Channel (expressed in {{units}}). For example, 93333 means 93.333% of the max sector power."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconPchPwrPercentage"; + } + leaf max-hrpd-beacon-tx-power { + type string { + length "0..64"; + } + config false; + description + "Maximum transmission power allowed on the dedicated HRPD beacon. {{param}} is expressed as a range of allowed maximum power levels with \"..\" (two periods) between the upper and lower values, i.e. \"<Pmax_low>..<Pmax_high>\". MaxHRPDBeaconTxPower identifies the limits between which the FAP can self-configure its maximum beacon transmit power. Self-configuration for maximum beacon transmission power is controlled by {{param|.Capabilities.CDMA2000.OneX.SelfConfig.MaxFAPBeaconTxPowerConfig}} from an availability perspective and {{param|.FAPControl.CDMA2000.OneX.SelfConfig.MaxFAPBeaconTxPowerSelfConfigEnable}} from an enabled perspective. <Pmax_low> and <Pmax_high> are measured in dBm and have a range of -40.0 to 20.0 incremented by 0.1 dB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.MaxHRPDBeaconTxPower"; + } + leaf max-hrpd-beacon-tx-power-in-use { + type int64; + units "0.1 dBm"; + description + "Maximum beacon transmission power measured in dBm currently used by the FAP on any beacon frequency. Actual values of the maximum transmission power are -40.0 dBm to 20.0 in units of {{units}}. The value of {{param}} divided by 10 yields the actual value of the maximum transmission power."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.MaxHRPDBeaconTxPowerInUse"; + } + leaf beacon-pilot-pwr-percentage { + type int64; + units "0.001 percent"; + config false; + description + "Percentage of Max Sector Power Used By Pilot Channel (expressed in {{units}}). For example, 19950 means 19.950% of total."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconPilotPwrPercentage"; + } + leaf beacon-sync-pwr-percentage { + type int64; + units "0.001 percent"; + config false; + description + "Percentage of Max Sector Power Used By Sync Channel (expressed in {{units}}). For example, 23458 means 23.458% of the max sector power."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconSyncPwrPercentage"; + } + leaf max-beacon-list-entries { + type uint64; + description + "Maximum number of entries in the {{object|.CellConfig.CDMA2000.Beacon.BeaconList.{i}.}} object."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.MaxBeaconListEntries"; + } + leaf beacon-list-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconListNumberOfEntries"; + } + leaf max-hrpd-beacon-list-entries { + type uint64; + description + "Maximum number of entries in the {{object|.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.}} object."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.MaxHRPDBeaconListEntries"; + } + leaf hrpd-beacon-list-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconListNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon."; + } + + grouping cdma2000-beacon-beacon-list-g { + description + "This object models an individual beacon intervals. It may be used to model both 1x and HRPD beacons with offset from start of beacon frame measured in 80ms slots."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.Alias"; + } + leaf beacon-index { + type int64; + description + "Instance identifier for this beacon interval. Allowed range is 0..(BeaconListNumberOfEntries-1)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.BeaconIndex"; + } + leaf offset { + type uint16 { + range "0..32767"; + } + config false; + description + "Offset from the start of the beacon frame in 80ms slots."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.Offset"; + } + leaf duration { + type uint16 { + range "0..32767"; + } + units "80 ms slots"; + config false; + description + "Duration of this beacon interval in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.Duration"; + } + leaf transmission-format { + type enumeration { + enum "0" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.TransmissionFormat - 0"; + } + enum "1" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.TransmissionFormat - 1"; + } + } + config false; + description + "Determines if this beacon interval shall transmit HRPD (HRPD) or CDMA2000 1x.{HRPD=\"0\", 1x=\"1\"}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.TransmissionFormat"; + } + leaf beacon-band-class { + type int64; + config false; + description + "Band class for this beacon interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.BeaconBandClass"; + } + leaf beacon-channel-freq { + type uint16 { + range "0..2016"; + } + config false; + description + "Channel number for this beacon interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.BeaconChannelFreq"; + } + leaf-list beacon-pn-offset { + type string { + length "0..32"; + } + config false; + min-elements 1; + description + "{{list}} Each item is a pilot PN offset of the pilot beacon for this channel in units of 64 PN chips. If this parameter contains more than one item, then the FAP is expected to select one from the list as the PilotPN to be used for this channel. If the self-configuration capability is not to be used, then this parameter SHALL contain only a single item."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.BeaconPNOffset"; + } + leaf tx-power { + type int64; + units "dBm"; + config false; + description + "TX power for the beacon interval (in {{units}}). If self-configuration of the Beacon Tx Power is enabled, then this value is determined by the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.TxPower"; + } + leaf beacon-sid { + type uint16 { + range "0..65535"; + } + config false; + description + "SID for this beacon interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.BeaconSID"; + } + leaf beacon-nid { + type uint16 { + range "0..32767"; + } + config false; + description + "NID for this beacon interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.BeaconNID"; + } + leaf beacon-pzid { + type uint64; + config false; + description + "PZID for this beacon interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}.BeaconPZID"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.BeaconList.{i}."; + } + + grouping cdma2000-beacon-hrpd-beacon-list-g { + description + "This object models individual HRPD beacon intervals where the beacon start is expressed as a number of HRPD control channel slots from the start of the beacon frame."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.Alias"; + } + leaf beacon-index { + type int64; + description + "Instance identifier for this beacon interval. Allowed range is 0..(HRPDBeaconListNumberOfEntries-1)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.BeaconIndex"; + } + leaf c-coffset { + type uint16 { + range "0..2048"; + } + config false; + description + "Offset of the current beacon interval from the start of the beacon frame, in Control Channel cycles. The HRPDBeaconList interval SHOULD not overlap in time with any beacon interval for the same channel defined in the BeaconList object."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.CCoffset"; + } + leaf offset { + type int64; + config false; + description + "Start of beacon transmission with respect to the Control Channel boundary."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.Offset"; + } + leaf duration { + type uint16 { + range "0..256"; + } + config false; + description + "Duration of the beacon transmission within a Control Channel cycle, in slots. Beacon is transmitted starting offset from the CC boundary for duration. Transmission restarts offset from the next CC boundary, given that beacon interval spans more than 1 CC cycles."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.Duration"; + } + leaf num-c-ccycles { + type uint8 { + range "0..48"; + } + config false; + description + "Number of Control Channel Cycles this beacon interval spans."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.NumCCcycles"; + } + leaf beacon-band-class { + type uint8 { + range "0..31"; + } + config false; + description + "Band class for this beacon interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.BeaconBandClass"; + } + leaf beacon-channel-freq { + type uint16 { + range "0..2016"; + } + config false; + description + "Channel number for this beacon interval."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.BeaconChannelFreq"; + } + leaf-list beacon-pn-offset { + type string { + length "0..256"; + } + config false; + min-elements 1; + description + "{{list}} Each item is a pilot PN offset of the pilot beacon for this channel in units of 64 PN chips. If this parameter contains more than one item, then the FAP is expected to select one from the list as the PilotPN to be used for this channel. If the self-configuration capability is not to be used, then this parameter SHALL contain only a single item."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.BeaconPNOffset"; + } + leaf tx-power { + type int64; + units "dBm"; + config false; + description + "TX power for the beacon interval. If self-configuration of the HRPD Beacon Tx Power is enabled, then this value is determined by the FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}.TxPower"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.CellConfig.CDMA2000.Beacon.HRPDBeaconList.{i}."; + } + + grouping rem-g { + description + "This object contains parameters relating to REM (Radio Environment Measurement)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM."; + } + + grouping rem-umts-g { + description + "This object contains Radio Environment Measurement parameters for UMTS FAP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS."; + } + + grouping rem-umts-wcdma-g { + description + "This object contains parameters relating to radio environment measurement capabilities for the UMTS system."; + leaf in-service-handling { + type enumeration { + enum "immediate" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.InServiceHandling - Immediate"; + } + enum "delayed" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.InServiceHandling - Delayed"; + } + } + default "immediate"; + config false; + description + "FAP REM behavior with respect to ongoing active connections."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.InServiceHandling"; + } + leaf scan-on-boot { + type boolean; + default "true"; + config false; + description + "Enables or disables Radio Environment Measurement during the FAP start up."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanOnBoot"; + } + leaf scan-periodically { + type boolean; + default "false"; + config false; + description + "Enable Periodic Radio Environment Measurement on all enabled RAT."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanPeriodically"; + } + leaf periodic-interval { + type uint64; + units "seconds"; + config false; + description + "When {{param|ScanPeriodically}} is {{true}}, this value indicates the interval in {{units}} which REM is performed while the FAP service is enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.PeriodicInterval"; + } + leaf periodic-time { + type yang:date-and-time; + config false; + description + "An absolute time reference in UTC to determine when the CPE will initiate the periodic REM. Each REM MUST occur at (or as soon as possible after) this reference time plus or minus an integer multiple of the {{param|PeriodicInterval}}. {{param}} is used only to set the \"phase\" of the REM. The actual value of {{param}} can be arbitrarily far into the past or future. For example, if {{param|PeriodicInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic REMs will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future. The Unknown Time value defined in {{bibref|TR-106a2|Section 3.2}} indicates that no particular time reference is specified. That is, the CPE MAY locally choose the time reference, and needs only to adhere to the specified PeriodicInformInterval. If absolute time is not available to the CPE, its periodic REM behavior MUST be the same as if {{param}} parameter was set to the Unknown Time value."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.PeriodicTime"; + } + leaf-list remplmn-list { + type string; + config false; + max-elements "32"; + description + "{{list}} Each item is a PLMN ID to measure. PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. If {{empty}}, then no specific PLMN ID is provided, meaning that the FAP is required to scan all available PLMN IDs."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.REMPLMNList"; + } + leaf-list rem-band-list { + type string { + length "0..64"; + } + config false; + description + "{{list}} Each item is a UMTS Band to measure. Each band is identified in by a roman numeral {{bibref|3GPP-TS.25.104}}. If {{empty}} then no specific UMTS band is provided, meaning that the FAP is required to scan all available bands. The order of the band indicator has no significance."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.REMBandList"; + } + leaf-list uarfcndl-list { + type string; + config false; + max-elements "64"; + description + "{{list}} Each entry is a UARFCN in the DL direction to measure. If {{empty}}, then no specific UARFCN is provided, meaning that the FAP is required to scan all UARFCNs that it is aware of."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.UARFCNDLList"; + } + leaf scan-timeout { + type uint64; + units "seconds"; + config false; + description + "Specifies the time-out value in {{units}}, measured from the start of the REM scan, before the REM scan will time out."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanTimeout"; + } + leaf scan-status { + type enumeration { + enum "indeterminate" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanStatus - Indeterminate"; + } + enum "in-progress" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanStatus - InProgress"; + } + enum "success" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanStatus - Success"; + } + enum "error" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanStatus - Error"; + } + enum "error-timeout" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanStatus - Error_TIMEOUT"; + } + } + description + "Indicates the current status of this scan."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ScanStatus"; + } + leaf error-details { + type string { + length "0..256"; + } + description + "Provides more detail when the {{param|ScanStatus}} is either {{enum|Error|ScanStatus}} or {{enum|Error_TIMEOUT|ScanStatus}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.ErrorDetails"; + } + leaf last-scan-time { + type yang:date-and-time; + description + "The time of the last UMTS system radio environment measurement."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.LastScanTime"; + } + leaf max-cell-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.REM.UMTS.WCDMA.Cell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.MaxCellEntries"; + } + leaf cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.CellNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA."; + } + + grouping rem-umts-wcdma-cell-g { + leaf rem-umts-wcdma-cell-key { + type string; + description + "Key value for this object, which could be an item of a list."; + } + description + "Table indicating the components of the discovered cells."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}."; + } + + grouping rem-umts-wcdma-cell-rf-g { + description + "Table indicating the RF aspect of the discovered cells."; + leaf uarfcndl { + type uint16 { + range "0..16383"; + } + description + "The UTRA Absolute Radio Frequency Channel Number (UARFCN) in the DL direction of an FDD mode cell. {{bibref|3GPP-TS.25.433}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.RF.UARFCNDL"; + } + leaf cpichrscp { + type int64; + units "dBm"; + description + "Received signal level in {{units}} of the CPICH channel. (Ref. 3GPP TS 25.133)"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.RF.CPICHRSCP"; + } + leaf cpich-ec-no { + type int64; + units "dB"; + description + "Measured EcNo. (energy per chip to interference power density) in {{units}} received in the downlink pilot channel. Actual values of the range are -24.0 {{units}} to 0.0 {{units}} in steps of 0.5 {{units}}. The value of {{param}} divided by 2 yields the actual value of the range. {{bibref|3GPP-TS.25.133|Section 9.1.2.3}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.RF.CPICHEcNo"; + } + leaf rssi { + type int64; + units "dBm"; + description + "This measurement is for Inter-frequency handover evaluation, measured in total {{units}} in the band. {{bibref|3GPP-TS.25.133|Section9.1.3}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.RF.RSSI"; + } + leaf primary-scrambling-code { + type uint16 { + range "0..511"; + } + description + "Primary scrambling code."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.RF.PrimaryScramblingCode"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.RF."; + } + + grouping rem-umts-wcdma-cell-bcch-g { + description + "Table containing the system information broadcast in the BCCH logical channel."; + leaf plmn-type { + type enumeration { + enum "gsm-map" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.PLMNType - GSM-MAP"; + } + enum "ansi-41" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.PLMNType - ANSI-41"; + } + } + description + "Type of Public Land Mobile Network (PLMN)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.PLMNType"; + } + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.PLMNID"; + } + leaf lac { + type uint16 { + range "0..65535"; + } + description + "Location Area Code (LAC) as defined in SIB 1 {{bibref|3GPP-TS.25.331}}. The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the LAI (Location Area ID) {{bibref|3GPP-TS.23.003}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.LAC"; + } + leaf rac { + type uint8 { + range "0..255"; + } + description + "Routing Area Code (RAC) as defined in SIB 1 {{bibref|3GPP-TS.25.331}}. The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the RAI (Routing Area ID) {{bibref|3GPP-TS.23.003}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.RAC"; + } + leaf cell-id { + type uint32 { + range "0..268435455"; + } + description + "Cell Identity as defined in SIB3 {{bibref|3GPP-TS.25.331|Section10.3.2.2}}. {{bibref|3GPP-TS.24.008}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CellID"; + } + leaf pcpich-tx-power { + type int64; + description + "Primary Common Pilot Channel (CPICH) power level on SIB 5/6 {{bibref|3GPP-TS.25.331|Section10.3.6.55}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.PCPICHTxPower"; + } + leaf csg-indicator { + type boolean; + description + "The CSG-indicator Information Element (IE) in the Master Information Block reflects the access mode of the CSG cell. It is hence dependent on the value of {{param|.AccessMgmt.UMTS.AccessMode}}. If {{true}} the CSG-indicator IE is present, reflecting closed access to the CSG cell. If {{false}} the CSG-indicator IE is absent, reflecting the access mode as \"not a closed-access\". {{bibref|3GPP-TS.25.331|Section 10.2.48.8.1}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGIndicator"; + } + leaf csgid { + type uint32 { + range "0..134217727"; + } + description + "Defines the Closed Subscriber Group of the Access Control List. FAP broadcasts this CSG ID in SIB3 {{bibref|3GPP-TS.25.331|Section10.3.2.8}} depending on the AccessMode."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGID"; + } + leaf-list uarfcndl-list { + type uint16 { + range "0..16383"; + } + max-elements "128"; + description + "{{list}} Each item is a UTRA Absolute Radio Frequency Channel Number (UARFCN} in the DL direction dedicated to the CSG cells. {{param}} is broadcast in SIB 11bis {{bibref|3GPP-TS.25.331|Section 10.2.48.8.14a}}. The corresponding UTRA Absolute Radio Frequency Channel Number (UARFCN} in the UL direction is derived based on the fixed offset applicable for the frequency band."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.UARFCNDLList"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH."; + } + + grouping rem-umts-wcdma-cell-bcch-csgpsc-split-info-g { + description + "This object contains parameters relating to the Primary Scambling Code (PSC) split information for the CSG. Defined in SIB3/11bis {{bibref|3GPP-TS.25.331|Section 10.3.2.8 and 10.3.2.9}}."; + leaf start-psc-range1-coefficient { + type uint8 { + range "0..63"; + } + description + "The value of this Information Element (IE) multiplied by 8 specifies the start PSC value of the first PSC range as specified in {{bibref|3GPP-TS.25.331|Section 8.6.2.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.StartPSCRange1Coefficient"; + } + leaf number-of-ps-cs { + type enumeration { + enum "5" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 5"; + } + enum "10" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 10"; + } + enum "15" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 15"; + } + enum "20" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 20"; + } + enum "30" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 30"; + } + enum "40" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 40"; + } + enum "50" { + value 7; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 50"; + } + enum "64" { + value 8; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 64"; + } + enum "80" { + value 9; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 80"; + } + enum "120" { + value 10; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 120"; + } + enum "160" { + value 11; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 160"; + } + enum "256" { + value 12; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - 256"; + } + enum "alltherest" { + value 13; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - alltherest"; + } + enum "spare3" { + value 14; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - spare3"; + } + enum "spare2" { + value 15; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - spare2"; + } + enum "spare1" { + value 16; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs - spare1"; + } + } + description + "This Information Element (IE) specifies the number of PSCs reserved for CSG cells in each PSC range."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.NumberOfPSCs"; + } + leaf psc-range2-offset { + type uint8 { + range "0..63"; + } + description + "If this Information Element (IE) is included, the UE shall calculate the second PSC range as specified in {{bibref|3GPP-TS.25.331|Section 8.6.2.4}}. If this Information Element (IE) is not included, the UE shall consider the second PSC range to be not present."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo.PSCRange2Offset"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.CSGPSCSplitInfo."; + } + + grouping rem-umts-wcdma-cell-bcch-reference-position-g { + description + "This object defines parameters related to the surface point of the ellipsoid. {{bibref|3GPP-TS.23.032|Section 5}} It is characterized by the co-ordinates of an ellipsoid point with altitude, distances, and an angle of orientation. This information is used to refer to a point on the Earth's surface, or close to the Earth's surface, with the same longitude and latitude."; + leaf latitude { + type int64; + description + "This parameter specifies the latitude of the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, north of the equator. The negative value signifies the direction, south of the equator. Range is from: 90.00.00' South (-90,000,000) to 90.00.00' North (90,000,000). Example: A latitude of 13.19.43' N would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). Latitude of 50.00.00' S would be represented as value -50,000,000. If 0 then SIB15 is not detected in the specific cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.ReferencePosition.Latitude"; + } + leaf longitude { + type int64; + description + "This parameter specifies the longitude of the device's position in degrees, multiplied by 1 million. The positive value signifies the direction, east of the prime meridian. The negative value signifies the direction, west of the prime meridian. Range is from: 180.00.00' West (-180,000,000) to 180.00.00' East (180,000,000). Example: A longitude of 13.19.43' E would be represented as 13,323,833, derived as (13*1,000,000)+((19.43*1,000,000)/60). A longitude of 50.00'0'' W would be represented as value -50,000,000. If 0 then SIB15 is not detected in the specific cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.ReferencePosition.Longitude"; + } + leaf uncertainty-semi-major { + type uint8 { + range "0..127"; + } + description + "The uncertainty r is derived from the \"uncertainty code\" k by r = 10 x ( 1.1 <power> (k-1) ) {{bibref|3GPP-TS.23.032|Section6.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.ReferencePosition.UncertaintySemiMajor"; + } + leaf uncertainty-semi-minor { + type uint8 { + range "0..127"; + } + description + "The uncertainty r is derived from the \"uncertainty code\" k by r = 10 x ( 1.1 <power> (k-1) ) {{bibref|3GPP-TS.23.032|Section6.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.ReferencePosition.UncertaintySemiMinor"; + } + leaf orientation-of-major-axis { + type uint8 { + range "0..89"; + } + description + "The Information Element (IE) value 'N' is derived by this formula: 2N <= a < 2(N+1) Where 'a' is the orientation in degrees (0..179)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.ReferencePosition.OrientationOfMajorAxis"; + } + leaf confidence { + type uint8 { + range "0..100"; + } + units "percent"; + description + "The degree of confidence in the ellipsoid's points expressed in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.ReferencePosition.Confidence"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.WCDMA.Cell.{i}.BCCH.ReferencePosition."; + } + + grouping rem-umts-gsm-g { + description + "This object contains parameters relating to GSM REM capabilities."; + leaf in-service-handling { + type enumeration { + enum "immediate" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.InServiceHandling - Immediate"; + } + enum "delayed" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.InServiceHandling - Delayed"; + } + } + default "immediate"; + config false; + description + "FAP REM behavior with respect to ongoing active connections."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.InServiceHandling"; + } + leaf scan-on-boot { + type boolean; + default "true"; + config false; + description + "Enables or disables Radio Environment Measurement during the FAP start up."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanOnBoot"; + } + leaf scan-periodically { + type boolean; + default "false"; + config false; + description + "Enable Periodic Radio Environment Measurement on all enabled RAT."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanPeriodically"; + } + leaf periodic-interval { + type uint64; + units "seconds"; + config false; + description + "When {{param|ScanPeriodically}} is {{true}}, this value indicates the interval in {{units}} which REM is performed while the FAP service is enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.PeriodicInterval"; + } + leaf periodic-time { + type yang:date-and-time; + config false; + description + "An absolute time reference in UTC to determine when the CPE will initiate the periodic REM. Each REM MUST occur at (or as soon as possible after) this reference time plus or minus an integer multiple of the {{param|PeriodicInterval}}. {{param}} is used only to set the \"phase\" of the REM. The actual value of {{param}} can be arbitrarily far into the past or future. For example, if {{param|PeriodicInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic REMs will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future. The Unknown Time value defined in {{bibref|TR-106a2|Section 3.2}} indicates that no particular time reference is specified. That is, the CPE MAY locally choose the time reference, and needs only to adhere to the specified PeriodicInformInterval. If absolute time is not available to the CPE, its periodic REM behavior MUST be the same as if {{param}} parameter was set to the Unknown Time value."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.PeriodicTime"; + } + leaf-list remplmn-list { + type string { + length "0..6"; + } + config false; + description + "{{list}} Each item is a PLMNID. PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of the PLMNID is 5. If {{empty}} no specific PLMN ID is provided, meaning that the FAP is required to report all available PLMN IDs. If a list is provided, the FAP is expected to limit the REM measurement to the PLMN(s) specified in this list only and ignore others even if they are detected."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMPLMNList"; + } + leaf-list rem-band-list { + type enumeration { + enum "t-gsm380" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - T-GSM380"; + } + enum "t-gsm410" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - T-GSM410"; + } + enum "gsm450" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - GSM450"; + } + enum "gsm480" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - GSM480"; + } + enum "gsm710" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - GSM710"; + } + enum "gsm750" { + value 6; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - GSM750"; + } + enum "t-gsm810" { + value 7; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - T-GSM810"; + } + enum "gsm850" { + value 8; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - GSM850"; + } + enum "p-gsm900" { + value 9; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - P-GSM900"; + } + enum "e-gsm900" { + value 10; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - E-GSM900"; + } + enum "r-gsm900" { + value 11; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - R-GSM900"; + } + enum "t-gsm900" { + value 12; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - T-GSM900"; + } + enum "dcs1800" { + value 13; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - DCS1800"; + } + enum "pcs1900" { + value 14; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList - PCS1900"; + } + } + config false; + description + "{{list}} Each item is a GSM Band to measure. {{enum}} If {{empty}} then no specific GSM band is provided, meaning that the FAP MUST scan all bands. If a list is provided, the FAP is expected to limit the REM measurement to the band(s) specified in this list only and ignore others even if they are detected."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.REMBandList"; + } + leaf-list arfcn-list { + type string; + config false; + max-elements "64"; + description + "{{list}} Each item is a GSM ARFCN to measure. If {{empty}} then no specific ARFCN is provided, meaning that the FAP is required to scan all ARFCNs. If a list is provided, the FAP is expected to limit the REM measurement to the ARFCN(s) specified in this list only and ignore others even if they are detected."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ARFCNList"; + } + leaf scan-timeout { + type uint64; + units "seconds"; + config false; + description + "Specifies the time-out value in {{units}}, measured from the start of the REM scan, before the REM scan will time out."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanTimeout"; + } + leaf scan-status { + type enumeration { + enum "indeterminate" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanStatus - Indeterminate"; + } + enum "in-progress" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanStatus - InProgress"; + } + enum "success" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanStatus - Success"; + } + enum "error" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanStatus - Error"; + } + enum "error-timeout" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanStatus - Error_TIMEOUT"; + } + } + description + "Indicates the current status of this scan."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ScanStatus"; + } + leaf error-details { + type string { + length "0..256"; + } + description + "Provides more detail when the {{param|ScanStatus}} is either {{enum|Error|ScanStatus}} or {{enum|Error_TIMEOUT|ScanStatus}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.ErrorDetails"; + } + leaf last-scan-time { + type yang:date-and-time; + description + "The time of the last GSM radio environment measurement."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.LastScanTime"; + } + leaf max-cell-entries { + type uint64; + description + "The maximum number of entries allowed in the {{object|.REM.UMTS.GSM.Cell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.MaxCellEntries"; + } + leaf cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.CellNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM."; + } + + grouping rem-umts-gsm-cell-g { + description + "Table indicating the components of the discovered cells."; + leaf band-indicator { + type enumeration { + enum "gsm 850" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.BandIndicator - GSM 850"; + } + enum "gsm 900" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.BandIndicator - GSM 900"; + } + enum "dcs 1800" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.BandIndicator - DCS 1800"; + } + enum "pcs 1900" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.BandIndicator - PCS 1900"; + } + } + description + "Indicates how to interpret the BCCH ARFCN."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.BandIndicator"; + } + leaf arfcn { + type uint16 { + range "0..1023"; + } + description + "Absolute Radio Frequency Channel Number (ARFCN) {{bibref|3GPP-TS.05.05}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.ARFCN"; + } + leaf bsic { + type uint8 { + range "0..63"; + } + description + "Base Station Identity Code {{bibref|3GPP-TS.03.03}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.BSIC"; + } + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of the PLMNID is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.PLMNID"; + } + leaf lac { + type uint16 { + range "1..65535"; + } + description + "Location Area Code (LAC) as defined in SIB1 {{bibref|3GPP-TS.25.331}}. The concatenation of PLMN ID (MCC+MNC) and LAC uniquely identifies the LAI (Location Area ID) {{bibref|3GPP-TS.23.003}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.LAC"; + } + leaf rac { + type uint8 { + range "0..255"; + } + description + "Routing Area Code (RAC) consists of up to 3 numerical characters. The concatenation of PLMN ID (MCC+MNC), LAC, and RAC uniquely identifies the Routing Area ID (RAI). {{bibref|3GPP-TS.23.003|Section 4.2}} {{bibref|3GPP-TS.25.413|Section 9.2.3.7}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.RAC"; + } + leaf ci { + type uint16 { + range "0..63535"; + } + description + "Cell Identity. {{bibref|3GPP-TS.25.331|Section 10.3.2.2}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.CI"; + } + leaf rssi { + type int64; + units "dBm"; + description + "Received signal level in {{units}} of the BCCH carrier."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}.RSSI"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.UMTS.GSM.Cell.{i}."; + } + + grouping rem-lte-g { + description + "This object contains parameters relating to radio environment measurement capabilities for the LTE system."; + leaf in-service-handling { + type enumeration { + enum "immediate" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.InServiceHandling - Immediate"; + } + enum "delayed" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.InServiceHandling - Delayed"; + } + } + default "immediate"; + config false; + description + "FAP REM behavior with respect to ongoing active connections."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.InServiceHandling"; + } + leaf scan-on-boot { + type boolean; + default "true"; + config false; + description + "Enables or disables Radio Environment Measurement during the FAP start up."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanOnBoot"; + } + leaf scan-periodically { + type boolean; + default "false"; + config false; + description + "Enable Periodic Radio Environment Measurement on LTE EUTRAN bands."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanPeriodically"; + } + leaf periodic-interval { + type uint64; + units "seconds"; + config false; + description + "When {{param|ScanPeriodically}} is {{true}}, this value indicates the interval in {{units}} which REM is performed while the FAP service is enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.PeriodicInterval"; + } + leaf periodic-time { + type yang:date-and-time; + config false; + description + "An absolute time reference in UTC to determine when the CPE will initiate the periodic REM. Each REM MUST occur at (or as soon as possible after) this reference time plus or minus an integer multiple of the {{param|PeriodicInterval}}. {{param}} is used only to set the \"phase\" of the REM. The actual value of {{param}} can be arbitrarily far into the past or future. For example, if {{param|PeriodicInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic REMs will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future. The Unknown Time value defined in {{bibref|TR-106a2|Section 3.2}} indicates that no particular time reference is specified. That is, the CPE MAY locally choose the time reference, and needs only to adhere to the specified PeriodicInformInterval. If absolute time is not available to the CPE, its periodic REM behavior MUST be the same as if {{param}} parameter was set to the Unknown Time value."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.PeriodicTime"; + } + leaf-list remplmn-list { + type string; + config false; + max-elements "32"; + description + "{{list}} Each item is a PLMN ID to measure. PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. If {{empty}}, then no specific PLMN ID is provided, meaning that the FAP is required to scan all available PLMN IDs."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.REMPLMNList"; + } + leaf-list rem-band-list { + type string { + length "0..64"; + } + config false; + description + "{{list}} Each item is a LTE Band to measure. Corresponds to frequency band indicator defined in {{bibref|3GPP-TS.36.101|Table 5.5-1}}. If {{empty}} then no specific LTE band is provided, meaning that the FAP is required to scan all available bands. The order of the band indicator has no significance."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.REMBandList"; + } + leaf-list eutra-carrier-arfcndl-list { + type string; + config false; + max-elements "64"; + description + "{{list}} Each entry is a EUTRA ARFCN in the DL direction to measure. Corrsponds to the parameter NDL in {{bibref|3GPP-TS.36.101|Section 5.7.3}}. If {{empty}}, then no specific EUTRA ARFCN is provided, meaning that the FAP is required to scan all ARFCNs that it is aware of."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.EUTRACarrierARFCNDLList"; + } + leaf scan-timeout { + type uint64; + units "seconds"; + config false; + description + "Specifies the time-out value in {{units}}, measured from the start of the REM scan, before the REM scan will time out."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanTimeout"; + } + leaf scan-status { + type enumeration { + enum "indeterminate" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanStatus - Indeterminate"; + } + enum "in-progress" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanStatus - InProgress"; + } + enum "success" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanStatus - Success"; + } + enum "error" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanStatus - Error"; + } + enum "error-timeout" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanStatus - Error_TIMEOUT"; + } + } + description + "Indicates the current status of this scan."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ScanStatus"; + } + leaf error-details { + type string { + length "0..256"; + } + description + "Provides more detail when the {{param|ScanStatus}} is either {{enum|Error|ScanStatus}} or {{enum|Error_TIMEOUT|ScanStatus}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.ErrorDetails"; + } + leaf last-scan-time { + type yang:date-and-time; + description + "The time of the last LTE system radio environment measurement."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.LastScanTime"; + } + leaf max-cell-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.REM.LTE.Cell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.MaxCellEntries"; + } + leaf cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.CellNumberOfEntries"; + } + leaf max-carrier-meas-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.REM.LTE.CarrierMeas.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.MaxCarrierMeasEntries"; + } + leaf carrier-meas-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.CarrierMeasNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE."; + } + + grouping rem-lte-cell-g { + leaf rem-lte-cell-key { + type string; + description + "Key value for this object, which could be an item of a list."; + } + description + "Table indicating the components of the discovered cells."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}."; + } + + grouping rem-lte-cell-rf-g { + description + "Table indicating the RF aspect of the discovered cells."; + leaf eutra-carrier-arfcn { + type uint16 { + range "0..65535"; + } + description + "Indicates the ARFCN of this carrier frequency. Corresponds to parameter dl-CarrierFreq in SIB5 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}, and parameter NDL in {{bibref|3GPP-TS.36.101|Section 5.7.3}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.RF.EUTRACarrierARFCN"; + } + leaf phy-cell-id { + type uint16 { + range "0..503"; + } + description + "Physical cell ID of the detected EUTRAN cell, as specified in {{bibref|3GPP-TS.36.101|Section 5.6}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.RF.PhyCellID"; + } + leaf rsrp { + type int64; + units "dBm"; + description + "Received RSRP level of the detected EUTRA cell, specified in {{units}}, as specified in {{bibref|3GPP-TS.36.214|Section 5.1.1}}. The reporting range is specified in {{bibref|3GPP-TS.36.133|Section 9.1.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.RF.RSRP"; + } + leaf rsrq { + type int64; + units "dB"; + description + "Received RSRQ level of the detected EUTRA cell, specified in {{units}}, as specified in {{bibref|3GPP-TS.36.214|Section 5.1.3}}. Actual measured values range between -24.0 {{units}} and 0.0 {{units}} in steps of 0.5 {{units}}. The value of {{param}} divided by 10 yields the actual measured value. Only values in multiple of 5 are valid."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.RF.RSRQ"; + } + leaf rssi { + type int64; + units "dBm"; + description + "E-UTRA Carrier Received Signal Strength Indicator (RSSI), specified in {{units}}, as specified in {{bibref|3GPP-TS.36.214|Section 5.1.3}}. It comprises the linear average of the total received power (in [W]) observed only in OFDM symbols containing reference symbols for antenna port 0, in the measurement bandwidth, over N number of resource blocks by the UE from all sources, including co-channel serving and non-serving cells, adjacent channel interference, thermal noise etc."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.RF.RSSI"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.RF."; + } + + grouping rem-lte-cell-bcch-g { + description + "Table containing the system information broadcast in the BCCH logical channel."; + leaf dl-bandwidth { + type uint8 { + range "6 | 15 | 25 | 50 | 75 | 100"; + } + units "resource blocks"; + description + "Downlink transmission bandwidth, specified in number of {{units}}. Corresponds to parameter dl_Bandwidth in Master Information Block in {{bibref|3GPP-TS.36.331|Section 6.2.2}}. and to parameter NRB in {{bibref|3GPP-TS.36.101|Table 5.6-1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.DLBandwidth"; + } + leaf ul-bandwidth { + type uint8 { + range "6 | 15 | 25 | 50 | 75 | 100"; + } + units "resource blocks"; + description + "Uplink transmission bandwidth, specified in number of {{units}}. Corresponds to parameter ul_Bandwidth in SIB2 in {{bibref|3GPP-TS.36.331|Section 6.3.1}}. and to parameter NRB in {{bibref|3GPP-TS.36.101|Table 5.6-1}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.ULBandwidth"; + } + leaf rs-tx-power { + type int64; + units "dBm"; + description + "The downlink reference-signal transmit power, specified in {{units}}. Defined as the linear average over the power contributions (in W) of all resource elements that carry cell-specific reference signals within the operating system bandwidth. Corresponds to parameter referenceSignalPower in SIB4 as a part of PDSCH-Config IE in {{bibref|3GPP-TS.36.331|Section 6.3.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.RSTxPower"; + } + leaf tac { + type uint16 { + range "0..65535"; + } + description + "Tracking Area Code that is common for all the PLMNs listed. Corresponds to trackingAreaCode as specified in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.TAC"; + } + leaf cell-id { + type uint32 { + range "0..268435455"; + } + description + "Defines the cell identify, defines as a 28-bit binary number. Corresponds to cellIdentity as specified in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2 and Section 6.3.4}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.CellID"; + } + leaf cell-barred { + type boolean; + description + "Indicates whether the cell is barred or not. If {{true}}, the cell is barred. If {{false}}, the cell is not barred. Corresponds to cellBarred as specified in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}} and {{bibref|3GPP-TS.36.304}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.CellBarred"; + } + leaf csg-indication { + type boolean; + description + "Indicates whether CSG is used in this cell or not. If {{true}}, the UE is only allowed to access the cell if the CSG identity matches an entry in the allowed CSG list that the UE has stored. Corresponds to csg-Indication as specified in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.CSGIndication"; + } + leaf csg-identity { + type uint32 { + range "0..134217727"; + } + description + "Defines the CSG ID value if {{param|CSGIndication}} parameter indicates that CSG is used in this cell. Corresponds to csg-Identity as specified in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.CSGIdentity"; + } + leaf max-plmn-list-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.REM.LTE.Cell.{i}.BCCH.PLMNList.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.MaxPLMNListEntries"; + } + leaf plmn-list-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.PLMNListNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH."; + } + + grouping rem-lte-cell-bcch-plmn-list-g { + description + "Table containing the PLMN list in the system information broadcast in the BCCH logical channel. Correspnds to plmn-IdentityList as specified in SIB1 in {{bibref|3GPP-TS.36.331|Section 6.2.2}}. Each instance in this object is a PLMN-IdentityInfo which consists of plmn-Identity and cellReservedForOperatorUse IEs."; + leaf plmnid { + type string { + length "0..6"; + } + description + "PLMN ID consists of Mobile Country Code (MCC) and Mobile Network Code (MNC) {{bibref|3GPP-TS.23.003}}, {{bibref|3GPP-TS.24.008}}. Mobile Country Code consists of three digits and uniquely identifies the country of domicile of the subscriber. Mobile Network Code consists of two or three digits and identifies the Home PLMN within a country. For a 2-digit MNC the total string length of {{param}} is 5."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.PLMNList.{i}.PLMNID"; + } + leaf cell-reserved-for-operator-use { + type boolean; + description + "Indicates whether the cell is reserved for operator use or not. If {{true}}, it is reserved. If {{false}}, it is not reserved. Corresponds to \"reserved\" \"notReserved\" respectively as defined in PLMN-IdentityInfo in {{bibref|3GPP-TS.36.331|Section 6.2.2}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.PLMNList.{i}.CellReservedForOperatorUse"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.Cell.{i}.BCCH.PLMNList.{i}."; + } + + grouping rem-lte-carrier-meas-g { + description + "Table indicating the measurement of the discovered carrier. The information stored in this object is strictly in the physical layer level and may not necessarily be associated with any particular E-UTRAN cell (e.g. interference level generated by sources other than E-UTRAN cell)."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the CarrierMeas entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.CarrierMeas.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.CarrierMeas.{i}.Alias"; + } + leaf carrier-arfcndl { + type int64; + units "MHz"; + description + "Lower bound of the EUTRA ARFCN as specified in {{bibref|3GPP-TS.36.101|Section 5.7.3}} in the DL direction that is requested to measure. Unit in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.CarrierMeas.{i}.CarrierARFCNDL"; + } + leaf carrier-ch-width { + type int64; + units "ARFCN"; + description + "Number of {{units}} in DL direction, as specified in {{bibref|3GPP-TS.36.101|Section 5.6}}, that is requested to measure. The range bounded by {{param|CarrierARFCNDL}} as the lower bound and the value of ({{param|CarrierARFCNDL}} + {{param}}) as the upper bound expresses the total carrier frequency range to be measured."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.CarrierMeas.{i}.CarrierChWidth"; + } + leaf carrier-rssi { + type int64; + units "ARFCN"; + description + "Received Signal Strength Indicator (RSSI) as specified in {{bibref|3GPP-TS.36.214|Sec 5.1.3}} over the carrier frequency range from {{param|CarrierARFCNDL}} as the lower bound and the value of ({{param|CarrierARFCNDL}} + {{param|CarrierChWidth}}) as the upper bound."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.CarrierMeas.{i}.CarrierRSSI"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.LTE.CarrierMeas.{i}."; + } + + grouping rem-cdma2000-g { + description + "This object contains parameters relating to radio environment measurement capabilities for the CDMA2000 system."; + leaf in-service-handling { + type enumeration { + enum "immediate" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.InServiceHandling - Immediate"; + } + enum "delayed" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.InServiceHandling - Delayed"; + } + } + config false; + description + "FAP REM behavior with respect to ongoing active connections. {{enum}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.InServiceHandling"; + } + leaf scan-on-boot { + type boolean; + config false; + description + "Enables or disables Radio Environment Measurement during the FAP start up."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanOnBoot"; + } + leaf scan-now { + type boolean; + config false; + description + "Directs FAP to perform radio environment measurements immediately (but respecting the setting of {{param|InServiceHandling}}) and report back. After performing the action, the FAP resets the ScanNow value to \"0\" ({{false}})."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanNow"; + } + leaf return-timer { + type uint64 { + range "1..max"; + } + units "seconds"; + config false; + description + "Time in {{units}} within which the action should be performed by the FAP. Only applies if {{param|InServiceHandling}} is set to Delayed."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ReturnTimer"; + } + leaf scan-periodically { + type boolean; + config false; + description + "Enables periodic reporting of radio environment measurements."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanPeriodically"; + } + leaf periodic-interval { + type uint64 { + range "1..max"; + } + units "seconds"; + config false; + description + "When {{param|ScanPeriodically}} is {{true}}, this value indicates the interval in {{units}} which REM is performed while the FAP service is enabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.PeriodicInterval"; + } + leaf periodic-time { + type yang:date-and-time; + config false; + description + "An absolute time reference in UTC to determine when the CPE will initiate the periodic REM. Each REM MUST occur at (or as soon as possible after) this reference time plus or minus an integer multiple of the {{param|PeriodicInterval}}. {{param}} is used only to set the \"phase\" of the REM. The actual value of {{param}} can be arbitrarily far into the past or future. For example, if {{param|PeriodicInterval}} is 86400 (a day) and if {{param}} is set to UTC midnight on some day (in the past, present, or future) then periodic REMs will occur every day at UTC midnight. These MUST begin on the very next midnight, even if {{param}} refers to a day in the future. The Unknown Time value defined in {{bibref|TR-106a2|Section 3.2}} indicates that no particular time reference is specified. That is, the CPE MAY locally choose the time reference, and needs only to adhere to the specified PeriodicInformInterval. If absolute time is not available to the CPE, its periodic REM behavior MUST be the same as if {{param}} parameter was set to the Unknown Time value."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.PeriodicTime"; + } + leaf report-overheads { + type enumeration { + enum "all" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ReportOverheads - All"; + } + enum "one-x" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ReportOverheads - OneX"; + } + enum "hrpd" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ReportOverheads - HRPD"; + } + enum "none" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ReportOverheads - None"; + } + } + config false; + description + "If {{param}} is set to {{enum|All}}, the FAP shall report the overheads from the sectors as well."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ReportOverheads"; + } + leaf scan-timeout { + type uint64; + units "seconds"; + config false; + description + "Specifies the time-out value in {{units}}, measured from the start of the REM scan, before the REM scan will time out."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanTimeout"; + } + leaf scan-status { + type enumeration { + enum "indeterminate" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanStatus - Indeterminate"; + } + enum "in-progress" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanStatus - InProgress"; + } + enum "success" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanStatus - Success"; + } + enum "error" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanStatus - Error"; + } + enum "error-timeout" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanStatus - Error_TIMEOUT"; + } + } + description + "Indicates the current status of this scan."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ScanStatus"; + } + leaf error-details { + type string { + length "0..256"; + } + description + "Provides more detail when the {{param|ScanStatus}} is either \"Error\" or \"Error_TIMEOUT\"."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.ErrorDetails"; + } + leaf last-scan-time { + type yang:date-and-time; + description + "The time of the last system radio environment measurement."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.LastScanTime"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000."; + } + + grouping rem-cdma2000-one-x-g { + description + "This object contains parameters relating to radio environment measurement capabilities for the 1x system."; + leaf max-cell-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.REM.CDMA2000.OneX.Cell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.MaxCellEntries"; + } + leaf cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.CellNumberOfEntries"; + } + leaf max-channel-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.REM.CDMA2000.OneX.Channel.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.MaxChannelEntries"; + } + leaf channel-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.ChannelNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX."; + } + + grouping rem-cdma2000-one-x-channel-g { + description + "REM specific configuration and reporting."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Channel.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Channel.{i}.Alias"; + } + leaf sniffing-band-class { + type uint8 { + range "0..31"; + } + description + "Config parameter to set band class. Reference - {{bibref|3GPP2-C.S0057}}, Band Class Specification for CDMA2000 Spread Spectrum Systems."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Channel.{i}.SniffingBandClass"; + } + leaf sniffing-channel-number { + type uint16 { + range "0..2016"; + } + description + "The Radio Frequency Channel Number (RFCN) in the forward direction."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Channel.{i}.SniffingChannelNumber"; + } + leaf-list pn-list { + type string { + length "0..256"; + } + config false; + description + "{{list}} Each item is a (single value) PN offset in units of 64 PN chips or PNrange expressed in the following format: <Start-value>\"..\"<End-value>:<Increment> If an empty string, then no specific PNList is provided, meaning that the FAP is required to pick a PN list to scan on its own."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Channel.{i}.PNList"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Channel.{i}."; + } + + grouping rem-cdma2000-one-x-cell-g { + leaf rem-cdma2000-one-x-cell-key { + type string; + description + "Key value for this object, which could be an item of a list."; + } + description + "Table indicating the components of the discovered cells."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}."; + } + + grouping rem-cdma2000-one-x-cell-rf-g { + description + "RF REM results for each detected cell."; + leaf band { + type int64; + description + "CDMA band for the reported cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF.Band"; + } + leaf rfcnfl { + type uint16 { + range "0..2016"; + } + description + "The Radio Frequency Channel Number (RFCN) in the FL direction for the reported cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF.RFCNFL"; + } + leaf io { + type int64; + units "dBm"; + description + "The total received power spectral density in {{units}}, including signal and interference."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF.Io"; + } + leaf p-ilot-pn { + type uint16 { + range "0..511"; + } + units "64 PN chips"; + description + "Pilot PN Offset (in units of {{units}})."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF.PIlotPN"; + } + leaf p-ilot-pn-phase { + type uint64; + units "chips"; + description + "Pilot PN phase in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF.PIlotPNPhase"; + } + leaf pilot-strength-ecp { + type int64; + units "dBm"; + description + "The strength estimate of the received pilot energy per chip, Ecp, in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF.PilotStrengthEcp"; + } + leaf pilot-strength-ecp-io { + type int64; + units "dB"; + description + "The strength estimate of the received pilot energy per chip, Ecp, to total received spectral density, Io (signal and noise) in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF.PilotStrengthEcpIo"; + } + leaf overheads-available { + type boolean; + description + "If set to {{true}}, the overhead messages for this particular cell is included in {{object|.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF.OverheadsAvailable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.RF."; + } + + grouping rem-cdma2000-one-x-cell-control-channel-g { + description + "Table containing information broadcast on control channel."; + leaf sid { + type int64; + description + "System identification. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.SID"; + } + leaf nid { + type int64; + description + "Network identification. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.NID"; + } + leaf regzone { + type int64; + description + "Registration Zone. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.REGZONE"; + } + leaf baselat { + type int64; + description + "Basestation latitude. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.BASELAT"; + } + leaf baselong { + type int64; + description + "Basestation longtitude. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.BASELONG"; + } + leaf mcc { + type int64; + description + "Mobile Country Code. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.MCC"; + } + leaf mncimsi1112 { + type int64; + description + "the 11th and 12th digits of IMSI, i.e., Mobile Network Code. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.MNCIMSI1112"; + } + leaf baseid { + type int64; + description + "Basestation identification. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.BASEID"; + } + leaf apid { + type string { + length "0..32"; + } + description + "Access Point Identification. Set to empty string if not available. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.APID"; + } + leaf apidmask { + type int64; + description + "Access Point Identification Mask. Set to zero if not available. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.APIDMASK"; + } + leaf apidtext { + type string { + length "0..256"; + } + description + "Access Point Identification Text. Set to empty string if not available. Refer to {{bibref|3GPP2-C.S0005}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel.APIDTEXT"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.OneX.Cell.{i}.ControlChannel."; + } + + grouping rem-cdma2000-hrpd-g { + description + "This object contains parameters relating to radio environment measurement capabilities for the HRPD system."; + leaf max-cell-entries { + type uint64; + description + "The maximum number of entries available in the {{object|.REM.CDMA2000.HRPD.Cell.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.MaxCellEntries"; + } + leaf cell-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.CellNumberOfEntries"; + } + leaf max-channel-entries { + type uint64; + description + "The maximum number of entries in {{object|.REM.CDMA2000.HRPD.Channel.{i}.}} table."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.MaxChannelEntries"; + } + leaf channel-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.ChannelNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD."; + } + + grouping rem-cdma2000-hrpd-channel-g { + description + "REM specific configuration and reporting."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Channel.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Channel.{i}.Alias"; + } + leaf sniffing-band-class { + type uint8 { + range "0..31"; + } + description + "Config parameter to set band class. Reference - {{bibref|3GPP2-C.S0057}}, Band Class Specification for CDMA2000 Spread Spectrum Systems."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Channel.{i}.SniffingBandClass"; + } + leaf sniffing-channel-number { + type uint16 { + range "0..2016"; + } + description + "The Radio Frequency Channel Number (RFCN) in the FL direction."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Channel.{i}.SniffingChannelNumber"; + } + leaf-list pn-list { + type string { + length "0..256"; + } + config false; + description + "{{list}} Each item is a (single value) PN offset in units of 64 PN chips or PNrange expressed in the following format: <Start-value>\"..\"<End-value>:<Increment>. If an empty string, then no specific PNList is provided, meaning that the FAP is required to pick a PN list to scan on its own."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Channel.{i}.PNList"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Channel.{i}."; + } + + grouping rem-cdma2000-hrpd-cell-g { + leaf rem-cdma2000-hrpd-cell-key { + type string; + description + "Key value for this object, which could be an item of a list."; + } + description + "Table indicating the components of the discovered cells."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}."; + } + + grouping rem-cdma2000-hrpd-cell-rf-g { + description + "RF REM results for each detected cell."; + leaf band { + type int64; + description + "CDMA band for the reported cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF.Band"; + } + leaf rfcnfl { + type uint16 { + range "0..2016"; + } + description + "The Radio Frequency Channel Number (RFCN) in the FL direction for the reported cell."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF.RFCNFL"; + } + leaf io { + type int64; + units "dBm"; + description + "The total received power spectral density in {{units}}, including signal and interference."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF.Io"; + } + leaf p-ilot-pn { + type uint16 { + range "0..511"; + } + units "64 PN chips"; + description + "Pilot PN Offset (in units of {{units}})."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF.PIlotPN"; + } + leaf p-ilot-pn-phase { + type uint64; + units "chips"; + description + "Pilot PN phase in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF.PIlotPNPhase"; + } + leaf pilot-strength-ecp { + type int64; + units "dBm"; + description + "The strength estimate of the received pilot energy per chip in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF.PilotStrengthEcp"; + } + leaf pilot-strength-ecp-io { + type int64; + units "dB"; + description + "The strength estimate of the received pilot energy per chip, Ecp, to total received spectral density, Io (signal and noise) in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF.PilotStrengthEcpIo"; + } + leaf overheads-available { + type boolean; + description + "If set to {{true}}, the overhead messages for this particular cell is included in {{object|.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel.}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF.OverheadsAvailable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.RF."; + } + + grouping rem-cdma2000-hrpd-cell-control-channel-g { + description + "Table containing information braodcast on control channel."; + leaf color-code { + type int64; + description + "The color code of the measured sector as defined in {{bibref|3GPP2-C.S0024}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel.ColorCode"; + } + leaf sector-id { + type binary { + length "16"; + } + description + "The sector ID of the measured sector as defined in {{bibref|3GPP2-C.S0024}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel.SectorID"; + } + leaf subnet-mask { + type int64; + units "bits"; + description + "The length of the subnet mask in {{units}} for the measured sector as defined in {{bibref|3GPP2-C.S0024}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel.SubnetMask"; + } + leaf country-code { + type int64; + description + "The country code of the measured sector as defined in {{bibref|3GPP2-C.S0024}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel.CountryCode"; + } + leaf latitude { + type int64; + units "0.25 arc seconds"; + description + "The reported lattitude of the cell in units of {{units}}, expressed as a two's complement signed number with positive numbers signifying North latitudes in the range -1296000 to 1296000 inclusive corresponding to a range of -90 to +90) Refer to {{bibref|3GPP2-C.S0024}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel.Latitude"; + } + leaf longitude { + type int64; + units "0.25 arc seconds"; + description + "The reported longitude of the cell in units of {{units}}, expressed as a two's complement signed number with positive numbers signifying East longitude in the range -2592000 to 2592000 inclusive (corresponding to a range of -180 to +180). Refer to {{bibref|3GPP2-C.S0024}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel.Longitude"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.HRPD.Cell.{i}.ControlChannel."; + } + + grouping rem-cdma2000-macro-timing-g { + description + "Parameters for controlling CDMA2000 system timing derived from macro system sniffing."; + leaf admin-state { + type uint8 { + range "0..1"; + } + config false; + description + "This is the Admin State of Macro Timing. Lock means MacroTiming feature is Enabled. Unlock means MacroTiming feature is disabled. 0 - Lock (Enabled), 1 - Unlock (Disabled)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.AdminState"; + } + leaf tracking-channel-number { + type uint64; + description + "Channel number of Macro Base Station currently used for MacroTiming."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.TrackingChannelNumber"; + } + leaf tracking-band-class { + type uint8 { + range "0..31"; + } + description + "BandClass of Macro Base Station currently used for MacroTiming."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.TrackingBandClass"; + } + leaf-list tracking-pn-offset { + type string { + length "0..256"; + } + description + "{{list}} Each item is a (single value) PN offset in units of 64 PN chips of a Macro Base Station currently used for MacroTiming."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.TrackingPNOffset"; + } + leaf timing-source { + type uint8 { + range "0..1"; + } + description + "This parameter indicates the timing source for the FAP: 0 - GPS 1 - Macro Timing The other read-only parameters in this object only have valid values when timingsource is set to 1."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.TimingSource"; + } + leaf channel-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.ChannelNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming."; + } + + grouping rem-cdma2000-macro-timing-channel-g { + description + "Object used to configure list of channels to be used for Macto Timing."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the {{object}} entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}.Enable"; + } + leaf alias { + type string { + length "1..64"; + } + description + "{{datatype|expand}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}.Alias"; + } + leaf air-interface-type { + type uint8 { + range "0..1"; + } + config false; + description + "Air interface type of the configured Band class and Channel. 0 - 1x, 1 - HRPD."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}.AirInterfaceType"; + } + leaf band-class { + type uint8 { + range "0..31"; + } + description + "Bandclass of the Macro timing channel."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}.BandClass"; + } + leaf channel-number { + type uint64; + description + "Macro timing acquisition channel."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}.ChannelNumber"; + } + leaf priority { + type uint64; + config false; + description + "Priority of the channle to use for acquisition. FAP should prioritize lower values over higher."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}.Priority"; + } + leaf-list pn-list { + type string { + length "0..256"; + } + config false; + description + "{{list}} Each item is a (single value) PN offset in units of 64 PN chips or PNrange expressed in the following format: <Start-value>\"..\"<End-value>:<Increment> If an empty string, then no specific PNList is provided, meaning that the FAP is required to pick a PN list to scan on its own."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}.PNList"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.REM.CDMA2000.MacroTiming.Channel.{i}."; + } + + grouping transport-g { + description + "This object contains parameters relating to the transport."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport."; + } + + grouping transport-sip-g { + description + "This object contains parameters relating to SIP as a transport protocol. SIP is defined in {{bibref|RFC3261}}."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the whole SIP object and allows the setup or release of SIP associations and their related streams."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.Enable"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP."; + } + + grouping transport-sip-fcs-g { + description + "This object models SIP Femtocell Convergence Server (FCS) parameters."; + leaf fcsuri { + type string { + length "0..256"; + } + config false; + description + "The request URI for MESSAGE method sent to Femtocell Convergence Server (FCS). The string MUST contain a URI as defined in {{bibref|RFC3986}}. The device MUST support SIP URI and MAY support other URI schemes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.FCSURI"; + } + leaf out-going-proxy-uri { + type string { + length "0..256"; + } + config false; + description + "The request URI for Outgoing Proxy. The string MUST contain a URI as defined in {{bibref|RFC3986}}. The device MUST support SIP URI and MAY support other URI schemes."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.OutGoingProxyURI"; + } + leaf p-access-net-info-header { + type string { + length "0..256"; + } + description + "This string will be populated as the value for P-Access-Network-Info header. This header is generated by the device. See {{bibref|3GPP2-X.S0059}} and {{bibref|RFC3455}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.PAccessNetInfoHeader"; + } + leaf realm { + type string { + length "0..64"; + } + config false; + description + "The FQDN or IP Address representing the Home Domain of the device. The request URI for REGISTER will be formed by prefixing \"sip:\" to this value."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.Realm"; + } + leaf impu { + type string { + length "0..256"; + } + config false; + description + "The \"IP Multimedia Public User\" (IMPU) Identity."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.IMPU"; + } + leaf impi { + type string { + length "0..256"; + } + config false; + description + "The \"IP Multimedia Private Identity\" (IMPI). This value is ignored when {{param|SIPAuthMethod}} is set to {{enum|TNA|SIPAuthMethod}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.IMPI"; + } + leaf sip-password { + type string { + length "0..32"; + } + config false; + description + "Password to Authenticate the IMS core. This value is ignored when {{param|SIPAuthMethod}} is set to {{enum|TNA|SIPAuthMethod}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.SIPPassword"; + } + leaf-list sip-auth-capability { + type enumeration { + enum "tna" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.SIPAuthCapability - TNA"; + } + enum "sip-digest" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.SIPAuthCapability - SIPDigest"; + } + } + description + "Represents the SIP authentication mechanisms supported by this device."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.SIPAuthCapability"; + } + leaf sip-auth-method { + type string { + length "0..256"; + } + config false; + description + "Represents the authentication method used by this device for SIP registration. If value is {{enum|SIPDigest}}, the {{param|SIPPassword}} MUST not be {{empty}}. If value is {{enum|TNA}}, {{param|SIPPassword}} and {{param|IMPI}} are ignored."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.SIPAuthMethod"; + } + leaf sip-local-port { + type uint16 { + range "0..65535"; + } + config false; + description + "Local port number for initiating SIP traffic."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.SIPLocalPort"; + } + leaf rtp-port-low-limit { + type uint16 { + range "0..65535"; + } + config false; + description + "The low limit of port number for originating and receiving RTP/RTCP traffic."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.RTPPortLowLimit"; + } + leaf rtp-port-high-limit { + type uint16 { + range "0..65535"; + } + config false; + description + "The high limit of port number for originating and receiving RTP/RTCP traffic."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.RTPPortHighLimit"; + } + leaf sip-reg-expiry { + type uint64; + config false; + description + "SIP registration expiry value, as defined in {{bibref|RFC3261}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.SIPRegExpiry"; + } + leaf sip-session-expiry { + type uint64 { + range "90..max"; + } + units "seconds"; + default "1800"; + config false; + description + "SIP session timer expiry value, in {{units}}, as defined in {{bibref|RFC4028}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.SIPSessionExpiry"; + } + leaf-list emergency-numbers-list { + type string { + length "0..64"; + } + config false; + description + "Indicates the dialed digit pattern matching strings used to determine if the call is an emergency call that MAY bypass access control and receive priority treatment."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.EmergencyNumbersList"; + } + leaf timer-t1 { + type uint64 { + range "1..max"; + } + units "milliseconds"; + config false; + description + "Value of SIP timer T1, in {{units}}, as defined in {{bibref|RFC3261}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.TimerT1"; + } + leaf timer-t2 { + type uint64 { + range "1..max"; + } + units "milliseconds"; + config false; + description + "Value of SIP timer T2, in {{units}}, as defined in {{bibref|RFC3261}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.TimerT2"; + } + leaf timer-t4 { + type uint64 { + range "1..max"; + } + units "milliseconds"; + config false; + description + "Value of SIP timer T4, in {{units}}, as defined in {{bibref|RFC3261}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.TimerT4"; + } + leaf t3210 { + type uint8 { + range "1..20"; + } + units "seconds"; + config false; + description + "This value specifies how much time to wait, in {{units}}, before time out on location update accept/reject. See {{bibref|3GPP2-A.S0014}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS.T3210"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SIP.FCS."; + } + + grouping transport-sctp-g { + description + "This object contains parameters relating to SCTP as a transport protocol. SCTP is defined in {{bibref|RFC4960}} and {{bibref|RFC3873}}."; + leaf enable { + type boolean; + config false; + description + "Enables or disables the whole SCTP object and allows the setup or release of SCTP associations and their related streams."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Enable"; + } + leaf hb-interval { + type uint64 { + range "1..max"; + } + units "seconds"; + default "30"; + config false; + description + "Heartbeat interval in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.HBInterval"; + } + leaf max-association-retransmits { + type uint64; + default "10"; + config false; + description + "Maximum number of consecutive retransmissions to a peer before an endpoint considers that the peer is unreachable and closes the association."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.MaxAssociationRetransmits"; + } + leaf max-init-retransmits { + type uint64; + default "8"; + config false; + description + "Number of retransmission per connection-attempt."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.MaxInitRetransmits"; + } + leaf max-path-retransmits { + type uint64; + default "5"; + config false; + description + "Maximum retransmission per destination address."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.MaxPathRetransmits"; + } + leaf rto-initial { + type uint64; + units "milliseconds"; + default "3000"; + config false; + description + "Initial value for Retransmit timeout in {{units}}. A retransmission time value of zero means immediate retransmission."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.RTOInitial"; + } + leaf rto-max { + type uint64; + units "milliseconds"; + default "6000"; + config false; + description + "Maximum value for Retransmit timeout in {{units}}. A retransmission time value of zero means immediate retransmission."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.RTOMax"; + } + leaf rto-min { + type uint64; + units "milliseconds"; + default "1000"; + config false; + description + "Minimum value for Retransmit timeout in {{units}}. A retransmission time value of zero means immediate retransmission. The value of this parameter MUST be lower than or equal to {{param|RTOMax}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.RTOMin"; + } + leaf val-cookie-life { + type uint64; + units "milliseconds"; + default "60000"; + config false; + description + "Valid cookie life in the 4-way start-up handshake procedure in {{units}}."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.ValCookieLife"; + } + leaf out-of-blues { + type uint64; + description + "The number of correctly formed SCTP packets, including the proper checksum, but for which the receiver was unable to identify an appropriate association."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.OutOfBlues"; + } + leaf checksum-errors { + type uint64; + description + "The number of SCTP packets received with an invalid checksum."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.ChecksumErrors"; + } + leaf out-ctrl-chunks { + type uint64; + description + "The number of SCTP control chunks sent (retransmissions are not included)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.OutCtrlChunks"; + } + leaf out-order-chunks { + type uint64; + description + "The number of SCTP ordered data chunks sent (retransmissions are not included)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.OutOrderChunks"; + } + leaf out-unorder-chunks { + type uint64; + description + "The number of SCTP unordered chunks (data chunks in which the U bit is set to 1) sent (retransmissions are not included)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.OutUnorderChunks"; + } + leaf in-ctrl-chunks { + type uint64; + description + "The number of SCTP control chunks received (no duplicate chunks included)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.InCtrlChunks"; + } + leaf in-order-chunks { + type uint64; + description + "The number of SCTP ordered data chunks received (no duplicate chunks included)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.InOrderChunks"; + } + leaf in-unorder-chunks { + type uint64; + description + "The number of SCTP unordered chunks (data chunks in which the U bit is set to 1) received (no duplicate chunks included)."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.InUnorderChunks"; + } + leaf frag-usr-msgs { + type uint64; + description + "The number of user messages that have been sent fragmented."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.FragUsrMsgs"; + } + leaf reasm-usr-msgs { + type uint64; + description + "The number of user messages that have been received fragmented and submitted to the reassembly process."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.ReasmUsrMsgs"; + } + leaf out-sctp-packs { + type uint64; + description + "The number of SCTP packets sent. Retransmitted DATA chunks are included."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.OutSCTPPacks"; + } + leaf in-sctp-packs { + type uint64; + description + "The number of SCTP packets received. Duplicates are included."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.InSCTPPacks"; + } + leaf discontinuity { + type yang:date-and-time; + description + "The time of the last discontinuity."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Discontinuity"; + } + leaf assoc-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.AssocNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP."; + } + + grouping transport-sctp-assoc-g { + description + "SCTP Association Table"; + leaf status { + type enumeration { + enum "disabled" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.Status - Disabled"; + } + enum "active" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.Status - Active"; + } + enum "progressing" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.Status - Progressing"; + } + enum "shutting-down" { + value 4; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.Status - ShuttingDown"; + } + enum "error" { + value 5; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.Status - Error"; + } + } + description + "The status of this SCTP association entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.Status"; + } + leaf primary-peer-address { + type inet:ip-address; + description + "The primary IP address of the peer SCTP association entity."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.PrimaryPeerAddress"; + } + leaf local-port { + type uint16 { + range "0..63999"; + } + description + "The local SCTP port number used for this SCTP association."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.LocalPort"; + } + leaf in-streams { + type uint64; + description + "The number of Inbound Streams according to the negotiation at association start-up."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.InStreams"; + } + leaf out-streams { + type uint64; + description + "The number of Outbound Streams according to the negotiation at association start-up."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.OutStreams"; + } + leaf start-time { + type yang:date-and-time; + description + "The start Time for the present SCTP association."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.StartTime"; + } + leaf discontinuity { + type yang:date-and-time; + description + "The time of the last discontinuity."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}.Discontinuity"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.SCTP.Assoc.{i}."; + } + + grouping transport-real-time-g { + description + "This object contains parameters relating to Real Time Transport using RTP."; + leaf rtcp-enable { + type boolean; + config false; + description + "Enable or disable RTCP."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.RTCPEnable"; + } + leaf sent-packets { + type uint64; + description + "The number of sent RTP packets."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.SentPackets"; + } + leaf rcv-packets { + type uint64; + description + "The number of received RTP packets."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.RcvPackets"; + } + leaf bytes-sent { + type uint64; + description + "Total number of RTP payload bytes sent."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.BytesSent"; + } + leaf bytes-received { + type uint64; + description + "Total number of RTP payload bytes received."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.BytesReceived"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime."; + } + + grouping transport-real-time-perf-g { + description + "This object contains performances relating to Real Time Transport using RTP."; + leaf lost-rcv-packets { + type uint64; + description + "The number of Lost RTP packets in reception."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.LostRcvPackets"; + } + leaf lost-far-end-packets { + type uint64; + description + "The number of Far End Lost RTP packets."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.LostFarEndPackets"; + } + leaf overruns { + type uint64; + description + "Total number of times the receive jitter buffer has overrun."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.Overruns"; + } + leaf underruns { + type uint64; + description + "Total number of times the receive jitter buffer has underrun for a CS-domain RAB."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.Underruns"; + } + leaf mean-rtt { + type uint64; + units "microseconds"; + description + "The mean Round Trip Time in {{units}} as computed by the source. {{bibref|RFC3550}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.MeanRTT"; + } + leaf max-rtt { + type uint64; + units "microseconds"; + description + "The maximum Round Trip Time in {{units}} as computed by the source. {{bibref|RFC3550}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.MaxRTT"; + } + leaf mean-receive-jitter { + type uint64; + units "microseconds"; + description + "The mean receive jitter in {{units}} as computed by the source. {{bibref|RFC3550}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.MeanReceiveJitter"; + } + leaf max-receive-jitter { + type uint64; + units "microseconds"; + description + "The maximum receive jitter in {{units}} as computed by the source. {{bibref|RFC3550}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.MaxReceiveJitter"; + } + leaf mean-far-end-jitter { + type uint64; + units "microseconds"; + description + "The mean far end jitter in {{units}} as computed by the source. {{bibref|RFC3550}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.MeanFarEndJitter"; + } + leaf max-far-end-jitter { + type uint64; + units "microseconds"; + description + "The maximum far end jitter in {{units}} as computed by the source. {{bibref|RFC3550}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf.MaxFarEndJitter"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.RealTime.Perf."; + } + + grouping transport-packet-g { + description + "This object contains parameters relating to Packet Transport using GTP-U."; + leaf echo-interval { + type uint64; + units "seconds"; + config false; + description + "Echo interval in {{units}}. An Echo interval value of zero means echo is disabled."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Packet.EchoInterval"; + } + leaf sent-packets { + type uint64; + description + "The number of sent GTP-U packets."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Packet.SentPackets"; + } + leaf rcv-packets { + type uint64; + description + "The number of received GTP-U packets."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Packet.RcvPackets"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Packet."; + } + + grouping transport-security-g { + description + "This object contains parameters relating to Security."; + leaf secret-number-of-entries { + type uint64; + description + "{{numentries}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.SecretNumberOfEntries"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security."; + } + + grouping transport-security-secret-g { + description + "Shared Secret Table. This table gathers information about all types of shared secret-based credentials (UICC)."; + leaf enable { + type boolean; + config false; + description + "Enable or disable this Shared Secret entry"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.Enable"; + } + leaf type { + type enumeration { + enum "sim" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.Type - SIM"; + } + enum "usim" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.Type - USIM"; + } + } + description + "The type of this Shared Secret entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.Type"; + } + leaf status { + type enumeration { + enum "present" { + value 1; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.Status - Present"; + } + enum "not-present" { + value 2; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.Status - Not_present"; + } + enum "error" { + value 3; + description + "none"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.Status - Error"; + } + } + description + "The status of this Shared Secret entry."; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.Status"; + } + leaf uicc-card-id { + type string { + length "0..19"; + } + description + "The UICC Card Identifier (UICCID), only numeric values are allowed. {{bibref|ITU-E.118}}"; + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}.UICCCardID"; + } + reference "BBF TR-196 2.0.3 full - FAPService.{i}.Transport.Security.Secret.{i}."; + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/core-model@2017-03-20.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/core-model@2017-03-20.yang new file mode 100644 index 000000000..63883ba44 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/core-model@2017-03-20.yang @@ -0,0 +1,1951 @@ +module core-model {
+ namespace "urn:onf:params:xml:ns:yang:core-model";
+ prefix core-model;
+ organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project";
+ contact "WG Web: <https://www.opennetworking.org/technical-communities/areas/specification/1931-optical-transport>
+ WG List: <mailto:wireless-transport@login.opennetworking.org>
+ WG Chair: Lyndon Ong
+ <mailto:lyong@ciena.com>
+ WG Chair: Giorgio Cazzaniga
+ <mailto:giorgio.cazzaniga@sm-optics.com>
+ Editors: Thorsten Heinze
+ <mailto:thorsten.heinze@telefonica.com>
+ Martin Skorupski
+ <mailto:martin.skorupski@highstreet-technologies.com>";
+ description "This module contains a collection of YANG definitions for managing wireless networks.";
+ revision 2017-03-20 {
+ description "Initial version";
+ reference "ONF TR 532: A YANG Data Model for Wireless Networks.";
+ }
+ /***********************
+ * package core-network-model
+ **********************/
+ /***********************
+ * package type-definitions
+ **********************/
+ /***********************
+ * package resilience
+ **********************/
+ typedef protection-reason {
+ type enumeration {
+ enum wait-to-revert {
+ description "The resource is selected as control is waiting to restore to a preferred resource.";
+ }
+ enum signal-degrade {
+ description "The resource is selected as the best preferred resource is in signal degrade.";
+ }
+ enum signal-fail {
+ description "The resource is selected as the best preferred resource is in signal fail.";
+ }
+ }
+ description "The cause of the current protection state.";
+ }
+ typedef route-selection-control {
+ type enumeration {
+ enum normal {
+ description "No administrative control applied to the switch.";
+ }
+ enum manual {
+ description "Resource temporarily chosen by control configuration where the resource is not the preferred resource.
+ Preferred resource has highest priority.
+ Temporarily overrides reversion.
+ If this resource fails will switch to best available resource.
+ If resource selected is shared and another FC requires the resource then the selection control will change to Normal and switch to best available based upon normal rules.
+ If the resource selected is then set to LOCK_OUT then the the selection control will change to NORMAL and switch to best available based upon normal rules.
+ Can be returned to NORMAL by configuration action.";
+ }
+ enum forced {
+ description "Resource temporarily chosen by control configuration where the resource is not the preferred resource.
+ Preferred resource has highest priority.
+ Temporarily overrides reversion.
+ If this resource fails will NOT switch.
+ If resource selected is shared and another FC requires the resource through a FORCE on that FC and the FC is of a higher FcPriority then the selection control will change to NORMAL and switch to best available based upon normal rules.
+ If the resource selected is then set to LOCK_OUT then the the selection control will change to NORMAL and switch to best available based upon normal rules.
+ Can be returned to NORMAL by configuration action.";
+ }
+ enum lock-out {
+ description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of.
+ This overrides all other protection control states including forced.
+ If the item is locked out then it cannot be used under any circumstances.
+ Note: Only relevant when part of a protection scheme.";
+ }
+ }
+ description "Possible degrees of administrative control applied to the Route selection.";
+ }
+ typedef route-selection-reason {
+ type enumeration {
+ enum wait-to-revert {
+ description "The resource is selected as control is waiting to restore to a preferred resource.";
+ }
+ enum signal-degrade {
+ description "The resource is selected as the best preferred resource is in signal degrade.";
+ }
+ enum signal-fail {
+ description "The resource is selected as the best preferred resource is in signal fail.";
+ }
+ enum normal {
+ description "No administrative control applied to the switch.";
+ }
+ enum manual {
+ description "Resource temporarily chosen by control configuration where the resource is not the preferred resource.
+ Preferred resource has highest priority.
+ Temporarily overrides reversion.
+ If this resource fails will switch to best available resource.
+ If resource selected is shared and another FC requires the resource then the selection control will change to Normal and switch to best available based upon normal rules.
+ If the resource selected is then set to LOCK_OUT then the the selection control will change to NORMAL and switch to best available based upon normal rules.
+ Can be returned to NORMAL by configuration action.";
+ }
+ enum forced {
+ description "Resource temporarily chosen by control configuration where the resource is not the preferred resource.
+ Preferred resource has highest priority.
+ Temporarily overrides reversion.
+ If this resource fails will NOT switch.
+ If resource selected is shared and another FC requires the resource through a FORCE on that FC and the FC is of a higher FcPriority then the selection control will change to NORMAL and switch to best available based upon normal rules.
+ If the resource selected is then set to LOCK_OUT then the the selection control will change to NORMAL and switch to best available based upon normal rules.
+ Can be returned to NORMAL by configuration action.";
+ }
+ enum lock-out {
+ description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of.
+ This overrides all other protection control states including forced.
+ If the item is locked out then it cannot be used under any circumstances.
+ Note: Only relevant when part of a protection scheme.";
+ }
+ }
+ description "The cause of the current route selection.";
+ }
+ typedef switch-control {
+ type enumeration {
+ enum normal {
+ description "No administrative control applied to the switch.";
+ }
+ enum manual {
+ description "Resource temporarily chosen by control configuration where the resource is not the preferred resource.
+ Preferred resource has highest priority.
+ Temporarily overrides reversion.
+ If this resource fails will switch to best available resource.
+ If resource selected is shared and another FC requires the resource then the selection control will change to Normal and switch to best available based upon normal rules.
+ If the resource selected is then set to LOCK_OUT then the the selection control will change to NORMAL and switch to best available based upon normal rules.
+ Can be returned to NORMAL by configuration action.";
+ }
+ enum forced {
+ description "Resource temporarily chosen by control configuration where the resource is not the preferred resource.
+ Preferred resource has highest priority.
+ Temporarily overrides reversion.
+ If this resource fails will NOT switch.
+ If resource selected is shared and another FC requires the resource through a FORCE on that FC and the FC is of a higher FcPriority then the selection control will change to NORMAL and switch to best available based upon normal rules.
+ If the resource selected is then set to LOCK_OUT then the the selection control will change to NORMAL and switch to best available based upon normal rules.
+ Can be returned to NORMAL by configuration action.";
+ }
+ }
+ description "none";
+ }
+ typedef switch-state-reason {
+ type enumeration {
+ enum wait-to-revert {
+ description "The resource is selected as control is waiting to restore to a preferred resource.";
+ }
+ enum signal-degrade {
+ description "The resource is selected as the best preferred resource is in signal degrade.";
+ }
+ enum signal-fail {
+ description "The resource is selected as the best preferred resource is in signal fail.";
+ }
+ enum normal {
+ description "No administrative control applied to the switch.";
+ }
+ enum manual {
+ description "Resource temporarily chosen by control configuration where the resource is not the preferred resource.
+ Preferred resource has highest priority.
+ Temporarily overrides reversion.
+ If this resource fails will switch to best available resource.
+ If resource selected is shared and another FC requires the resource then the selection control will change to Normal and switch to best available based upon normal rules.
+ If the resource selected is then set to LOCK_OUT then the the selection control will change to NORMAL and switch to best available based upon normal rules.
+ Can be returned to NORMAL by configuration action.";
+ }
+ enum forced {
+ description "Resource temporarily chosen by control configuration where the resource is not the preferred resource.
+ Preferred resource has highest priority.
+ Temporarily overrides reversion.
+ If this resource fails will NOT switch.
+ If resource selected is shared and another FC requires the resource through a FORCE on that FC and the FC is of a higher FcPriority then the selection control will change to NORMAL and switch to best available based upon normal rules.
+ If the resource selected is then set to LOCK_OUT then the the selection control will change to NORMAL and switch to best available based upon normal rules.
+ Can be returned to NORMAL by configuration action.";
+ }
+ }
+ description "Explains the reason for the current switch state.";
+ }
+ typedef reversion-mode {
+ type enumeration {
+ enum revertive {
+ description "An FC switched to a lower priority (non-preferred) resource will revert to a higher priority (preferred) resource when that recovers (potentially after some hold-off time).";
+ }
+ enum non-revertive {
+ description "An FC switched to a lower priority (non-preferred) resource will not revert to a higher priority (preferred) resource when that recovers.";
+ }
+ }
+ description "The reversion mode associated with protection.";
+ }
+ grouping global-pac-g {
+ uses global-class-g;
+ description "Provides the properties of a GlobalClass via composition.";
+ }
+ grouping local-pac-g {
+ uses local-class-g;
+ description "Provides the properties of a LocalClass via composition.";
+ }
+ typedef protection-type {
+ type string;
+ description "Identifies the type of protection of an FcSwitch.";
+ }
+
+ typedef layer-protocol-name {
+ type string;
+ description "Provides a controlled list of layer protocol names and indicates the naming authority.
+ Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference.
+ Layer protocol names include:
+ - Layer 1 (L1): OTU, ODU
+ - Layer 2 (L2): Carrier Grade Ethernet (ETY, ETH), MPLS-TP (MT)
+ ";
+ }
+ typedef port-role {
+ type string;
+ description "The role of a port in the context of the function of the forwarding entity that it bounds.";
+ }
+ typedef port-direction {
+ type enumeration {
+ enum bidirectional {
+ description "The Port has both an INPUT flow and an OUTPUT flow defined.";
+ }
+ enum input {
+ description "The Port only has definition for a flow into the Forwarding entity (i.e. an ingress flow).";
+ }
+ enum output {
+ description "The Port only has definition for a flow out of the Forwarding entity (i.e. an egress flow).";
+ }
+ enum unidentified-or-unknown {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ }
+ description "The orientation of flow at the Port of a Forwarding entity";
+ }
+ typedef forwarding-direction {
+ type enumeration {
+ enum bidirectional {
+ description "The Forwarding entity supports both BIDIRECTIONAL flows at all Ports (i.e. all Ports have both an INPUT flow and an OUTPUT flow defined).";
+ }
+ enum unidirectional {
+ description "The Forwarding entity has Ports that are either INPUT or OUTPUT. It has no BIDIRECTIONAL Ports.";
+ }
+ enum undefined-or-unknown {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ }
+ description "The directionality of a Forwarding entity.";
+ }
+ typedef termination-direction {
+ type enumeration {
+ enum bidirectional {
+ description "A Termination with both SINK and SOURCE flows.";
+ }
+ enum sink {
+ description "The flow is up the layer stack from the server side to the client side.
+ Considering an example of a Termination function within the termination entity, a SINK flow:
+ - will arrive at at the base of the termination function (the server side) where it is essentially at an INPUT to the termination component
+ - then will be decoded and deconstructed
+ - then relevant parts of the flow will be sent out of the termination function (the client side) where it is essentially at an OUTPUT from the termination component
+ A SINK termination is one that only supports a SINK flow.
+ A SINK termiation can be bound to an OUTPUT Port of a Forwarding entity";
+ }
+ enum source {
+ description "The flow is down the layer stack from the server side to the client side.
+ Considering an example of a Termination function within the termination entity, a SOURCE flow:
+ - will arrive at at the top of the termination function (the client side) where it is essentially at an INPUT to the termination component
+ - then will be assembled with various overheads etc and will be coded
+ - then coded form of the assembly of flow will be sent out of the termination function (the server side) where it is essentially at an OUTPUT from the termination component
+ A SOURCE termination is one that only supports a SOURCE flow.
+ A SOURCE termiation can be bound to an INPUT Port of a Forwarding entity";
+ }
+ enum undefined-or-unknown {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ }
+ description "The directionality of a termination entity.";
+ }
+ typedef extended-termination-direction {
+ type enumeration {
+ enum bidirectional {
+ description "A Termination with both SINK and SOURCE flows.";
+ }
+ enum sink {
+ description "The flow is up the layer stack from the server side to the client side.
+ Considering an example of a Termination function within the termination entity, a SINK flow:
+ - will arrive at at the base of the termination function (the server side) where it is essentially at an INPUT to the termination component
+ - then will be decoded and deconstructed
+ - then relevant parts of the flow will be sent out of the termination function (the client side) where it is essentially at an OUTPUT from the termination component
+ A SINK termination is one that only supports a SINK flow.
+ A SINK termiation can be bound to an OUTPUT Port of a Forwarding entity";
+ }
+ enum source {
+ description "The flow is down the layer stack from the server side to the client side.
+ Considering an example of a Termination function within the termination entity, a SOURCE flow:
+ - will arrive at at the top of the termination function (the client side) where it is essentially at an INPUT to the termination component
+ - then will be assembled with various overheads etc and will be coded
+ - then coded form of the assembly of flow will be sent out of the termination function (the server side) where it is essentially at an OUTPUT from the termination component
+ A SOURCE termination is one that only supports a SOURCE flow.
+ A SOURCE termiation can be bound to an INPUT Port of a Forwarding entity";
+ }
+ enum undefined-or-unknown {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ enum contra-direction-sink {
+ description "The essential flow of the Termination entity is SINK (i.e. up the layer stack) but the INPUT flow of the Termination entity was provided by a SOURCE OUTPUT or taken from a SOURCE INPUT (duplicating the input signal) hence reversing the flow orientation from down the layer stack to up the layer stack.";
+ }
+ enum contra-direction-source {
+ description "The essential flow of the Termination entity is SOURCE (i.e. down the layer stack) but the OUTPUT flow of the Termination entity was fed to (and replaces) a SINK OUTPUT or was fed to a SINK INPUT (replacing the normal flow) hence reversing the flow orientation from down the layer stack to up the layer stack.";
+ }
+ }
+ description "Extended to include contra-direction considerations. Only applies to LP and elements of LP not to LTP.";
+ }
+ typedef termination-state {
+ type enumeration {
+ enum lp-can-never-terminate {
+ description "A non-flexible case that can never be terminated.";
+ }
+ enum lt-not-terminated {
+ description "A flexible termination that can terminate but is currently not terminated.";
+ }
+ enum terminated-server-to-client-flow {
+ description "A flexible termination that is currently terminated for server to client flow only.";
+ }
+ enum terminated-client-to-server-flow {
+ description "A flexible termination that is currently terminated for client to server flow only.";
+ }
+ enum terminated-bidirectional {
+ description "A flexible termination that is currently terminated in both directions of flow.";
+ }
+ enum lt-permenantly-terminated {
+ description "A non-flexible termination that is always terminated (in both directions of flow for a bidirectional case and in the one direction of flow for both unidirectional cases).";
+ }
+ enum termination-state-unknown {
+ description "There TerminationState cannot be determined.";
+ }
+ }
+ description "Provides support for the range of behaviours and specific states that an LP can take with respect to termination of the signal.
+ Indicates to what degree the LayerTermination is terminated.";
+ }
+
+ /***********************
+ * package object-classes
+ **********************/
+ /***********************
+ * package resilience
+ **********************/
+ grouping configuration-and-switch-controller-g {
+ leaf switch-rule {
+ type to-be-defined;
+ description "A sketch of the presence of complex rules governing the switch behavior.";
+ }
+ leaf-list fc-switch {
+ type leafref {
+ path '/forwarding-construct/fc-switch/uuid';
+ }
+ description "The switch being controlled.";
+ }
+ container control-parameters {
+ uses control-parameters-pac-g;
+ description "The control parameters to be applied if local parameters are used rather than profiles";
+ }
+ leaf-list profile-proxy {
+ type string;
+ description "Applied profiles.";
+ }
+ container local-pac {
+ uses local-pac-g;
+ description "none";
+ }
+ container global-pac {
+ uses global-pac-g;
+ description "none";
+ }
+ leaf is-frozen {
+ type boolean;
+ description "Temporarily prevents any switch action to be taken and, as such, freezes the current state.
+ Until the freeze is cleared, additional near-end external commands are rejected and fault condition changes and received APS messages are ignored.
+ All administrative controls of any aspect of protection are rejected.";
+ }
+ leaf is-coordinated-switching-both-ends {
+ type boolean;
+ description "The C&SC is operating such that switching at both ends of each flow acorss the FC is coordinated at both ingress and egress ends.";
+ }
+ leaf-list subordinate-controller {
+ type leafref {
+ path '/network-element/ltp/lp/config-and-switch-controller/switch-rule';
+ }
+ description "A C&SC that is fully or partially subordinate this C&SC.
+ A peer is considered as partially subordinate in that the peer will respond to requests for action from this C&SC but will also make requests for action to be carried out by this C&SC.
+ Where there is a peer relationship each controller in the peering will see the other controller as subordinate.";
+ }
+ description "Represents the capability to control and coordinate switches, to add/delete/modify FCs and to add/delete/modify LTPs/LPs so as to realize a protection scheme.";
+ }
+ grouping control-parameters-pac-g {
+ leaf reversion-mode {
+ type reversion-mode;
+ description "Indcates whether the protection scheme is revertive or non-revertive.";
+ }
+ leaf wait-to-revert-time {
+ type int64;
+ default 15;
+ description "If the protection system is revertive, this attribute specifies the time, in minutes, to wait after a fault clears on a higher priority (preferred) resource before reverting to the preferred resource.";
+ }
+ leaf prot-type {
+ type protection-type;
+ description "Indicates the protection scheme that is used for the ProtectionGroup.";
+ }
+ leaf hold-off-time {
+ type int64;
+ description "This attribute indicates the time, in milliseconds, between declaration of signal degrade or signal fail, and the initialization of the protection switching algorithm.";
+ }
+ leaf network-scheme-specification {
+ type string;
+ description "none";
+ }
+ description "A list of control parameters to apply to a switch.";
+ }
+ grouping fc-switch-g {
+ leaf hold-off-time {
+ type int64;
+ description "Moved to ControlParameter_Pac... This attribute indicates the time, in seconds, between declaration of unacceptable quality of signal on the currently selected FcPort, and the initialization of the protection switching algorithm. ";
+ }
+ leaf prot-type {
+ type protection-type;
+ description "Indicates the protection scheme that is used for the ProtectionGroup.";
+ }
+ leaf reversion-mode {
+ type reversion-mode;
+ description "Moved to ControlParameter_Pac... This attribute whether or not the protection scheme is revertive or non-revertive. ";
+ }
+ leaf-list selected-fc-port {
+ type leafref {
+ path '/forwarding-construct/fc-port/uuid';
+ }
+ description "Indicates which points are selected by the switch.
+ Depending on the switch spec (via Fcspec)
+ - more than one FcPort can be selected at any one time (e.g. egress switch, ingress packet switch)
+ - zero FcPorts can be selected. For an ingress switch this indicates that the switch common (egress) is 'high impedance'
+.";
+ }
+ leaf-list profile-proxy {
+ type string;
+ description "Provides a set of predefined values for switch control in place of the direct values available via the FcSwitch or via _configurationAndSwitchControl.";
+ }
+ container internal-configuration-and-switch-control {
+ uses configuration-and-switch-controller-g;
+ description "A switch controller encapsulated in the FcSwitch.";
+ }
+ leaf switch-control {
+ type switch-control;
+ description "Degree of administrative control applied to the switch selection.";
+ }
+ leaf switch-selects-ports {
+ type port-direction;
+ description "Indicates whether the switch selects from ingress to the FC or to egress of the FC, or both.";
+ }
+ leaf switch-selection-reason {
+ type switch-state-reason;
+ config false;
+ description "The reason for the current switch selection.";
+ }
+ container control-parameters {
+ uses control-parameters-pac-g;
+ description "none";
+ }
+ leaf wait-to-restore-time {
+ type int64;
+ description "Moved to ControlParameter_Pac and changed to waitToRevert... If the protection system is revertive, this attribute specifies the amount of time, in seconds, to wait after the preferred FcPort returns to an acceptable state of operation (e.g. a fault has cleared) before restoring traffic to that preferred FcPort.";
+ }
+ uses local-class-g;
+ description "The FcSwitch class models the switched forwarding of traffic (traffic flow) between FcPorts and is present where there is protection functionality in the FC.
+ If an FC exposes protection (having two or more FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects to represent the alternative flow choices visible at the edge of the FC.
+ The FC switch represents and defines a protection switch structure encapsulated in the FC.
+ Essentially performs one of the functions of the Protection Group in a traditional model. It associates to 2 or more FcPorts each playing the role of a Protection Unit.
+ One or more protection, i.e. standby/backup, FcPorts provide protection for one or more working (i.e. regular/main/preferred) FcPorts where either protection or working can feed one or more protected FcPort.
+ The switch may be used in revertive or non-revertive (symmetric) mode. When in revertive mode it may define a waitToRestore time.
+ It may be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 and 1:1).
+ It may be locked out (prevented from switching), force switched or manual switched.
+ It will indicate switch state and change of state.
+ The switch can be switched away from all sources such that it becomes open and hence two coordinated switches can both feed the same LTP so long as at least one of the two is switched away from all sources (is 'open').
+ The ability for a Switch to be 'high impedance' allows bidirectional ForwardingConstructs to be overlaid on the same bidirectional LTP where the appropriate control is enabled to prevent signal conflict.
+ This ability allows multiple alternate routes to be present that otherwise would be in conflict.";
+ }
+
+ grouping forwarding-domain-g {
+ leaf-list layer-protocol-name {
+ type layer-protocol-name;
+ min-elements 1;
+ description "One or more protocol layers at which the FD represents the opportunity to enable forwarding between LTP that bound it.";
+ }
+ leaf-list lower-level-fd {
+ type leafref {
+ path '/network-element/fd/uuid';
+ }
+ description "The FD class supports a recursive aggregation relationship (HigherLevelFdEncompassesLowerLevelFds) such that the internal construction of an FD can be exposed as multiple lower level FDs and associated Links (partitioning).
+ The aggregated FDs and Links form an interconnected topology that provides and describes the capability of the aggregating FD.
+ Note that the model actually represents aggregation of lower level FDs into higher level FDs as views rather than FD partition, and supports multiple views.
+ Aggregation allow reallocation of capacity from lower level FDs to different higher level FDs as if the network is reorganized (as the association is aggregation not composition).";
+ }
+ leaf-list fc {
+ type leafref {
+ path '/forwarding-construct/uuid';
+ }
+ description "An FD aggregares one or more FCs. A aggregated FC connects LTPs that bound the FD.";
+ }
+ leaf-list ltp {
+ type leafref {
+ path '/network-element/ltp/uuid';
+ }
+ description "An instance of FD is associated with zero or more LTP objects.
+ The LTPs that bound the FD provide capacity for forwarding.";
+ }
+ leaf-list lower-level-link {
+ type string;
+ description "The FD encompasses Links that interconnect lower level FDs and collect links that are wholly within the bounds of the FD.
+ See also _lowerLevelFd.";
+ }
+ uses global-class-g;
+ description "The ForwardingDomain (FD) class models the topological component that represents the opportunity to enable forwarding (of specific transport characteristic information at one or more protocol layers) between points represented by the LTP in the model.
+ The FD object provides the context for and constrains the formation, adjustment and removal of FCs and hence offers the potential to enable forwarding.
+ The LTPs available are those defined at the boundary of the FD.
+ At a lower level of recursion an FD could represent a fabric (switch matrix) in a Network Element (NE).
+ An NE can encompass more than one switch matrix and hence more than one FD. The FD representing a switch matrix can be further partitioned.
+ The FD corresponds to a subnetwork [ITU-T G.800], FlowDomain [TMF 612] and a MultiLayerSubNetwork (MLSN) [TMF 612]. As in the TMF concept of MLSN and unlike the ITU-T concet of subnetwork model the FD can support more than one layer-protocol.";
+ }
+ grouping forwarding-construct-g {
+ leaf layer-protocol-name {
+ type layer-protocol-name;
+ description "The layerProtocol at which the FC enables the potential for forwarding.";
+ }
+ leaf-list lower-level-fc {
+ type leafref {
+ path '/forwarding-construct/uuid';
+ }
+ description "An FC object supports a recursive aggregation relationship such that the internal construction of an FC can be exposed as multiple lower level FC objects (partitioning).
+ Aggregation is used as for the FD to allow changes in hierarchy.
+ FC aggregation reflects FD aggregation.
+ The FC represents a Cross-Connection in an NE. The Cross-Connection in an NE is not necessarily the lowest level of FC partitioning.
+ ";
+ }
+ leaf-list fc-route {
+ type string;
+ description "An FC object can have zero or more routes, each of which is defined as a list of lower level FC objects describing the flow across the network.";
+ }
+ list fc-port {
+ key 'uuid';
+ min-elements 2;
+ uses fc-port-g;
+ description "The association of the FC to LTPs is made via FcPorts (essentially the ports of the FC).";
+ }
+ list fc-switch {
+ key 'uuid';
+ uses fc-switch-g;
+ description "If an FC exposes protection (having two FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects.
+ The arrangement of switches for a particular instance is described by a referenced FcSpec";
+ }
+ leaf forwarding-direction {
+ type forwarding-direction;
+ description "The directionality of the ForwardingConstruct.
+ Is applicable to simple ForwardingConstructs where all FcPorts are BIDIRECTIONAL (the ForwardingConstruct will be BIDIRECTIONAL) or UNIDIRECTIONAL (the ForwardingConstruct will be UNIDIRECTIONAL).
+ Is not present in more complex cases.";
+ }
+ leaf is-protection-lock-out {
+ if-feature protection-exclude-server;
+ type boolean;
+ description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of.
+ This overrides all other protection control states including forced.
+ If the item is locked out then it cannot be used under any circumstances.
+ Note: Only relevant when part of a protection scheme.";
+ }
+ leaf service-priority {
+ type int64;
+ description "Relevant where 'service' FCs are competing for server resources.
+ Used to determine which signal FC is allocated resource.
+ The priority of the 'service' with respect to other 'services'.
+ Lower numeric value means higher priority.
+ Covers cases such as preemptable.";
+ }
+ leaf-list supported-link {
+ type string;
+ description "An FC that spans between LTPs that terminate the LayerProtocol usually supports one or more links in the client layer.";
+ }
+ uses global-class-g;
+ description "The ForwardingConstruct (FC) class models enabled constrained potential for forwarding between two or more LTPs at a particular specific layerProtocol.
+ Like the LTP, the FC supports any transport protocol including all circuit and packet forms.
+ It is used to effect forwarding of transport characteristic (layer protocol) information.
+ An FC can be in only one FD.
+ The ForwardingConstruct is a Forwarding entity.
+ At a low level of the recursion, a FC represents a cross-connection within an NE. It may also represent a fragment of a cross-connection under certain circumstances.
+ The FC object can be used to represent many different structures including point-to-point (P2P), point-to-multipoint (P2MP), rooted-multipoint (RMP) and multipoint-to-multipoint (MP2MP) bridge and selector structures for linear, ring or mesh protection schemes.";
+ }
+ container network-element {
+ presence "";
+ list fd {
+ key 'uuid';
+ uses forwarding-domain-g;
+ description "Represents the FD that is completely within the boundary of the NE.
+ At a low level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric).
+ Note that an NE can encompass multiple switch matrices (FDs) and the FD representing the switch matrix can be further partitioned.
+ Where an FD is referenced by the NeEncompassesFd association, any FDs that it encompasses (i.e., that are associated with it by HigherLevelFdEncompassesLowerLevelFds), must also be encompassed by the NE and hence must have the NeEncompassesFd association.
+ ";
+ }
+ list ltp {
+ key 'uuid';
+ uses logical-termination-point-g;
+ description "An NE has associated LTPs that are at its boundary.
+ The NeEncompassesFd association occurs for FDs that are within the bounds of the NetworkElement definition such that the FD is bounded by LTPs, all of which are on the boundary of the NetworkElement or are within the NetworkElement.
+ An LTP can be independent of an NE.";
+ }
+ uses global-class-g;
+ description "The Network Element (NE) class represents a network element (traditional NE) in the data plane.
+ A data plane network element is essentially a consolidation of capabilities that can be viewed and controlled through a 'single' management-control port.
+ In the direct interface from an SDN controller to a network element in the data plane, the NetworkElement object defines the scope of control for the resources within the network element
+ For example internal transfer of user information between the external terminations (ports of the NE), encapsulation, multiplexing/demultiplexing, and OAM functions, etc.
+ The NetworkElement provides the scope of the naming space for identifying objects representing the resources within the data plane network element.
+ NE is really a product bundling or some view of management scope, management access, session.
+ The NE is not directly part of topology but brings meaning to the FD context and the LTP context (and hence the links). ";
+ }
+ list forwarding-construct {
+ key 'uuid';
+ uses forwarding-construct-g;
+ description "none";
+ }
+ grouping fc-port-g {
+ leaf-list ltp {
+ type leafref {
+ path '/network-element/ltp/uuid';
+ }
+ max-elements 2;
+ description "The FcPort may be associated with more than one LTP when the FcPort is bidirectional and the LTPs are unidirectional.
+ Multiple Ltp
+ - Bidirectional FcPort to two Uni Ltps
+ Zero Ltp
+ - BreakBeforeMake transition
+ - Planned Ltp not yet in place
+ - Off-network LTP referenced through other mechanism";
+ }
+ leaf role {
+ type port-role;
+ description "Each FcPort of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function. ";
+ }
+ leaf fc-port-direction {
+ type port-direction;
+ description "The orientation of defined flow at the FcPort.";
+ }
+ leaf is-protection-lock-out {
+ if-feature protection-exclude-fc-port;
+ type boolean;
+ description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of.
+ This overrides all other protection control states including forced.
+ If the item is locked out then it cannot be used under any circumstances.
+ Note: Only relevant when part of a protection scheme.";
+ }
+ leaf selection-priority {
+ type int64;
+ description "The preference priority of the resource in the protection scheme for a particular FC.
+ The lower the value the higher the priority.
+ A lower value of selection priority is preferred
+ If two resources have the same value they are of equal priory.
+ There is no preference between equal priorities.
+ If a resource with the lowest value selection priority fails then the next lowest value available (may be the same value) is picked.
+ Hence on failure of the current resource the next best available will be selected.
+ If there are several equal values the choice is essentially arbitrary).
+ If the scheme is revertive then when a resource of higher priority than the currently selected resource recovers it will be selected.
+ This is equivalent to working/protection but allows for all static scheme types with n:m capability.
+ In simple schemes 0 = working and 1 = protecting.";
+ }
+ leaf is-internal-port {
+ type boolean;
+ config false;
+ description "The FcPort is not exposed and cannot have associated LTPs.
+ This form of FcPort is used to enable chaining of FcSwitches or FcRoutes in complex network protection scenarios.";
+ }
+ leaf-list fc-route-feeds-fc-port-egress {
+ type string;
+ description "Identifies which route(s) currently actively forward to the FcPort to exit the FC to an LTP (or for an internal FcPort to propagate to the next internal switch/route).";
+ }
+ uses local-class-g;
+ description "The association of the FC to LTPs is made via FcPorts.
+ The FcPort class models the access to the FC function.
+ The traffic forwarding between the associated FcPorts of the FC depends upon the type of FC and may be associated with FcSwitch object instances.
+ In cases where there is resilience, the FcPort may convey the resilience role of the access to the FC.
+ It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point.
+ The FcPort replaces the Protection Unit of a traditional protection model.
+ The ForwardingConstruct can be considered as a component and the FcPort as a Port on that component.";
+ }
+ grouping layer-protocol-g {
+ leaf layer-protocol-name {
+ type layer-protocol-name;
+ description "Indicate the specific layer-protocol described by the LayerProtocol entity.";
+ }
+ leaf configured-client-capacity {
+ type to-be-defined;
+ description "Provides a summarized view of the client capacity that is configurable for use.
+ Note the client LTP association should provide all necessary detail hence this attribute is questionable.";
+ }
+ leaf lp-direction {
+ type termination-direction;
+ description "The overall directionality of the LP.
+ - A BIDIRECTIONAL LP will have some SINK and/or SOURCE flows.
+ - A SINK LP can only contain elements with SINK flows or CONTRA_DIRECTION_SOURCE flows
+ - A SOURCE LP can only contain SOURCE flows or CONTRA_DIRECTION_SINK flows";
+ }
+ leaf termination-state {
+ type termination-state;
+ description "Indicates whether the layer is terminated and if so how.";
+ }
+ list config-and-switch-controller {
+ key 'switch-rule';
+ uses configuration-and-switch-controller-g;
+ description "A switch controller external to the LayerProtocol.
+ The controller will coordinate one or more switches in one or more FCs related to the LayerProtocol";
+ }
+ leaf is-protection-lock-out {
+ if-feature protection-exclude-ltp;
+ type boolean;
+ description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of.
+ This overrides all other protection control states including forced.
+ If the item is locked out then it cannot be used under any circumstances.
+ Note: Only relevant when part of a protection scheme.";
+ }
+ leaf fc-blocks-signal-to-lp {
+ type string;
+ description "none";
+ }
+ uses local-class-g;
+ description "The projection of an LTP into each transport layer is represented by a LayerProtocol (LP) instance. A LayerProtocol instances can be used for controlling termination and monitoring functionality. It can also be used for controlling the adaptation (i.e. encapsulation and/or multiplexing of client signal), tandem connection monitoring, traffic conditioning and/or shaping functionality at an intermediate point along a connection. Where the client - server relationship is fixed 1:1 and immutable, the layers can be encapsulated in a single LTP instance. Where there is a n:1 relationship between client and server, the layers must be split over two separate instances of LTP. ";
+ }
+ grouping logical-termination-point-g {
+ leaf-list server-ltp {
+ type leafref {
+ path '/network-element/ltp/uuid';
+ }
+ description "References contained LTPs representing servers of this LTP in an inverse multiplexing configuration (e.g. VCAT).";
+ }
+ leaf-list client-ltp {
+ type leafref {
+ path '/network-element/ltp/uuid';
+ }
+ description "References contained LTPs representing client traffic of this LTP for normal cases of multiplexing.";
+ }
+ list lp {
+ key 'uuid';
+ min-elements 1;
+ uses layer-protocol-g;
+ description "Ordered list of LayerProtocols that this LTP is comprised of where the first entry in the list is the lowest server layer (e.g. physical).";
+ }
+ leaf connected-ltp {
+ type leafref {
+ path '/network-element/ltp/uuid';
+ }
+ description "Applicable in a simple context where two LTPs are associated via a non-adjustable enabled forwarding.
+ Reduces clutter removing the need for two additional LTPs and an FC with a pair of FcPorts.";
+ }
+ leaf peer-ltp {
+ type leafref {
+ path '/network-element/ltp/uuid';
+ }
+ description "References contained LTPs representing the reversal of orientation of flow where two LTPs are associated via a non-adjustable enabled forwarding and where the referenced LTP is fully dependent on the this LTP.";
+ }
+ leaf-list physical-port-reference {
+ type string;
+ description "One or more text labels for the unmodelled physical port associated with the LTP.
+ In many cases there is no associated physical port.";
+ }
+ leaf-list ltp-in-other-view {
+ type leafref {
+ path '/network-element/ltp/uuid';
+ }
+ description "References one or more LTPs in other views that represent this LTP.
+ The referencing LTP is the provider of capability.";
+ }
+ leaf ltp-direction {
+ type termination-direction;
+ description "The overall directionality of the LTP.
+ - A BIDIRECTIONAL LTP must have at least some LPs that are BIDIRECTIONAL but may also have some SINK and/or SOURCE LPs.
+ - A SINK LTP can only contain SINK LPs
+ - A SOURCE LTP can only contain SOURCE LPs";
+ }
+ uses global-class-g;
+ description "The LogicalTerminationPoint (LTP) class encapsulates the termination and adaptation functions of one or more transport layers represented by instances of LayerProtocol.
+ The encapsulated transport layers have a simple fixed 1:1 client-server relationship defined by association end ordering.
+ The structure of LTP supports all transport protocols including circuit and packet forms.";
+ }
+ feature protection-exclude-server {
+ description "In protection context if server of protection where entire server is to be excluded from use for protection.";
+ }
+ feature protection-exclude-fc-port {
+ description "In protection context where the FcPort is to be excluded from use for protection.";
+ }
+ feature protection-exclude-ltp {
+ description "In protection context if LTP of protection where entire LTP is to be excluded from use for protection.";
+ }
+
+ /***********************
+ * package diagrams
+ **********************/
+
+ /***********************
+ * package associations
+ **********************/
+
+
+ /***********************
+ * package core-foundation-model
+ **********************/
+ /***********************
+ * package type-definitions
+ **********************/
+ typedef date-and-time {
+ type string;
+ description "This primitive type defines the date and time according to the following structure:
+ 'yyyyMMddhhmmss.s[Z|{+|-}HHMm]' where:
+ yyyy '0000'..'9999' year
+ MM '01'..'12' month
+ dd '01'..'31' day
+ hh '00'..'23' hour
+ mm '00'..'59' minute
+ ss '00'..'59' second
+ s '.0'..'.9' tenth of second (set to '.0' if EMS or NE cannot support this granularity)
+ Z 'Z' indicates UTC (rather than local time)
+ {+|-} '+' or '-' delta from UTC
+ HH '00'..'23' time zone difference in hours
+ Mm '00'..'59' time zone difference in minutes.";
+ }
+ typedef bit-string {
+ type string;
+ description "This primitive type defines a bit oriented string.
+ The size of the BitString will be defined in the valueRange property of the attribute; according to ASN.1 (X.680).
+ The semantic of each bit position will be defined in the Documentation field of the attribute.";
+ }
+ typedef real {
+ type string;
+ description "This primitive type maps to the 'realnumber' defined in Recommendation X.680.";
+ }
+ typedef printable-string {
+ type string;
+ description "A string that only includes printable characters.";
+ }
+ typedef to-be-defined {
+ type string;
+ description "This type is used when the actual type of the attrbute is expected to be complex but where the type has not yet been developed.
+ This type should only be used for attributes that are experimental.";
+ }
+
+ /***********************
+ * package super-classes-and-common-packages
+ **********************/
+ /***********************
+ * package object-classes
+ **********************/
+ grouping name-g {
+ list name {
+ key 'value-name';
+ min-elements 1;
+ uses name-and-value-g;
+ description "List of names.";
+ }
+ description "Name: A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity.";
+ }
+ grouping global-class-g {
+ list local-id {
+ key 'value-name';
+ uses name-and-value-g;
+ description "An identifier that is unique in the context of some scope that is less than the global scope.
+ (consider in the context of Identifier: A property of an entity/role with a value that is unique within an identifier space, where the identifier space is itself unique, and immutable. The identifier therefore represents the identity of the entity/role. An identifier carries no semantics with respect to the purpose of the entity.)";
+ }
+ leaf uuid {
+ type universal-id;
+ description "UUID: An identifier that is universally unique
+ (consider in the context of Identifier: A property of an entity/role with a value that is unique within an identifier space, where the identifier space is itself globally unique, and immutable. An identifier carries no semantics with respect to the purpose or state of the entity)
+ The uuid should be treated as opaque by the user.";
+ }
+ uses name-g;
+ uses label-g;
+ uses extension-g;
+ uses state-pac-g;
+ description "Represents a type of thing (an Entity) that has instances which can exist in their own right (independently of any others).
+ Entity: Has identity, defined boundary, properties, functionality and lifecycle in a global context.
+ (consider in the context of a Class: (usage) The representation of a thing that may be an entity or an inseparable Entity Feature).";
+ }
+ grouping local-class-g {
+ list local-id {
+ key 'value-name';
+ min-elements 1;
+ uses name-and-value-g;
+ description "An identifier that is unique in the context of some scope that is less than the global scope.
+ (consider in the context of Identifier: A property of an entity/role with a value that is unique within an identifier space, where the identifier space is itself unique, and immutable. The identifier therefore represents the identity of the entity/role. An identifier carries no semantics with respect to the purpose of the entity.)";
+ }
+ leaf uuid {
+ type universal-id;
+ description "A global identifier for the LocalClass, which is used as reference.";
+ }
+ uses name-g;
+ uses label-g;
+ uses extension-g;
+ uses state-pac-g;
+ description "A LocalClass represents a Feature of an Entity. It is inseparable from a GlobalClass but is a distinct feature of that GlobalClass such that the instances of LocalClass are able to have associations to other instances..
+ Feature of an Entity: An inseparable, externally distinguishable part of an entity.
+ The mandatory LocalId of the LocalClass instance is unique in the context of the GlobalClass from which it is inseparable.
+ (consider in the context of a Class: (usage) The representation of a thing that may be an entity or an inseparable feature of an entity)
+ ";
+ }
+ grouping label-g {
+ list label {
+ key 'value-name';
+ uses name-and-value-g;
+ description "List of labels.";
+ }
+ description "A property of an entity with a value that is not expected to be unique and is allowed to change. A label carries no semantics with respect to the purpose of the entity and has no effect on the entity behavior or state.";
+ }
+ grouping extension-g {
+ list extension {
+ key 'value-name';
+ uses name-and-value-g;
+ description "List of simple name-value extensions.";
+ }
+ description "Extension provides an opportunity to define properties not declared in the class that extend the class enabling a realization with simple ad-hoc extension of standard classes to be conformant.";
+ }
+ grouping universal-id-authority-g {
+ leaf uuid {
+ type universal-id;
+ description "The UUID for the UUID authority.";
+ }
+ description "Represents the authority that controls the allocation of UUIDs.";
+ }
+ grouping name-and-value-authority-g {
+ leaf uuid {
+ type universal-id;
+ description "The UUID for the NameValueAuthority.";
+ }
+ description "Represents the authority that controls the legal values for the names and values of a name/value attribute.";
+ }
+ grouping conditional-package-g {
+ uses extension-g;
+ uses label-g;
+ description "The base class for conditional packages.";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ grouping name-and-value-g {
+ leaf value-name {
+ type string;
+ description "The name of the value. The value need not have a name.";
+ }
+ leaf value {
+ type string;
+ description "The value.";
+ }
+ description "A scoped name-value pair.";
+ }
+ typedef universal-id {
+ type string;
+ description "The universal ID value where the mechanism for generation is defined by some authority not directly referenced in the structure.
+ A example structure is [IETF RFC4122].";
+ }
+ grouping address-g {
+ leaf address-name {
+ type string;
+ description "The name of the address (to allow the specific hierarchy to be distinguished from others for the same entity).";
+ }
+ list address-element {
+ key 'uuid';
+ uses address-element-g;
+ description "The elements of the address that form the recursive scope narrowing.";
+ }
+ description "A description of location via a hierarchy of narrowing contexts.";
+ }
+ grouping local-id-and-class-g {
+ leaf class-of-instance {
+ type string;
+ description "The class to which the name refers.";
+ }
+ container local-id {
+ uses name-and-value-g;
+ description "The localId of the entity.";
+ }
+ description "The localId and the class of entity that it identifies.";
+ }
+ grouping name-and-class-g {
+ leaf class-of-instance {
+ type string;
+ description "The class to which the name refers.";
+ }
+ container name {
+ uses name-and-value-g;
+ description "If the element is a name.";
+ }
+ description "The name and the class of entity that it names.";
+ }
+ grouping address-element-g {
+ leaf address-element-name {
+ type string;
+ description "The name of the address element (e.g. 'shelf' as an element of a shelf/slot/port addressing scheme).
+ The remainder of the structure has the reference for the shelf.
+ ";
+ }
+ container local-id {
+ uses local-id-and-class-g;
+ description "If the element is a localId (where the element above in the hierarchy must be the context in which the specific localId is relevant).";
+ }
+ leaf uuid {
+ type universal-id;
+ description "If the element is a uuid (where this element could be the top of a hierarchy but may also be at some level in the hierarchy where address navigation is considered necessary to assist in location of the UUID).";
+ }
+ container name {
+ uses name-and-class-g;
+ description "If the element is a name.";
+ }
+ leaf arbitrary-element {
+ type string;
+ description "Where the element is from some external model that is not formally represented in this model.";
+ }
+ description "One element of a hierarchy of elements.
+ Note that the element must have one and only one value chosen from a list of potential value types.";
+ }
+
+
+ /***********************
+ * package state-model
+ **********************/
+ /***********************
+ * package object-classes
+ **********************/
+ grouping state-pac-g {
+ leaf operational-state {
+ type operational-state;
+ config false;
+ description "The operational state is used to indicate whether or not the resource is installed and working.";
+ }
+ leaf administrative-control {
+ type administrative-control;
+ description "The administrativeControl state provides control of the availability of specific resources without modification to the provisioning of those resources.
+ The value is the current control target. The actual administrativeState may or may not be at target.";
+ }
+ leaf administrative-state {
+ type administrative-state;
+ config false;
+ description "Shows whether or not the client has permission to use or has a prohibition against using the resource.
+ The administrative state expresses usage permissions for specific resources without modification to the provisioning of those resources.";
+ }
+ leaf lifecycle-state {
+ type lifecycle-state;
+ description "Used to track the planned deployment, allocation to clients and withdrawal of resources.";
+ }
+ description "Provides general state attributes.";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ typedef operational-state {
+ type enumeration {
+ enum disabled {
+ description "The resource is unable to meet the SLA of the user of the resource. If no (explicit) SLA is defined the resource is disabled if it is totally inoperable and unable to provide service to the user.";
+ }
+ enum enabled {
+ description "The resource is partially or fully operable and available for use.";
+ }
+ }
+ description "The possible values of the operationalState.";
+ }
+ typedef administrative-state {
+ type enumeration {
+ enum locked {
+ description "Users are administratively prohibited from making use of the resource.";
+ }
+ enum unlocked {
+ description "Users are allowed to use the resource.";
+ }
+ }
+ description "The possible values of the administrativeState.";
+ }
+ typedef administrative-control {
+ type enumeration {
+ enum unlock {
+ description "The intention is for the entity to become unlocked.
+ The entity may already be UNLOCKED.";
+ }
+ enum lock-passive {
+ description "The intention is for the entity to become locked but no effort is expected to move to the Locked state (the state will be achieved once all users stop using the resource).
+ The entity may be LOCKED.";
+ }
+ enum lock-active {
+ description "The intention is for the entity to become locked and it is expected that effort will be made to move to the Locked state (users will be actively removed).
+ The entity may already be LOCKED.";
+ }
+ enum lock-immediate {
+ description "The intention is for the entity to become locked and it is expected to move to the Locked state immediately (users will be force removed).
+ The entity may already be LOCKED.";
+ }
+ }
+ description "Reflects the current control action when the entity is not in the desired state.
+ The possible values of the current target administrative state.";
+ }
+ typedef extended-admin-state {
+ type enumeration {
+ enum locked {
+ description "Users are administratively prohibited from making use of the resource.";
+ }
+ enum unlocked {
+ description "Users are allowed to use the resource.";
+ }
+ enum shutting-down-active {
+ description "The entity is administratively restricted to existing instances of use only. There are specific actions to remove existing uses. There may be no new instances of use enabled. This corresponds to a control of LOCK_ACTIVE.";
+ }
+ enum shutting-down-passive {
+ description "The entity is administratively restricted to existing instances of use only. There may be no new instances of use enabled. This corresponds to a control of LOCK_PASSIVE.";
+ }
+ }
+ description "Possible extensions to AdministrativeState.";
+ }
+ typedef lifecycle-state {
+ type enumeration {
+ enum planned {
+ description "The resource is planned but is not present in the network.";
+ }
+ enum potential {
+ description "The supporting resources are present in the network but are shared with other clients; or require further configuration before they can be used; or both.o When a potential resource is configured and allocated to a client it is moved to the 'installed' state for that client.o If the potential resource has been consumed (e.g. allocated to another client) it is moved to the 'planned' state for all other clients.";
+ }
+ enum installed {
+ description "The resource is present in the network and is capable of providing the service expected.";
+ }
+ enum pending-removal {
+ description "The resource has been marked for removal.";
+ }
+ }
+ description "The possible values of the lifecycleState.";
+ }
+
+
+
+ /***********************
+ * package core-operations-model
+ **********************/
+ /***********************
+ * package pattern
+ **********************/
+ /***********************
+ * package data-types
+ **********************/
+ typedef action-verbs {
+ type enumeration {
+ enum create-post-add {
+ description "none";
+ }
+ enum set-update-put-modify-write-add {
+ description "none";
+ }
+ enum get-read {
+ description "none";
+ }
+ enum delete-remove {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef test-type {
+ type string;
+ description "none";
+ }
+ typedef activity-directive {
+ type enumeration {
+ enum structure-is-not {
+ description "none";
+ }
+ enum new-structure-and-values {
+ description "none";
+ }
+ enum incremental-structure-and-values {
+ description "none";
+ }
+ enum only-values-in-existing-structure {
+ description "none";
+ }
+ enum defined-by-verb {
+ description "none";
+ }
+ }
+ description "none";
+ }
+
+ /***********************
+ * package diagrams
+ **********************/
+ typedef action-effort {
+ type enumeration {
+ enum best-effort {
+ description "none";
+ }
+ enum exact-match {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef pause-resume-rule {
+ type enumeration {
+ enum no-pause-possible {
+ description "none";
+ }
+ }
+ description "none";
+ }
+
+ /***********************
+ * package object-classes
+ **********************/
+ grouping general-directives-g {
+ description "none";
+ }
+ grouping necessary-initial-condition-constraints-g {
+ leaf is-not {
+ type boolean;
+ description "none";
+ }
+ description "none";
+ }
+ grouping operation-details-g {
+ leaf action-verb {
+ type action-verbs;
+ description "none";
+ }
+ list necessary-initialcondition-constraints {
+ key 'is-not';
+ uses necessary-initial-condition-constraints-g;
+ description "none";
+ }
+ description "none";
+ }
+ container operation-envelope {
+ presence "";
+ list operation-set {
+ key 'effort-and-action';
+ min-elements 1;
+ uses operation-set-g;
+ description "none";
+ }
+ container generaldirectives {
+ uses general-directives-g;
+ description "none";
+ }
+ container operationidentifiers {
+ uses operation-identifiers-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping operation-identifiers-g {
+ description "none";
+ }
+ grouping operation-set-g {
+ leaf-list after-operation-set {
+ type leafref {
+ path '/operation-envelope/operation-set/effort-and-action';
+ }
+ description "none";
+ }
+ leaf-list before-operation-set {
+ type leafref {
+ path '/operation-envelope/operation-set/effort-and-action';
+ }
+ description "none";
+ }
+ leaf effort-and-action {
+ type action-effort;
+ description "none";
+ }
+ leaf pause-resume-rule {
+ type pause-resume-rule;
+ description "none";
+ }
+ leaf-list operationset {
+ type leafref {
+ path '/operation-envelope/operation-set/effort-and-action';
+ }
+ description "none";
+ }
+ leaf is-short-lived {
+ type boolean;
+ default true;
+ description "none";
+ }
+ list operation-details {
+ key 'action-verb';
+ min-elements 1;
+ uses operation-details-g;
+ description "none";
+ }
+ description "none";
+ }
+
+
+
+ /***********************
+ * package core-physical-model-initial
+ **********************/
+ /***********************
+ * package rule-models
+ **********************/
+ /***********************
+ * package connector-rules
+ **********************/
+ /***********************
+ * package object-classes
+ **********************/
+ grouping connector-in-holder-g {
+ leaf connector-on-equipment-for-holder {
+ type universal-id;
+ description "none";
+ }
+ uses connector-g;
+ description "A rule class (an abstract specialization of Connector) that represents a connector that are only accessible to an equipment inserted in the holder.";
+ }
+ grouping connector-cable-end-g {
+ leaf connector-on-equipment-for-cable {
+ type universal-id;
+ description "none";
+ }
+ uses connector-g;
+ description "A rule class (an abstract specialization of Connector) that represents a connector on the end of a cable.";
+ }
+ grouping connector-on-equipment-for-cable-g {
+ leaf connector-cable-end {
+ type universal-id;
+ description "none";
+ }
+ uses connector-g;
+ description "A rule class (an abstract specialization of Connector) that represents a connector exposed on an equipment such that a cable may be plugged in.";
+ }
+ grouping connector-on-equipment-for-holder-g {
+ leaf connector-in-holder {
+ type universal-id;
+ description "none";
+ }
+ uses connector-g;
+ description "A rule class (an abstract specialization of Connector) that represents a connector on an equipment that is intended to mate with a connector in a holder.";
+ }
+
+
+
+ /***********************
+ * package equipment-detail
+ **********************/
+ /***********************
+ * package object-classes
+ **********************/
+ /***********************
+ * package dynamic-details
+ **********************/
+ grouping function-enablers-g {
+ leaf power-state {
+ type to-be-defined;
+ description "none";
+ }
+ description "Represents the dynamic aspects of the properties that relate to the motive force that directly enable functionality to emerge from the equipment.";
+ }
+ grouping mechanical-functions-g {
+ leaf rotation-speed {
+ type to-be-defined;
+ description "none";
+ }
+ description "Represents the dynamic aspects of the mechanical functions of the equipment.";
+ }
+ grouping physical-properties-g {
+ leaf temperature {
+ type to-be-defined;
+ description "none";
+ }
+ description "Represents the dynamic aspects of the physical environmental properties of the equipment.";
+ }
+ grouping holder-monitors-g {
+ leaf is-active {
+ type boolean;
+ description "none";
+ }
+ leaf is-actual-mismatch-with-expected {
+ type boolean;
+ description "none";
+ }
+ leaf aggregate-function {
+ type string;
+ description "none";
+ }
+ description "Represents the dynamic state of the holder instance. ";
+ }
+ grouping location-g {
+ container equipment-location {
+ uses address-g;
+ description "none";
+ }
+ container geographical-location {
+ uses address-g;
+ description "none";
+ }
+ description "none";
+ }
+
+ /***********************
+ * package invariant-details
+ **********************/
+ grouping category-g {
+ leaf category {
+ type equipment-category;
+ description "none";
+ }
+ description "Represents the form of the equipment.";
+ }
+ grouping equipment-instance-g {
+ leaf manufacture-date {
+ type string;
+ description "none";
+ }
+ leaf serial-number {
+ type string;
+ description "none";
+ }
+ leaf asset-instance-identifier {
+ type string;
+ description "none";
+ }
+ description "Represents the per instance invariant properties of the equipment.";
+ }
+ grouping equipment-type-g {
+ leaf description {
+ type string;
+ description "none";
+ }
+ leaf model-identifier {
+ type string;
+ description "none";
+ }
+ leaf part-type-identifier {
+ type string;
+ description "none";
+ }
+ leaf type-name {
+ type string;
+ description "none";
+ }
+ leaf version {
+ type string;
+ description "none";
+ }
+ description "Represents the invariant properties of the equipment that define and characterise the type.";
+ }
+ grouping holder-structure-g {
+ leaf holder-category {
+ type holder-category;
+ description "none";
+ }
+ leaf is-captive {
+ type boolean;
+ description "none";
+ }
+ leaf is-guided {
+ type boolean;
+ description "none";
+ }
+ leaf is-quantized-space {
+ type boolean;
+ description "none";
+ }
+ description "Represents the form of the holder.";
+ }
+ grouping manufactured-thing-g {
+ container manufacturer-properties {
+ uses manufacturer-properties-g;
+ description "none";
+ }
+ container equipment-type {
+ uses equipment-type-g;
+ description "none";
+ }
+ container equipment-instance {
+ uses equipment-instance-g;
+ description "none";
+ }
+ container operator-augmented-equipment-type {
+ uses operator-augmented-equipment-type-g;
+ description "none";
+ }
+ description "Collects all invariant aspects of a manufactured thing.";
+ }
+ grouping manufacturer-properties-g {
+ leaf manufacturer-identifier {
+ type string;
+ description "none";
+ }
+ leaf manufacturer-name {
+ type string;
+ description "none";
+ }
+ description "Represents the properties of the manufacturer.";
+ }
+ grouping mechanical-features-g {
+ description "Represents the invariant characteristics of dynamic mechanical features of a physical thing.";
+ }
+ grouping operator-augmented-equipment-type-g {
+ leaf asset-type-identifier {
+ type string;
+ description "none";
+ }
+ description "Represents the invariant properties of the equipment asset allocated by the operator that define and characterise the type.";
+ }
+ grouping physical-characteristics-g {
+ leaf weight-characteristics {
+ type to-be-defined;
+ description "none";
+ }
+ leaf fire-characteristics {
+ type to-be-defined;
+ description "none";
+ }
+ leaf materials {
+ type to-be-defined;
+ description "none";
+ }
+ description "Represents the invariant physical characteristics (including composition and physical robustness) of the type.";
+ }
+ grouping physical-rating-g {
+ leaf thermal-rating {
+ type to-be-defined;
+ description "none";
+ }
+ leaf power-rating {
+ type to-be-defined;
+ description "none";
+ }
+ description "Represents the invariant physical operational boundaries for the equipment/holder type.";
+ }
+ grouping position-g {
+ leaf relative-position {
+ type to-be-defined;
+ description "none";
+ }
+ description "Represents the invariant relative position of the holder (with respect to some frame of reference in an equipment) or connector on an equipment or pin in a connector.";
+ }
+ grouping spatial-properties-of-type-g {
+ leaf height {
+ type to-be-defined;
+ description "none";
+ }
+ leaf width {
+ type to-be-defined;
+ description "none";
+ }
+ leaf length {
+ type to-be-defined;
+ description "none";
+ }
+ description "Represents the basic invariant spatial properties of a physical thing.";
+ }
+ grouping swapability-g {
+ leaf is-hot-swappable {
+ type boolean;
+ default true;
+ description "none";
+ }
+ description "Represents the degree of field replacement that is possible for the equipment type.";
+ }
+
+
+
+ /***********************
+ * package equipment-pattern-structure
+ **********************/
+ /***********************
+ * package object-classes
+ **********************/
+ grouping cable-g {
+ list connector {
+ key 'uuid';
+ min-elements 1;
+ uses connector-g;
+ description "none";
+ }
+ container manufactured-thing {
+ uses manufactured-thing-g;
+ description "none";
+ }
+ container physical-characteristics {
+ uses physical-characteristics-g;
+ description "none";
+ }
+ container mechanical-features {
+ uses mechanical-features-g;
+ description "none";
+ }
+ container spatial-properties-of-type {
+ uses spatial-properties-of-type-g;
+ description "none";
+ }
+ uses global-class-g;
+ description "Basic model representing a cable with connectors fitted where the cable is 'short' (e.g. patch cord, in-station cabling).
+ This is intentionally a very basic representation of a cable.
+ In a more sophisticated representation cable ends might be represented that then associate to the attached connector.
+ At this point it is assumed that the basic model is sufficient.";
+ }
+ grouping connector-g {
+ leaf connector {
+ type string;
+ description "none";
+ }
+ list pin {
+ key 'position';
+ min-elements 1;
+ uses pin-g;
+ description "none";
+ }
+ leaf orientation {
+ type connector-and-pin-orientation;
+ description "none";
+ }
+ container manufactured-thing {
+ uses manufactured-thing-g;
+ description "none";
+ }
+ container position {
+ uses position-g;
+ description "none";
+ }
+ container mechanical-features {
+ uses mechanical-features-g;
+ description "none";
+ }
+ container pin-layout {
+ uses pin-layout-g;
+ description "none";
+ }
+ leaf connector-type {
+ type to-be-defined;
+ description "none";
+ }
+ uses local-class-g;
+ uses group-of-pins-g;
+ description "Represents a connector that may be fully exposed (e.g. to plug in a cable or on the end of a cable) or partially exposed (e.g. backplane to plug in another piece of equipment such as a module).";
+ }
+ grouping equipment-g {
+ list connector {
+ key 'uuid';
+ uses connector-g;
+ description "none";
+ }
+ list contained-holder {
+ key 'uuid';
+ uses holder-g;
+ description "none";
+ }
+ list exposed-cable {
+ key 'uuid';
+ uses cable-g;
+ description "none";
+ }
+ container manufactured-thing {
+ uses manufactured-thing-g;
+ description "none";
+ }
+ container spatial-properties-of-type {
+ uses spatial-properties-of-type-g;
+ description "none";
+ }
+ container mechanical-features {
+ uses mechanical-features-g;
+ description "none";
+ }
+ container physical-properties {
+ uses physical-properties-g;
+ description "none";
+ }
+ container function-enablers {
+ uses function-enablers-g;
+ description "none";
+ }
+ container mechanical-functions {
+ uses mechanical-functions-g;
+ description "none";
+ }
+ container physical-characteristics {
+ uses physical-characteristics-g;
+ description "none";
+ }
+ container swapability {
+ uses swapability-g;
+ description "none";
+ }
+ container category {
+ uses category-g;
+ description "none";
+ }
+ container physical-rating {
+ uses physical-rating-g;
+ description "none";
+ }
+ leaf is-field-replaceable {
+ type boolean;
+ default true;
+ config false;
+ description "Indicates whether or not the equipment can be removed and replaced 'in the field' (i.e. in a deployment) by normal operations personnel.
+ ";
+ }
+ leaf-list function-block {
+ type string;
+ description "none";
+ }
+ container expected-equipment {
+ uses expected-equipment-g;
+ description "none";
+ }
+ container actual-equipment {
+ uses actual-equipment-g;
+ description "none";
+ }
+ container location {
+ uses location-g;
+ description "none";
+ }
+ uses global-class-g;
+ description "Represents any relevant physical thing.
+ Can be either field replaceable or not field replaceable.
+ Note: The model is currently constrained to inside plant.";
+ }
+ list equipment {
+ key 'uuid';
+ uses equipment-g;
+ description "none";
+}
+ grouping holder-g {
+ leaf-list connector {
+ type leafref {
+ path '/equipment/exposed-cable/connector/uuid';
+ }
+ description "none";
+ }
+ leaf occupying-fru {
+ type leafref {
+ path '/equipment/uuid';
+ }
+ description "The FRU that is occupying the holder.
+ A holder may be unoccupied.
+ An FRU may occupy more hat one holder (using or blocking are intentionally not distinguished here).";
+ }
+ container spatial-properties-of-type {
+ uses spatial-properties-of-type-g;
+ description "none";
+ }
+ container holder-monitors {
+ uses holder-monitors-g;
+ description "none";
+ }
+ container holder-location {
+ uses address-g;
+ description "none";
+ }
+ container position {
+ uses position-g;
+ description "none";
+ }
+ container holder-structure {
+ uses holder-structure-g;
+ description "none";
+ }
+ container physical-rating {
+ uses physical-rating-g;
+ description "none";
+ }
+ leaf-list supported-equipment {
+ type string;
+ min-elements 1;
+ description "none";
+ }
+ container expected-holder {
+ uses expected-holder-g;
+ description "none";
+ }
+ container actual-holder {
+ uses actual-holder-g;
+ description "none";
+ }
+ uses local-class-g;
+ description "Represents a space in an equipment in which another equipment can be fitted in the field.";
+ }
+
+ /***********************
+ * package data-types
+ **********************/
+ typedef connector-and-pin-orientation {
+ type enumeration {
+ enum male {
+ description "The connecting elements are dominantly protrusions.";
+ }
+ enum female {
+ description "The connecting elements are dominantly indentations.";
+ }
+ enum symmetric-neutral {
+ description "The pin (and housing) orientation combination is such that it is symmetric so a connector is compatible with itself.
+ The connecting element may be a surface rather than protrusions or indentations.";
+ }
+ }
+ description "Most connector schems are asymmetric such that there are two orientations of the connector where a mating is only possible between two connectors of different orientations.
+ A multi-pin connector may have a mix of pin orientations. In this case it is expected that the dominant orientation of pin is chosen for the connector orientation.";
+ }
+ typedef equipment-category {
+ type enumeration {
+ enum subrack {
+ description "An assembly with holders designed to accommodate CIRCUIT_PACKs.
+ The assembly is designed to be mounted in a RACK.";
+ }
+ enum circuit-pack {
+ description "An assembly with connectors compatible with those in a holder.
+ The assembly is designed to be mounted in a holder (SLOT) of a SUBRACK.
+ May also support holders (SLOTs) for SMALL_FORMFACTOR_PLUGGABLEs";
+ }
+ enum small-formfactor-pluggable {
+ description "A small assembly (compared to a CIRCUIT_PACK) with connectors compatible with those in a holder.
+ The assembly is designed to be mounted in a holder (SLOT) of a CIRCUIT_PACK or STAND_ALONE_UNIT.";
+ }
+ enum stand-alone-unit {
+ description "An assembly with connectors for cabling and potentially with holders.
+ The assembly is designed to be mounted in a freeform environment (on a table or simple mechanical cabinet).
+ May support holders (SLOTs) for CIRCUIT_PACKs or for SMALL_FORMFACTOR_PLUGGABLEs";
+ }
+ enum rack {
+ description "A mechanical assembly with cabling and predefined mounting points for particular SUBRACK types.
+ The assembly is designed to be mounted on the floor in a row with other RACKs.";
+ }
+ }
+ description "The form of equipment.";
+ }
+ typedef holder-category {
+ type enumeration {
+ enum slot {
+ description "A guided holder with fixed connectors.
+ The guided holder is designed to take a particular form of CIRCUIT_PACK or SMALL_FORMFACTOR_PLUGGABLE";
+ }
+ }
+ description "The form of holder.";
+ }
+
+
+ /***********************
+ * package expected-and-actual
+ **********************/
+ /***********************
+ * package object-classes
+ **********************/
+ grouping actual-holder-g {
+ description "A holder in the ActualEquipment.";
+ }
+ grouping expected-holder-g {
+ description "A definition of a holder expected in the ActualEquipment (i.e. an ActualHolder) as part of the constraints provided by the ExpectedEquipment.";
+ }
+ grouping actual-equipment-g {
+ description "The equipment that is actually present in the physical network.
+ It will expose all dynamic properties and some critical static properties.";
+ }
+ grouping expected-equipment-g {
+ description "A definition of the restrictions on the equipment that is expected to be present in the physical network at a particular 'place'.
+ The expected equipment will state the type and may constrain any other invariant properties.
+ It may also provide desired ranges for dynami properties.";
+ }
+
+
+ /***********************
+ * package connector-and-pin
+ **********************/
+ /***********************
+ * package object-classes
+ **********************/
+ grouping pin-g {
+ leaf position {
+ type leafref {
+ path '/equipment/exposed-cable/connector/position/relative-position';
+ }
+ description "none";
+ }
+ leaf orientation {
+ type connector-and-pin-orientation;
+ description "none";
+ }
+ description "An individual physical connection point (male or female).
+ May be capable of carrying electrical or optical signals.
+ A pin may have more than one wire/fiber attached but is such that all attached things get exactly the same signal set.";
+ }
+ grouping pin-group-g {
+ leaf-list pin {
+ type leafref {
+ path '/equipment/exposed-cable/connector/pin/position';
+ }
+ min-elements 1;
+ description "none";
+ }
+ uses port-g;
+ uses group-of-pins-g;
+ description "A group of pins that together provide signal group where any one pin removed from the group will prevent the signals of the signal group from flowing successfully.";
+ }
+ grouping pin-layout-g {
+ list position {
+ key 'relative-position';
+ min-elements 1;
+ uses position-g;
+ description "none";
+ }
+ description "The structuring of pins in a connector.";
+ }
+ grouping port-g {
+ description "A conceptual access point for a group of signals (where that group of signals cannot be separated).";
+ }
+ grouping signal-ref-pt-g {
+ leaf ltp {
+ type leafref {
+ path '/network-element/ltp/uuid';
+ }
+ description "none";
+ }
+ leaf-list elemental-signals {
+ type universal-id;
+ min-elements 1;
+ description "none";
+ }
+ description "A single coherent signal as processed by a single LTP.";
+ }
+ grouping signal-ref-pt-group-g {
+ leaf pin-group {
+ type universal-id;
+ description "none";
+ }
+ leaf-list signal-ref-pt {
+ type universal-id;
+ min-elements 1;
+ description "none";
+ }
+ uses port-g;
+ description "A physical indivisible group of signals.";
+ }
+ grouping elemental-signals-g {
+ leaf-list pin {
+ type leafref {
+ path '/equipment/exposed-cable/connector/pin/position';
+ }
+ min-elements 1;
+ description "none";
+ }
+ description "The elemental (sub-atomic) parts of an 'indivisible' signal where processing in the LTP is required to extract the elemental signals.";
+ }
+ grouping group-of-pins-g {
+ description "A group of pins from one or more connectors relevant for some purpose.";
+ }
+
+
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/g.874.1-model@2017-03-20.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/g.874.1-model@2017-03-20.yang new file mode 100644 index 000000000..4a14783a2 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/g.874.1-model@2017-03-20.yang @@ -0,0 +1,646 @@ +module g.874.1-model { + namespace "urn:onf:params:xml:ns:yang:g.874.1-model"; + prefix g.874.1-model; + + import core-model { + prefix core-model; + } + import ietf-yang-types { + prefix yang; + } + + organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project"; + contact "WG Web: <https://www.opennetworking.org/technical-communities/areas/specification/1931-optical-transport> + WG List: <mailto:wireless-transport@login.opennetworking.org> + WG Chair: Lyndon Ong + <mailto:lyong@ciena.com> + WG Chair: Giorgio Cazzaniga + <mailto:giorgio.cazzaniga@sm-optics.com> + Editors: Thorsten Heinze + <mailto:thorsten.heinze@telefonica.com> + Martin Skorupski + <mailto:martin.skorupski@highstreet-technologies.com>"; + description "<p>Version 2.02; outcome of the 10/2013 Nuremberg meeting.<br>Version 2.03; updates for Geneva 03-2014<br>Version 2.04; updates for Shanghai 09-2014<br>Version 2.05; input to Geneva 11-2014<br>Version 2.06; output from Geneva 11-2014<br>Version 2.07; using OpenProfile 3-2015<br>Version 2.08; output from Geneva 06-2015</p>"; + revision 2017-03-20 { + description "Initial version"; + reference "ONF TR 532: A YANG Data Model for Wireless Networks."; + } + /*********************** + * package object-classes + **********************/ + grouping otn-current-data-g { + leaf timestamp { + type date-and-time; + description "The timestamp associated with when the current data was collected."; + } + uses q.822-current-data-g; + description "This object class is an abstract class from which the OTN layer-specific CurrentData object classes are inherited. This object class is a subclass of the Q.822 CurrentData object class, which in turn is a subclass of X.739 Scanner object class. It inherits the following attributes: scannerId, operationalState, granularityPeriod, administrativeState, suspectIntervalFlag, elapsedTime, observedObjectClass, and observedObjectInstance."; + } + grouping otn-history-data-g { + leaf suspect-interval-flag { + type boolean; + default false; + description "This attribute indicates that the data collected during the interval is suspect."; + } + uses q.822-history-data-g; + description "This object class is an abstract class from which the OTN layer-specific HistoryData object classes are inherited. "; + } + + /*********************** + * package type-definitions + **********************/ + typedef directionality { + type enumeration { + enum sink { + description "none"; + } + enum source { + description "none"; + } + enum bidirectional { + description "none"; + } + } + description "The enumeration with the options for directionality of the termination point."; + } + typedef gcc-access { + type enumeration { + enum gcc1 { + description "none"; + } + enum gcc2 { + description "none"; + } + enum gcc1-and-gcc2 { + description "none"; + } + } + description "This enumeration indicates the GCC access represented by the entity."; + } + typedef operational-state { + type enumeration { + enum enabled { + description "none"; + } + enum disabled { + description "none"; + } + } + description "The list of valid operational states for the connection."; + } + typedef oper-type { + type enumeration { + enum revertive { + description "none"; + } + enum non-revertive { + description "none"; + } + } + description "The operation type associated with the protection mechanism (either non-revertive or revertive)."; + } + typedef ext-cmd-operation { + type enumeration { + enum exercise { + description "none"; + } + enum manual-switch { + description "none"; + } + enum forced-switch { + description "none"; + } + enum lockout { + description "none"; + } + enum release-of-manual-switch { + description "none"; + } + enum release-of-forced-switch { + description "none"; + } + enum release-of-lockout { + description "none"; + } + } + description "This enumeration contains the options for the actions that instruct the protection system for performing specific protection switching operations."; + } + typedef administrative-state { + type enumeration { + enum unlocked { + description "none"; + } + enum locked { + description "none"; + } + enum shutting-down { + description "none"; + } + } + description "For more information on Administrative State, See ITU-T Recs. X.731 and M.3100."; + } + typedef oc-tk-nim-k-bit-rate { + type enumeration { + enum 2.5-g { + description "none"; + } + enum 10-g { + description "none"; + } + enum 40-g { + description "none"; + } + enum 100-g { + description "none"; + } + } + description "Provides an enumeration with the meaning of each 'k' value."; + } + typedef tim-det-mo { + type enumeration { + enum dapi { + description "none"; + } + enum sapi { + description "none"; + } + enum both { + description "none"; + } + } + description "List of modes for trace identifier mismatch detection."; + } + typedef oc-tk-nim-problem-list { + type enumeration { + enum los-p { + description "Loss of Signal -- Payload"; + } + enum oci { + description "Open Connection Indicator"; + } + enum ssf-p { + description "Server Signal Failure -- Payload -- can not co-exist with SSF or SSF-O"; + } + enum ssf-o { + description "Server Signal Failure -- Overhead; can not co-exist with SSF or SSF-P"; + } + enum ssf { + description "Server Signal Failure; can not co-exist with SSF-P or SSF-O"; + } + enum tim { + description "Trail Trace Identifier Mismatch"; + } + enum deg { + description "Signal Degraded"; + } + enum bdi { + description "Backward Defect Indication"; + } + } + description "The valid list of problems for the entity."; + } + typedef tcm-monitoring { + type enumeration { + enum intrusive { + description "none"; + } + enum non-intrusive { + description "none"; + } + } + description "Monitoring types for the tandem connection monitoring function."; + } + typedef tcm-mode { + type enumeration { + enum operational { + description "none"; + } + enum transparent { + description "none"; + } + enum monitor { + description "none"; + } + } + description "List of value modes for the sink side of the tandem connection monitoring function."; + } + typedef ops-mnk-ttp-k-bit-rate { + type enumeration { + enum 40-g { + description "none"; + } + enum 100-g { + description "none"; + } + } + description "Provides an enumeration with the meaning of each 'k' value."; + } + typedef ops-mnk-ttp-problem-list { + type enumeration { + enum los { + description "Loss of Signal"; + } + enum lol { + description "Loss of Lane Alignment"; + } + } + description "The valid list of problems for the entity."; + } + typedef op-sn-ttp-problem-list { + type enumeration { + enum los { + description "Loss of Signal"; + } + } + description "The valid list of problems for the entity."; + } + typedef otm-n-k-bit-rates { + type enumeration { + enum 2.5-g { + description "none"; + } + enum 10-g { + description "none"; + } + enum 40-g { + description "none"; + } + enum 2.5-10-g { + description "none"; + } + enum 10-40-g { + description "none"; + } + enum 2.5-10-40-g { + description "none"; + } + } + description "Provides an enumeration with the meaning of each 'k' value."; + } + typedef domain-interface { + type enumeration { + enum intra-domain { + description "none"; + } + enum inter-domain { + description "none"; + } + } + description "This enumeration provides the options for the interface associated with OTMn."; + } + typedef otm-n-optical-reach { + type enumeration { + enum intra-office { + description "none"; + } + enum shorthaul { + description "none"; + } + enum longhaul { + description "none"; + } + } + description "The valid options for reach of the optical cable."; + } + typedef apr-status { + type enumeration { + enum on { + description "none"; + } + enum off { + description "none"; + } + } + description "The enumeration of the options for the Automatic Power Reduction Status."; + } + typedef ot-sn-ttp-problem-list { + type enumeration { + enum bdi-p { + description "BDI-P (Backward Defect Indication - Payload); not co-exist with BDI-O or BDI"; + } + enum bdi-o { + description "BDI-O (Backward Defect Indication - Overhead); not co-exist with BDI-P or BDI"; + } + enum bdi { + description "BDI (Backward Defect Indication); not co-exist with BDI-P or BDI-O"; + } + enum tim { + description "TIM (Trail Trace Identifier Mismatch);"; + } + enum los-p { + description "-P (Loss of Signal - Payload); not co-exist with LOS-O or LOS"; + } + enum los-o { + description "LOS-O (Loss of Signal - Overhead); not co-exist with LOS-P or LOS"; + } + enum los { + description "LOS (Loss of Signal); not co-exist with LOS-P or LOS-O. "; + } + } + description "The valid list of problems for the entity."; + } + typedef ot-uk-ctp-adaptation { + type enumeration { + enum regular { + description "i.e. OPSM/OTUk-a, OCh[r]/OTUk-a"; + } + enum none { + description "i.e. OPSM/OTUk-b, OCh[r]/OTUk-b"; + } + enum vendor-specific { + description "i.e. OCh[r]/OTUk-v"; + } + enum functionally-standardized { + description "i.e. OCh[r]/OTUkV"; + } + } + description "The adaptation options for OTUk_ConnectionTermationPoints."; + } + typedef ot-uk-ctp-k-bit-rate { + type enumeration { + enum 2.5-g { + description "none"; + } + enum 10-g { + description "none"; + } + enum 40-g { + description "none"; + } + enum 100-g { + description "none"; + } + } + description "Provides an enumeration with the meaning of each 'k' value."; + } + typedef ot-uk-ctp-problem-list { + type enumeration { + enum lof { + description "Loss of Frame"; + } + enum ais { + description "Alarm Indication Signal"; + } + enum lom { + description "Loss of MultiFrame"; + } + } + description "The valid list of problems for the entity."; + } + typedef ot-uk-ttp-problem-list { + type enumeration { + enum tim { + description "Trail Trace Identifier Mismatch"; + } + enum deg { + description "Signal Degraded"; + } + enum bdi { + description "Backward Defect Indication"; + } + enum ssf { + description "Server Signal Failure"; + } + } + description "The valid list of problems for the entity."; + } + typedef monitored-direction { + type enumeration { + enum sink { + description "none"; + } + enum source { + description "none"; + } + } + description "The enumeration with the options for directionality for nonintrusive monitoring."; + } + typedef deg-thr-type { + type enumeration { + enum percentage { + description "<p>Choice of % or Number of errored blocks</p>"; + } + enum number-errored-blocks { + description "<p>Number of % or blocks</p>"; + } + } + description "<p>The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.</p>"; + } + typedef link-type { + type enumeration { + enum dwdm { + description "none"; + } + enum cwdm { + description "none"; + } + enum no-wdm { + description "none"; + } + } + description "none"; + } + typedef application-identifier-type { + type enumeration { + enum standard { + description "none"; + } + enum proprietary { + description "none"; + } + } + description "none"; + } + typedef printable-string { + type string; + description "none"; + } + typedef date-and-time { + type string; + description "This primitive type defines the date and time according to the following structure: + 'yyyyMMddhhmmss.s[Z|{+|-}HHMm]' where: + yyyy '0000'..'9999' year + MM '01'..'12' month + dd '01'..'31' day + hh '00'..'23' hour + mm '00'..'59' minute + ss '00'..'59' second + s '.0'..'.9' tenth of second (set to '.0' if EMS or NE cannot support this granularity) + Z 'Z' indicates UTC (rather than local time) + {+|-} '+' or '-' delta from UTC + HH '00'..'23' time zone difference in hours + Mm '00'..'59' time zone difference in minutes."; + } + typedef aps-channel { + type enumeration { + enum path { + description "none"; + } + enum tcm1 { + description "none"; + } + enum tcm2 { + description "none"; + } + enum tcm3 { + description "none"; + } + enum tcm4 { + description "none"; + } + enum tcm5 { + description "none"; + } + enum tcm6 { + description "none"; + } + enum section { + description "none"; + } + } + description "none"; + } + typedef bit-string { + type string; + description "This primitive type defines a bit oriented string. + The size of the BitString will be defined in the valueRange property of the attribute; according to ASN.1 (X.680). + The semantic of each bit position will be defined in the Documentation field of the attribute."; + } + typedef delay-measurement-role { + type enumeration { + enum controller { + description "none"; + } + enum responder { + description "none"; + } + } + description "none"; + } + typedef resize-operation-type { + type enumeration { + enum increase-bw { + description "Increase Bandwidth"; + } + enum decrease-bw { + description "Decrease Bandwidth"; + } + } + description "none"; + } + typedef granularity-period-type { + type enumeration { + enum unknown { + description "none"; + } + enum period-15-min { + description "none"; + } + enum period-24-hours { + description "none"; + } + } + description "The enumeration with the options for granularity period of the performance data."; + } + + /*********************** + * package illustrative-object-diagrams + **********************/ + + /*********************** + * package imported-information-object-classes + **********************/ + /*********************** + * package q.822 + **********************/ + grouping q.822-current-data-g { + leaf suspect-interval-flag { + type boolean; + description "This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are:- Suspect data were detected by the actual resource doing data collection.- Transition of the administrativeState attribute to/from the 'lock' state.- Transition of the operationalState to/from the 'disabled' state.- Scheduler setting that inhibits the collection function.- The performance counters were reset during the interval.- The currentData (or subclass) object instance was created during the monitoring period."; + } + leaf elapsed-time { + type int64; + description "none"; + } + uses x.739-scanner-g; + description "none"; + } + grouping q.822-history-data-g { + leaf history-data-id { + type string; + description "none"; + } + leaf period-end-time { + type yang:date-and-time; + description "none"; + } + leaf granularity-period { + type granularity-period-type; + description "none"; + } + uses x.721-top-g; + description "none"; + } + + /*********************** + * package x.739 + **********************/ + grouping x.739-scanner-g { + leaf scanner-id { + type string; + description "none"; + } + leaf granularity-period { + type granularity-period-type; + description "none"; + } + leaf administrative-state { + type core-model:administrative-state; + description "none"; + } + uses x.721-top-g; + description "none"; + } + + /*********************** + * package x.721 + **********************/ + grouping x.721-top-g { + leaf object-class { + type object-identifier; + description "ObjectClass ::= CHOICE{ globalForm [0] OBJECT IDENTIFIER, + localForm [1] INTEGER}"; + } + leaf name-binding { + type object-identifier; + description "none"; + } + description "This is the top level of managed object class hierarchy and every other managed object class is a specialization of either this generic class (top) or a specialization of subclass of top. The parameter miscellaneousError is to be used when a processing failure has occurred and the error condition encountered does not match any of object's defined specific error types."; + } + + + /*********************** + * package imported-data-types + **********************/ + typedef object-instance { + type string; + description "none"; + } + typedef name { + type string; + description "none"; + } + typedef object-identifier { + type string; + description "none"; + } + typedef generalized-time { + type string; + description "none"; + } + typedef time-period { + type string; + description "This primitive Type is imported from X.739."; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/iana-crypt-hash@2014-08-06.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/iana-crypt-hash@2014-08-06.yang new file mode 100644 index 000000000..f73c31b18 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/iana-crypt-hash@2014-08-06.yang @@ -0,0 +1,120 @@ +module iana-crypt-hash { + namespace "urn:ietf:params:xml:ns:yang:iana-crypt-hash"; + prefix ianach; + + organization "IANA"; + contact + " Internet Assigned Numbers Authority + + Postal: ICANN + 12025 Waterfront Drive, Suite 300 + Los Angeles, CA 90094-2536 + United States + + Tel: +1 310 301 5800 + E-Mail: iana&iana.org>"; + description + "This YANG module defines a type for storing passwords + using a hash function and features to indicate which hash + functions are supported by an implementation. + + The latest revision of this YANG module can be obtained from + the IANA web site. + + Requests for new values should be made to IANA via + email (iana&iana.org). + + Copyright (c) 2014 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + The initial version of this YANG module is part of RFC 7317; + see the RFC itself for full legal notices."; + + revision 2014-08-06 { + description + "Initial revision."; + reference + "RFC 7317: A YANG Data Model for System Management"; + } + + typedef crypt-hash { + type string { + pattern + '$0$.*' + + '|$1$[a-zA-Z0-9./]{1,8}$[a-zA-Z0-9./]{22}' + + '|$5$(rounds=\d+$)?[a-zA-Z0-9./]{1,16}$[a-zA-Z0-9./]{43}' + + '|$6$(rounds=\d+$)?[a-zA-Z0-9./]{1,16}$[a-zA-Z0-9./]{86}'; + } + description + "The crypt-hash type is used to store passwords using + a hash function. The algorithms for applying the hash + function and encoding the result are implemented in + various UNIX systems as the function crypt(3). + + A value of this type matches one of the forms: + + $0$<clear text password> + $<id>$<salt>$<password hash> + $<id>$<parameter>$<salt>$<password hash> + + The '$0$' prefix signals that the value is clear text. When + such a value is received by the server, a hash value is + calculated, and the string '$<id>$<salt>$' or + $<id>$<parameter>$<salt>$ is prepended to the result. This + value is stored in the configuration data store. + If a value starting with '$<id>$', where <id> is not '0', is + received, the server knows that the value already represents a + hashed value and stores it 'as is' in the data store. + + When a server needs to verify a password given by a user, it + finds the stored password hash string for that user, extracts + the salt, and calculates the hash with the salt and given + password as input. If the calculated hash value is the same + as the stored value, the password given by the client is + accepted. + + This type defines the following hash functions: + + id | hash function | feature + ---+---------------+------------------- + 1 | MD5 | crypt-hash-md5 + 5 | SHA-256 | crypt-hash-sha-256 + 6 | SHA-512 | crypt-hash-sha-512 + + The server indicates support for the different hash functions + by advertising the corresponding feature."; + reference + "IEEE Std 1003.1-2008 - crypt() function + RFC 1321: The MD5 Message-Digest Algorithm + FIPS.180-4.2012: Secure Hash Standard (SHS)"; + } + + feature crypt-hash-md5 { + description + "Indicates that the device supports the MD5 + hash function in 'crypt-hash' values."; + reference "RFC 1321: The MD5 Message-Digest Algorithm"; + } + + feature crypt-hash-sha-256 { + description + "Indicates that the device supports the SHA-256 + hash function in 'crypt-hash' values."; + reference "FIPS.180-4.2012: Secure Hash Standard (SHS)"; + } + + feature crypt-hash-sha-512 { + description + "Indicates that the device supports the SHA-512 + hash function in 'crypt-hash' values."; + reference "FIPS.180-4.2012: Secure Hash Standard (SHS)"; + } + +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-inet-types@2010-09-24.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-inet-types@2010-09-24.yang new file mode 100644 index 000000000..a9fc2c8b9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-inet-types@2010-09-24.yang @@ -0,0 +1,418 @@ +module ietf-inet-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + prefix "inet"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: <http://tools.ietf.org/wg/netmod/> + WG List: <mailto:netmod@ietf.org> + + WG Chair: David Partain + <mailto:david.partain@ericsson.com> + + WG Chair: David Kessens + <mailto:david.kessens@nsn.com> + + Editor: Juergen Schoenwaelder + <mailto:j.schoenwaelder@jacobs-university.de>"; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + Copyright (c) 2010 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, is permitted pursuant to, and subject to the license + terms contained in, the Simplified BSD License set forth in Section + 4.c of the IETF Trust's Legal Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6021; see + the RFC itself for full legal notices."; + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of protocol field related types ***/ + + typedef ip-version { + type enumeration { + enum unknown { + value "0"; + description + "An unknown or unspecified version of the Internet protocol."; + } + enum ipv4 { + value "1"; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum ipv6 { + value "2"; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code-Point + that may be used for marking packets in a traffic stream. + + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The flow-label type represents flow identifier or Flow Label + in an IPv6 packet header that may be used to discriminate + traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport layer protocol such as UDP, TCP, DCCP, or + SCTP. Port numbers are assigned by IANA. A current list of + all assignments is available from <http://www.iana.org/>. + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 793: Transmission Control Protocol + RFC 4960: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + /*** collection of autonomous system related types ***/ + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASs'. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4893: BGP Support for Four-octet AS Number Space + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + /*** collection of IP address and hostname related types ***/ + + typedef ip-address { + type union { + type inet:ipv4-address; + type inet:ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '(%[\p{N}\p{L}]+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(%[\p{N}\p{L}]+)?'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format of IPv6 addresses uses the compressed + format described in RFC 4291, Section 2.2, item 2 with the + following additional rules: the :: substitution must be + applied to the longest sequence of all-zero 16-bit chunks + in an IPv6 address. If there is a tie, the first sequence + of all-zero 16-bit chunks is replaced by ::. Single + all-zero 16-bit chunks are not compressed. The canonical + format uses lowercase characters and leading zeros are + not allowed. The canonical format for the zone index is + the numerical format as described in RFC 4007, Section + 11.2."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text Representation"; + } + + typedef ip-prefix { + type union { + type inet:ipv4-prefix; + type inet:ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix."; + } + + typedef ipv6-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + description + "The ipv6-prefix type represents an IPv6 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The IPv6 address should have all bits that do not belong + to the prefix set to zero. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, IPv6 address is represented + in the compressed format described in RFC 4291, Section + 2.2, item 2 with the following additional rules: the :: + substitution must be applied to the longest sequence of + all-zero 16-bit chunks in an IPv6 address. If there is + a tie, the first sequence of all-zero 16-bit chunks is + replaced by ::. Single all-zero 16-bit chunks are not + compressed. The canonical format uses lowercase + characters and leading zeros are not allowed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture"; + } + + /*** collection of domain name and URI types ***/ + + typedef domain-name { + type string { + pattern '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.'; + length "1..253"; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitely or it may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be encoded in punycode as described in RFC + 3492"; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 3492: Punycode: A Bootstring encoding of Unicode for + Internationalized Domain Names in Applications + (IDNA) + RFC 5891: Internationalizing Domain Names in Applications + (IDNA): Protocol"; + } + + typedef host { + type union { + type inet:ip-address; + type inet:domain-name; + } + description + "The host type represents either an IP address or a DNS + domain name."; + } + + typedef uri { + type string; + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by STD 66. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary + percent-encoding is removed, and all case-insensitive + characters are set to lowercase except for hexadecimal + digits, which are normalized to uppercase as described in + Section 6.2.2.1. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + } + + }
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-inet-types@2013-07-15.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-inet-types@2013-07-15.yang new file mode 100644 index 000000000..0ca56288a --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-inet-types@2013-07-15.yang @@ -0,0 +1,457 @@ +module ietf-inet-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types"; + prefix "inet"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: <http://tools.ietf.org/wg/netmod/> + WG List: <mailto:netmod@ietf.org> + + WG Chair: David Kessens + <mailto:david.kessens@nsn.com> + + WG Chair: Juergen Schoenwaelder + <mailto:j.schoenwaelder@jacobs-university.de> + + Editor: Juergen Schoenwaelder + <mailto:j.schoenwaelder@jacobs-university.de>"; + + description + "This module contains a collection of generally useful derived + YANG data types for Internet addresses and related things. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - ip-address-no-zone + - ipv4-address-no-zone + - ipv6-address-no-zone"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of types related to protocol fields ***/ + + typedef ip-version { + type enumeration { + enum unknown { + value "0"; + description + "An unknown or unspecified version of the Internet + protocol."; + } + enum ipv4 { + value "1"; + description + "The IPv4 protocol as defined in RFC 791."; + } + enum ipv6 { + value "2"; + description + "The IPv6 protocol as defined in RFC 2460."; + } + } + description + "This value represents the version of the IP protocol. + + In the value set and its semantics, this type is equivalent + to the InetVersion textual convention of the SMIv2."; + reference + "RFC 791: Internet Protocol + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + typedef dscp { + type uint8 { + range "0..63"; + } + description + "The dscp type represents a Differentiated Services Code Point + that may be used for marking packets in a traffic stream. + In the value set and its semantics, this type is equivalent + to the Dscp textual convention of the SMIv2."; + reference + "RFC 3289: Management Information Base for the Differentiated + Services Architecture + RFC 2474: Definition of the Differentiated Services Field + (DS Field) in the IPv4 and IPv6 Headers + RFC 2780: IANA Allocation Guidelines For Values In + the Internet Protocol and Related Headers"; + } + + typedef ipv6-flow-label { + type uint32 { + range "0..1048575"; + } + description + "The ipv6-flow-label type represents the flow identifier or Flow + Label in an IPv6 packet header that may be used to + discriminate traffic flows. + + In the value set and its semantics, this type is equivalent + to the IPv6FlowLabel textual convention of the SMIv2."; + reference + "RFC 3595: Textual Conventions for IPv6 Flow Label + RFC 2460: Internet Protocol, Version 6 (IPv6) Specification"; + } + + typedef port-number { + type uint16 { + range "0..65535"; + } + description + "The port-number type represents a 16-bit port number of an + Internet transport-layer protocol such as UDP, TCP, DCCP, or + SCTP. Port numbers are assigned by IANA. A current list of + all assignments is available from <http://www.iana.org/>. + + Note that the port number value zero is reserved by IANA. In + situations where the value zero does not make sense, it can + be excluded by subtyping the port-number type. + In the value set and its semantics, this type is equivalent + to the InetPortNumber textual convention of the SMIv2."; + reference + "RFC 768: User Datagram Protocol + RFC 793: Transmission Control Protocol + RFC 4960: Stream Control Transmission Protocol + RFC 4340: Datagram Congestion Control Protocol (DCCP) + RFC 4001: Textual Conventions for Internet Network Addresses"; + } + + /*** collection of types related to autonomous systems ***/ + + typedef as-number { + type uint32; + description + "The as-number type represents autonomous system numbers + which identify an Autonomous System (AS). An AS is a set + of routers under a single technical administration, using + an interior gateway protocol and common metrics to route + packets within the AS, and using an exterior gateway + protocol to route packets to other ASes. IANA maintains + the AS number space and has delegated large parts to the + regional registries. + + Autonomous system numbers were originally limited to 16 + bits. BGP extensions have enlarged the autonomous system + number space to 32 bits. This type therefore uses an uint32 + base type without a range restriction in order to support + a larger autonomous system number space. + + In the value set and its semantics, this type is equivalent + to the InetAutonomousSystemNumber textual convention of + the SMIv2."; + reference + "RFC 1930: Guidelines for creation, selection, and registration + of an Autonomous System (AS) + RFC 4271: A Border Gateway Protocol 4 (BGP-4) + RFC 4001: Textual Conventions for Internet Network Addresses + RFC 6793: BGP Support for Four-Octet Autonomous System (AS) + Number Space"; + } + + /*** collection of types related to IP addresses and hostnames ***/ + + typedef ip-address { + type union { + type inet:ipv4-address; + type inet:ipv6-address; + } + description + "The ip-address type represents an IP address and is IP + version neutral. The format of the textual representation + implies the IP version. This type supports scoped addresses + by allowing zone identifiers in the address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '(%[\p{N}\p{L}]+)?'; + } + description + "The ipv4-address type represents an IPv4 address in + dotted-quad notation. The IPv4 address may include a zone + index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format for the zone index is the numerical + format"; + } + + typedef ipv6-address { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(%[\p{N}\p{L}]+)?'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(%.+)?'; + } + description + "The ipv6-address type represents an IPv6 address in full, + mixed, shortened, and shortened-mixed notation. The IPv6 + address may include a zone index, separated by a % sign. + + The zone index is used to disambiguate identical address + values. For link-local addresses, the zone index will + typically be the interface index number or the name of an + interface. If the zone index is not present, the default + zone of the device will be used. + + The canonical format of IPv6 addresses uses the textual + representation defined in Section 4 of RFC 5952. The + canonical format for the zone index is the numerical + format as described in Section 11.2 of RFC 4007."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-address-no-zone { + type union { + type inet:ipv4-address-no-zone; + type inet:ipv6-address-no-zone; + } + description + "The ip-address-no-zone type represents an IP address and is + IP version neutral. The format of the textual representation + implies the IP version. This type does not support scoped + addresses since it does not allow zone identifiers in the + address format."; + reference + "RFC 4007: IPv6 Scoped Address Architecture"; + } + + typedef ipv4-address-no-zone { + type inet:ipv4-address { + pattern '[0-9\.]*'; + } + description + "An IPv4 address without a zone index. This type, derived from + ipv4-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + } + + typedef ipv6-address-no-zone { + type inet:ipv6-address { + pattern '[0-9a-fA-F:\.]*'; + } + description + "An IPv6 address without a zone index. This type, derived from + ipv6-address, may be used in situations where the zone is + known from the context and hence no zone index is needed."; + reference + "RFC 4291: IP Version 6 Addressing Architecture + RFC 4007: IPv6 Scoped Address Architecture + RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + typedef ip-prefix { + type union { + type inet:ipv4-prefix; + type inet:ipv6-prefix; + } + description + "The ip-prefix type represents an IP prefix and is IP + version neutral. The format of the textual representations + implies the IP version."; + } + + typedef ipv4-prefix { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' + + '/(([0-9])|([1-2][0-9])|(3[0-2]))'; + } + description + "The ipv4-prefix type represents an IPv4 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 32. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The canonical format of an IPv4 prefix has all bits of + the IPv4 address set to zero that are not part of the + IPv4 prefix."; + } + + typedef ipv6-prefix { + type string { + pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}' + + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|' + + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}' + + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))' + + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))'; + pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|' + + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)' + + '(/.+)'; + } + description + "The ipv6-prefix type represents an IPv6 address prefix. + The prefix length is given by the number following the + slash character and must be less than or equal to 128. + + A prefix length value of n corresponds to an IP address + mask that has n contiguous 1-bits from the most + significant bit (MSB) and all other bits set to 0. + + The IPv6 address should have all bits that do not belong + to the prefix set to zero. + + The canonical format of an IPv6 prefix has all bits of + the IPv6 address set to zero that are not part of the + IPv6 prefix. Furthermore, the IPv6 address is represented + as defined in Section 4 of RFC 5952."; + reference + "RFC 5952: A Recommendation for IPv6 Address Text + Representation"; + } + + /*** collection of domain name and URI types ***/ + + typedef domain-name { + type string { + pattern + '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' + + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)' + + '|\.'; + length "1..253"; + } + description + "The domain-name type represents a DNS domain name. The + name SHOULD be fully qualified whenever possible. + + Internet domain names are only loosely specified. Section + 3.5 of RFC 1034 recommends a syntax (modified in Section + 2.1 of RFC 1123). The pattern above is intended to allow + for current practice in domain name use, and some possible + future expansion. It is designed to hold various types of + domain names, including names used for A or AAAA records + (host names) and other records, such as SRV records. Note + that Internet host names have a stricter syntax (described + in RFC 952) than the DNS recommendations in RFCs 1034 and + 1123, and that systems that want to store host names in + schema nodes using the domain-name type are recommended to + adhere to this stricter standard to ensure interoperability. + + The encoding of DNS names in the DNS protocol is limited + to 255 characters. Since the encoding consists of labels + prefixed by a length bytes and there is a trailing NULL + byte, only 253 characters can appear in the textual dotted + notation. + + The description clause of schema nodes using the domain-name + type MUST describe when and how these names are resolved to + IP addresses. Note that the resolution of a domain-name value + may require to query multiple DNS records (e.g., A for IPv4 + and AAAA for IPv6). The order of the resolution process and + which DNS record takes precedence can either be defined + explicitly or may depend on the configuration of the + resolver. + + Domain-name values use the US-ASCII encoding. Their canonical + format uses lowercase US-ASCII characters. Internationalized + domain names MUST be A-labels as per RFC 5890."; + reference + "RFC 952: DoD Internet Host Table Specification + RFC 1034: Domain Names - Concepts and Facilities + RFC 1123: Requirements for Internet Hosts -- Application + and Support + RFC 2782: A DNS RR for specifying the location of services + (DNS SRV) + RFC 5890: Internationalized Domain Names in Applications + (IDNA): Definitions and Document Framework"; + } + + typedef host { + type union { + type inet:ip-address; + type inet:domain-name; + } + description + "The host type represents either an IP address or a DNS + domain name."; + } + + typedef uri { + type string; + description + "The uri type represents a Uniform Resource Identifier + (URI) as defined by STD 66. + + Objects using the uri type MUST be in US-ASCII encoding, + and MUST be normalized as described by RFC 3986 Sections + 6.2.1, 6.2.2.1, and 6.2.2.2. All unnecessary + percent-encoding is removed, and all case-insensitive + characters are set to lowercase except for hexadecimal + digits, which are normalized to uppercase as described in + Section 6.2.2.1. + + The purpose of this normalization is to help provide + unique URIs. Note that this normalization is not + sufficient to provide uniqueness. Two URIs that are + textually distinct after this normalization may still be + equivalent. + + Objects using the uri type may restrict the schemes that + they permit. For example, 'data:' and 'urn:' schemes + might not be appropriate. + + A zero-length URI is not a valid URI. This can be used to + express 'URI absent' where required. + + In the value set and its semantics, this type is equivalent + to the Uri SMIv2 textual convention defined in RFC 5017."; + reference + "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax + RFC 3305: Report from the Joint W3C/IETF URI Planning Interest + Group: Uniform Resource Identifiers (URIs), URLs, + and Uniform Resource Names (URNs): Clarifications + and Recommendations + RFC 5017: MIB Textual Conventions for Uniform Resource + Identifiers (URIs)"; + } + +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-acm@2012-02-22.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-acm@2012-02-22.yang new file mode 100644 index 000000000..05be7658e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-acm@2012-02-22.yang @@ -0,0 +1,449 @@ +module ietf-netconf-acm { + + namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-acm"; + + prefix "nacm"; + + import ietf-yang-types { + prefix yang; + } + + organization + "IETF NETCONF (Network Configuration) Working Group"; + + contact + "WG Web: <http://tools.ietf.org/wg/netconf/> + WG List: <mailto:netconf@ietf.org> + + WG Chair: Mehmet Ersue + <mailto:mehmet.ersue@nsn.com> + + WG Chair: Bert Wijnen + <mailto:bertietf@bwijnen.net> + + Editor: Andy Bierman + <mailto:andy@yumaworks.com> + + Editor: Martin Bjorklund + <mailto:mbj@tail-f.com>"; + + description + "NETCONF Access Control Model. + + Copyright (c) 2012 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD + License set forth in Section 4.c of the IETF Trust's + Legal Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6536; see + the RFC itself for full legal notices."; + + revision "2012-02-22" { + description + "Initial version"; + reference + "RFC 6536: Network Configuration Protocol (NETCONF) + Access Control Model"; + } + + /* + * Extension statements + */ + + extension default-deny-write { + description + "Used to indicate that the data model node + represents a sensitive security system parameter. + + If present, and the NACM module is enabled (i.e., + /nacm/enable-nacm object equals 'true'), the NETCONF server + will only allow the designated 'recovery session' to have + write access to the node. An explicit access control rule is + required for all other users. + + The 'default-deny-write' extension MAY appear within a data + definition statement. It is ignored otherwise."; + } + + extension default-deny-all { + description + "Used to indicate that the data model node + controls a very sensitive security system parameter. + + If present, and the NACM module is enabled (i.e., + /nacm/enable-nacm object equals 'true'), the NETCONF server + will only allow the designated 'recovery session' to have + read, write, or execute access to the node. An explicit + access control rule is required for all other users. + + The 'default-deny-all' extension MAY appear within a data + definition statement, 'rpc' statement, or 'notification' + statement. It is ignored otherwise."; + } + + /* + * Derived types + */ + + typedef user-name-type { + type string { + length "1..max"; + } + description + "General Purpose Username string."; + } + + typedef matchall-string-type { + type string { + pattern "\*"; + } + description + "The string containing a single asterisk '*' is used + to conceptually represent all possible values + for the particular leaf using this data type."; + } + + typedef access-operations-type { + type bits { + bit create { + description + "Any protocol operation that creates a + new data node."; + } + bit read { + description + "Any protocol operation or notification that + returns the value of a data node."; + } + bit update { + description + "Any protocol operation that alters an existing + data node."; + } + bit delete { + description + "Any protocol operation that removes a data node."; + } + bit exec { + description + "Execution access to the specified protocol operation."; + } + } + description + "NETCONF Access Operation."; + } + + typedef group-name-type { + type string { + length "1..max"; + pattern "[^\*].*"; + } + description + "Name of administrative group to which + users can be assigned."; + } + + typedef action-type { + type enumeration { + enum permit { + description + "Requested action is permitted."; + } + enum deny { + description + "Requested action is denied."; + } + } + description + "Action taken by the server when a particular + rule matches."; + } + + typedef node-instance-identifier { + type yang:xpath1.0; + description + "Path expression used to represent a special + data node instance identifier string. + + A node-instance-identifier value is an + unrestricted YANG instance-identifier expression. + All the same rules as an instance-identifier apply + except predicates for keys are optional. If a key + predicate is missing, then the node-instance-identifier + represents all possible server instances for that key. + + This XPath expression is evaluated in the following context: + + o The set of namespace declarations are those in scope on + the leaf element where this type is used. + + o The set of variable bindings contains one variable, + 'USER', which contains the name of the user of the current + session. + + o The function library is the core function library, but + note that due to the syntax restrictions of an + instance-identifier, no functions are allowed. + + o The context node is the root node in the data tree."; + } + + /* + * Data definition statements + */ + + container nacm { + nacm:default-deny-all; + + description + "Parameters for NETCONF Access Control Model."; + + leaf enable-nacm { + type boolean; + default true; + description + "Enables or disables all NETCONF access control + enforcement. If 'true', then enforcement + is enabled. If 'false', then enforcement + is disabled."; + } + + leaf read-default { + type action-type; + default "permit"; + description + "Controls whether read access is granted if + no appropriate rule is found for a + particular read request."; + } + + leaf write-default { + type action-type; + default "deny"; + description + "Controls whether create, update, or delete access + is granted if no appropriate rule is found for a + particular write request."; + } + + leaf exec-default { + type action-type; + default "permit"; + description + "Controls whether exec access is granted if no appropriate + rule is found for a particular protocol operation request."; + } + + leaf enable-external-groups { + type boolean; + default true; + description + "Controls whether the server uses the groups reported by the + NETCONF transport layer when it assigns the user to a set of + NACM groups. If this leaf has the value 'false', any group + names reported by the transport layer are ignored by the + server."; + } + + leaf denied-operations { + type yang:zero-based-counter32; + config false; + mandatory true; + description + "Number of times since the server last restarted that a + protocol operation request was denied."; + } + + leaf denied-data-writes { + type yang:zero-based-counter32; + config false; + mandatory true; + description + "Number of times since the server last restarted that a + protocol operation request to alter + a configuration datastore was denied."; + } + + leaf denied-notifications { + type yang:zero-based-counter32; + config false; + mandatory true; + description + "Number of times since the server last restarted that + a notification was dropped for a subscription because + access to the event type was denied."; + } + + container groups { + description + "NETCONF Access Control Groups."; + + list group { + key name; + + description + "One NACM Group Entry. This list will only contain + configured entries, not any entries learned from + any transport protocols."; + + leaf name { + type group-name-type; + description + "Group name associated with this entry."; + } + + leaf-list user-name { + type user-name-type; + description + "Each entry identifies the username of + a member of the group associated with + this entry."; + } + } + } + + list rule-list { + key "name"; + ordered-by user; + description + "An ordered collection of access control rules."; + + leaf name { + type string { + length "1..max"; + } + description + "Arbitrary name assigned to the rule-list."; + } + leaf-list group { + type union { + type matchall-string-type; + type group-name-type; + } + description + "List of administrative groups that will be + assigned the associated access rights + defined by the 'rule' list. + + The string '*' indicates that all groups apply to the + entry."; + } + + list rule { + key "name"; + ordered-by user; + description + "One access control rule. + + Rules are processed in user-defined order until a match is + found. A rule matches if 'module-name', 'rule-type', and + 'access-operations' match the request. If a rule + matches, the 'action' leaf determines if access is granted + or not."; + + leaf name { + type string { + length "1..max"; + } + description + "Arbitrary name assigned to the rule."; + } + + leaf module-name { + type union { + type matchall-string-type; + type string; + } + default "*"; + description + "Name of the module associated with this rule. + + This leaf matches if it has the value '*' or if the + object being accessed is defined in the module with the + specified module name."; + } + choice rule-type { + description + "This choice matches if all leafs present in the rule + match the request. If no leafs are present, the + choice matches all requests."; + case protocol-operation { + leaf rpc-name { + type union { + type matchall-string-type; + type string; + } + description + "This leaf matches if it has the value '*' or if + its value equals the requested protocol operation + name."; + } + } + case notification { + leaf notification-name { + type union { + type matchall-string-type; + type string; + } + description + "This leaf matches if it has the value '*' or if its + value equals the requested notification name."; + } + } + case data-node { + leaf path { + type node-instance-identifier; + mandatory true; + description + "Data Node Instance Identifier associated with the + data node controlled by this rule. + + Configuration data or state data instance + identifiers start with a top-level data node. A + complete instance identifier is required for this + type of path value. + + The special value '/' refers to all possible + datastore contents."; + } + } + } + + leaf access-operations { + type union { + type matchall-string-type; + type access-operations-type; + } + default "*"; + description + "Access operations associated with this rule. + + This leaf matches if it has the value '*' or if the + bit corresponding to the requested operation is set."; + } + + leaf action { + type action-type; + mandatory true; + description + "The access control action associated with the + rule. If a rule is determined to match a + particular request, then this object is used + to determine whether to permit or deny the + request."; + } + + leaf comment { + type string; + description + "A textual description of the access rule."; + } + } + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-monitoring@2010-10-04.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-monitoring@2010-10-04.yang new file mode 100644 index 000000000..48a0e56c0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-monitoring@2010-10-04.yang @@ -0,0 +1,558 @@ +module ietf-netconf-monitoring { + + namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring"; + prefix "ncm"; + + import ietf-yang-types { prefix yang; } + import ietf-inet-types { prefix inet; } + + organization + "IETF NETCONF (Network Configuration) Working Group"; + + contact + "WG Web: <http://tools.ietf.org/wg/netconf/> + WG List: <mailto:netconf@ietf.org> + + WG Chair: Mehmet Ersue + <mailto:mehmet.ersue@nsn.com> + + WG Chair: Bert Wijnen + <mailto:bertietf@bwijnen.net> + + Editor: Mark Scott + <mailto:mark.scott@ericsson.com> + + Editor: Martin Bjorklund + <mailto:mbj@tail-f.com>"; + + description + "NETCONF Monitoring Module. + All elements in this module are read-only. + + Copyright (c) 2010 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD + License set forth in Section 4.c of the IETF Trust's + Legal Provisions Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6022; see + the RFC itself for full legal notices."; + + revision 2010-10-04 { + description + "Initial revision."; + reference + "RFC 6022: YANG Module for NETCONF Monitoring"; + } + + typedef netconf-datastore-type { + type enumeration { + enum running; + enum candidate; + enum startup; + } + description + "Enumeration of possible NETCONF datastore types."; + reference + "RFC 4741: NETCONF Configuration Protocol"; + } + + identity transport { + description + "Base identity for NETCONF transport types."; + } + + identity netconf-ssh { + base transport; + description + "NETCONF over Secure Shell (SSH)."; + reference + "RFC 4742: Using the NETCONF Configuration Protocol + over Secure SHell (SSH)"; + } + + identity netconf-soap-over-beep { + base transport; + description + "NETCONF over Simple Object Access Protocol (SOAP) over + Blocks Extensible Exchange Protocol (BEEP)."; + reference + "RFC 4743: Using NETCONF over the Simple Object + Access Protocol (SOAP)"; + } + + identity netconf-soap-over-https { + base transport; + description + "NETCONF over Simple Object Access Protocol (SOAP) + over Hypertext Transfer Protocol Secure (HTTPS)."; + reference + "RFC 4743: Using NETCONF over the Simple Object + Access Protocol (SOAP)"; + } + + identity netconf-beep { + base transport; + description + "NETCONF over Blocks Extensible Exchange Protocol (BEEP)."; + reference + "RFC 4744: Using the NETCONF Protocol over the + Blocks Extensible Exchange Protocol (BEEP)"; + } + + identity netconf-tls { + base transport; + description + "NETCONF over Transport Layer Security (TLS)."; + reference + "RFC 5539: NETCONF over Transport Layer Security (TLS)"; + } + + identity schema-format { + description + "Base identity for data model schema languages."; + } + + identity xsd { + base schema-format; + description + "W3C XML Schema Definition."; + reference + "W3C REC REC-xmlschema-1-20041028: + XML Schema Part 1: Structures"; + } + + identity yang { + base schema-format; + description + "The YANG data modeling language for NETCONF."; + reference + "RFC 6020: YANG - A Data Modeling Language for the + Network Configuration Protocol (NETCONF)"; + } + + identity yin { + base schema-format; + description + "The YIN syntax for YANG."; + reference + "RFC 6020: YANG - A Data Modeling Language for the + Network Configuration Protocol (NETCONF)"; + } + + identity rng { + base schema-format; + description + "Regular Language for XML Next Generation (RELAX NG)."; + reference + "ISO/IEC 19757-2:2008: RELAX NG"; + } + + identity rnc { + base schema-format; + description + "Relax NG Compact Syntax"; + reference + "ISO/IEC 19757-2:2008: RELAX NG"; + } + + grouping common-counters { + description + "Counters that exist both per session, and also globally, + accumulated from all sessions."; + + leaf in-rpcs { + type yang:zero-based-counter32; + description + "Number of correct <rpc> messages received."; + } + leaf in-bad-rpcs { + type yang:zero-based-counter32; + description + "Number of messages received when an <rpc> message was expected, + that were not correct <rpc> messages. This includes XML parse + errors and errors on the rpc layer."; + } + leaf out-rpc-errors { + type yang:zero-based-counter32; + description + "Number of <rpc-reply> messages sent that contained an + <rpc-error> element."; + } + leaf out-notifications { + type yang:zero-based-counter32; + description + "Number of <notification> messages sent."; + } + } + + container netconf-state { + config false; + description + "The netconf-state container is the root of the monitoring + data model."; + + container capabilities { + description + "Contains the list of NETCONF capabilities supported by the + server."; + + leaf-list capability { + type inet:uri; + description + "List of NETCONF capabilities supported by the server."; + } + } + + container datastores { + description + "Contains the list of NETCONF configuration datastores."; + + list datastore { + key name; + description + "List of NETCONF configuration datastores supported by + the NETCONF server and related information."; + + leaf name { + type netconf-datastore-type; + description + "Name of the datastore associated with this list entry."; + } + container locks { + presence + "This container is present only if the datastore + is locked."; + description + "The NETCONF <lock> and <partial-lock> operations allow + a client to lock specific resources in a datastore. The + NETCONF server will prevent changes to the locked + resources by all sessions except the one that acquired + the lock(s). + + Monitoring information is provided for each datastore + entry including details such as the session that acquired + the lock, the type of lock (global or partial) and the + list of locked resources. Multiple locks per datastore + are supported."; + + grouping lock-info { + description + "Lock related parameters, common to both global and + partial locks."; + + leaf locked-by-session { + type uint32; + mandatory true; + description + "The session ID of the session that has locked + this resource. Both a global lock and a partial + lock MUST contain the NETCONF session-id. + + If the lock is held by a session that is not managed + by the NETCONF server (e.g., a CLI session), a session + id of 0 (zero) is reported."; + reference + "RFC 4741: NETCONF Configuration Protocol"; + } + leaf locked-time { + type yang:date-and-time; + mandatory true; + description + "The date and time of when the resource was + locked."; + } + } + + choice lock-type { + description + "Indicates if a global lock or a set of partial locks + are set."; + + container global-lock { + description + "Present if the global lock is set."; + uses lock-info; + } + + list partial-lock { + key lock-id; + description + "List of partial locks."; + reference + "RFC 5717: Partial Lock Remote Procedure Call (RPC) for + NETCONF"; + + leaf lock-id { + type uint32; + description + "This is the lock id returned in the <partial-lock> + response."; + } + uses lock-info; + leaf-list select { + type yang:xpath1.0; + min-elements 1; + description + "The xpath expression that was used to request + the lock. The select expression indicates the + original intended scope of the lock."; + } + leaf-list locked-node { + type instance-identifier; + description + "The list of instance-identifiers (i.e., the + locked nodes). + + The scope of the partial lock is defined by the list + of locked nodes."; + } + } + } + } + } + } + + container schemas { + description + "Contains the list of data model schemas supported by the + server."; + + list schema { + key "identifier version format"; + + description + "List of data model schemas supported by the server."; + + leaf identifier { + type string; + description + "Identifier to uniquely reference the schema. The + identifier is used in the <get-schema> operation and may + be used for other purposes such as file retrieval. + + For modeling languages that support or require a data + model name (e.g., YANG module name) the identifier MUST + match that name. For YANG data models, the identifier is + the name of the module or submodule. In other cases, an + identifier such as a filename MAY be used instead."; + } + leaf version { + type string; + description + "Version of the schema supported. Multiple versions MAY be + supported simultaneously by a NETCONF server. Each + version MUST be reported individually in the schema list, + i.e., with same identifier, possibly different location, + but different version. + + For YANG data models, version is the value of the most + recent YANG 'revision' statement in the module or + submodule, or the empty string if no 'revision' statement + is present."; + } + leaf format { + type identityref { + base schema-format; + } + description + "The data modeling language the schema is written + in (currently xsd, yang, yin, rng, or rnc). + For YANG data models, 'yang' format MUST be supported and + 'yin' format MAY also be provided."; + } + leaf namespace { + type inet:uri; + mandatory true; + description + "The XML namespace defined by the data model. + + For YANG data models, this is the module's namespace. + If the list entry describes a submodule, this field + contains the namespace of the module to which the + submodule belongs."; + } + leaf-list location { + type union { + type enumeration { + enum "NETCONF"; + } + type inet:uri; + } + description + "One or more locations from which the schema can be + retrieved. This list SHOULD contain at least one + entry per schema. + + A schema entry may be located on a remote file system + (e.g., reference to file system for ftp retrieval) or + retrieved directly from a server supporting the + <get-schema> operation (denoted by the value 'NETCONF')."; + } + } + } + + container sessions { + description + "The sessions container includes session-specific data for + NETCONF management sessions. The session list MUST include + all currently active NETCONF sessions."; + + list session { + key session-id; + description + "All NETCONF sessions managed by the NETCONF server + MUST be reported in this list."; + + leaf session-id { + type uint32 { + range "1..max"; + } + description + "Unique identifier for the session. This value is the + NETCONF session identifier, as defined in RFC 4741."; + reference + "RFC 4741: NETCONF Configuration Protocol"; + } + leaf transport { + type identityref { + base transport; + } + mandatory true; + description + "Identifies the transport for each session, e.g., + 'netconf-ssh', 'netconf-soap', etc."; + } + leaf username { + type string; + mandatory true; + description + "The username is the client identity that was authenticated + by the NETCONF transport protocol. The algorithm used to + derive the username is NETCONF transport protocol specific + and in addition specific to the authentication mechanism + used by the NETCONF transport protocol."; + } + leaf source-host { + type inet:host; + description + "Host identifier of the NETCONF client. The value + returned is implementation specific (e.g., hostname, + IPv4 address, IPv6 address)"; + } + leaf login-time { + type yang:date-and-time; + mandatory true; + description + "Time at the server at which the session was established."; + } + uses common-counters { + description + "Per-session counters. Zero based with following reset + behaviour: + - at start of a session + - when max value is reached"; + } + } + } + + container statistics { + description + "Statistical data pertaining to the NETCONF server."; + + leaf netconf-start-time { + type yang:date-and-time; + description + "Date and time at which the management subsystem was + started."; + } + leaf in-bad-hellos { + type yang:zero-based-counter32; + description + "Number of sessions silently dropped because an + invalid <hello> message was received. This includes <hello> + messages with a 'session-id' attribute, bad namespace, and + bad capability declarations."; + } + leaf in-sessions { + type yang:zero-based-counter32; + description + "Number of sessions started. This counter is incremented + when a <hello> message with a <session-id> is sent. + + 'in-sessions' - 'in-bad-hellos' = + 'number of correctly started netconf sessions'"; + } + leaf dropped-sessions { + type yang:zero-based-counter32; + description + "Number of sessions that were abnormally terminated, e.g., + due to idle timeout or transport close. This counter is not + incremented when a session is properly closed by a + <close-session> operation, or killed by a <kill-session> + operation."; + } + uses common-counters { + description + "Global counters, accumulated from all sessions. + Zero based with following reset behaviour: + - re-initialization of NETCONF server + - when max value is reached"; + } + } + } + + rpc get-schema { + description + "This operation is used to retrieve a schema from the + NETCONF server. + + Positive Response: + The NETCONF server returns the requested schema. + + Negative Response: + If requested schema does not exist, the <error-tag> is + 'invalid-value'. + + If more than one schema matches the requested parameters, the + <error-tag> is 'operation-failed', and <error-app-tag> is + 'data-not-unique'."; + + input { + leaf identifier { + type string; + mandatory true; + description + "Identifier for the schema list entry."; + } + leaf version { + type string; + description + "Version of the schema requested. If this parameter is not + present, and more than one version of the schema exists on + the server, a 'data-not-unique' error is returned, as + described above."; + } + leaf format { + type identityref { + base schema-format; + } + description + "The data modeling language of the schema. If this + parameter is not present, and more than one formats of + the schema exists on the server, a 'data-not-unique' error + is returned, as described above."; + } + } + output { + anyxml data { + description + "Contains the schema content."; + } + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-partial-lock@2009-10-19.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-partial-lock@2009-10-19.yang new file mode 100644 index 000000000..13658ac58 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-partial-lock@2009-10-19.yang @@ -0,0 +1,83 @@ +module ietf-netconf-partial-lock { + + namespace urn:ietf:params:xml:ns:netconf:partial-lock:1.0; + prefix pl; + + // needed to force data type of select string to be corect + import ietf-yang-types { prefix yang; } + + organization "IETF Network Configuration (netconf) Working Group"; + + contact + "Netconf Working Group + Mailing list: netconf@ietf.org + Web: http://www.ietf.org/html.charters/netconf-charter.html + + Balazs Lengyel + Ericsson + balazs.lengyel@ericsson.com"; + + description + "This YANG module defines the <partial-lock> and + <partial-unlock> operations."; + + revision 2009-10-19 { + description + "Initial version, published as RFC 5717."; + } + + typedef lock-id-type { + type uint32; + description + "A number identifying a specific partial-lock granted to a session. + It is allocated by the system, and SHOULD be used in the + partial-unlock operation."; + } + + rpc partial-lock { + description + "A NETCONF operation that locks parts of the running datastore."; + input { + leaf-list select { + //type string; + type yang:xpath1.0; + min-elements 1; + description + "XPath expression that specifies the scope of the lock. + An Instance Identifier expression MUST be used unless the + :xpath capability is supported, in which case any XPath 1.0 + expression is allowed."; + } + } + output { + leaf lock-id { + type lock-id-type; + mandatory true; + description + "Identifies the lock, if granted. The lock-id SHOULD be + used in the partial-unlock rpc."; + } + leaf-list locked-node { + type instance-identifier; + min-elements 1; + description + "List of locked nodes in the running datastore"; + } + } + } + + rpc partial-unlock { + description + "A NETCONF operation that releases a previously acquired + partial-lock."; + input { + leaf lock-id { + type lock-id-type; + mandatory true; + description + "Identifies the lock to be released. MUST be the value + received in the response to a partial-lock operation."; + } + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-with-defaults@2011-06-01.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-with-defaults@2011-06-01.yang new file mode 100644 index 000000000..81d7f0bc3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf-with-defaults@2011-06-01.yang @@ -0,0 +1,140 @@ +module ietf-netconf-with-defaults { + + namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults"; + + prefix ncwd; + + import ietf-netconf { prefix nc; } + + organization + "IETF NETCONF (Network Configuration Protocol) Working Group"; + + contact + "WG Web: <http://tools.ietf.org/wg/netconf/> + + WG List: <netconf@ietf.org> + + WG Chair: Bert Wijnen + <bertietf@bwijnen.net> + + WG Chair: Mehmet Ersue + <mehmet.ersue@nsn.com> + + Editor: Andy Bierman + <andy.bierman@brocade.com> + + Editor: Balazs Lengyel + <balazs.lengyel@ericsson.com>"; + + description + "This module defines an extension to the NETCONF protocol + that allows the NETCONF client to control how default + values are handled by the server in particular NETCONF + operations. + + Copyright (c) 2011 IETF Trust and the persons identified as + the document authors. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6243; see + the RFC itself for full legal notices."; + + revision 2011-06-01 { + description + "Initial version."; + reference + "RFC 6243: With-defaults Capability for NETCONF"; + } + + typedef with-defaults-mode { + description + "Possible modes to report default data."; + reference + "RFC 6243; Section 3."; + type enumeration { + enum report-all { + description + "All default data is reported."; + reference + "RFC 6243; Section 3.1"; + } + enum report-all-tagged { + description + "All default data is reported. + Any nodes considered to be default data + will contain a 'default' XML attribute, + set to 'true' or '1'."; + reference + "RFC 6243; Section 3.4"; + } + enum trim { + description + "Values are not reported if they contain the default."; + reference + "RFC 6243; Section 3.2"; + } + enum explicit { + description + "Report values that contain the definition of + explicitly set data."; + reference + "RFC 6243; Section 3.3"; + } + } + } + + grouping with-defaults-parameters { + description + "Contains the <with-defaults> parameter for control + of defaults in NETCONF retrieval operations."; + + leaf with-defaults { + description + "The explicit defaults processing mode requested."; + reference + "RFC 6243; Section 4.5.1"; + + type with-defaults-mode; + } + } + + // extending the get-config operation + augment /nc:get-config/nc:input { + description + "Adds the <with-defaults> parameter to the + input of the NETCONF <get-config> operation."; + reference + "RFC 6243; Section 4.5.1"; + + uses with-defaults-parameters; + } + + // extending the get operation + augment /nc:get/nc:input { + description + "Adds the <with-defaults> parameter to + the input of the NETCONF <get> operation."; + reference + "RFC 6243; Section 4.5.1"; + + uses with-defaults-parameters; + } + + // extending the copy-config operation + augment /nc:copy-config/nc:input { + description + "Adds the <with-defaults> parameter to + the input of the NETCONF <copy-config> operation."; + reference + "RFC 6243; Section 4.5.1"; + + uses with-defaults-parameters; + } + +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf@2011-06-01.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf@2011-06-01.yang new file mode 100644 index 000000000..644942164 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-netconf@2011-06-01.yang @@ -0,0 +1,934 @@ +module ietf-netconf { + + // the namespace for NETCONF XML definitions is unchanged + // from RFC 4741, which this document replaces + namespace "urn:ietf:params:xml:ns:netconf:base:1.0"; + + prefix nc; + + import ietf-inet-types { + prefix inet; + } + + import ietf-netconf-acm { prefix nacm; } + + organization + "IETF NETCONF (Network Configuration) Working Group"; + + contact + "WG Web: <http://tools.ietf.org/wg/netconf/> + WG List: <netconf@ietf.org> + + WG Chair: Bert Wijnen + <bertietf@bwijnen.net> + + WG Chair: Mehmet Ersue + <mehmet.ersue@nsn.com> + + Editor: Martin Bjorklund + <mbj@tail-f.com> + + Editor: Juergen Schoenwaelder + <j.schoenwaelder@jacobs-university.de> + + Editor: Andy Bierman + <andy.bierman@brocade.com>"; + description + "NETCONF Protocol Data Types and Protocol Operations. + + Copyright (c) 2011 IETF Trust and the persons identified as + the document authors. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6241; see + the RFC itself for full legal notices."; + + revision 2011-06-01 { + description + "Initial revision; + 2013-09-29: Updated to include NACM attributes, + as specified in RFC 6536: sec 3.2.5 and 3.2.8"; + reference + "RFC 6241: Network Configuration Protocol"; + } + + extension get-filter-element-attributes { + description + "If this extension is present within an 'anyxml' + statement named 'filter', which must be conceptually + defined within the RPC input section for the <get> + and <get-config> protocol operations, then the + following unqualified XML attribute is supported + within the <filter> element, within a <get> or + <get-config> protocol operation: + + type : optional attribute with allowed + value strings 'subtree' and 'xpath'. + If missing, the default value is 'subtree'. + + If the 'xpath' feature is supported, then the + following unqualified XML attribute is + also supported: + + select: optional attribute containing a + string representing an XPath expression. + The 'type' attribute must be equal to 'xpath' + if this attribute is present."; + } + + // NETCONF capabilities defined as features + feature writable-running { + description + "NETCONF :writable-running capability; + If the server advertises the :writable-running + capability for a session, then this feature must + also be enabled for that session. Otherwise, + this feature must not be enabled."; + reference "RFC 6241, Section 8.2"; + } + + feature candidate { + description + "NETCONF :candidate capability; + If the server advertises the :candidate + capability for a session, then this feature must + also be enabled for that session. Otherwise, + this feature must not be enabled."; + reference "RFC 6241, Section 8.3"; + } + + feature confirmed-commit { + if-feature candidate; + description + "NETCONF :confirmed-commit:1.1 capability; + If the server advertises the :confirmed-commit:1.1 + capability for a session, then this feature must + also be enabled for that session. Otherwise, + this feature must not be enabled."; + + reference "RFC 6241, Section 8.4"; + } + + feature rollback-on-error { + description + "NETCONF :rollback-on-error capability; + If the server advertises the :rollback-on-error + capability for a session, then this feature must + also be enabled for that session. Otherwise, + this feature must not be enabled."; + reference "RFC 6241, Section 8.5"; + } + + feature validate { + description + "NETCONF :validate:1.1 capability; + If the server advertises the :validate:1.1 + capability for a session, then this feature must + also be enabled for that session. Otherwise, + this feature must not be enabled."; + reference "RFC 6241, Section 8.6"; + } + + feature startup { + description + "NETCONF :startup capability; + If the server advertises the :startup + capability for a session, then this feature must + also be enabled for that session. Otherwise, + this feature must not be enabled."; + reference "RFC 6241, Section 8.7"; + } + + feature url { + description + "NETCONF :url capability; + If the server advertises the :url + capability for a session, then this feature must + also be enabled for that session. Otherwise, + this feature must not be enabled."; + reference "RFC 6241, Section 8.8"; + } + + feature xpath { + description + "NETCONF :xpath capability; + If the server advertises the :xpath + capability for a session, then this feature must + also be enabled for that session. Otherwise, + this feature must not be enabled."; + reference "RFC 6241, Section 8.9"; + } + + // NETCONF Simple Types + + typedef session-id-type { + type uint32 { + range "1..max"; + } + description + "NETCONF Session Id"; + } + + typedef session-id-or-zero-type { + type uint32; + description + "NETCONF Session Id or Zero to indicate none"; + } + typedef error-tag-type { + type enumeration { + enum in-use { + description + "The request requires a resource that + already is in use."; + } + enum invalid-value { + description + "The request specifies an unacceptable value for one + or more parameters."; + } + enum too-big { + description + "The request or response (that would be generated) is + too large for the implementation to handle."; + } + enum missing-attribute { + description + "An expected attribute is missing."; + } + enum bad-attribute { + description + "An attribute value is not correct; e.g., wrong type, + out of range, pattern mismatch."; + } + enum unknown-attribute { + description + "An unexpected attribute is present."; + } + enum missing-element { + description + "An expected element is missing."; + } + enum bad-element { + description + "An element value is not correct; e.g., wrong type, + out of range, pattern mismatch."; + } + enum unknown-element { + description + "An unexpected element is present."; + } + enum unknown-namespace { + description + "An unexpected namespace is present."; + } + enum access-denied { + description + "Access to the requested protocol operation or + data model is denied because authorization failed."; + } + enum lock-denied { + description + "Access to the requested lock is denied because the + lock is currently held by another entity."; + } + enum resource-denied { + description + "Request could not be completed because of + insufficient resources."; + } + enum rollback-failed { + description + "Request to roll back some configuration change (via + rollback-on-error or <discard-changes> operations) + was not completed for some reason."; + + } + enum data-exists { + description + "Request could not be completed because the relevant + data model content already exists. For example, + a 'create' operation was attempted on data that + already exists."; + } + enum data-missing { + description + "Request could not be completed because the relevant + data model content does not exist. For example, + a 'delete' operation was attempted on + data that does not exist."; + } + enum operation-not-supported { + description + "Request could not be completed because the requested + operation is not supported by this implementation."; + } + enum operation-failed { + description + "Request could not be completed because the requested + operation failed for some reason not covered by + any other error condition."; + } + enum partial-operation { + description + "This error-tag is obsolete, and SHOULD NOT be sent + by servers conforming to this document."; + } + enum malformed-message { + description + "A message could not be handled because it failed to + be parsed correctly. For example, the message is not + well-formed XML or it uses an invalid character set."; + } + } + description "NETCONF Error Tag"; + reference "RFC 6241, Appendix A"; + } + + typedef error-severity-type { + type enumeration { + enum error { + description "Error severity"; + } + enum warning { + description "Warning severity"; + } + } + description "NETCONF Error Severity"; + reference "RFC 6241, Section 4.3"; + } + + typedef edit-operation-type { + type enumeration { + enum merge { + description + "The configuration data identified by the + element containing this attribute is merged + with the configuration at the corresponding + level in the configuration datastore identified + by the target parameter."; + } + enum replace { + description + "The configuration data identified by the element + containing this attribute replaces any related + configuration in the configuration datastore + identified by the target parameter. If no such + configuration data exists in the configuration + datastore, it is created. Unlike a + <copy-config> operation, which replaces the + entire target configuration, only the configuration + actually present in the config parameter is affected."; + } + enum create { + description + "The configuration data identified by the element + containing this attribute is added to the + configuration if and only if the configuration + data does not already exist in the configuration + datastore. If the configuration data exists, an + <rpc-error> element is returned with an + <error-tag> value of 'data-exists'."; + } + enum delete { + description + "The configuration data identified by the element + containing this attribute is deleted from the + configuration if and only if the configuration + data currently exists in the configuration + datastore. If the configuration data does not + exist, an <rpc-error> element is returned with + an <error-tag> value of 'data-missing'."; + } + enum remove { + description + "The configuration data identified by the element + containing this attribute is deleted from the + configuration if the configuration + data currently exists in the configuration + datastore. If the configuration data does not + exist, the 'remove' operation is silently ignored + by the server."; + } + } + default "merge"; + description "NETCONF 'operation' attribute values"; + reference "RFC 6241, Section 7.2"; + } + + // NETCONF Standard Protocol Operations + + rpc get-config { + description + "Retrieve all or part of a specified configuration."; + + reference "RFC 6241, Section 7.1"; + + input { + container source { + description + "Particular configuration to retrieve."; + + choice config-source { + mandatory true; + description + "The configuration to retrieve."; + leaf candidate { + if-feature candidate; + type empty; + description + "The candidate configuration is the config source."; + } + leaf running { + type empty; + description + "The running configuration is the config source."; + } + leaf startup { + if-feature startup; + type empty; + description + "The startup configuration is the config source. + This is optional-to-implement on the server because + not all servers will support filtering for this + datastore."; + } + } + } + + anyxml filter { + description + "Subtree or XPath filter to use."; + nc:get-filter-element-attributes; + } + } + + output { + anyxml data { + description + "Copy of the source datastore subset that matched + the filter criteria (if any). An empty data container + indicates that the request did not produce any results."; + } + } + } + + rpc edit-config { + description + "The <edit-config> operation loads all or part of a specified + configuration to the specified target configuration."; + + reference "RFC 6241, Section 7.2"; + + input { + container target { + description + "Particular configuration to edit."; + + choice config-target { + mandatory true; + description + "The configuration target."; + + leaf candidate { + if-feature candidate; + type empty; + description + "The candidate configuration is the config target."; + } + leaf running { + if-feature writable-running; + type empty; + description + "The running configuration is the config source."; + } + } + } + + leaf default-operation { + type enumeration { + enum merge { + description + "The default operation is merge."; + } + enum replace { + description + "The default operation is replace."; + } + enum none { + description + "There is no default operation."; + } + } + default "merge"; + description + "The default operation to use."; + } + + leaf test-option { + if-feature validate; + type enumeration { + enum test-then-set { + description + "The server will test and then set if no errors."; + } + enum set { + description + "The server will set without a test first."; + } + + enum test-only { + description + "The server will only test and not set, even + if there are no errors."; + } + } + default "test-then-set"; + description + "The test option to use."; + } + + leaf error-option { + type enumeration { + enum stop-on-error { + description + "The server will stop on errors."; + } + enum continue-on-error { + description + "The server may continue on errors."; + } + enum rollback-on-error { + description + "The server will roll back on errors. + This value can only be used if the 'rollback-on-error' + feature is supported."; + } + } + default "stop-on-error"; + description + "The error option to use."; + } + + choice edit-content { + mandatory true; + description + "The content for the edit operation."; + + anyxml config { + description + "Inline Config content."; + } + leaf url { + if-feature url; + type inet:uri; + description + "URL-based config content."; + } + } + } + } + + rpc copy-config { + description + "Create or replace an entire configuration datastore with the + contents of another complete configuration datastore."; + + reference "RFC 6241, Section 7.3"; + + input { + container target { + description + "Particular configuration to copy to."; + + choice config-target { + mandatory true; + description + "The configuration target of the copy operation."; + + leaf candidate { + if-feature candidate; + type empty; + description + "The candidate configuration is the config target."; + } + leaf running { + if-feature writable-running; + type empty; + description + "The running configuration is the config target. + This is optional-to-implement on the server."; + } + leaf startup { + if-feature startup; + type empty; + description + "The startup configuration is the config target."; + } + leaf url { + if-feature url; + type inet:uri; + description + "The URL-based configuration is the config target."; + } + } + } + + container source { + description + "Particular configuration to copy from."; + + choice config-source { + mandatory true; + description + "The configuration source for the copy operation."; + + leaf candidate { + if-feature candidate; + type empty; + description + "The candidate configuration is the config source."; + } + leaf running { + type empty; + description + "The running configuration is the config source."; + } + leaf startup { + if-feature startup; + type empty; + description + "The startup configuration is the config source."; + } + leaf url { + if-feature url; + type inet:uri; + description + "The URL-based configuration is the config source."; + } + anyxml config { + description + "Inline Config content: <config> element. Represents + an entire configuration datastore, not + a subset of the running datastore."; + } + } + } + } + } + + rpc delete-config { + nacm:default-deny-all; + description + "Delete a configuration datastore."; + + reference "RFC 6241, Section 7.4"; + + input { + container target { + description + "Particular configuration to delete."; + + choice config-target { + mandatory true; + description + "The configuration target to delete."; + + leaf startup { + if-feature startup; + type empty; + description + "The startup configuration is the config target."; + } + leaf url { + if-feature url; + type inet:uri; + description + "The URL-based configuration is the config target."; + } + } + } + } + } + + rpc lock { + description + "The lock operation allows the client to lock the configuration + system of a device."; + + reference "RFC 6241, Section 7.5"; + + input { + container target { + description + "Particular configuration to lock."; + + choice config-target { + mandatory true; + description + "The configuration target to lock."; + + leaf candidate { + if-feature candidate; + type empty; + description + "The candidate configuration is the config target."; + } + leaf running { + type empty; + description + "The running configuration is the config target."; + } + leaf startup { + if-feature startup; + type empty; + description + "The startup configuration is the config target."; + } + } + } + } + } + + rpc unlock { + description + "The unlock operation is used to release a configuration lock, + previously obtained with the 'lock' operation."; + + reference "RFC 6241, Section 7.6"; + + input { + container target { + description + "Particular configuration to unlock."; + + choice config-target { + mandatory true; + description + "The configuration target to unlock."; + + leaf candidate { + if-feature candidate; + type empty; + description + "The candidate configuration is the config target."; + } + leaf running { + type empty; + description + "The running configuration is the config target."; + } + leaf startup { + if-feature startup; + type empty; + description + "The startup configuration is the config target."; + } + } + } + } + } + + rpc get { + description + "Retrieve running configuration and device state information."; + + reference "RFC 6241, Section 7.7"; + + input { + anyxml filter { + description + "This parameter specifies the portion of the system + configuration and state data to retrieve."; + nc:get-filter-element-attributes; + } + } + + output { + anyxml data { + description + "Copy of the running datastore subset and/or state + data that matched the filter criteria (if any). + An empty data container indicates that the request did not + produce any results."; + } + } + } + + rpc close-session { + description + "Request graceful termination of a NETCONF session."; + + reference "RFC 6241, Section 7.8"; + } + + rpc kill-session { + nacm:default-deny-all; + description + "Force the termination of a NETCONF session."; + + reference "RFC 6241, Section 7.9"; + + input { + leaf session-id { + type session-id-type; + mandatory true; + description + "Particular session to kill."; + } + } + } + + rpc commit { + if-feature candidate; + + description + "Commit the candidate configuration as the device's new + current configuration."; + + reference "RFC 6241, Section 8.3.4.1"; + + input { + leaf confirmed { + if-feature confirmed-commit; + type empty; + description + "Requests a confirmed commit."; + reference "RFC 6241, Section 8.3.4.1"; + } + + leaf confirm-timeout { + if-feature confirmed-commit; + type uint32 { + range "1..max"; + } + units "seconds"; + default "600"; // 10 minutes + description + "The timeout interval for a confirmed commit."; + reference "RFC 6241, Section 8.3.4.1"; + } + + leaf persist { + if-feature confirmed-commit; + type string; + description + "This parameter is used to make a confirmed commit + persistent. A persistent confirmed commit is not aborted + if the NETCONF session terminates. The only way to abort + a persistent confirmed commit is to let the timer expire, + or to use the <cancel-commit> operation. + + The value of this parameter is a token that must be given + in the 'persist-id' parameter of <commit> or + <cancel-commit> operations in order to confirm or cancel + the persistent confirmed commit. + + The token should be a random string."; + reference "RFC 6241, Section 8.3.4.1"; + } + + leaf persist-id { + if-feature confirmed-commit; + type string; + description + "This parameter is given in order to commit a persistent + confirmed commit. The value must be equal to the value + given in the 'persist' parameter to the <commit> operation. + If it does not match, the operation fails with an + 'invalid-value' error."; + reference "RFC 6241, Section 8.3.4.1"; + } + + } + } + + rpc discard-changes { + if-feature candidate; + + description + "Revert the candidate configuration to the current + running configuration."; + reference "RFC 6241, Section 8.3.4.2"; + } + + rpc cancel-commit { + if-feature confirmed-commit; + description + "This operation is used to cancel an ongoing confirmed commit. + If the confirmed commit is persistent, the parameter + 'persist-id' must be given, and it must match the value of the + 'persist' parameter."; + reference "RFC 6241, Section 8.4.4.1"; + + input { + leaf persist-id { + type string; + description + "This parameter is given in order to cancel a persistent + confirmed commit. The value must be equal to the value + given in the 'persist' parameter to the <commit> operation. + If it does not match, the operation fails with an + 'invalid-value' error."; + } + } + } + + rpc validate { + if-feature validate; + + description + "Validates the contents of the specified configuration."; + + reference "RFC 6241, Section 8.6.4.1"; + + input { + container source { + description + "Particular configuration to validate."; + + choice config-source { + mandatory true; + description + "The configuration source to validate."; + + leaf candidate { + if-feature candidate; + type empty; + description + "The candidate configuration is the config source."; + } + leaf running { + type empty; + description + "The running configuration is the config source."; + } + leaf startup { + if-feature startup; + type empty; + description + "The startup configuration is the config source."; + } + leaf url { + if-feature url; + type inet:uri; + description + "The URL-based configuration is the config source."; + } + anyxml config { + description + "Inline Config content: <config> element. Represents + an entire configuration datastore, not + a subset of the running datastore."; + } + } + } + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-ptp-dataset@2017-02-08.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-ptp-dataset@2017-02-08.yang new file mode 100644 index 000000000..d899e5692 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-ptp-dataset@2017-02-08.yang @@ -0,0 +1,605 @@ + module ietf-ptp-dataset{ + namespace "urn:ietf:params:xml:ns:yang:ietf-ptp-dataset"; + prefix "ptp-dataset"; + organization "IETF TICTOC Working Group"; + contact + "WG Web: http://tools.ietf.org/wg/tictoc/ + WG List: <mailto:tictoc@ietf.org> + WG Chair: Karen O'Donoghue + <mailto:odonoghue@isoc.org> + WG Chair: Yaakov Stein + <mailto: Yaakov_s@rad.com> + Editor: Yuanlong Jiang + <mailto:jiangyuanlong@huawei.com> + Editor: Rodney Cummings + <mailto:rodney.cummings@ni.com>"; + description + "This YANG module defines a data model for the configuration + of IEEE 1588-2008 clocks, and also for retrieval of the state + data of IEEE 1588-2008 clocks."; + + revision "2017-02-08" { + description "Version 4.0"; + reference "draft-ietf-tictoc-1588v2-yang"; + } + + typedef delay-mechanism-enumeration { + type enumeration { + enum E2E { + value 1; + description + "The port uses the delay request-response + mechanism."; + } + enum P2P { + value 2; + description + "The port uses the peer delay mechanism."; + } + enum DISABLED { + value 254; + description + "The port does not implement any delay + mechanism."; + } + } + description + "The propagation delay measuring option used by the + port. Values for this enumeration are specified + by the IEEE 1588 standard exclusively."; + reference + "IEEE Std 1588-2008: 8.2.5.4.4"; + } + + typedef port-state-enumeration { + type enumeration { + enum INITIALIZING { + value 1; + description + "The port is initializing its data sets, hardware, and + communication facilities."; + } + enum FAULTY { + value 2; + description + "The port is in the fault state."; + } + enum DISABLED { + value 3; + description + "The port is disabled, and is not communicating PTP + messages (other than possibly PTP management + messages)."; + } + enum LISTENING { + value 4; + description + "The port is listening for an Announce message."; + } + enum PRE_MASTER { + value 5; + description + "The port is in the pre-master state."; + } + enum MASTER { + value 6; + description + "The port is behaving as a master port."; + } + enum PASSIVE { + value 7; + description + "The port is in the passive state."; + } + enum UNCALIBRATED { + value 8; + description + "A master port has been selected, but the port is still + in the uncalibrated state."; + } + enum SLAVE { + value 9; + description + "The port is synchronizing to the selected + master port."; + } + } + description + "The current state of the protocol engine associated + with the port. Values for this enumeration are specified + by the IEEE 1588 standard exclusively."; + reference + "IEEE Std 1588-2008: 8.2.5.3.1, 9.2.5"; + } + + typedef time-interval-type { + type int64; + description + "Derived data type for time interval, + represented in units of nanoseconds and + multipled by 2^16"; + reference + "IEEE Std 1588-2008: 5.3.2"; + } + + typedef clock-identity-type { + type binary { + length "8"; + } + description + "Derived data type to identify a clock"; + reference + "IEEE Std 1588-2008: 5.3.4"; + } + + grouping port-identity-grouping { + description + "Derived data type to identify a port, which contains + two members: clockIdentity and portNumber."; + reference + "IEEE Std 1588-2008: 5.3.5"; + + leaf clock-identity { + type clock-identity-type; + description + "Identity of the clock"; + } + + leaf port-number { + type uint16; + description + "Port number"; + } + } + + grouping clock-quality-grouping { + description + "Derived data type for quality of a clock, which contains + clockClass, clockAccuracy and offsetScaledLogVariance."; + reference + "IEEE Std 1588-2008: 5.3.7"; + + leaf clock-class { + type uint8; + default 248; + description + "The clockClass denotes the traceability of the time + or frequency distributed by the clock."; + } + + leaf clock-accuracy { + type uint8; + description + "The clockAccuracy indicates the expected accuracy + of the clock."; + } + + leaf offset-scaled-log-variance { + type uint16; + description + "The offsetScaledLogVariance provides an + estimate of the variations of the clock + from a linear timescale when it is not synchronized + to another clock using the protocol."; + } + } + + grouping default-ds-entry { + description + "Collection of members of the default data set."; + + leaf two-step-flag { + type boolean; + description + "When set, the clock is a two-step clock; otherwise, + the clock is a one-step clock."; + } + + leaf clock-identity { + type clock-identity-type; + description + "The clockIdentity of the local clock"; + } + + leaf number-ports { + type uint16; + description + "The number of PTP ports on the device."; + } + + container clock-quality { + description + "The clockQuality of the local clock."; + + uses clock-quality-grouping; + } + + leaf priority1 { + type uint8; + description + "The priority1 attribute of the local clock."; + } + + leaf priority2{ + type uint8; + description + "The priority2 attribute of the local clock. "; + } + + leaf domain-number { + type uint8; + description + "The domain number of the current syntonization + domain."; + } + + leaf slave-only { + type boolean; + description + "When set, the clock is a slave-only clock."; + } + } + + grouping current-ds-entry { + description + "Collection of members of current data set."; + + leaf steps-removed { + type uint16; + default 0; + description + "The number of communication paths traversed + between the local clock and the grandmaster clock."; + } + leaf offset-from-master { + type time-interval-type; + description + "The current value of the time difference between + a master and a slave clock as computed by the slave."; + } + + leaf mean-path-delay { + type time-interval-type; + description + "The current value of the mean propagation time between + a master and a slave clock as computed by the slave."; + + } + } + + grouping parent-ds-entry { + description + "Collection of members of the parent data set."; + + container parent-port-identity { + description + "The portIdentity of the port on the master"; + uses port-identity-grouping; + } + leaf parent-stats { + type boolean; + default false; + description + "When set, the values of + observedParentOffsetScaledLogVariance and + observedParentClockPhaseChangeRate of parentDS + have been measured and are valid."; + } + leaf observed-parent-offset-scaled-log-variance { + type uint16; + default 0xFFFF; + description + "An estimate of the parent clock's PTP variance + as observed by the slave clock."; + } + leaf observed-parent-clock-phase-change-rate { + type int32; + description + "An estimate of the parent clock's phase change rate + as observed by the slave clock."; + } + leaf grandmaster-identity { + type binary{ + length "8"; + } + + description + "The clockIdentity attribute of the grandmaster clock."; + + } + container grandmaster-clock-quality { + description + "The clockQuality of the grandmaster clock."; + uses clock-quality-grouping; + } + leaf grandmaster-priority1 { + type uint8; + description + "The priority1 attribute of the grandmaster clock."; + } + leaf grandmaster-priority2 { + type uint8; + description + "The priority2 attribute of the grandmaster clock."; + } + } + + grouping time-properties-ds-entry { + description + "Collection of members of the timeProperties data set."; + leaf current-utc-offset-valid { + type boolean; + description + "When set, the current UTC offset is valid."; + } + leaf current-utc-offset { + type int16; + description + "The offset between TAI and UTC when the epoch of the + PTP system is the PTP epoch, i.e., when ptp-timescale + is TRUE; otherwise, the value has no meaning."; + } + leaf leap59 { + type boolean; + description + "When set, the last minute of the current UTC day + contains 59 seconds."; + } + leaf leap61 { + type boolean; + description + "When set, the last minute of the current UTC day + contains 61 seconds."; + } + leaf time-traceable { + type boolean; + description + "When set, the timescale and the currentUtcOffset are + traceable to a primary reference."; + } + leaf frequency-traceable { + type boolean; + description + "When set, the frequency determining the timescale + is traceable to a primary reference."; + } + leaf ptp-timescale { + type boolean; + description + "When set, the clock timescale of the grandmaster + clock is PTP; otherwise, the timescale is ARB + (arbitrary)."; + } + leaf time-source { + type uint8; + description + "The source of time used by the grandmaster clock."; + + } + } + + grouping port-ds-entry { + description + "Collection of members of the port data set."; + + container port-identity { + description + "The portIdentity attribute of the local port."; + uses port-identity-grouping; + } + + leaf port-state { + type port-state-enumeration; + default "INITIALIZING"; + description + "Current state associated with the port."; + } + + leaf log-min-delay-req-interval { + type int8; + description + "The base-two logarithm of the minDelayReqInterval + (the minimum permitted mean time interval between + successive Delay_Req messages)."; + } + + leaf peer-mean-path-delay { + type time-interval-type; + default 0; + description + "An estimate of the current one-way propagation delay + on the link when the delayMechanism is P2P; otherwise, + it is zero."; + } + + leaf log-announce-interval { + type int8; + description + "The base-two logarithm of the mean + announceInterval (mean time interval between + successive Announce messages)."; + } + + leaf announce-receipt-timeout { + type uint8; + description + "The number of announceInterval that have to pass + without receipt of an Announce message before the + occurrence of the event ANNOUNCE_RECEIPT_TIMEOUT_ + EXPIRES."; + } + + leaf log-sync-interval { + type int8; + description + "The base-two logarithm of the mean SyncInterval + for multicast messages. The rates for unicast + transmissions are negotiated separately on a per port + basis and are not constrained by this attribute."; + } + + leaf delay-mechanism { + type delay-mechanism-enumeration; + description + "The propagation delay measuring option used by the + port in computing meanPathDelay."; + } + + leaf log-min-pdelay-req-interval { + type int8; + description + "The base-two logarithm of the + minPdelayReqInterval (minimum permitted mean time + interval between successive Pdelay_Req messages)."; + + } + + leaf version-number { + type uint8; + description + "The PTP version in use on the port."; + } + } + + grouping transparent-clock-default-ds-entry { + description + "Collection of members of the transparentClockDefault data + set (default data set for a transparent clock)."; + + leaf clock-identity { + type clock-identity-type; + description + "The clockIdentity of the transparent clock."; + } + leaf number-ports { + type uint16; + description + "The number of PTP ports on the device."; + } + leaf delay-mechanism { + type delay-mechanism-enumeration; + description + "The propagation delay measuring option + used by the transparent clock."; + } + leaf primary-domain { + type uint8; + default 0; + description + "The domainNumber of the primary syntonization domain."; + + } + } + + grouping transparent-clock-port-ds-entry { + description + "Collection of members of the transparentClockPort data + set (port data set for a transparent clock)."; + + container port-identity { + description + "The portIdentity of the local port."; + + uses port-identity-grouping; + } + leaf log-min-pdelay-req-interval { + type int8; + description + "The logarithm to the base 2 of the + minPdelayReqInterval (minimum permitted mean time + interval between successive Pdelay_Req messages)."; + } + leaf faulty-flag { + type boolean; + default false; + description + "When set, the port is faulty."; + } + leaf peer-mean-path-delay { + type time-interval-type; + default 0; + description + "An estimate of the current one-way propagation delay + on the link when the delayMechanism is P2P; otherwise, + it is zero."; + } + } + + list instance-list { + + key "instance-number"; + + description + "List of one or more PTP datasets in the device, one for + each domain (see IEEE 1588-2008 subclause 6.3). + Each PTP dataset represents a distinct instance of + PTP implementation in the device (i.e. distinct + Ordinary Clock or Boundary Clock)."; + + leaf instance-number { + type uint16; + description + "The instance number of the current PTP instance"; + } + container default-ds { + description + "The default data set of the clock."; + uses default-ds-entry; + } + + container current-ds { + description + "The current data set of the clock."; + uses current-ds-entry; + } + + container parent-ds { + description + "The parent data set of the clock."; + uses parent-ds-entry; + } + + container time-properties-ds { + description + "The timeProperties data set of the clock."; + uses time-properties-ds-entry; + } + + list port-ds-list { + key "port-number"; + description + "List of port data sets of the clock."; + leaf port-number{ + type leafref{ + path "../port-identity/port-number"; + } + description + "Refers to the portNumber memer of + portDS.portIdentity."; + } + uses port-ds-entry; + } + } + + container transparent-clock-default-ds { + description + "The members of the transparentClockDefault Data Set"; + uses transparent-clock-default-ds-entry; + } + + list transparent-clock-port-ds-list { + key "port-number"; + description + "List of transparentClockPort data sets + of the transparent clock."; + leaf port-number { + type leafref { + path "../port-identity/port-number"; + } + description + "Refers to the portNumber memer + of transparentClockPortDS.portIdentity."; + } + uses transparent-clock-port-ds-entry; + } + } diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-restconf@2013-10-19.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-restconf@2013-10-19.yang new file mode 100644 index 000000000..83bb37835 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-restconf@2013-10-19.yang @@ -0,0 +1,689 @@ +module ietf-restconf { + namespace "urn:ietf:params:xml:ns:yang:ietf-restconf"; + prefix "restconf"; + + import ietf-yang-types { prefix yang; revision-date 2013-07-15; } + import ietf-inet-types { prefix inet; } + + organization + "IETF NETCONF (Network Configuration) Working Group"; + + contact + "Editor: Andy Bierman + <mailto:andy@yumaworks.com> + + Editor: Martin Bjorklund + <mailto:mbj@tail-f.com> + + Editor: Kent Watsen + <mailto:kwatsen@juniper.net> + + Editor: Rex Fernando + <mailto:rex@cisco.com>"; + + description + "This module contains conceptual YANG specifications + for the YANG Patch and error content that is used in + RESTCONF protocol messages. A conceptual container + representing the RESTCONF API nodes (media type + application/yang.api). + + Note that the YANG definitions within this module do not + represent configuration data of any kind. + The YANG grouping statements provide a normative syntax + for XML and JSON message encoding purposes. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + // RFC Ed.: replace XXXX with actual RFC number and remove this + // note. + + // RFC Ed.: remove this note + // Note: extracted from draft-bierman-netconf-restconf-02.txt + + // RFC Ed.: update the date below with the date of RFC publication + // and remove this note. + revision 2013-10-19 { + description + "Initial revision."; + reference + "RFC XXXX: RESTCONF Protocol."; + } + + typedef data-resource-identifier { + type string { + length "1 .. max"; + } + description + "Contains a Data Resource Identifier formatted string + to identify a specific data node. The data node that + uses this data type SHOULD define the document root + for data resource identifiers. The default document + root is the target datastore conceptual root node. + Data resource identifiers are defined relative to + this document root."; + reference + "RFC XXXX: [sec. 5.3.1.1 ABNF For Data Resource Identifiers]"; + } + + // this typedef is TBD; not currently used + typedef datastore-identifier { + type union { + type enumeration { + enum candidate { + description + "Identifies the NETCONF shared candidate datastore."; + reference + "RFC 6241, section 8.3"; + } + enum running { + description + "Identifies the NETCONF running datastore."; + reference + "RFC 6241, section 5.1"; + } + enum startup { + description + "Identifies the NETCONF startup datastore."; + reference + "RFC 6241, section 8.7"; + } + } + type string; + } + description + "Contains a string to identify a specific datastore. + The enumerated datastore identifier values are + reserved for standard datastore names."; + } + + typedef revision-identifier { + type string { + pattern '\d{4}-\d{2}-\d{2}'; + } + description + "Represents a specific date in YYYY-MM-DD format. + TBD: make pattern more precise to exclude leading zeros."; + } + + grouping yang-patch { + + description + "A grouping that contains a YANG container + representing the syntax and semantics of a + YANG Patch edit request message."; + + container yang-patch { + description + "Represents a conceptual sequence of datastore edits, + called a patch. Each patch is given a client-assigned + patch identifier. Each edit MUST be applied + in ascending order, and all edits MUST be applied. + If any errors occur, then the target datastore MUST NOT + be changed by the patch operation. + + A patch MUST be validated by the server to be a + well-formed message before any of the patch edits + are validated or attempted. + + YANG datastore validation (defined in RFC 6020, section + 8.3.3) is performed after all edits have been + individually validated. + + It is possible for a datastore constraint violation to occur + due to any node in the datastore, including nodes not + included in the edit list. Any validation errors MUST + be reported in the reply message."; + + reference + "RFC 6020, section 8.3."; + + leaf patch-id { + type string; + description + "An arbitrary string provided by the client to identify + the entire patch. This value SHOULD be present in any + audit logging records generated by the server for the + patch. Error messages returned by the server pertaining + to this patch will be identified by this patch-id value."; + } + + leaf comment { + type string { + length "0 .. 1024"; + } + description + "An arbitrary string provided by the client to describe + the entire patch. This value SHOULD be present in any + audit logging records generated by the server for the + patch."; + } + + list edit { + key edit-id; + ordered-by user; + + description + "Represents one edit within the YANG Patch + request message."; + + leaf edit-id { + type string; + description + "Arbitrary string index for the edit. + Error messages returned by the server pertaining + to a specific edit will be identified by this + value."; + } + + leaf operation { + type enumeration { + enum create { + description + "The target data node is created using the + supplied value, only if it does not already + exist."; + } + enum delete { + description + "Delete the target node, only if the data resource + currently exists, otherwise return an error."; + } + enum insert { + description + "Insert the supplied value into a user-ordered + list or leaf-list entry. The target node must + represent a new data resource."; + } + enum merge { + description + "The supplied value is merged with the target data + node."; + } + enum move { + description + "Move the target node. Reorder a user-ordered + list or leaf-list. The target node must represent + an existing data resource."; + } + enum replace { + description + "The supplied value is used to replace the target + data node."; + } + enum remove { + description + "Delete the target node if it currently exists."; + } + } + mandatory true; + description + "The datastore operation requested for the associated + edit entry"; + } + + leaf target { + type data-resource-identifier; + mandatory true; + description + "Identifies the target data resource for the edit + operation."; + } + + leaf point { + when "(../operation = 'insert' or " + + "../operation = 'move') and " + + "(../where = 'before' or ../where = 'after')" { + description + "Point leaf only applies for insert or move + operations, before or after an existing entry."; + } + type data-resource-identifier; + description + "The absolute URL path for the data node that is being + used as the insertion point or move point for the + target of this edit entry."; + } + + leaf where { + when "../operation = 'insert' or ../operation = 'move'" { + description + "Where leaf only applies for insert or move + operations."; + } + type enumeration { + enum before { + description + "Insert or move a data node before the data resource + identified by the 'point' parameter."; + } + enum after { + description + "Insert or move a data node after the data resource + identified by the 'point' parameter."; + } + enum first { + description + "Insert or move a data node so it becomes ordered + as the first entry."; + } + enum last { + description + "Insert or move a data node so it becomes ordered + as the last entry."; + } + + } + default last; + description + "Identifies where a data resource will be inserted or + moved. YANG only allows these operations for + list and leaf-list data nodes that are ordered-by + user."; + } + + anyxml value { + when "(../operation = 'create' or " + + "../operation = 'merge' " + + "or ../operation = 'replace' or " + + "../operation = 'insert')" { + description + "Value node only used for create, merge, + replace, and insert operations"; + } + description + "Value used for this edit operation."; + } + } + } + + } // grouping yang-patch + + + grouping yang-patch-status { + + description + "A grouping that contains a YANG container + representing the syntax and semantics of + YANG Patch status response message."; + + container yang-patch-status { + description + "A container representing the response message + sent by the server after a YANG Patch edit + request message has been processed."; + + leaf patch-id { + type string; + description + "The patch-id value used in the request"; + } + + choice global-status { + description + "Report global errors or complete success. + If there is no case selected then errors + are reported in the edit-status container."; + + case global-errors { + uses errors; + description + "This container will be present if global + errors unrelated to a specific edit occurred."; + } + leaf ok { + type empty; + description + "This leaf will be present if the request succeeded + and there are no errors reported in the edit-status + container."; + } + } + + container edit-status { + description + "This container will be present if there are + edit-specific status responses to report."; + + list edit { + key edit-id; + + description + "Represents a list of status responses, + corresponding to edits in the YANG Patch + request message. If an edit entry was + skipped or not reached by the server, + then this list will not contain a corresponding + entry for that edit."; + + leaf edit-id { + type string; + description + "Response status is for the edit list entry + with this edit-id value."; + } + choice edit-status-choice { + description + "A choice between different types of status + responses for each edit entry."; + leaf ok { + type empty; + description + "This edit entry was invoked without any + errors detected by the server associated + with this edit."; + } + leaf location { + type inet:uri; + description + "Contains the Location header value that would be + returned if this edit causes a new resource to be + created. If the edit identified by the same edit-id + value was successfully invoked and a new resource + was created, then this field will be returned + instead of 'ok'."; + } + case errors { + uses errors; + description + "The server detected errors associated with the + edit identified by the same edit-id value."; + } + } + } + } + } + } // grouping yang-patch-status + + + grouping errors { + + description + "A grouping that contains a YANG container + representing the syntax and semantics of a + YANG Patch errors report within a response message."; + + container errors { + config false; // needed so list error does not need a key + description + "Represents an error report returned by the server if + a request results in an error."; + + list error { + description + "An entry containing information about one + specific error that occurred while processing + a RESTCONF request."; + reference "RFC 6241, Section 4.3"; + + leaf error-type { + type enumeration { + enum transport { + description "The transport layer"; + } + enum rpc { + description "The rpc or notification layer"; + } + enum protocol { + description "The protocol operation layer"; + } + enum application { + description "The server application layer"; + } + } + mandatory true; + description + "The protocol layer where the error occurred."; + } + + leaf error-tag { + type string; + mandatory true; + description + "The enumerated error tag."; + } + + leaf error-app-tag { + type string; + description + "The application-specific error tag."; + } + + leaf error-path { + type data-resource-identifier; + description + "The target data resource identifier associated + with the error, if any."; + } + + leaf error-message { + type string; + description + "A message describing the error."; + } + + container error-info { + description + "A container allowing additional information + to be included in the error report."; + // arbitrary anyxml content here + } + } + } + } // grouping errors + + + grouping restconf { + + description + "A grouping that contains a YANG container + representing the syntax and semantics of + the RESTCONF API resource."; + + container restconf { + description + "Conceptual container representing the + application/yang.api resource type."; + + container config { + description + "Container representing the application/yang.datastore + resource type. Represents the conceptual root of the + unified configuration datastore containing YANG data + nodes. The child nodes of this container are + configuration data resources (application/yang.data) + defined as top-level YANG data nodes from the modules + advertised by the server in /restconf/modules."; + } + + container operational { + description + "Container representing the application/yang.datastore + resource type. Represents the conceptual root of the + operational data supported by the server. The child + nodes of this container are operational data resources + (application/yang.data) defined as top-level + YANG data nodes from the modules advertised by + the server in /restconf/modules."; + } + + container modules { + description + "Contains a list of module description entries. + These modules are currently loaded into the server."; + + list module { + key "name revision"; + description + "Each entry represents one module currently + supported by the server."; + + leaf name { + type yang:yang-identifier; + description "The YANG module name."; + } + leaf revision { + type union { + type revision-identifier; + type string { length 0; } + } + description + "The YANG module revision date. An empty string is + used if no revision statement is present in the + YANG module."; + } + leaf namespace { + type inet:uri; + mandatory true; + description + "The XML namespace identifier for this module."; + } + leaf-list feature { + type yang:yang-identifier; + description + "List of YANG feature names from this module that are + supported by the server."; + } + leaf-list deviation { + type yang:yang-identifier; + description + "List of YANG deviation module names used by this + server to modify the conformance of the module + associated with this entry."; + } + } + } + + container operations { + description + "Container for all operation resources + (application/yang.operation), + + Each resource is represented as an empty leaf with the + name of the RPC operation from the YANG rpc statement. + + E.g.; + + POST /restconf/operations/show-log-errors + + leaf show-log-errors { + type empty; + } + "; + } + + container streams { + description + "Container representing the notification event streams + supported by the server."; + reference + "RFC 5277, Section 3.4, <streams> element."; + + list stream { + key name; + description + "Each entry describes an event stream supported by + the server."; + + leaf name { + type string; + description "The stream name"; + reference "RFC 5277, Section 3.4, <name> element."; + } + + leaf description { + type string; + description "Description of stream content"; + reference + "RFC 5277, Section 3.4, <description> element."; + } + + leaf replay-support { + type boolean; + description + "Indicates if replay buffer supported for this stream"; + reference + "RFC 5277, Section 3.4, <replaySupport> element."; + } + + leaf replay-log-creation-time { + type yang:date-and-time; + description + "Indicates the time the replay log for this stream + was created."; + reference + "RFC 5277, Section 3.4, <replayLogCreationTime> + element."; + } + + leaf events { + type empty; + description + "Represents the entry point for establishing + notification delivery via server sent events."; + } + } + } + + leaf version { + type enumeration { + enum "1.0" { + description + "Version 1.0 of the RESTCONF protocol."; + } + } + config false; + description + "Contains the RESTCONF protocol version."; + } + } + } // grouping restconf + + + grouping notification { + description + "Contains the notification message wrapper definition."; + + container notification { + description + "RESTCONF notification message wrapper."; + + leaf event-time { + type yang:date-and-time; + mandatory true; + description + "The time the event was generated by the + event source."; + reference + "RFC 5277, section 4, <eventTime> element."; + } + + /* The YANG-specific notification container is encoded + * after the 'event-time' element. The format + * corresponds to the notificationContent element + * in RFC 5277, section 4. For example: + * + * module example-one { + * ... + * notification event1 { ... } + * + * } + * + * Encoded as element 'event1' in the namespace + * for module 'example-one'. + */ + } + } // grouping notification + +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-system@2014-08-06.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-system@2014-08-06.yang new file mode 100644 index 000000000..de3096c4c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-system@2014-08-06.yang @@ -0,0 +1,842 @@ +module ietf-system { + namespace "urn:ietf:params:xml:ns:yang:ietf-system"; + prefix "sys"; + + import ietf-yang-types { + prefix yang; + } + + import ietf-inet-types { + prefix inet; + } + + import ietf-netconf-acm { + prefix nacm; + } + + import iana-crypt-hash { + prefix ianach; + } + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + + + + + + + contact + "WG Web: <http://tools.ietf.org/wg/netmod/> + WG List: <mailto:netmod@ietf.org> + + WG Chair: Thomas Nadeau + <mailto:tnadeau@lucidvision.com> + + WG Chair: Juergen Schoenwaelder + <mailto:j.schoenwaelder@jacobs-university.de> + + Editor: Andy Bierman + <mailto:andy@yumaworks.com> + + Editor: Martin Bjorklund + <mailto:mbj@tail-f.com>"; + + description + "This module contains a collection of YANG definitions for the + configuration and identification of some common system + properties within a device containing a NETCONF server. This + includes data node definitions for system identification, + time-of-day management, user management, DNS resolver + configuration, and some protocol operations for system + management. + + Copyright (c) 2014 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 7317; see + the RFC itself for full legal notices."; + + revision 2014-08-06 { + description + "Initial revision."; + reference + "RFC 7317: A YANG Data Model for System Management"; + } + + + + + /* + * Typedefs + */ + + typedef timezone-name { + type string; + description + "A time zone name as used by the Time Zone Database, + sometimes referred to as the 'Olson Database'. + + The exact set of valid values is an implementation-specific + matter. Client discovery of the exact set of time zone names + for a particular server is out of scope."; + reference + "RFC 6557: Procedures for Maintaining the Time Zone Database"; + } + + /* + * Features + */ + + feature radius { + description + "Indicates that the device can be configured as a RADIUS + client."; + reference + "RFC 2865: Remote Authentication Dial In User Service (RADIUS)"; + } + + feature authentication { + description + "Indicates that the device supports configuration of + user authentication."; + } + + feature local-users { + if-feature authentication; + description + "Indicates that the device supports configuration of + local user authentication."; + } + + + + + + + + feature radius-authentication { + if-feature radius; + if-feature authentication; + description + "Indicates that the device supports configuration of user + authentication over RADIUS."; + reference + "RFC 2865: Remote Authentication Dial In User Service (RADIUS) + RFC 5607: Remote Authentication Dial-In User Service (RADIUS) + Authorization for Network Access Server (NAS) + Management"; + } + + feature ntp { + description + "Indicates that the device can be configured to use one or + more NTP servers to set the system date and time."; + } + + feature ntp-udp-port { + if-feature ntp; + description + "Indicates that the device supports the configuration of + the UDP port for NTP servers. + + This is a 'feature', since many implementations do not support + any port other than the default port."; + } + + feature timezone-name { + description + "Indicates that the local time zone on the device + can be configured to use the TZ database + to set the time zone and manage daylight saving time."; + reference + "RFC 6557: Procedures for Maintaining the Time Zone Database"; + } + + feature dns-udp-tcp-port { + description + "Indicates that the device supports the configuration of + the UDP and TCP port for DNS servers. + + This is a 'feature', since many implementations do not support + any port other than the default port."; + } + + + /* + * Identities + */ + + identity authentication-method { + description + "Base identity for user authentication methods."; + } + + identity radius { + base authentication-method; + description + "Indicates user authentication using RADIUS."; + reference + "RFC 2865: Remote Authentication Dial In User Service (RADIUS) + RFC 5607: Remote Authentication Dial-In User Service (RADIUS) + Authorization for Network Access Server (NAS) + Management"; + } + + identity local-users { + base authentication-method; + description + "Indicates password-based authentication of locally + configured users."; + } + + identity radius-authentication-type { + description + "Base identity for RADIUS authentication types."; + } + + identity radius-pap { + base radius-authentication-type; + description + "The device requests Password Authentication Protocol (PAP) + authentication from the RADIUS server."; + reference + "RFC 2865: Remote Authentication Dial In User Service (RADIUS)"; + } + + + + + + + + + identity radius-chap { + base radius-authentication-type; + description + "The device requests Challenge Handshake Authentication + Protocol (CHAP) authentication from the RADIUS server."; + reference + "RFC 2865: Remote Authentication Dial In User Service (RADIUS)"; + } + + /* + * Configuration data nodes + */ + + container system { + description + "System group configuration."; + + leaf contact { + type string; + description + "The administrator contact information for the system. + + A server implementation MAY map this leaf to the sysContact + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and sysContact. The definition of + such a mechanism is outside the scope of this document."; + reference + "RFC 3418: Management Information Base (MIB) for the + Simple Network Management Protocol (SNMP) + SNMPv2-MIB.sysContact"; + } + leaf hostname { + type inet:domain-name; + description + "The name of the host. This name can be a single domain + label or the fully qualified domain name of the host."; + } + leaf location { + type string; + description + "The system location. + + A server implementation MAY map this leaf to the sysLocation + MIB object. Such an implementation needs to use some + mechanism to handle the differences in size and characters + allowed between this leaf and sysLocation. The definition + of such a mechanism is outside the scope of this document."; + reference + "RFC 3418: Management Information Base (MIB) for the + Simple Network Management Protocol (SNMP) + SNMPv2-MIB.sysLocation"; + } + + container clock { + description + "Configuration of the system date and time properties."; + + choice timezone { + description + "The system time zone information."; + + case timezone-name { + if-feature timezone-name; + leaf timezone-name { + type timezone-name; + description + "The TZ database name to use for the system, such + as 'Europe/Stockholm'."; + } + } + case timezone-utc-offset { + leaf timezone-utc-offset { + type int16 { + range "-1500 .. 1500"; + } + units "minutes"; + description + "The number of minutes to add to UTC time to + identify the time zone for this system. For example, + 'UTC - 8:00 hours' would be represented as '-480'. + Note that automatic daylight saving time adjustment + is not provided if this object is used."; + } + } + } + } + + container ntp { + if-feature ntp; + presence + "Enables the NTP client unless the 'enabled' leaf + (which defaults to 'true') is set to 'false'"; + description + "Configuration of the NTP client."; + + leaf enabled { + type boolean; + default true; + description + "Indicates that the system should attempt to + synchronize the system clock with an NTP server + from the 'ntp/server' list."; + } + list server { + key name; + description + "List of NTP servers to use for system clock + synchronization. If '/system/ntp/enabled' + is 'true', then the system will attempt to + contact and utilize the specified NTP servers."; + + leaf name { + type string; + description + "An arbitrary name for the NTP server."; + } + choice transport { + mandatory true; + description + "The transport-protocol-specific parameters for this + server."; + + case udp { + container udp { + description + "Contains UDP-specific configuration parameters + for NTP."; + leaf address { + type inet:host; + mandatory true; + description + "The address of the NTP server."; + } + leaf port { + if-feature ntp-udp-port; + type inet:port-number; + default 123; + description + "The port number of the NTP server."; + } + } + } + } + leaf association-type { + type enumeration { + enum server { + description + "Use client association mode. This device + will not provide synchronization to the + configured NTP server."; + } + enum peer { + description + "Use symmetric active association mode. + This device may provide synchronization + to the configured NTP server."; + } + enum pool { + description + "Use client association mode with one or + more of the NTP servers found by DNS + resolution of the domain name given by + the 'address' leaf. This device will not + provide synchronization to the servers."; + } + } + default server; + description + "The desired association type for this NTP server."; + } + leaf iburst { + type boolean; + default false; + description + "Indicates whether this server should enable burst + synchronization or not."; + } + leaf prefer { + type boolean; + default false; + description + "Indicates whether this server should be preferred + or not."; + } + } + } + + container dns-resolver { + description + "Configuration of the DNS resolver."; + + leaf-list search { + type inet:domain-name; + ordered-by user; + description + "An ordered list of domains to search when resolving + a host name."; + } + list server { + key name; + ordered-by user; + description + "List of the DNS servers that the resolver should query. + + When the resolver is invoked by a calling application, it + sends the query to the first name server in this list. If + no response has been received within 'timeout' seconds, + the resolver continues with the next server in the list. + If no response is received from any server, the resolver + continues with the first server again. When the resolver + has traversed the list 'attempts' times without receiving + any response, it gives up and returns an error to the + calling application. + + Implementations MAY limit the number of entries in this + list."; + + leaf name { + type string; + description + "An arbitrary name for the DNS server."; + } + choice transport { + mandatory true; + description + "The transport-protocol-specific parameters for this + server."; + + case udp-and-tcp { + container udp-and-tcp { + description + "Contains UDP- and TCP-specific configuration + parameters for DNS."; + reference + "RFC 1035: Domain Names - Implementation and + Specification + RFC 5966: DNS Transport over TCP - Implementation + Requirements"; + + leaf address { + type inet:ip-address; + mandatory true; + description + "The address of the DNS server."; + } + leaf port { + if-feature dns-udp-tcp-port; + type inet:port-number; + default 53; + description + "The UDP and TCP port number of the DNS server."; + } + } + } + } + } + container options { + description + "Resolver options. The set of available options has been + limited to those that are generally available across + different resolver implementations and generally useful."; + leaf timeout { + type uint8 { + range "1..max"; + } + units "seconds"; + default "5"; + description + "The amount of time the resolver will wait for a + response from each remote name server before + retrying the query via a different name server."; + } + leaf attempts { + type uint8 { + range "1..max"; + } + default "2"; + description + "The number of times the resolver will send a query to + all of its name servers before giving up and returning + an error to the calling application."; + } + } + } + + + + container radius { + if-feature radius; + + description + "Configuration of the RADIUS client."; + + list server { + key name; + ordered-by user; + description + "List of RADIUS servers used by the device. + + When the RADIUS client is invoked by a calling + application, it sends the query to the first server in + this list. If no response has been received within + 'timeout' seconds, the client continues with the next + server in the list. If no response is received from any + server, the client continues with the first server again. + When the client has traversed the list 'attempts' times + without receiving any response, it gives up and returns an + error to the calling application."; + + leaf name { + type string; + description + "An arbitrary name for the RADIUS server."; + } + choice transport { + mandatory true; + description + "The transport-protocol-specific parameters for this + server."; + + case udp { + container udp { + description + "Contains UDP-specific configuration parameters + for RADIUS."; + leaf address { + type inet:host; + mandatory true; + description + "The address of the RADIUS server."; + } + + + + + leaf authentication-port { + type inet:port-number; + default "1812"; + description + "The port number of the RADIUS server."; + } + leaf shared-secret { + type string; + mandatory true; + nacm:default-deny-all; + description + "The shared secret, which is known to both the + RADIUS client and server."; + reference + "RFC 2865: Remote Authentication Dial In User + Service (RADIUS)"; + } + } + } + } + leaf authentication-type { + type identityref { + base radius-authentication-type; + } + default radius-pap; + description + "The authentication type requested from the RADIUS + server."; + } + } + container options { + description + "RADIUS client options."; + + leaf timeout { + type uint8 { + range "1..max"; + } + units "seconds"; + default "5"; + description + "The number of seconds the device will wait for a + response from each RADIUS server before trying with a + different server."; + } + + + + leaf attempts { + type uint8 { + range "1..max"; + } + default "2"; + description + "The number of times the device will send a query to + all of its RADIUS servers before giving up."; + } + } + } + + container authentication { + nacm:default-deny-write; + if-feature authentication; + + description + "The authentication configuration subtree."; + + leaf-list user-authentication-order { + type identityref { + base authentication-method; + } + must '(. != "sys:radius" or ../../radius/server)' { + error-message + "When 'radius' is used, a RADIUS server" + + " must be configured."; + description + "When 'radius' is used as an authentication method, + a RADIUS server must be configured."; + } + ordered-by user; + + description + "When the device authenticates a user with a password, + it tries the authentication methods in this leaf-list in + order. If authentication with one method fails, the next + method is used. If no method succeeds, the user is + denied access. + + An empty user-authentication-order leaf-list still allows + authentication of users using mechanisms that do not + involve a password. + + If the 'radius-authentication' feature is advertised by + the NETCONF server, the 'radius' identity can be added to + this list. + + If the 'local-users' feature is advertised by the + NETCONF server, the 'local-users' identity can be + added to this list."; + } + + list user { + if-feature local-users; + key name; + description + "The list of local users configured on this device."; + + leaf name { + type string; + description + "The user name string identifying this entry."; + } + leaf password { + type ianach:crypt-hash; + description + "The password for this entry."; + } + list authorized-key { + key name; + description + "A list of public SSH keys for this user. These keys + are allowed for SSH authentication, as described in + RFC 4253."; + reference + "RFC 4253: The Secure Shell (SSH) Transport Layer + Protocol"; + + leaf name { + type string; + description + "An arbitrary name for the SSH key."; + } + + + + + + + + + + + + + leaf algorithm { + type string; + mandatory true; + description + "The public key algorithm name for this SSH key. + + Valid values are the values in the IANA 'Secure Shell + (SSH) Protocol Parameters' registry, Public Key + Algorithm Names."; + reference + "IANA 'Secure Shell (SSH) Protocol Parameters' + registry, Public Key Algorithm Names"; + } + leaf key-data { + type binary; + mandatory true; + description + "The binary public key data for this SSH key, as + specified by RFC 4253, Section 6.6, i.e.: + + string certificate or public key format + identifier + byte[n] key/certificate data."; + reference + "RFC 4253: The Secure Shell (SSH) Transport Layer + Protocol"; + } + } + } + } + } + + /* + * Operational state data nodes + */ + + container system-state { + config false; + description + "System group operational state."; + + container platform { + description + "Contains vendor-specific information for + identifying the system platform and operating system."; + reference + "IEEE Std 1003.1-2008 - sys/utsname.h"; + + leaf os-name { + type string; + description + "The name of the operating system in use - + for example, 'Linux'."; + reference + "IEEE Std 1003.1-2008 - utsname.sysname"; + } + leaf os-release { + type string; + description + "The current release level of the operating + system in use. This string MAY indicate + the OS source code revision."; + reference + "IEEE Std 1003.1-2008 - utsname.release"; + } + leaf os-version { + type string; + description + "The current version level of the operating + system in use. This string MAY indicate + the specific OS build date and target variant + information."; + reference + "IEEE Std 1003.1-2008 - utsname.version"; + } + leaf machine { + type string; + description + "A vendor-specific identifier string representing + the hardware in use."; + reference + "IEEE Std 1003.1-2008 - utsname.machine"; + } + } + + container clock { + description + "Monitoring of the system date and time properties."; + + leaf current-datetime { + type yang:date-and-time; + description + "The current system date and time."; + } + + + leaf boot-datetime { + type yang:date-and-time; + description + "The system date and time when the system last restarted."; + } + } + } + + rpc set-current-datetime { + nacm:default-deny-all; + description + "Set the /system-state/clock/current-datetime leaf + to the specified value. + + If the system is using NTP (i.e., /system/ntp/enabled + is set to 'true'), then this operation will fail with + error-tag 'operation-failed' and error-app-tag value of + 'ntp-active'."; + input { + leaf current-datetime { + type yang:date-and-time; + mandatory true; + description + "The current system date and time."; + } + } + } + + rpc system-restart { + nacm:default-deny-all; + description + "Request that the entire system be restarted immediately. + A server SHOULD send an rpc reply to the client before + restarting the system."; + } + + rpc system-shutdown { + nacm:default-deny-all; + description + "Request that the entire system be shut down immediately. + A server SHOULD send an rpc reply to the client before + shutting down the system."; + } + +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-yang-library@2016-04-09.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-yang-library@2016-04-09.yang new file mode 100644 index 000000000..31fc9ee6d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-yang-library@2016-04-09.yang @@ -0,0 +1,263 @@ +module ietf-yang-library { + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-library"; + prefix "yanglib"; + + import ietf-yang-types { + prefix yang; + } + import ietf-inet-types { + prefix inet; + } + + organization + "IETF NETCONF (Network Configuration) Working Group"; + + contact + "WG Web: <http://tools.ietf.org/wg/netconf/> + WG List: <mailto:netconf@ietf.org> + + WG Chair: Mehmet Ersue + <mailto:mehmet.ersue@nsn.com> + + WG Chair: Mahesh Jethanandani + <mailto:mjethanandani@gmail.com> + + Editor: Andy Bierman + <mailto:andy@yumaworks.com> + + Editor: Martin Bjorklund + <mailto:mbj@tail-f.com> + + Editor: Kent Watsen + <mailto:kwatsen@juniper.net>"; + + description + "This module contains monitoring information about the YANG + modules and submodules that are used within a YANG-based + server. + + Copyright (c) 2016 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC XXXX; see + the RFC itself for full legal notices."; + + // RFC Ed.: replace XXXX with actual RFC number and remove this + // note. + + // RFC Ed.: remove this note + // Note: extracted from draft-ietf-netconf-yang-library-06.txt + + // RFC Ed.: update the date below with the date of RFC publication + // and remove this note. + revision 2016-04-09 { + description + "Initial revision."; + reference + "RFC XXXX: YANG Module Library."; + } + + /* + * Typedefs + */ + + // FIXME inline this union after https://bugs.opendaylight.org/show_bug.cgi?id=5826 is fixed + typedef optional-revision { + type union { + type revision-identifier; + type string { length 0; } + } + description + "The YANG module or submodule revision date. + A zero-length string is used if no revision statement + is present in the YANG module or submodule."; + } + + typedef revision-identifier { + type string { + pattern '\d{4}-\d{2}-\d{2}'; + } + description + "Represents a specific date in YYYY-MM-DD format."; + } + + /* + * Groupings + */ + + grouping module-list { + description + "The module data structure is represented as a grouping + so it can be reused in configuration or another monitoring + data structure."; + + grouping common-leafs { + description + "Common parameters for YANG modules and submodules."; + + leaf name { + type yang:yang-identifier; + description + "The YANG module or submodule name."; + } + leaf revision { + type optional-revision; + } + } + + grouping schema-leaf { + description + "Common schema leaf parameter for modules and submodules."; + + leaf schema { + type inet:uri; + description + "Contains a URL that represents the YANG schema + resource for this module or submodule. + + This leaf will only be present if there is a URL + available for retrieval of the schema for this entry."; + } + } + + list module { + key "name revision"; + description + "Each entry represents one revision of one module + currently supported by the server."; + + uses common-leafs; + uses schema-leaf; + + leaf namespace { + type inet:uri; + mandatory true; + description + "The XML namespace identifier for this module."; + } + leaf-list feature { + type yang:yang-identifier; + description + "List of YANG feature names from this module that are + supported by the server, regardless whether they are + defined in the module or any included submodule."; + } + list deviation { + key "name revision"; + description + "List of YANG deviation module names and revisions + used by this server to modify the conformance of + the module associated with this entry. Note that + the same module can be used for deviations for + multiple modules, so the same entry MAY appear + within multiple 'module' entries. + + The deviation module MUST be present in the 'module' + list, with the same name and revision values. + The 'conformance-type' value will be 'implement' for + the deviation module."; + uses common-leafs; + } + leaf conformance-type { + type enumeration { + enum implement { + description + "Indicates that the server implements one or more + protocol-accessible objects defined in the YANG module + identified in this entry. This includes deviation + statements defined in the module. + + For YANG version 1.1 modules, there is at most one + module entry with conformance type 'implement' for a + particular module name, since YANG 1.1 requires that + at most one revision of a module is implemented. + + For YANG version 1 modules, there SHOULD NOT be more + than one module entry for a particular module name."; + } + enum import { + description + "Indicates that the server imports reusable definitions + from the specified revision of the module, but does + not implement any protocol accessible objects from + this revision. + + Multiple module entries for the same module name MAY + exist. This can occur if multiple modules import the + same module, but specify different revision-dates in + the import statements."; + } + } + mandatory true; + description + "Indicates the type of conformance the server is claiming + for the YANG module identified by this entry."; + } + container submodules { + description + "Contains information about all the submodules used + by the parent module entry"; + + list submodule { + key "name revision"; + description + "Each entry represents one submodule within the + parent module."; + uses common-leafs; + uses schema-leaf; + } + } + } + } + + /* + * Operational state data nodes + */ + + container modules-state { + config false; + description + "Contains YANG module monitoring information."; + + leaf module-set-id { + type string; + mandatory true; + description + "Contains a server-specific identifier representing + the current set of modules and submodules. The + server MUST change the value of this leaf if the + information represented by the 'module' list instances + has changed."; + } + + uses module-list; + } + + /* + * Notifications + */ + + notification yang-library-change { + description + "Generated when the set of modules and submodules supported + by the server has changed."; + leaf module-set-id { + type leafref { + path "/yanglib:modules-state/yanglib:module-set-id"; + } + mandatory true; + description + "Contains the module-set-id value representing the + set of modules and submodules supported at the server at + the time the notification is generated."; + } + } + +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-yang-types@2013-07-15.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-yang-types@2013-07-15.yang new file mode 100644 index 000000000..bdff18cc4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/ietf-yang-types@2013-07-15.yang @@ -0,0 +1,467 @@ +module ietf-yang-types { + + namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types"; + prefix "yang"; + + organization + "IETF NETMOD (NETCONF Data Modeling Language) Working Group"; + + contact + "WG Web: <http://tools.ietf.org/wg/netmod/> + WG List: <mailto:netmod@ietf.org> + WG Chair: David Kessens + <mailto:david.kessens@nsn.com> + + WG Chair: Juergen Schoenwaelder + <mailto:j.schoenwaelder@jacobs-university.de> + + Editor: Juergen Schoenwaelder + <mailto:j.schoenwaelder@jacobs-university.de>"; + + description + "This module contains a collection of generally useful derived + YANG data types. + + Copyright (c) 2013 IETF Trust and the persons identified as + authors of the code. All rights reserved. + + Redistribution and use in source and binary forms, with or + without modification, is permitted pursuant to, and subject + to the license terms contained in, the Simplified BSD License + set forth in Section 4.c of the IETF Trust's Legal Provisions + Relating to IETF Documents + (http://trustee.ietf.org/license-info). + + This version of this YANG module is part of RFC 6991; see + the RFC itself for full legal notices."; + + revision 2013-07-15 { + description + "This revision adds the following new data types: + - yang-identifier + - hex-string + - uuid + - dotted-quad"; + reference + "RFC 6991: Common YANG Data Types"; + } + + revision 2010-09-24 { + description + "Initial revision."; + reference + "RFC 6021: Common YANG Data Types"; + } + + /*** collection of counter and gauge types ***/ + + typedef counter32 { + type uint32; + description + "The counter32 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter32 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter32 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter32. + + In the value set and its semantics, this type is equivalent + to the Counter32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter32 { + type yang:counter32; + default "0"; + description + "The zero-based-counter32 type represents a counter32 + that has the defined 'initial' value zero. + + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^32-1 (4294967295 decimal), when it + wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter32 textual convention of the SMIv2."; + reference + "RFC 4502: Remote Network Monitoring Management Information + Base Version 2"; + } + + typedef counter64 { + type uint64; + description + "The counter64 type represents a non-negative integer + that monotonically increases until it reaches a + maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Counters have no defined 'initial' value, and thus, a + single value of a counter has (in general) no information + content. Discontinuities in the monotonically increasing + value normally occur at re-initialization of the + management system, and at other times as specified in the + description of a schema node using this type. If such + other times can occur, for example, the creation of + a schema node of type counter64 at times other than + re-initialization, then a corresponding schema node + should be defined, with an appropriate type, to indicate + the last discontinuity. + + The counter64 type should not be used for configuration + schema nodes. A default statement SHOULD NOT be used in + combination with the type counter64. + + In the value set and its semantics, this type is equivalent + to the Counter64 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef zero-based-counter64 { + type yang:counter64; + default "0"; + description + "The zero-based-counter64 type represents a counter64 that + has the defined 'initial' value zero. + A schema node of this type will be set to zero (0) on creation + and will thereafter increase monotonically until it reaches + a maximum value of 2^64-1 (18446744073709551615 decimal), + when it wraps around and starts increasing again from zero. + + Provided that an application discovers a new schema node + of this type within the minimum time to wrap, it can use the + 'initial' value as a delta. It is important for a management + station to be aware of this minimum time and the actual time + between polls, and to discard data if the actual time is too + long or there is no defined minimum time. + + In the value set and its semantics, this type is equivalent + to the ZeroBasedCounter64 textual convention of the SMIv2."; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + typedef gauge32 { + type uint32; + description + "The gauge32 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^32-1 (4294967295 decimal), and + the minimum value cannot be smaller than 0. The value of + a gauge32 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge32 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the Gauge32 type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef gauge64 { + type uint64; + description + "The gauge64 type represents a non-negative integer, which + may increase or decrease, but shall never exceed a maximum + value, nor fall below a minimum value. The maximum value + cannot be greater than 2^64-1 (18446744073709551615), and + the minimum value cannot be smaller than 0. The value of + a gauge64 has its maximum value whenever the information + being modeled is greater than or equal to its maximum + value, and has its minimum value whenever the information + being modeled is smaller than or equal to its minimum value. + If the information being modeled subsequently decreases + below (increases above) the maximum (minimum) value, the + gauge64 also decreases (increases). + + In the value set and its semantics, this type is equivalent + to the CounterBasedGauge64 SMIv2 textual convention defined + in RFC 2856"; + reference + "RFC 2856: Textual Conventions for Additional High Capacity + Data Types"; + } + + /*** collection of identifier-related types ***/ + + typedef object-identifier { + type string { + pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))' + + '(\.(0|([1-9]\d*)))*'; + } + description + "The object-identifier type represents administratively + assigned names in a registration-hierarchical-name tree. + + Values of this type are denoted as a sequence of numerical + non-negative sub-identifier values. Each sub-identifier + value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers + are separated by single dots and without any intermediate + whitespace. + + The ASN.1 standard restricts the value space of the first + sub-identifier to 0, 1, or 2. Furthermore, the value space + of the second sub-identifier is restricted to the range + 0 to 39 if the first sub-identifier is 0 or 1. Finally, + the ASN.1 standard requires that an object identifier + has always at least two sub-identifiers. The pattern + captures these restrictions. + + Although the number of sub-identifiers is not limited, + module designers should realize that there may be + implementations that stick with the SMIv2 limit of 128 + sub-identifiers. + This type is a superset of the SMIv2 OBJECT IDENTIFIER type + since it is not restricted to 128 sub-identifiers. Hence, + this type SHOULD NOT be used to represent the SMIv2 OBJECT + IDENTIFIER type; the object-identifier-128 type SHOULD be + used instead."; + reference + "ISO9834-1: Information technology -- Open Systems + Interconnection -- Procedures for the operation of OSI + Registration Authorities: General procedures and top + arcs of the ASN.1 Object Identifier tree"; + } + + typedef object-identifier-128 { + type object-identifier { + pattern '\d*(\.\d*){1,127}'; + } + description + "This type represents object-identifiers restricted to 128 + sub-identifiers. + + In the value set and its semantics, this type is equivalent + to the OBJECT IDENTIFIER type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef yang-identifier { + type string { + length "1..max"; + pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*'; + pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*'; + } + description + "A YANG identifier string as defined by the 'identifier' + rule in Section 12 of RFC 6020. An identifier must + start with an alphabetic character or an underscore + followed by an arbitrary sequence of alphabetic or + numeric characters, underscores, hyphens, or dots. + + A YANG identifier MUST NOT start with any possible + combination of the lowercase or uppercase character + sequence 'xml'."; + reference + "RFC 6020: YANG - A Data Modeling Language for the Network + Configuration Protocol (NETCONF)"; + } + /*** collection of types related to date and time***/ + + typedef date-and-time { + type string { + pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?' + + '(Z|[\+\-]\d{2}:\d{2})'; + } + description + "The date-and-time type is a profile of the ISO 8601 + standard for representation of dates and times using the + Gregorian calendar. The profile is defined by the + date-time production in Section 5.6 of RFC 3339. + + The date-and-time type is compatible with the dateTime XML + schema type with the following notable exceptions: + + (a) The date-and-time type does not allow negative years. + + (b) The date-and-time time-offset -00:00 indicates an unknown + time zone (see RFC 3339) while -00:00 and +00:00 and Z + all represent the same time zone in dateTime. + + (c) The canonical format (see below) of data-and-time values + differs from the canonical format used by the dateTime XML + schema type, which requires all times to be in UTC using + the time-offset 'Z'. + + This type is not equivalent to the DateAndTime textual + convention of the SMIv2 since RFC 3339 uses a different + separator between full-date and full-time and provides + higher resolution of time-secfrac. + + The canonical format for date-and-time values with a known time + zone uses a numeric time zone offset that is calculated using + the device's configured known offset to UTC time. A change of + the device's offset to UTC time will cause date-and-time values + to change accordingly. Such changes might happen periodically + in case a server follows automatically daylight saving time + (DST) time zone offset changes. The canonical format for + date-and-time values with an unknown time zone (usually + referring to the notion of local time) uses the time-offset + -00:00."; + reference + "RFC 3339: Date and Time on the Internet: Timestamps + RFC 2579: Textual Conventions for SMIv2 + XSD-TYPES: XML Schema Part 2: Datatypes Second Edition"; + } + typedef timeticks { + type uint32; + description + "The timeticks type represents a non-negative integer that + represents the time, modulo 2^32 (4294967296 decimal), in + hundredths of a second between two epochs. When a schema + node is defined that uses this type, the description of + the schema node identifies both of the reference epochs. + + In the value set and its semantics, this type is equivalent + to the TimeTicks type of the SMIv2."; + reference + "RFC 2578: Structure of Management Information Version 2 + (SMIv2)"; + } + + typedef timestamp { + type yang:timeticks; + description + "The timestamp type represents the value of an associated + timeticks schema node at which a specific occurrence + happened. The specific occurrence must be defined in the + description of any schema node defined using this type. When + the specific occurrence occurred prior to the last time the + associated timeticks attribute was zero, then the timestamp + value is zero. Note that this requires all timestamp values + to be reset to zero when the value of the associated timeticks + attribute reaches 497+ days and wraps around to zero. + + The associated timeticks schema node must be specified + in the description of any schema node using this type. + + In the value set and its semantics, this type is equivalent + to the TimeStamp textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of generic address types ***/ + + typedef phys-address { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "Represents media- or physical-level addresses represented + as a sequence octets, each octet represented by two hexadecimal + numbers. Octets are separated by colons. The canonical + representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the PhysAddress textual convention of the SMIv2."; + reference + "RFC 2579: Textual Conventions for SMIv2"; + } + + typedef mac-address { + type string { + pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'; + } + description + "The mac-address type represents an IEEE 802 MAC address. + The canonical representation uses lowercase characters. + + In the value set and its semantics, this type is equivalent + to the MacAddress textual convention of the SMIv2."; + reference + "IEEE 802: IEEE Standard for Local and Metropolitan Area + Networks: Overview and Architecture + RFC 2579: Textual Conventions for SMIv2"; + } + + /*** collection of XML-specific types ***/ + + typedef xpath1.0 { + type string; + description + "This type represents an XPATH 1.0 expression. + + When a schema node is defined that uses this type, the + description of the schema node MUST specify the XPath + context in which the XPath expression is evaluated."; + reference + "XPATH: XML Path Language (XPath) Version 1.0"; + } + + /*** collection of string types ***/ + + typedef hex-string { + type string { + pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'; + } + description + "A hexadecimal string with octets represented as hex digits + separated by colons. The canonical representation uses + lowercase characters."; + } + + typedef uuid { + type string { + pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}'; + } + description + "A Universally Unique IDentifier in the string representation + defined in RFC 4122. The canonical representation uses + lowercase characters. + + The following is an example of a UUID in string representation: + f81d4fae-7dec-11d0-a765-00a0c91e6bf6 + "; + reference + "RFC 4122: A Universally Unique IDentifier (UUID) URN + Namespace"; + } + + typedef dotted-quad { + type string { + pattern + '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}' + + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; + } + description + "An unsigned 32-bit number expressed in the dotted-quad + notation, i.e., four octets written as decimal numbers + and separated with the '.' (full stop) character."; + } + }
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2017-03-24.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2017-03-24.yang new file mode 100644 index 000000000..e6b6bb382 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2017-03-24.yang @@ -0,0 +1,2262 @@ +module microwave-model { + namespace "urn:onf:params:xml:ns:yang:microwave-model"; + prefix microwave-model; + + import core-model { + prefix core-model; + } + import g.874.1-model { + prefix g; + } + import ietf-yang-types { + prefix yang; + } + + organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project"; + contact "WG Web: <https://www.opennetworking.org/technical-communities/areas/specification/1931-optical-transport> + WG List: <mailto:wireless-transport@login.opennetworking.org> + WG Chair: Lyndon Ong + <mailto:lyong@ciena.com> + WG Chair: Giorgio Cazzaniga + <mailto:giorgio.cazzaniga@sm-optics.com> + Editors: Thorsten Heinze + <mailto:thorsten.heinze@telefonica.com> + Martin Skorupski + <mailto:martin.skorupski@highstreet-technologies.com>"; + description "This module contains a collection of YANG definitions for managing wireless networks."; + revision 2017-03-24 { + description "Initial version"; + reference "ONF TR 532: A YANG Data Model for Wireless Networks."; + } + /*********************** + * package type-definitions + **********************/ + typedef loop-back-type { + type enumeration { + enum none { + description "none"; + } + enum if { + description "Intermediate Frequency on the interface between indoor and outdoor unit."; + } + enum rf { + description "Radio Frequency on the interface between outdoor unit and outdoor unit at the remote site."; + } + } + description "none"; + } + typedef severity-type { + type enumeration { + enum non-alarmed { + description "none"; + } + enum warning { + description "none"; + } + enum minor { + description "none"; + } + enum major { + description "none"; + } + enum critical { + description "none"; + } + } + description "According to ITU-T M.3160"; + } + grouping channel-plan-type-g { + leaf supported-channel-plan { + type string; + default "Channel plan name not defined."; + config false; + description "Unique name (e.g. ECC/REC/(01)04_Annex 5) of a document, which describes a frequency grid that can be adjusted at the air interface. Corresponding channel plans to be delivered by the hardware vendor and to be stored by the operator in an controller/application attached database."; + } + leaf duplex-distance-is-variable { + type boolean; + default false; + config false; + description "To be set on 'true', if the distance between transmitted and received frequency is variable."; + } + leaf duplex-distance { + type int32; + units "kHz"; + default -1; + config false; + description "Distance between transmitted and received frequency."; + } + leaf auto-freq-select-is-avail { + type boolean; + default false; + config false; + description "In case the microwave radio is capable of automatically selecting the transmit frequency in unlicensed bands, this field shall contain a 'true'."; + } + list transmission-mode-list { + key 'transmission-mode-id'; + config false; + min-elements 1; + uses transmission-mode-type-g; + description "none"; + } + description "none"; + } + grouping transmission-mode-type-g { + leaf transmission-mode-id { + type core-model:universal-id; + config false; + description "Indentifies the transmissionMode for internal reference."; + } + leaf channel-bandwidth { + type int32; + units "kHz"; + default -1; + config false; + description "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;"; + } + leaf modulation-scheme { + type int16; + units "symbols"; + default -1; + config false; + description "Modulation scheme, which is base to the other characteristics described in the same transmissionModeType data type. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256')."; + } + leaf code-rate { + type int8; + units "%"; + default -1; + config false; + description "Code rate of the coding scheme in % (Net bit rate ? Gross bit rate ? code rate)."; + } + leaf tx-power-min { + type int8; + units "dBm"; + default 99; + config false; + description "Value of the minimum transmit power the modem can operate in dBm."; + } + leaf tx-power-max { + type int8; + units "dBm"; + default 99; + config false; + description "Value of the maximum transmit power the modem can operate in dBm."; + } + leaf rx-threshold { + type int16; + units "dBm"; + default 99; + config false; + description "Value of the receive level required to decode the received signal with a Bit Error Rate of 1e-6 or less."; + } + leaf am-upshift-level { + type int8; + units "dBm"; + default 99; + config false; + description "Value of the receive level that has to be exceeded to shift into a higher modulation scheme."; + } + leaf am-downshift-level { + type int8; + units "dBm"; + default 99; + config false; + description "Value of the receive level that has to be exceeded for not shifting into a lower modulation scheme."; + } + leaf xpic-is-avail { + type boolean; + default false; + config false; + description "In case this air interface type is capable of XPIC, this field shall contain a 'true'. This information shall purely relate to capabilities of the equipment type, but not to the operational capability of a specific hardware composition on site. Means for example that this attribute might contain a 'true' statement, even if an additional cable would have been required to actually operate XPIC in a specific case."; + } + description "none"; + } + typedef polarization-type { + type enumeration { + enum not-specified { + description "none"; + } + enum horizontal { + description "none"; + } + enum vertical { + description "none"; + } + } + description "none"; + } + grouping air-interface-problem-severity-type-g { + leaf problem-kind-name { + type string; + default "Problem kind name not defined."; + description "Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms"; + } + leaf problem-kind-severity { + type severity-type; + default warning; + description "Severity of this type of alarm."; + } + description "none"; + } + grouping air-interface-current-problem-type-g { + leaf problem-name { + type string; + default "Problem name not specified."; + config false; + description "Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms"; + } + uses mw-current-problem-g; + description "none"; + } + grouping air-interface-performance-type-g { + leaf es { + type int32; + units "s"; + default -1; + config false; + description "Number of errored seconds."; + } + leaf ses { + type int32; + units "s"; + default -1; + config false; + description "Number of severely errored seconds."; + } + leaf cses { + type int32; + units "s"; + default -1; + config false; + description "Number of consecutive severely errored seconds."; + } + leaf unavailability { + type int32; + units "s"; + default -1; + config false; + description "Total time of unavailability in seconds."; + } + leaf tx-level-min { + type int8; + units "dBm"; + default 99; + config false; + description "Minimum transmit power. Signed integers are required."; + } + leaf tx-level-max { + type int8; + units "dBm"; + default 99; + config false; + description "Maximum transmit power. Signed integers are required."; + } + leaf tx-level-avg { + type int8; + units "dBm"; + default 99; + config false; + description "Averaged transmit power. Signed integers are required."; + } + leaf rx-level-min { + type int8; + units "dBm"; + default 99; + config false; + description "Minimum receive level. Signed integers are required."; + } + leaf rx-level-max { + type int8; + units "dBm"; + default 99; + config false; + description "Maximum receive level. Signed integers are required."; + } + leaf rx-level-avg { + type int8; + units "dBm"; + default 99; + config false; + description "Averaged receive level. Signed integers are required."; + } + leaf time2-states { + type int32; + units "s"; + default -1; + config false; + description "Sum of all seconds the transmitter operated in e.g. BPSK."; + } + leaf time4-states-s { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time4-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time8-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time16-states-s { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time16-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time32-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time64-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time128-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time256-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time512-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time512-states-l { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time1024-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time1024-states-l { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time2048-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time2048-states-l { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time4096-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time4096-states-l { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time8192-states { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf time8192-states-l { + type int32; + units "s"; + default -1; + config false; + description "none"; + } + leaf snir-min { + type int8; + units "dB"; + default -99; + config false; + description "Minimum signal to (noise+interference) ratio."; + } + leaf snir-max { + type int8; + units "dB"; + default -99; + config false; + description "Maximum signal to (noise+interference) ratio."; + } + leaf snir-avg { + type int8; + units "dB"; + default -99; + config false; + description "Averaged signal to (noise+interference) ratio."; + } + leaf xpd-min { + type int8; + units "dB"; + default -99; + config false; + description "Minimum cross polarization discrimination."; + } + leaf xpd-max { + type int8; + units "dB"; + default -99; + config false; + description "Maximum cross polarization discrimination."; + } + leaf xpd-avg { + type int8; + units "dB"; + default -99; + config false; + description "Averaged cross polarization discrimination."; + } + leaf rf-temp-min { + type int8; + units "C"; + default -99; + config false; + description "Lowest temperature (in degree Celsius) of the radio module inside the outdoor unit."; + } + leaf rf-temp-max { + type int8; + units "C"; + default -99; + config false; + description "Highest temperature (in degree Celsius) of the radio module inside the outdoor unit."; + } + leaf rf-temp-avg { + type int8; + units "C"; + default -99; + config false; + description "Averaged temperature (in degree Celsius) of the radio module inside the outdoor unit."; + } + leaf defect-blocks-sum { + type int16; + units "blocks"; + default -1; + config false; + description "Total number of blocks that were defect after receiving and could not be corrected by the FEC."; + } + leaf time-period { + type int32; + units "s"; + default -1; + config false; + description "Total length of the measurement period."; + } + description "Consolidated performance information of the air interface."; + } + grouping air-interface-current-performance-type-g { + container performance-data { + config false; + uses air-interface-performance-type-g; + description "none"; + } + uses g:otn-current-data-g; + description "Turns performance information into current performance information by inheriting from OTN_CurrentData."; + } + grouping air-interface-historical-performance-type-g { + container performance-data { + config false; + uses air-interface-performance-type-g; + description "none"; + } + uses g:otn-history-data-g; + description "Turns performance information into historical performance information by inheriting from OTN_HistoryData."; + } + typedef protection-type { + type enumeration { + enum hsb { + description "none"; + } + } + description "none"; + } + typedef role-type { + type enumeration { + enum working { + description "none"; + } + enum protection { + description "none"; + } + enum protected { + description "none"; + } + } + description "none"; + } + grouping diversity-type-g { + leaf diversity-name { + type string; + default "Diversity name not defined."; + config false; + description "Names to be chosen from the following list: 'spaceDiversity', 'frequencyDiversity'"; + } + leaf number-of-air-interfaces-max { + type int8; + units "air interfaces"; + default 1; + config false; + description "Maximum number of air interfaces that could be part of this kind of diversity."; + } + description "none"; + } + typedef air-interface-diversity-status-type { + type enumeration { + enum group-down { + description "All air interfaces that are members of the diversity configuration are down."; + } + enum not-all-ai-active { + description "At least one, but not all of the air interfaces that are part of the diversity configuration is not working."; + } + enum all-ai-active { + description "All air interfaces that are part of the diversity configuration are working."; + } + } + description "none"; + } + grouping air-interface-diversity-problem-severity-type-g { + leaf problem-kind-name { + type string; + default "Problem kind name not defined."; + description "Name of the alarm according to AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms"; + } + leaf problem-kind-severity { + type severity-type; + default warning; + description "Severity of this type of alarm."; + } + description "none"; + } + grouping air-interface-diversity-current-problem-type-g { + leaf problem-name { + type string; + default "Problem name not specified."; + config false; + description "Name of the alarm according to AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms"; + } + uses mw-current-problem-g; + description "none"; + } + grouping air-interface-diversity-performance-type-g { + leaf snir-min { + type int8; + units "dB"; + default -99; + config false; + description "Minimum signal to (noise+interference) ratio of the combined signals."; + } + leaf snir-max { + type int8; + units "dB"; + default -99; + config false; + description "Maximum signal to (noise+interference) ratio of the combined signals."; + } + leaf snir-avg { + type int8; + units "dB"; + default -99; + config false; + description "Average signal to (noise+interference) ratio of the combined signals."; + } + description "Consolidated performance information of the air interface diversity group."; + } + grouping air-interface-diversity-current-performance-type-g { + container performance-data { + config false; + uses air-interface-diversity-performance-type-g; + description "none"; + } + uses g:otn-current-data-g; + description "Turns performance information into current performance information by inheriting from OTN_CurrentData."; + } + grouping air-interface-diversity-historical-performance-type-g { + container performance-data { + config false; + uses air-interface-diversity-performance-type-g; + description "none"; + } + uses g:otn-history-data-g; + description "Turns performance information into historical performance information by inheriting from OTN_HistoryData."; + } + grouping tdm-structure-type-g { + leaf tdm-structure-name { + type string; + default "TDM structure name not defined."; + config false; + description "Names to be chosen from the following list: 'e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'"; + } + leaf tdm-segment-size { + type int32; + units "kbit/s"; + default -1; + config false; + description "Size of the TDM segment in kbit/s. Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;"; + } + leaf max-number-of-segments-reservable { + type int8; + units "segments"; + default -1; + config false; + description "Device specific maximum number of segments (not depending on current air interface configuration) that can be reserved for this type of segment on a single air interface."; + } + description "none"; + } + grouping structure-problem-severity-type-g { + leaf problem-kind-name { + type string; + default "Problem kind name not defined."; + description "Name of the alarm according to Structure::StructureCapability::supportedAlarms"; + } + leaf problem-kind-severity { + type severity-type; + default warning; + description "Severity of this type of alarm."; + } + description "none"; + } + grouping structure-current-problem-type-g { + leaf problem-name { + type string; + default "Problem name not specified."; + config false; + description "Name of the alarm according to Structure::StructureCapability::supportedAlarms"; + } + uses mw-current-problem-g; + description "none"; + } + typedef structure-performance-type { + type int32; + description "Consolidated performance information of the Structure."; + } + grouping structure-current-performance-type-g { + leaf performance-data { + type structure-performance-type; + config false; + description "none"; + } + uses g:otn-current-data-g; + description "Turns performance information into current performance information by inheriting from OTN_CurrentData."; + } + grouping structure-historical-performance-type-g { + leaf performance-data { + type structure-performance-type; + config false; + description "none"; + } + uses g:otn-history-data-g; + description "Turns performance information into historical performance information by inheriting from OTN_HistoryData."; + } + grouping container-type-g { + leaf container-name { + type string; + default "Container name not yet defined."; + config false; + description "Names to be chosen from the following list: 'ethernet','e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'"; + } + leaf number-of-time-slots-required { + type int16; + units "timeslots"; + default -1; + config false; + description "Number of time slots required for transporting this type of container. Value must be calculated by the vendor after defining the timeSlotCapacity. For containers of fixed size: numberOfTimeSlotsRequired = required bandwidth of the container divided by timeSlotCapacity. For containers of variable size the minimum (most probably 1) is to be stated."; + } + leaf tdm-time-slots-is-required { + type boolean; + default false; + config false; + description "Shall be set to '1', if this container type requires bandwidth (times slots) reserved for TDM transport."; + } + leaf bundling-is-avail { + type boolean; + default false; + config false; + description "If it is possible to combine transport resources of several radio links to transport this container type, this attribute shall be set to '1'."; + } + description "none"; + } + grouping tdm-container-type-g { + leaf tdm-container-name { + type string; + default "TDM container name not defined."; + config false; + description "Names to be chosen from the following list: 'e1','t1','j1','e3','t3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'"; + } + leaf tdm-container-size { + type int32; + units "kbit/s"; + default -1; + config false; + description "Capacity required for transporting this type of container (in kbit/s). Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;"; + } + description "none"; + } + grouping segment-id-type-g { + leaf structure-id-ref { + type core-model:universal-id; + description "none"; + } + leaf segment-id-ref { + type int16; + description "Combinations of structureId and segmentId must be unique inside the device to assure that every resource is used just once."; + } + description "Identifies the segments, which are used to transport the container."; + } + grouping segment-status-type-g { + leaf segment-status-type-id { + type int16; + config false; + description "none"; + } + leaf segment-is-reserved-for-tdm { + type boolean; + default false; + config false; + description "The number of segments, which is configured by Structure::StructureConfiguration::tdmReservedNumberOfSegements, has to be reserved for TDM. Starting from the lowest index value, these segments have to be marked with a 'true' in segmentIsReservedForTdm. + "; + } + leaf operational-status { + type core-model:operational-state; + default disabled; + config false; + description "Current operational status of each segment."; + } + leaf obsolete-priority-class { + type int8; + default -1; + config false; + description "PriorityClass as inherited from the associated Container::ContainerConfiguration::priorityClass. In case the device is capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, priorityClass shall be considered, while calculating the dropOrderRank."; + } + leaf obsolete-drop-order-rank { + type int16; + default -1; + config false; + description "In case the device is NOT capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, dropOrderRank is number of segments minus sequence number of the segment. In case the device is capable of adapting the sequence, dropOrderRank has to be calculated by the device in dependency to the assigned priorityClass. + _unique: within Structure::StructureStatus::segmentStatusList"; + } + description "none"; + } + grouping container-problem-severity-type-g { + leaf problem-kind-name { + type string; + default "Problem kind name not defined."; + description "Name of the alarm according to Container::ContainerCapability::supportedAlarms"; + } + leaf problem-kind-severity { + type severity-type; + default warning; + description "Severity of this type of alarm."; + } + description "none"; + } + grouping container-current-problem-type-g { + leaf problem-name { + type string; + default "Problem name not specified."; + config false; + description "Name of the alarm according to Container::ContainerCapability::supportedAlarms"; + } + uses mw-current-problem-g; + description "none"; + } + grouping container-performance-type-g { + leaf tx-ethernet-bytes-max-s { + type int32; + units "Bytes/s"; + default -1; + config false; + description "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a second and keeps the highest value within the measurement period. Field to be left blank for all types of TDM containers."; + } + leaf tx-ethernet-bytes-max-m { + type int64; + units "Bytes/min"; + default -1; + config false; + description "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a minute and keeps the highest value with in the measurement period. Field to be left blank for all types of TDM containers."; + } + leaf tx-ethernet-bytes-sum { + type int64; + units "Bytes"; + default -1; + config false; + description "Total number of Bytes of Ethernet traffic (before header compression) transmitted (in direction out of the device) during the measurement period. Field to be left blank for all types of TDM containers."; + } + leaf time-period { + type int32; + units "s"; + default -1; + config false; + description "Total length of the measurement period in seconds."; + } + description "Consolidated performance information of the Container."; + } + grouping container-current-performance-type-g { + container performance-data { + config false; + uses container-performance-type-g; + description "none"; + } + uses g:otn-current-data-g; + description "Turns performance information into current performance information by inheriting from OTN_CurrentData."; + } + grouping container-historical-performance-type-g { + container performance-data { + config false; + uses container-performance-type-g; + description "none"; + } + uses g:otn-history-data-g; + description "Turns performance information into historical performance information by inheriting from OTN_HistoryData."; + } + + /*********************** + * package object-classes + **********************/ + /*********************** + * package air-interface + **********************/ + list mw-air-interface-pac { + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"; + } + container air-interface-capability { + config false; + uses air-interface-capability-g; + description "none"; + } + container air-interface-configuration { + uses air-interface-configuration-g; + description "none"; + } + container air-interface-status { + config false; + uses air-interface-status-g; + description "none"; + } + container air-interface-current-problems { + config false; + uses air-interface-current-problems-g; + description "none"; + } + container air-interface-current-performance { + config false; + uses air-interface-current-performance-g; + description "none"; + } + container air-interface-historical-performances { + config false; + uses air-interface-historical-performances-g; + description "none"; + } + description "none"; + } + grouping air-interface-capability-g { + leaf type-of-equipment { + type string; + default "Type of equipment not yet defined."; + config false; + description "This parameter indicates the equipment type. Instead of uploading the complete set of capabilities, capabilities of the same equipment type could be reused. Should be unique for a combination of modem, radio and their respective firmware."; + } + leaf tx-frequency-min { + type int32; + units "kHz"; + default -1; + config false; + description "Value of the minimum transmit frequency tunable at the air interface."; + } + leaf tx-frequency-max { + type int32; + units "kHz"; + default -1; + config false; + description "Value of the maximum transmit frequency tunable at the air interface."; + } + leaf rx-frequency-min { + type int32; + units "kHz"; + default -1; + config false; + description "Value of the minimum receive frequency tunable at the air interface."; + } + leaf rx-frequency-max { + type int32; + units "kHz"; + default -1; + config false; + description "Value of the maximum receive frequency tunable at the air interface."; + } + leaf adaptive-modulation-is-avail { + type boolean; + default false; + config false; + description "In case the device is capable of adaptive modulation, this field shall contain a 'true'."; + } + leaf mimo-is-avail { + type boolean; + default false; + config false; + description "In case the device is capable of MIMO, this field shall contain a 'true'."; + } + leaf mimo-channels { + type int8; + units "channels"; + default 1; + config false; + description "Maximum number (n) of spatial multiplexing streams that can be conveyed by an n x n MIMO configuration."; + } + leaf alic-is-avail { + type boolean; + default false; + config false; + description "In case the microwave radio is capable of Adjacent Link Interference Cancelation (canceling of interference cause by transmitters located at the same site), this field shall contain a 'true'."; + } + leaf atpc-is-avail { + type boolean; + default false; + config false; + description "In case the microwave radio is capable of ATPC, this field shall contain a 'true'."; + } + leaf atpc-range { + type int8; + units "dB"; + default 0; + config false; + description "Extent of the ATPC range."; + } + leaf encryption-is-avail { + type boolean; + default false; + config false; + description "Shall be marked 'true', if payload encryption is available."; + } + leaf-list supported-loop-back-kind-list { + type loop-back-type; + config false; + min-elements 1; + max-elements 2; + description "List of supported kinds of looping back of header information to the remote site."; + } + leaf maintenance-timer-range { + type string; + units "s"; + default "Range of the maintenance timer not yet defined."; + config false; + description "Available time periods for maintenance configurations (e.g. the loop back of microwave header information) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360')."; + } + leaf supported-alarms { + type string; + default "Supported alarms not yet defined."; + config false; + description "Available alarms to be listed. Mandatory:'signalIsLost','rslIsExceeded','temperatureIsExceeded','modemIsFaulty','radioIsFaulty' and 'modulationIsDownShifted'. Further alarms might be added by the device. Names are to be separated by commas."; + } + list supported-channel-plan-list { + key 'supported-channel-plan'; + config false; + min-elements 1; + uses channel-plan-type-g; + description "List of channel spacing that are supported by the device."; + } + description "Describes the 'analog' capabilities of modem and transmitter of the microwave device. Value ranges of attributes are not independently (e.g. min. and max. transmit power depends on modulation). Legal combinations of values are expressed in transmissionModeTypes."; + } + grouping air-interface-configuration-g { + leaf air-interface-name { + type string; + default "Air interface ID not yet defined."; + description "Operator specific microwave link ID (often used for coding area, type of element and sequential number)."; + } + leaf radio-signal-id { + type string; + default "Radio signal ID not yet defined."; + description "The radioSignalId is transmitted on the air interface so the remote site of the link synchronizes on the correct transmitter. The local radio MUST NOT synchronize on a radio signal with a different radioSignalId. The link ID is neither an ID necessary to span the model nor an ID referencing external data. It is just some sort of name of the link transmitted so the correct remote site can be identified in an interference situation. The value zero might be used to make the microwave to disable the link ID check."; + } + leaf tx-frequency { + type int32; + units "kHz"; + default -1; + description "Center frequency of the transmit channel. The values to be configured have to exactly match the values listed in the international agreement referenced in channelPlanID. In case of automated selection of the transmit frequency this field shall describe the lowest center frequency selectable."; + } + leaf rx-frequency { + type int32; + units "kHz"; + default -1; + description "Center frequency of the receive channel."; + } + leaf tx-channel-bandwidth { + type int32; + units "kHz"; + default -1; + description "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;"; + } + leaf rx-channel-bandwidth { + type int32; + units "kHz"; + default -1; + description "Bandwidth of the receive channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;"; + } + leaf polarization { + type polarization-type; + default not-specified; + description "Allows documenting the polarization of the air interface."; + } + leaf power-is-on { + type boolean; + default true; + description "Power ON. Activation of the entire radio in a split mount configuration shall be expressed as a 'true'."; + } + leaf transmitter-is-on { + type boolean; + default false; + description "Activation of the transmitter inside the radio shall be expressed as a 'true'."; + } + leaf receiver-is-on { + type boolean; + default true; + description "Maintenance Feature. Activation of the receiver inside the radio shall be expressed as a 'true'. Attribute shall also be used for RX main and RX diversity squelches in case of diversity configurations. + "; + } + leaf tx-power { + type int8; + units "dBm"; + default 99; + description "Transmit power to be configured on the microwave link. Signed Byte is required. The actually operated transmit power might be lower depending on adaptive modulation and ATPC."; + } + leaf adaptive-modulation-is-on { + type boolean; + default false; + description "Adaptive Modulation. Activation of adaptive modulation shall be expressed as a 'true'."; + } + leaf modulation-min { + type int16; + units "symbols"; + default -1; + description "Minimum modulation to be configured (in case adaptive modulation is not used, this value represents also the fixed modulation). The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme."; + } + leaf modulation-max { + type int16; + units "symbols"; + default -1; + description "Maximum modulation to be configured. The value of this field is only relevant, if Adaptive Modulation has been activated. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme."; + } + leaf xpic-is-on { + type boolean; + default false; + description "Activation of Cross Polarization Interference Cancelation shall be expressed as a 'true'. In case XPIC is not available for the current combination of channel bandwidth and modulation or the hardware in general, this parameter shall always be set to 'false'."; + } + leaf mimo-is-on { + type boolean; + default false; + description "Activation of Multiple Input Multiple Output (MIMO) shall be expressed as a 'true'."; + } + leaf alic-is-on { + type boolean; + default false; + description "Activation of Adjacent Link Interference Cancelation (ALIC) shall be expressed as a 'true'."; + } + leaf atpc-is-on { + type boolean; + default false; + description "ATPC. Activation of Automated Transmit Power Control shall be expressed as a 'true'."; + } + leaf atpc-thresh-upper { + type int16; + units "dBm"; + default 99; + description "If the receive level is higher than the upper threshold value, the transmitter is notified to decrease transmit power."; + } + leaf atpc-thresh-lower { + type int16; + units "dBm"; + default 99; + description "If the receive level is lower than the lower threshold value, the transmitter is notified to increase transmit power."; + } + leaf auto-freq-select-is-on { + type boolean; + default false; + description "Activation of automatically selecting the transmit frequency in unlicensed bands shall be expressed as a 'true'."; + } + leaf auto-freq-select-range { + type int8; + units "channels"; + default -1; + description "Number of transmit channels (starting at the center frequency defined in txFrequency and with channel bandwidth according to txChannelBandwidth) that define the range within the transmit frequency can automatically been chosen. "; + } + leaf modulation-is-on { + type boolean; + default true; + description "Maintenance Feature. De-activation of the modulation of the carrier signal for fault management shall be expressed as a 'false'."; + } + leaf encryption-is-on { + type boolean; + default false; + description "Activates encryption of the payload."; + } + leaf cryptographic-key { + type string; + default "Cryptographic key not yet defined."; + description "Key for transforming plaintext into ciphertext data."; + } + leaf loop-back-kind-on { + type loop-back-type; + default none; + description "Maintenance Feature. The currently configured type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site."; + } + leaf maintenance-timer { + type int32; + units "s"; + default -1; + description "Time of existence of any maintenance configuration (e.g. the loop back of microwave header information). Valid values are defined in AirInterface::AirInterfaceCapability::maintenanceTimerRange."; + } + list problem-kind-severity-list { + key 'problem-kind-name'; + min-elements 6; + uses air-interface-problem-severity-type-g; + description "Severity of the problem to be configured."; + } + description "Configuration of the radio link."; + } + grouping air-interface-status-g { + leaf tx-frequency-cur { + type int32; + units "kHz"; + default -1; + config false; + description "Center frequency of the currently operated transmit channel."; + } + leaf rx-frequency-cur { + type int32; + units "kHz"; + default -1; + config false; + description "Center frequency of the currently operated receive channel."; + } + leaf tx-level-cur { + type int8; + units "dBm"; + default 99; + config false; + description "Current transmit level."; + } + leaf rx-level-cur { + type int8; + units "dBm"; + default 99; + config false; + description "Current receive level."; + } + leaf modulation-cur { + type int16; + units "symbols"; + default -1; + config false; + description "Currently operated modulation on transmit path. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme."; + } + leaf code-rate-cur { + type int8; + units "%"; + default -1; + config false; + description "Code rate of the currently operated coding scheme (Net bit rate ? Gross bit rate ? code rate)."; + } + leaf snir-cur { + type int8; + units "dB"; + default -99; + config false; + description "Currently measured signal to (noise+interference) ratio."; + } + leaf xpd-cur { + type int8; + units "dB"; + default -99; + config false; + description "Currently measured cross polarization discrimination."; + } + leaf rf-temp-cur { + type int8; + units "Celsius"; + default -99; + config false; + description "Current temperature (in degree Celsius) of the radio module inside the outdoor unit."; + } + leaf last-status-change { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + config false; + description "Time the Air Interface entered its current operational status. "; + } + leaf radio-power-is-up { + type boolean; + default false; + config false; + description "If the radio unit has power and is switched on, this shall be expressed as a 'true'."; + } + leaf link-is-up { + type boolean; + default false; + config false; + description "If connection is established to the remote site with the same linkID, this shall be expressed as a 'true'."; + } + leaf xpic-is-up { + type boolean; + default false; + config false; + description "If XPIC is currently actually working (not just configured), this shall be expressed as a 'true'."; + } + leaf mimo-is-up { + type boolean; + default false; + config false; + description "If MIMO is currently actually working (not just configured), this shall be expressed as a 'true'."; + } + leaf alic-is-up { + type boolean; + default false; + config false; + description "If Adjacent Link Interference Cancelation (ALIC) is currently actually working (not just configured), this shall be expressed as a 'true'."; + } + leaf atpc-is-up { + type boolean; + default false; + config false; + description "If ATPC is currently actually working (not just configured), this shall be expressed as a 'true'."; + } + leaf auto-freq-select-is-up { + type boolean; + default false; + config false; + description "If automated frequency selection is currently actually working (not just configured), this shall be expressed as a 'true'."; + } + leaf loop-back-kind-up { + type loop-back-type; + default none; + config false; + description "The currently active (not just configured) type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site."; + } + leaf local-end-point-id { + type string; + default "not-supported"; + config false; + description "The value of the localEndPointId is a vendor specific identifier of the air interface, used by the node to discover a microwave radio link."; + } + leaf remote-end-point-id { + type string; + default "not-supported"; + config false; + description "The value of the remoteEndPointId is a vendor specific identifier or the airinterface at the remote side, used to by the node to discover a microwave radio link."; + } + description "Measurements of current values on the air interface and operational status of the device."; + } + grouping air-interface-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses air-interface-current-problem-type-g; + description "none"; + } + description "none"; + } + grouping air-interface-current-performance-g { + list current-performance-data-list { + key 'scanner-id'; + config false; + min-elements 1; + max-elements 2; + uses air-interface-current-performance-type-g; + description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."; + } + description "Aggregated performance information of the air interface at a particular moment."; + } + grouping air-interface-historical-performances-g { + list historical-performance-data-list { + key 'history-data-id'; + config false; + uses air-interface-historical-performance-type-g; + description "none"; + } + description "Aggregated performance information of the air interface for a pre-defined measurement interval."; + } + list co-channel-group { + key 'co-channel-group-id'; + uses co-channel-group-g; + description "none"; + } + grouping co-channel-group-g { + leaf co-channel-group-id { + type core-model:universal-id; + description "none"; + } + leaf-list air-interface-list { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:uuid'; + } + description "List of air interfaces, which are part of the co-channel (XPIC, MIMO, ALIC) group."; + } + leaf sort-of-co-channel-group { + type string; + default "Kind of co-channel group not specified."; + description "Type of group of air interfaces with the same transmit and receive frequency. The values shall be chosen from the following _list:'XPIC', 'MIMO', 'ALIC';"; + } + leaf-list logical-termination-point { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:uuid'; + } + description "none"; + } + description "Required for configuring XPIC, MIMO and ALIC."; + } + + /*********************** + * package air-interface-hsb + **********************/ + list mw-air-interface-hsb-end-point-pac { + key 'endpoint'; + leaf role { + type role-type; + default working; + description "none"; + } + leaf endpoint { + type leafref { + path '/core-model:forwarding-construct/core-model:fc-port/core-model:uuid'; + } + description "none"; + } + description "The EndPoint (EP) object class models the access to the FC function. Each EndPoint instance has a role (e.g., working, protection, protected, hub, spoke, leaf, root, etc.) with respect to the FC function. The association of the FC to LTPs is made via EndPoints (essentially the ports of the FC) where each EndPoint (EP) of the FC has a role in the context of the FC. The traffic forwarding between the associated End PointsEPs of the FC depends upon the type of FC and may be associated with FCSwitch object instances. In cases where there is protection conveys the protecting role of the access to the FC. The EP replaces the Protection Unit of a traditional protection model. It represents a protected (resilient/reliable) point or a protecting (unreliable working or protection) point."; + } + list mw-air-interface-hsb-fc-switch-pac { + key 'fcswitch'; + leaf prot-type { + type protection-type; + default hsb; + description "Indicates the protection scheme that is used for the ProtectionGroup."; + } + leaf air-interface-hsb-configuration-is-faulty-severity { + type severity-type; + default warning; + description "The level of severity of an airInterfaceHsbConfigurationIsFaulty alarm shall be chosen from an enumeration."; + } + leaf air-interface-hsb-is-partly-down-severity { + type severity-type; + default warning; + description "The level of severity for one link out of the HSB configuration being down shall be chosen from an enumeration."; + } + leaf air-interface-hsb-is-down-severity { + type severity-type; + default warning; + description "The level of severity of the total HSB configuration being down shall be chosen from an enumeration."; + } + leaf fcswitch { + type leafref { + path '/core-model:forwarding-construct/core-model:fc-switch/core-model:uuid'; + } + description "none"; + } + description "Represents and defines a protection switch structure encapsulated in the forwarding construct. Essentially performs the function of Protection Group. Associates to 2 or more Endpoints each playing the role of a Protection Unit. One or more protection EndPoints (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) Endpoints where either protection or working can feed one or more protected Endpoint. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1). May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state."; + } + + /*********************** + * package air-interface-diversity + **********************/ + list mw-air-interface-diversity-pac { + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"; + } + container air-interface-diversity-capability { + config false; + uses air-interface-diversity-capability-g; + description "none"; + } + container air-interface-diversity-configuration { + uses air-interface-diversity-configuration-g; + description "none"; + } + container air-interface-diversity-status { + config false; + uses air-interface-diversity-status-g; + description "none"; + } + container air-interface-diversity-current-problems { + config false; + uses air-interface-diversity-current-problems-g; + description "none"; + } + container air-interface-diversity-current-performance { + config false; + uses air-interface-diversity-current-performance-g; + description "none"; + } + container air-interface-diversity-historical-performances { + config false; + uses air-interface-diversity-historical-performances-g; + description "none"; + } + description "none"; + } + grouping air-interface-diversity-capability-g { + list available-kinds-of-diversity { + key 'diversity-name'; + config false; + uses diversity-type-g; + description "Available types of diversity to be listed."; + } + leaf supported-alarms { + type string; + default "Supported alarms not yet defined."; + config false; + description "Available alarms to be listed. Mandatory:'airInterfaceDiversityConfigurationIsPartlyDown' (at least one air interface is down, but not all of them) and 'airInterfaceDiversityConfigurationIsDown' (all air interfaces are down). Further alarms might be added by the device. Names are to be separated by commas."; + } + description "Describes the capabilities in implementing different types of air interface diversity."; + } + grouping air-interface-diversity-configuration-g { + container air-interface-diversity { + uses diversity-type-g; + description "Type of air interface diversity configured at the link."; + } + leaf-list air-interface-ltp-list { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:uuid'; + } + min-elements 2; + description "_multiplicity:2-ThisAirInterfaceDiversity::AirInterfaceDiversityConfiguration::airInterfaceDiversity::diversityType::numberOfAirInterfacesMax"; + } + list problem-kind-severity-list { + key 'problem-kind-name'; + min-elements 3; + uses air-interface-diversity-problem-severity-type-g; + description "Severity of the problem to be configured."; + } + description "none"; + } + grouping air-interface-diversity-status-g { + leaf snir-cur { + type int8; + units "dB"; + default -99; + config false; + description "Currently measured signal to (noise+interference) ratio of the combined signals."; + } + leaf air-interface-diversity-status { + type air-interface-diversity-status-type; + default group-down; + config false; + description "Status of the air interface bundle. "; + } + leaf last-status-change { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + config false; + description "Time the Diversity Group entered its current operational status. "; + } + description "none"; + } + grouping air-interface-diversity-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses air-interface-diversity-current-problem-type-g; + description "none"; + } + description "none"; + } + grouping air-interface-diversity-current-performance-g { + list current-performance-data-list { + key 'scanner-id'; + config false; + min-elements 1; + max-elements 2; + uses air-interface-diversity-current-performance-type-g; + description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."; + } + description "Aggregated performance information of the air interface diversity configuration at a particular moment."; + } + grouping air-interface-diversity-historical-performances-g { + list historical-performance-data-list { + key 'history-data-id'; + config false; + uses air-interface-diversity-historical-performance-type-g; + description "none"; + } + description "Aggregated performance information of the air interface diversity configuration for a pre-defined measurement interval."; + } + + /*********************** + * package pure-ethernet-structure + **********************/ + list mw-pure-ethernet-structure-pac { + if-feature pure-ethernet; + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"; + } + container pure-ethernet-structure-capability { + config false; + uses pure-ethernet-structure-capability-g; + description "none"; + } + container pure-ethernet-structure-configuration { + uses pure-ethernet-structure-configuration-g; + description "none"; + } + container pure-ethernet-structure-status { + config false; + uses pure-ethernet-structure-status-g; + description "none"; + } + container pure-ethernet-structure-current-problems { + config false; + uses pure-ethernet-structure-current-problems-g; + description "none"; + } + container pure-ethernet-structure-current-performance { + config false; + uses pure-ethernet-structure-current-performance-g; + description "none"; + } + container pure-ethernet-structure-historical-performances { + config false; + uses pure-ethernet-structure-historical-performances-g; + description "none"; + } + description "The pureEthernetStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting Ethernet traffic only."; + } + grouping pure-ethernet-structure-capability-g { + leaf structure-id { + type core-model:universal-id; + config false; + description "Identifies the Structure for bundling and container."; + } + leaf supported-alarms { + type string; + default "Supported alarms not yet defined."; + config false; + description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the device."; + } + description "Describes the logical structuring of the physical capacity provided by a pure Ethernet microwave device. Segmentation is not available. No fixed segment size. No TDM transport."; + } + grouping pure-ethernet-structure-configuration-g { + list problem-kind-severity-list { + key 'problem-kind-name'; + uses structure-problem-severity-type-g; + description "Severity of the type of problem to be configured."; + } + description "none"; + } + grouping pure-ethernet-structure-status-g { + container segment-status-list { + config false; + uses segment-status-type-g; + description "Status of the Ethernet transport segment. Always just one segment."; + } + leaf last-status-change { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + config false; + description "Time and date of the last update of the status information. "; + } + description "none"; + } + grouping pure-ethernet-structure-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses structure-current-problem-type-g; + description "none"; + } + description "none"; + } + grouping pure-ethernet-structure-current-performance-g { + list current-performance-data-list { + key 'scanner-id'; + config false; + min-elements 1; + max-elements 2; + uses structure-current-performance-type-g; + description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."; + } + description "Aggregated performance information of the structure of an pure Ethernet microwave at a particular moment."; + } + grouping pure-ethernet-structure-historical-performances-g { + list historical-performance-data-list { + key 'history-data-id'; + config false; + uses structure-historical-performance-type-g; + description "none"; + } + description "Aggregated performance information of the structure of an pure Ethernet microwave for a pre-defined measurement interval."; + } + feature pure-ethernet { + description "Feature 'pure-ethernet' is mandatory for device types transporting pure Ethernet."; + } + + /*********************** + * package hybrid-mw-structure + **********************/ + list mw-hybrid-mw-structure-pac { + if-feature hybrid-microwave; + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"; + } + container hybrid-mw-structure-capability { + config false; + uses hybrid-mw-structure-capability-g; + description "none"; + } + container hybrid-mw-structure-configuration { + uses hybrid-mw-structure-configuration-g; + description "none"; + } + container hybrid-mw-structure-status { + config false; + uses hybrid-mw-structure-status-g; + description "none"; + } + container hybrid-mw-structure-current-problems { + config false; + uses hybrid-mw-structure-current-problems-g; + description "none"; + } + container hybrid-mw-structure-current-performance { + config false; + uses hybrid-mw-structure-current-performance-g; + description "none"; + } + container hybrid-mw-structure-historical-performances { + config false; + uses hybrid-mw-structure-historical-performances-g; + description "none"; + } + description "The HybridMwStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM and Ethernet traffic."; + } + grouping hybrid-mw-structure-capability-g { + leaf structure-id { + type core-model:universal-id; + config false; + description "Identifies the Structure for bundling and container."; + } + list supported-tdm-structure-types-list { + key 'tdm-structure-name'; + config false; + min-elements 1; + uses tdm-structure-type-g; + description "Lists the TDM frame types that are supported."; + } + leaf supported-alarms { + type string; + default "Supported alarms not yet defined."; + config false; + description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the device."; + } + description "Describes the logical structuring of the physical capacity provided by a hybrid microwave device (TDM + Ethernet). Segmentation is available. TDM transport is available."; + } + grouping hybrid-mw-structure-configuration-g { + container structure-type { + uses tdm-structure-type-g; + description "TDM frame to be applied."; + } + leaf number-of-tdm-segments-to-be-reserved { + type int16; + default -1; + description "Allows to configure the number of segments reserved for TDM frames of the type specified in HybridMwStructure::HybridMwStructureConfiguration::structureType"; + } + list problem-kind-severity-list { + key 'problem-kind-name'; + uses structure-problem-severity-type-g; + description "Severity of the type of problem to be configured."; + } + description "none"; + } + grouping hybrid-mw-structure-status-g { + list segment-status-list { + key 'segment-status-type-id'; + config false; + uses segment-status-type-g; + description "Status of each segment (all TDM and one Ethernet). Multiplicity = HybridMwStructure::StructureConfiguration::tdmReservedNumberOfSegments + 1"; + } + leaf last-status-change { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + config false; + description "Time and date of the last update of the status information. "; + } + description "none"; + } + grouping hybrid-mw-structure-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses structure-current-problem-type-g; + description "none"; + } + description "none"; + } + grouping hybrid-mw-structure-current-performance-g { + list current-performance-data-list { + key 'scanner-id'; + config false; + min-elements 1; + max-elements 2; + uses structure-current-performance-type-g; + description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."; + } + description "Aggregated performance information of the structure of a hybrid microwave at a particular moment."; + } + grouping hybrid-mw-structure-historical-performances-g { + list historical-performance-data-list { + key 'history-data-id'; + config false; + uses structure-historical-performance-type-g; + description "none"; + } + description "Aggregated performance information of the structure of a hybrid microwave for a pre-defined measurement interval."; + } + feature hybrid-microwave { + description "Feature 'hybrid-microwave' is mandatory for device types transporting Ethernet + TDM."; + } + + /*********************** + * package ethernet-container + **********************/ + list mw-ethernet-container-pac { + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"; + } + container ethernet-container-capability { + config false; + uses ethernet-container-capability-g; + description "none"; + } + container ethernet-container-configuration { + uses ethernet-container-configuration-g; + description "none"; + } + container ethernet-container-status { + config false; + uses ethernet-container-status-g; + description "none"; + } + container ethernet-container-current-problems { + config false; + uses ethernet-container-current-problems-g; + description "none"; + } + container ethernet-container-current-performance { + config false; + uses ethernet-container-current-performance-g; + description "none"; + } + container ethernet-container-historical-performances { + config false; + uses ethernet-container-historical-performances-g; + description "none"; + } + description "none"; + } + grouping ethernet-container-capability-g { + leaf bundling-is-avail { + type boolean; + default false; + config false; + description "This attribute has to be set on 'true', if the device allows combining resources from several air interfaces for transporting this Ethernet container."; + } + leaf packet-compression-is-avail { + type boolean; + default false; + config false; + description "In case packet compression can be activated, but not configured to a certain type, packetCompressionAvail shall be set on 'true', but none of the compression level specific booleans."; + } + leaf layer2-compression-is-avail { + type boolean; + default false; + config false; + description "Packet compression on layer 2 available at the device."; + } + leaf vlan-compression-is-avail { + type boolean; + default false; + config false; + description "Packet compression on VLAN layer available at the device."; + } + leaf q-in-q-compression-is-avail { + type boolean; + default false; + config false; + description "Packet compression on layer of a second VLAN available at the device."; + } + leaf mpls-compression-is-avail { + type boolean; + default false; + config false; + description "Packet compression on mpls layer available at the device."; + } + leaf ipv4-compression-is-avail { + type boolean; + default false; + config false; + description "Packet compression on layer 3 for IPv4 available at the device."; + } + leaf ipv6-compression-is-avail { + type boolean; + default false; + config false; + description "Packet compression on layer 3 for IPv6 available at the device."; + } + leaf layer4-compression-is-avail { + type boolean; + default false; + config false; + description "Packet compression on layer 4 (TCP and UDP header) available at the device."; + } + leaf encryption-is-avail { + type boolean; + default false; + config false; + description "Shall be marked 'true', if Ethernet payload encryption is available."; + } + leaf supported-alarms { + type string; + default "Supported alarms not yet defined."; + config false; + description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device."; + } + description "none"; + } + grouping ethernet-container-configuration-g { + leaf container-id { + type string; + default "No Ethernet Flow associated yet."; + description "ContainterID in Netconf must be the same as EthernetPortID in OpenFlow so a connection can be made between the two items, which separately exist in the controller."; + } + list segments-id-list { + key 'structure-id-ref segment-id-ref'; + min-elements 1; + uses segment-id-type-g; + description "Lists the segments used for transporting this Ethernet container. In case EthernetContainer::ContainerCapability::bundlingIsAvail==0, all TypeDefinitions::segmentIdType::structureId must be identical in the list."; + } + leaf packet-compression-is-on { + type boolean; + default false; + description "In case packet compression is activated, but no type is activated, it is assumed that the device chooses the optimum."; + } + leaf layer2-compression-is-on { + type boolean; + default false; + description "Packet compression on layer 2 configured at the device."; + } + leaf vlan-compression-is-on { + type boolean; + default false; + description "Packet compression on VLAN layer configured at the device."; + } + leaf q-in-q-compression-is-on { + type boolean; + default false; + description "Packet compression on layer of a second VLAN configured at the device."; + } + leaf mpls-compression-is-on { + type boolean; + default false; + description "Packet compression on MPLS layer configured at the device."; + } + leaf ipv4-compression-is-on { + type boolean; + default false; + description "Packet compression on layer 3 for IPv4 configured at the device."; + } + leaf ipv6-compression-is-on { + type boolean; + default false; + description "Packet compression on layer 3 for IPv6 configured at the device."; + } + leaf layer4-compression-is-on { + type boolean; + default false; + description "Packet compression on layer 4 (TCP and UDP header) configured at the device."; + } + leaf encryption-is-on { + type boolean; + default false; + description "Activates encryption of the Ethernet payload."; + } + leaf cryptographic-key { + type string; + default "Cryptographic key not yet defined."; + description "Key for transforming plaintext into cipher text data."; + } + list problem-kind-severity-list { + key 'problem-kind-name'; + min-elements 2; + uses container-problem-severity-type-g; + description "Severity of the problem to be configured."; + } + description "none"; + } + grouping ethernet-container-status-g { + leaf last-status-change { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + config false; + description "Time the Container entered its current operational status. "; + } + description "none"; + } + grouping ethernet-container-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses container-current-problem-type-g; + description "none"; + } + description "none"; + } + grouping ethernet-container-current-performance-g { + list current-performance-data-list { + key 'scanner-id'; + config false; + min-elements 1; + max-elements 2; + uses container-current-performance-type-g; + description "none"; + } + description "Aggregated performance information of the Ethernet container at a particular moment."; + } + grouping ethernet-container-historical-performances-g { + list historical-performance-data-list { + key 'history-data-id'; + config false; + uses container-historical-performance-type-g; + description "none"; + } + description "Aggregated performance information of the Ethernet container for a pre-defined measurement interval."; + } + + /*********************** + * package tdm-container + **********************/ + list mw-tdm-container-pac { + if-feature hybrid-microwave; + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"; + } + container tdm-container-capability { + config false; + uses tdm-container-capability-g; + description "none"; + } + container tdm-container-configuration { + uses tdm-container-configuration-g; + description "none"; + } + container tdm-container-status { + config false; + uses tdm-container-status-g; + description "none"; + } + container tdm-container-current-problems { + config false; + uses tdm-container-current-problems-g; + description "none"; + } + container tdm-container-current-performance { + config false; + uses tdm-container-current-performance-g; + description "none"; + } + container tdm-container-historical-performances { + config false; + uses tdm-container-historical-performances-g; + description "none"; + } + description "none"; + } + grouping tdm-container-capability-g { + list supported-tdm-container-types-list { + key 'tdm-container-name'; + config false; + min-elements 1; + uses tdm-container-type-g; + description "Lists the TDM containers that are supported."; + } + leaf supported-alarms { + type string; + default "Supported alarms not yet defined."; + config false; + description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device."; + } + description "Bundling is not available."; + } + grouping tdm-container-configuration-g { + leaf container-id { + type string; + default "No TDM Flow associated yet."; + description "ContainterID in Netconf must be the same as TDM Flow ID so a connection can be made between the two items, which separately exist in the controller."; + } + container container-type { + uses tdm-container-type-g; + description "Type of TDM container."; + } + container segment-id { + uses segment-id-type-g; + description "Multiplicity = 1; One segment per TDM container; Type of segment must match type of container;"; + } + list problem-kind-severity-list { + key 'problem-kind-name'; + min-elements 2; + uses container-problem-severity-type-g; + description "Severity of the problem to be configured."; + } + description "none"; + } + grouping tdm-container-status-g { + leaf last-status-change { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + config false; + description "Time the Container entered its current operational status. "; + } + description "none"; + } + grouping tdm-container-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses container-current-problem-type-g; + description "none"; + } + description "none"; + } + grouping tdm-container-current-performance-g { + list current-performance-data-list { + key 'scanner-id'; + config false; + min-elements 1; + max-elements 2; + uses container-current-performance-type-g; + description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."; + } + description "Aggregated performance information of the TDM container at a particular moment."; + } + grouping tdm-container-historical-performances-g { + list historical-performance-data-list { + key 'history-data-id'; + config false; + uses container-historical-performance-type-g; + description "none"; + } + description "Aggregated performance information of the TDM container for a pre-defined measurement interval."; + } + + /*********************** + * package super-classes + **********************/ + grouping mw-current-problem-g { + leaf sequence-number { + type int32; + config false; + description "Unique sequence number of the current problem object."; + } + leaf time-stamp { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + config false; + description "Time and date of the problem. "; + } + leaf problem-severity { + type severity-type; + default warning; + config false; + description "Severity of the alarm."; + } + description "none"; + } + + + /*********************** + * package notifications + **********************/ + notification object-creation-notification { + uses object-creation-notification-g; + description "none"; + } + grouping object-creation-notification-g { + leaf counter { + type int32; + default -1; + description "Counts object creation notifications."; + } + leaf time-stamp { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + description "none"; + } + leaf object-id-ref { + type core-model:universal-id; + description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."; + } + leaf object-type { + type string; + default "Type of created object not specified."; + description "Type of Object to be chosen from the following list of values: 'MW_AirInterface_Pac', 'MW_AirInterfaceDiversity_Pac', 'MW_Structure_Pac', 'MW_PureEthernetStructure_Pac', 'MW_HybridMwStructure_Pac', 'MW_Container_Pac', 'MW_EthernetContainer_Pac' or 'MW_TdmContainer_Pac'."; + } + description "To be sent when a new MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac has to be instancieted in the controller."; + } + notification object-deletion-notification { + uses object-deletion-notification-g; + description "none"; + } + grouping object-deletion-notification-g { + leaf counter { + type int32; + default -1; + description "Counts object deletion notifications."; + } + leaf time-stamp { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + description "none"; + } + leaf object-id-ref { + type core-model:universal-id; + description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."; + } + description "To be sent when a new MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac instance has to be deleted in the controller."; + } + notification attribute-value-changed-notification { + uses attribute-value-changed-notification-g; + description "none"; + } + grouping attribute-value-changed-notification-g { + leaf counter { + type int32; + default -1; + description "Counts attribute value changed notifications."; + } + leaf time-stamp { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + description "none"; + } + leaf object-id-ref { + type core-model:universal-id; + description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."; + } + leaf attribute-name { + type string; + default "Attribute name not specified."; + description "Name of the attribute that has been changed."; + } + leaf new-value { + type string; + default "New value not specified."; + description "Attribute value converted to a string (xml, json, ...)"; + } + description "To be sent when an attribute has changed and one or more controllers have to update their data."; + } + notification problem-notification { + uses problem-notification-g; + description "none"; + } + grouping problem-notification-g { + leaf counter { + type int32; + default -1; + description "Counts problem notifications"; + } + leaf time-stamp { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + description "none"; + } + leaf object-id-ref { + type core-model:universal-id; + description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."; + } + leaf problem { + type string; + default "Problem name not specified."; + description "Name of the problem according to AirInterface::AirInterfaceCapability::supportedAlarms or AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms or Structure::StructureCapability::supportedAlarms or PureEthernetStructure::PureEthernetStructureCapability::supportedAlarms or HybridMwStructure::HybridMwStructureCapability::supportedAlarms or Container::ContainerCapability::supportedAlarms or EthernetContainer::EthernetContainerCapability::supportedAlarms or TdmContainer::TdmContainerCapability::supportedAlarms."; + } + leaf severity { + type severity-type; + default warning; + description "Severity of the problem according to AirInterface::AirInterfaceConfiguration::problemSeverityList, AirInterfaceDiversity::AirInterfaceDiversityConfiguration::problemSeverityList, Structure::StructureConfiguration::problemSeverityList, PureEthernetStructure::PureEthernetStructureConfiguration::problemSeverityList, HybridMwStructure::HybridMwStructureConfiguration::problemSeverityList, Container::ContainerConfiguration::problemSeverityList, EthernetContainer::EthernetContainerConfiguration::problemSeverityList or TdmContainer::TdmContainerConfiguration::problemSeverityList"; + } + description "To be sent when a problem occurs at a MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac."; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2018-09-07.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2018-09-07.yang new file mode 100644 index 000000000..db94e09c5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2018-09-07.yang @@ -0,0 +1,2567 @@ +module microwave-model {
+ namespace "urn:onf:params:xml:ns:yang:microwave-model";
+ prefix microwave-model;
+
+ import core-model {
+ prefix core-model;
+ }
+ import g.874.1-model {
+ prefix g;
+ }
+ import ietf-yang-types {
+ prefix yang;
+ }
+ organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project";
+ contact "WG Web: <https://www.opennetworking.org/software-defined-standards/models-apis/>
+ WG List: <mailto:wireless-transport@login.opennetworking.org>
+ WG Chair: Lyndon Ong
+ <mailto:lyong@ciena.com>
+ WG Chair: Giorgio Cazzaniga
+ <mailto:giorgio.cazzaniga@sm-optics.com>
+ Editors: Thorsten Heinze
+ <mailto:thorsten.heinze@telefonica.com>
+ Shrikanth Malavalli Divakar
+ <mailto:shrikanth.divakar@wipro.com>";
+ description "This module contains a collection of YANG definitions for managing wireless networks.
+ This model is for vendor agnostic management of wireless network elements.";
+ revision 2018-09-07 {
+ description "Version 1.1";
+ reference "ONF TR 532: A YANG Data Model for Wireless Networks.";
+ }
+
+ revision 2017-03-24 {
+ description "Initial version";
+ reference "ONF TR 532: A YANG Data Model for Wireless Networks.";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ typedef loop-back-type {
+ type enumeration {
+ enum rf-to-remote {
+ description "Returning the header information of the remote site back to the remote site on the radio interface between both outdoor units.";
+ }
+ enum rf-to-local {
+ description "Returning the header information of the local site back to the local site on the radio interface between both outdoor units.";
+ }
+ enum if-to-remote {
+ description "Returning the header information of the remote site back to the remote site on the intermediate frequency interface between local indoor unit and outdoor unit.";
+ }
+ enum if-to-local {
+ description "Returning the header information of the local site back to the local site on the intermediate frequency interface between local indoor unit and outdoor unit.";
+ }
+ enum none {
+ description "none";
+ }
+ enum if {
+ status deprecated;
+ description "Intermediate Frequency on the interface between indoor and outdoor unit.";
+ }
+ enum rf {
+ status deprecated;
+ description "Radio Frequency on the interface between outdoor unit and outdoor unit at the remote site.";
+ }
+ }
+ description "none";
+ }
+ typedef severity-type {
+ type enumeration {
+ enum non-alarmed {
+ description "none";
+ }
+ enum warning {
+ description "none";
+ }
+ enum minor {
+ description "none";
+ }
+ enum major {
+ description "none";
+ }
+ enum critical {
+ description "none";
+ }
+ }
+ description "According to ITU-T M.3160";
+ }
+ grouping channel-plan-type-g {
+ leaf supported-channel-plan {
+ type string;
+ config false;
+ description "Unique name (e.g. ECC/REC/(01)04_Annex 5) of a document, which describes a frequency grid that can be adjusted at the air interface. Corresponding channel plans to be delivered by the hardware vendor and to be stored by the operator in an controller/application attached database.";
+ }
+ leaf duplex-distance-is-variable {
+ type boolean;
+ default false;
+ config false;
+ description "To be set on 'true', if the distance between transmitted and received frequency is variable.";
+ }
+ leaf-list duplex-distance-list {
+ type int32;
+ units "kHz";
+ config false;
+ min-elements 1;
+ description "Distance between transmitted and received frequency. To be filled with single value, in case duplex distance is not variable. To be filled with all configurable values, in case duplex distance is variable.";
+ }
+ leaf duplex-distance {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ status deprecated;
+ description "Distance between transmitted and received frequency.";
+ }
+ leaf auto-freq-select-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the microwave radio is capable of automatically selecting the transmit frequency in unlicensed bands, this field shall contain a 'true'.";
+ }
+ list transmission-mode-list {
+ key 'transmission-mode-id';
+ config false;
+ min-elements 1;
+ uses transmission-mode-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping transmission-mode-type-g {
+ leaf transmission-mode-id {
+ type core-model:universal-id;
+ description "Indentifies the transmissionMode for internal reference.";
+ }
+ leaf transmission-mode-name {
+ type string;
+ default "Name of the transmission mode not yet defined.";
+ config false;
+ description "Name of the transmission mode. BBBB-m*-i*/t*-r*. B=four digits of channel bandwidth in MHz. m*=required number of digits for modulation name. (i*/t*=code rate.) i*=required number of digits for number of information bits. t*=required number of digits for total bits. r*=required number of digits for rate reduction factor. Example: 028-4QAM-188/204-1";
+ }
+ leaf channel-bandwidth {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;";
+ }
+ leaf modulation-scheme {
+ type int16;
+ units "symbols";
+ default -1;
+ config false;
+ description "Modulation scheme, which is base to the other characteristics described in the same transmissionModeType data type. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256').";
+ }
+ leaf code-rate {
+ type int8;
+ units "%";
+ default -1;
+ config false;
+ description "Code rate of the coding scheme in % (Net bit rate ≤ Gross bit rate · code rate).";
+ }
+ leaf symbol-rate-reduction-factor {
+ type int8;
+ default 1;
+ config false;
+ description "Reduction factor for the symbol rate. Example: value would be 4 for 1/4BPSK.";
+ }
+ leaf tx-power-min {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the minimum transmit power the modem can operate in dBm.";
+ }
+ leaf tx-power-max {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the maximum transmit power the modem can operate in dBm.";
+ }
+ leaf rx-threshold {
+ type int16;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the receive level required to decode the received signal with a Bit Error Rate of 1e-6 or less.";
+ }
+ leaf am-upshift-level {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the receive level that has to be exceeded to shift into a higher modulation scheme.";
+ }
+ leaf am-downshift-level {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the receive level that has to be exceeded for not shifting into a lower modulation scheme.";
+ }
+ leaf xpic-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case this air interface type is capable of XPIC, this field shall contain a 'true'. This information shall purely relate to capabilities of the equipment type, but not to the operational capability of a specific hardware composition on site. Means for example that this attribute might contain a 'true' statement, even if an additional cable would have been required to actually operate XPIC in a specific case.";
+ }
+ description "none";
+ }
+ typedef polarization-type {
+ type enumeration {
+ enum not-specified {
+ description "none";
+ }
+ enum horizontal {
+ description "none";
+ }
+ enum vertical {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef g826-type {
+ type enumeration {
+ enum es {
+ description "Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::es .";
+ }
+ enum ses {
+ description "Severely Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::ses .";
+ }
+ enum cses {
+ description "Consecutive Severely Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::cses .";
+ }
+ enum not-specified {
+ description "none";
+ }
+ }
+ description "none";
+ }
+
+ grouping threshold-cross-alarm-type-g {
+ leaf g826-value-kind {
+ type g826-type;
+ description "Kind of performance value that shall be equipped with a threshold alarm.";
+ }
+ leaf granularity-period {
+ type g:granularity-period-type;
+ description "Period of the performance data collection.";
+ }
+ leaf alarm-raising-threshold {
+ type int32;
+ units "s";
+ default -1;
+ description "Number of events required for raising the threshold cross alarm.";
+ }
+ leaf alarm-clearing-threshold {
+ type int32;
+ units "s";
+ default -1;
+ description "Number of events required for clearing the threshold cross alarm.";
+ }
+ description "Allows defining a threshold cross alarm.
+ ";
+ }
+ grouping air-interface-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping air-interface-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping time-x-states-type-g {
+ leaf transmission-mode {
+ type leafref{
+ path '/mw-air-interface-pac/air-interface-capability/supported-channel-plan-list/transmission-mode-list/transmission-mode-id';
+ }
+ config false;
+ description "Operated transmission mode.";
+ }
+ leaf time {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Sum of all seconds the transmitter operated the transmission mode.";
+ }
+ description "none";
+ }
+ grouping air-interface-performance-type-g {
+ leaf es {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of errored seconds.";
+ }
+ leaf ses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of severely errored seconds.";
+ }
+ leaf cses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of consecutive severely errored seconds.";
+ }
+ leaf unavailability {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total time of unavailability in seconds.";
+ }
+ leaf tx-level-min {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Minimum transmit power. Signed integers are required.";
+ }
+ leaf tx-level-max {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Maximum transmit power. Signed integers are required.";
+ }
+ leaf tx-level-avg {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Averaged transmit power. Signed integers are required.";
+ }
+ leaf rx-level-min {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Minimum receive level. Signed integers are required.";
+ }
+ leaf rx-level-max {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Maximum receive level. Signed integers are required.";
+ }
+ leaf rx-level-avg {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Averaged receive level. Signed integers are required.";
+ }
+ list time-x-states-list {
+ key 'transmission-mode';
+ config false;
+ min-elements 1;
+ uses time-x-states-type-g;
+ description "Time period the transmitter operated in the respective transmission mode.";
+ }
+ leaf time2-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "Sum of all seconds the transmitter operated in e.g. BPSK.";
+ }
+ leaf time4-states-s {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time4-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time8-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time16-states-s {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time16-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time32-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time64-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time128-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time256-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time512-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time512-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time1024-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time1024-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time2048-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time2048-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time4096-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time4096-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time8192-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time8192-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf snir-min {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Minimum signal to (noise+interference) ratio.";
+ }
+ leaf snir-max {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Maximum signal to (noise+interference) ratio.";
+ }
+ leaf snir-avg {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Averaged signal to (noise+interference) ratio.";
+ }
+ leaf xpd-min {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Minimum cross polarization discrimination.";
+ }
+ leaf xpd-max {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Maximum cross polarization discrimination.";
+ }
+ leaf xpd-avg {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Averaged cross polarization discrimination.";
+ }
+ leaf rf-temp-min {
+ type int8;
+ units "C";
+ default -99;
+ config false;
+ description "Lowest temperature (in degree Celsius) of the radio module inside the outdoor unit.";
+ }
+ leaf rf-temp-max {
+ type int8;
+ units "C";
+ default -99;
+ config false;
+ description "Highest temperature (in degree Celsius) of the radio module inside the outdoor unit.";
+ }
+ leaf rf-temp-avg {
+ type int8;
+ units "C";
+ default -99;
+ config false;
+ description "Averaged temperature (in degree Celsius) of the radio module inside the outdoor unit.";
+ }
+ leaf defect-blocks-sum {
+ type int16;
+ units "blocks";
+ default -1;
+ config false;
+ description "Total number of blocks that were defect after receiving and could not be corrected by the FEC.";
+ }
+ leaf time-period {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total length of the measurement period.";
+ }
+ description "Consolidated performance information of the air interface.";
+ }
+ grouping air-interface-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses air-interface-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping air-interface-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses air-interface-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+ typedef protection-type {
+ type enumeration {
+ enum hsb {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef role-type {
+ type enumeration {
+ enum working {
+ description "none";
+ }
+ enum protection {
+ description "none";
+ }
+ enum protected {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping diversity-type-g {
+ leaf diversity-name {
+ type string;
+ config false;
+ description "Names to be chosen from the following list: 'spaceDiversity', 'frequencyDiversity'";
+ }
+ leaf number-of-air-interfaces-max {
+ type int8;
+ units "air interfaces";
+ default 1;
+ config false;
+ description "Maximum number of air interfaces that could be part of this kind of diversity.";
+ }
+ description "none";
+ }
+ typedef air-interface-diversity-status-type {
+ type enumeration {
+ enum group-down {
+ description "All air interfaces that are members of the diversity configuration are down.";
+ }
+ enum not-all-ai-active {
+ description "At least one, but not all of the air interfaces that are part of the diversity configuration is not working.";
+ }
+ enum all-ai-active {
+ description "All air interfaces that are part of the diversity configuration are working.";
+ }
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping air-interface-diversity-performance-type-g {
+ leaf snir-min {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Minimum signal to (noise+interference) ratio of the combined signals.";
+ }
+ leaf snir-max {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Maximum signal to (noise+interference) ratio of the combined signals.";
+ }
+ leaf snir-avg {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Average signal to (noise+interference) ratio of the combined signals.";
+ }
+ description "Consolidated performance information of the air interface diversity group.";
+ }
+ grouping air-interface-diversity-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses air-interface-diversity-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping air-interface-diversity-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses air-interface-diversity-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+ grouping tdm-structure-type-g {
+ leaf tdm-structure-name {
+ type string;
+ config false;
+ description "Names to be chosen from the following list: 'e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'";
+ }
+ leaf tdm-segment-size {
+ type int32;
+ units "kbit/s";
+ default -1;
+ config false;
+ description "Size of the TDM segment in kbit/s. Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;";
+ }
+ leaf max-number-of-segments-reservable {
+ type int8;
+ units "segments";
+ default -1;
+ config false;
+ description "Device specific maximum number of segments (not depending on current air interface configuration) that can be reserved for this type of segment on a single air interface.";
+ }
+ description "none";
+ }
+ grouping structure-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to Structure::StructureCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping structure-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to Structure::StructureCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping structure-performance-type-g {
+ leaf time-period {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total length of the measurement period in seconds.";
+ }
+ leaf es {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals.";
+ }
+ leaf ses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of severely errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals.";
+ }
+ leaf cses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of consecutive severely errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals.";
+ }
+ leaf unavailability {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total time of unavailability in seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals.";
+ }
+ leaf rx-level-min {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Minimum receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value.";
+ }
+ leaf rx-level-max {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Maximum receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value.";
+ }
+ leaf rx-level-avg {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Averaged receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value.";
+ }
+ description "Consolidated performance information of the Structure.";
+ }
+ grouping structure-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses structure-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping structure-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses structure-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+ grouping container-type-g {
+ leaf container-name {
+ type string;
+ config false;
+ description "Names to be chosen from the following list: 'ethernet','e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'";
+ }
+ leaf number-of-time-slots-required {
+ type int16;
+ units "timeslots";
+ default -1;
+ config false;
+ description "Number of time slots required for transporting this type of container. Value must be calculated by the vendor after defining the timeSlotCapacity. For containers of fixed size: numberOfTimeSlotsRequired = required bandwidth of the container divided by timeSlotCapacity. For containers of variable size the minimum (most probably 1) is to be stated.";
+ }
+ leaf tdm-time-slots-is-required {
+ type boolean;
+ default false;
+ config false;
+ description "Shall be set to '1', if this container type requires bandwidth (times slots) reserved for TDM transport.";
+ }
+ leaf bundling-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "If it is possible to combine transport resources of several radio links to transport this container type, this attribute shall be set to '1'.";
+ }
+ description "none";
+ }
+ grouping tdm-container-type-g {
+ leaf tdm-container-name {
+ type string;
+ config false;
+ description "Names to be chosen from the following list: 'e1','t1','j1','e3','t3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'";
+ }
+ leaf tdm-container-size {
+ type int32;
+ units "kbit/s";
+ default -1;
+ config false;
+ description "Capacity required for transporting this type of container (in kbit/s). Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;";
+ }
+ description "none";
+ }
+ grouping segment-id-type-g {
+ leaf structure-id-ref {
+ type core-model:universal-id;
+ description "none";
+ }
+ leaf segment-id-ref {
+ type int16;
+ description "Combinations of structureId and segmentId must be unique inside the device to assure that every resource is used just once.";
+ }
+ description "Identifies the segments, which are used to transport the container.";
+ }
+ grouping segment-status-type-g {
+ leaf segment-status-type-id {
+ type int16;
+ config false;
+ description "none";
+ }
+ leaf segment-is-reserved-for-tdm {
+ type boolean;
+ default false;
+ config false;
+ description "The number of segments, which is configured by Structure::StructureConfiguration::tdmReservedNumberOfSegements, has to be reserved for TDM. Starting from the lowest index value, these segments have to be marked with a 'true' in segmentIsReservedForTdm.
+ ";
+ }
+ leaf operational-status {
+ type core-model:operational-state;
+ default disabled;
+ config false;
+ description "Current operational status of each segment.";
+ }
+ leaf obsolete-priority-class {
+ type int8;
+ default -1;
+ config false;
+ description "PriorityClass as inherited from the associated Container::ContainerConfiguration::priorityClass. In case the device is capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, priorityClass shall be considered, while calculating the dropOrderRank.";
+ }
+ leaf obsolete-drop-order-rank {
+ type int16;
+ default -1;
+ config false;
+ description "In case the device is NOT capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, dropOrderRank is number of segments minus sequence number of the segment. In case the device is capable of adapting the sequence, dropOrderRank has to be calculated by the device in dependency to the assigned priorityClass.
+ _unique: within Structure::StructureStatus::segmentStatusList";
+ }
+ description "none";
+ }
+ grouping container-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to Container::ContainerCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping container-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to Container::ContainerCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping container-performance-type-g {
+ leaf tx-ethernet-bytes-max-s {
+ type int32;
+ units "Bytes/s";
+ default -1;
+ config false;
+ description "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a second and keeps the highest value within the measurement period. Field to be left blank for all types of TDM containers.";
+ }
+ leaf tx-ethernet-bytes-max-m {
+ type int64;
+ units "Bytes/min";
+ default -1;
+ config false;
+ description "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a minute and keeps the highest value with in the measurement period. Field to be left blank for all types of TDM containers.";
+ }
+ leaf tx-ethernet-bytes-sum {
+ type int64;
+ units "Bytes";
+ default -1;
+ config false;
+ description "Total number of Bytes of Ethernet traffic (before header compression) transmitted (in direction out of the device) during the measurement period. Field to be left blank for all types of TDM containers.";
+ }
+ leaf time-period {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total length of the measurement period in seconds.";
+ }
+ description "Consolidated performance information of the Container.";
+ }
+ grouping container-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses container-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping container-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses container-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+
+ /***********************
+ * package object-classes
+ **********************/
+ /***********************
+ * package air-interface
+ **********************/
+ list mw-air-interface-pac {
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container air-interface-capability {
+ config false;
+ uses air-interface-capability-g;
+ description "none";
+ }
+ container air-interface-configuration {
+ uses air-interface-configuration-g;
+ description "none";
+ }
+ container air-interface-status {
+ config false;
+ uses air-interface-status-g;
+ description "none";
+ }
+ container air-interface-current-problems {
+ config false;
+ uses air-interface-current-problems-g;
+ description "none";
+ }
+ container air-interface-current-performance {
+ config false;
+ uses air-interface-current-performance-g;
+ description "none";
+ }
+ container air-interface-historical-performances {
+ config false;
+ uses air-interface-historical-performances-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping air-interface-capability-g {
+ leaf type-of-equipment {
+ type string;
+ default "Type of equipment not yet defined.";
+ config false;
+ description "This parameter indicates the equipment type. Instead of uploading the complete set of capabilities, capabilities of the same equipment type could be reused. Should be unique for a combination of modem, radio and their respective firmware.";
+ }
+ leaf tx-frequency-min {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Value of the minimum transmit frequency tunable at the air interface.";
+ }
+ leaf tx-frequency-max {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Value of the maximum transmit frequency tunable at the air interface.";
+ }
+ leaf rx-frequency-min {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Value of the minimum receive frequency tunable at the air interface.";
+ }
+ leaf rx-frequency-max {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Value of the maximum receive frequency tunable at the air interface.";
+ }
+ leaf adaptive-modulation-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the device is capable of adaptive modulation, this field shall contain a 'true'.";
+ }
+ leaf mimo-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the device is capable of MIMO, this field shall contain a 'true'.";
+ }
+ leaf mimo-channels {
+ type int8;
+ units "channels";
+ default 1;
+ config false;
+ description "Maximum number (n) of spatial multiplexing streams that can be conveyed by an n x n MIMO configuration.";
+ }
+ leaf alic-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the microwave radio is capable of Adjacent Link Interference Cancelation (canceling of interference cause by transmitters located at the same site), this field shall contain a 'true'.";
+ }
+ leaf atpc-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the microwave radio is capable of ATPC, this field shall contain a 'true'.";
+ }
+ leaf atpc-range {
+ type int8;
+ units "dB";
+ default 0;
+ config false;
+ description "Extent of the ATPC range. This value represents a device specific maximum value. The actual range of the ATPC at a specific link might be limited by the difference between configured transmit power (AirInterface::AirInterfaceConfiguration::txPower) and minimum transmit power of the device (TypeDefinitions::TransmissionModeType::txPowerMin).";
+ }
+ leaf encryption-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Shall be marked 'true', if payload encryption is available.";
+ }
+ leaf-list supported-loop-back-kind-list {
+ type loop-back-type;
+ config false;
+ min-elements 1;
+ max-elements 2;
+ description "List of supported kinds of looping back of header information to the remote site.";
+ }
+ leaf maintenance-timer-range {
+ type string;
+ units "s";
+ default "Range of the maintenance timer not yet defined.";
+ config false;
+ description "Available time periods for maintenance configurations (e.g. the loop back of microwave header information) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360').";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 7;
+ description "Available alarms to be listed. Mandatory:'signalIsLost','rslIsExceeded','signalIDMismatching','temperatureIsExceeded','modemIsFaulty','radioIsFaulty' and 'modulationIsDownShifted'. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:'signalIsLost','rslIsExceeded','temperatureIsExceeded','modemIsFaulty','radioIsFaulty' and 'modulationIsDownShifted'. Further alarms might be added by the device. Names are to be separated by commas.";
+ }
+ list supported-channel-plan-list {
+ key 'supported-channel-plan';
+ config false;
+ min-elements 1;
+ uses channel-plan-type-g;
+ description "List of channel spacing that are supported by the device.";
+ }
+ description "Describes the 'analog' capabilities of modem and transmitter of the microwave device. Value ranges of attributes are not independently (e.g. min. and max. transmit power depends on modulation). Legal combinations of values are expressed in transmissionModeTypes.";
+ }
+ grouping air-interface-configuration-g {
+ leaf air-interface-name {
+ type string;
+ default "Air interface ID not yet defined.";
+ description "Operator specific microwave link ID (often used for coding area, type of element and sequential number).";
+ }
+ leaf remote-air-interface-name {
+ type string;
+ default "Air interface ID at the remote site not yet defined.";
+ description "Name of the air interface, which belongs to the same link, at the remote site.";
+ }
+ leaf expected-signal-id {
+ type int16;
+ description "If set on '0', the receiver ignores the signal ID of the received signal. If set on any other value, the receiver exclusively synchronizes on signals with the same signal ID.";
+ }
+ leaf transmitted-signal-id {
+ type int16;
+ description "Transmitted radio signal ID for synchronizing the receiver.";
+ }
+ leaf radio-signal-id {
+ type string;
+ default "Radio signal ID not yet defined.";
+ status deprecated;
+ description "The radioSignalId is transmitted on the air interface so the remote site of the link synchronizes on the correct transmitter. The local radio MUST NOT synchronize on a radio signal with a different radioSignalId. The link ID is neither an ID necessary to span the model nor an ID referencing external data. It is just some sort of name of the link transmitted so the correct remote site can be identified in an interference situation. The value zero might be used to make the microwave to disable the link ID check.";
+ }
+ leaf tx-frequency {
+ type int32;
+ units "kHz";
+ default -1;
+ description "Center frequency of the transmit channel. The values to be configured have to exactly match the values listed in the international agreement referenced in channelPlanID. In case of automated selection of the transmit frequency this field shall describe the lowest center frequency selectable.";
+ }
+ leaf rx-frequency {
+ type int32;
+ units "kHz";
+ default -1;
+ description "Center frequency of the receive channel.";
+ }
+ leaf transmission-mode-min {
+ type core-model:universal-id;
+ description "Minimum transmission mode to be configured (in case adaptive modulation is not used, this value represents also the fixed transmission mode).";
+ }
+ leaf transmission-mode-max {
+ type core-model:universal-id;
+ description "Maximum transmission mode to be configured.";
+ }
+ leaf tx-channel-bandwidth {
+ type int32;
+ units "kHz";
+ default -1;
+ status deprecated;
+ description "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;";
+ }
+ leaf rx-channel-bandwidth {
+ type int32;
+ units "kHz";
+ default -1;
+ description "Bandwidth of the receive channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;";
+ }
+ leaf polarization {
+ type polarization-type;
+ default not-specified;
+ description "Allows documenting the polarization of the air interface.";
+ }
+ leaf power-is-on {
+ type boolean;
+ default true;
+ description "Power ON. Activation of the entire radio in a split mount configuration shall be expressed as a 'true'.";
+ }
+ leaf transmitter-is-on {
+ type boolean;
+ default false;
+ description "Activation of the transmitter inside the radio shall be expressed as a 'true'.";
+ }
+ leaf receiver-is-on {
+ type boolean;
+ default true;
+ description "Maintenance Feature. Activation of the receiver inside the radio shall be expressed as a 'true'. Attribute shall also be used for RX main and RX diversity squelches in case of diversity configurations.
+ ";
+ }
+ leaf tx-power {
+ type int8;
+ units "dBm";
+ default 99;
+ description "Transmit power to be configured on the microwave link. Signed Byte is required. The actually operated transmit power might be lower depending on adaptive modulation and ATPC.";
+ }
+ leaf adaptive-modulation-is-on {
+ type boolean;
+ default false;
+ description "Adaptive Modulation. Activation of adaptive modulation shall be expressed as a 'true'.";
+ }
+ leaf modulation-min {
+ type int16;
+ units "symbols";
+ default -1;
+ status deprecated;
+ description "Minimum modulation to be configured (in case adaptive modulation is not used, this value represents also the fixed modulation). The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme.";
+ }
+ leaf modulation-max {
+ type int16;
+ units "symbols";
+ default -1;
+ status deprecated;
+ description "Maximum modulation to be configured. The value of this field is only relevant, if Adaptive Modulation has been activated. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme.";
+ }
+ leaf xpic-is-on {
+ type boolean;
+ default false;
+ description "Activation of Cross Polarization Interference Cancelation shall be expressed as a 'true'. In case XPIC is not available for the current combination of channel bandwidth and modulation or the hardware in general, this parameter shall always be set to 'false'.";
+ }
+ leaf mimo-is-on {
+ type boolean;
+ default false;
+ description "Activation of Multiple Input Multiple Output (MIMO) shall be expressed as a 'true'.";
+ }
+ leaf alic-is-on {
+ type boolean;
+ default false;
+ description "Activation of Adjacent Link Interference Cancelation (ALIC) shall be expressed as a 'true'.";
+ }
+ leaf atpc-is-on {
+ type boolean;
+ default false;
+ description "ATPC. Activation of Automated Transmit Power Control shall be expressed as a 'true'.";
+ }
+ leaf atpc-thresh-upper {
+ type int16;
+ units "dBm";
+ default 99;
+ description "If the receive level is higher than the upper threshold value, the transmitter is notified to decrease transmit power.";
+ }
+ leaf atpc-thresh-lower {
+ type int16;
+ units "dBm";
+ default 99;
+ description "If the receive level is lower than the lower threshold value, the transmitter is notified to increase transmit power.";
+ }
+ leaf atpc-tx-power-min {
+ type int8;
+ units "dBm";
+ default -99;
+ description "Transmit power, which is not to be undercut, while operating ATPC.";
+ }
+ leaf auto-freq-select-is-on {
+ type boolean;
+ default false;
+ description "Activation of automatically selecting the transmit frequency in unlicensed bands shall be expressed as a 'true'.";
+ }
+ leaf auto-freq-select-range {
+ type int8;
+ units "channels";
+ default -1;
+ description "Number of transmit channels (starting at the center frequency defined in txFrequency and with channel bandwidth according to txChannelBandwidth) that define the range within the transmit frequency can automatically been chosen. ";
+ }
+ leaf modulation-is-on {
+ type boolean;
+ default true;
+ description "Maintenance Feature. De-activation of the modulation of the carrier signal for fault management shall be expressed as a 'false'.";
+ }
+ leaf encryption-is-on {
+ type boolean;
+ default false;
+ description "Activates encryption of the payload.";
+ }
+ leaf cryptographic-key {
+ type string;
+ default "Cryptographic key not yet defined.";
+ description "Key for transforming plaintext into ciphertext data.";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list threshold-cross-alarm-list {
+ key 'g826-value-kind granularity-period';
+ max-elements 6;
+ uses threshold-cross-alarm-type-g;
+ description "List of threshold cross alarms to be configured.";
+ }
+ leaf loop-back-kind-on {
+ type loop-back-type;
+ default none;
+ description "Maintenance Feature. The currently configured type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site.";
+ }
+ leaf maintenance-timer {
+ type int32;
+ units "s";
+ default -1;
+ description "Time of existence of any maintenance configuration (e.g. the loop back of microwave header information). Valid values are defined in AirInterface::AirInterfaceCapability::maintenanceTimerRange.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 6;
+ uses air-interface-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "Configuration of the radio link.";
+ }
+ grouping air-interface-status-g {
+ leaf tx-frequency-cur {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Center frequency of the currently operated transmit channel.";
+ }
+ leaf rx-frequency-cur {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Center frequency of the currently operated receive channel.";
+ }
+ leaf tx-level-cur {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Current transmit level.";
+ }
+ leaf rx-level-cur {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Current receive level.";
+ }
+ leaf transmission-mode-cur {
+ type leafref {
+ path '/mw-air-interface-pac/air-interface-capability/supported-channel-plan-list/transmission-mode-list/transmission-mode-id';
+ }
+ config false;
+ description "Currently operated transmission mode according to definitions in Capabilities.";
+ }
+ leaf modulation-cur {
+ type int16;
+ units "symbols";
+ default -1;
+ config false;
+ status deprecated;
+ description "Currently operated modulation on transmit path. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme.";
+ }
+ leaf code-rate-cur {
+ type int8;
+ units "%";
+ default -1;
+ config false;
+ status deprecated;
+ description "Code rate of the currently operated coding scheme (Net bit rate ? Gross bit rate ? code rate).";
+ }
+ leaf received-signal-id {
+ type int16;
+ default -1;
+ config false;
+ description "ID of the signal, which the receiver is currently synchronized on.";
+ }
+ leaf snir-cur {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Currently measured signal to (noise+interference) ratio.";
+ }
+ leaf xpd-cur {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Currently measured cross polarization discrimination.";
+ }
+ leaf rf-temp-cur {
+ type int8;
+ units "Celsius";
+ default -99;
+ config false;
+ description "Current temperature (in degree Celsius) of the radio module inside the outdoor unit.";
+ }
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time the Air Interface entered its current operational status. ";
+ }
+ leaf radio-power-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If the radio unit has power and is switched on, this shall be expressed as a 'true'.";
+ }
+ leaf link-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If connection is established to the remote site with the same linkID, this shall be expressed as a 'true'.";
+ }
+ leaf xpic-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If XPIC is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf mimo-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If MIMO is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf alic-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If Adjacent Link Interference Cancelation (ALIC) is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf atpc-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If ATPC is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf auto-freq-select-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If automated frequency selection is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf loop-back-kind-up {
+ type loop-back-type;
+ default none;
+ config false;
+ description "The currently active (not just configured) type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site.";
+ }
+ leaf local-end-point-id {
+ type string;
+ default "not-supported";
+ config false;
+ description "The value of the localEndPointId is a vendor specific identifier of the air interface, used by the node to discover a microwave radio link.";
+ }
+ leaf remote-end-point-id {
+ type string;
+ default "not-supported";
+ config false;
+ description "The value of the remoteEndPointId is a vendor specific identifier or the airinterface at the remote side, used to by the node to discover a microwave radio link.";
+ }
+ description "Measurements of current values on the air interface and operational status of the device.";
+ }
+ grouping air-interface-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses air-interface-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping air-interface-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses air-interface-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the air interface at a particular moment.";
+ }
+ grouping air-interface-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses air-interface-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the air interface for a pre-defined measurement interval.";
+ }
+ list co-channel-group {
+ key 'co-channel-group-id';
+ uses co-channel-group-g;
+ description "none";
+ }
+ grouping co-channel-group-g {
+ leaf co-channel-group-id {
+ type core-model:universal-id;
+ description "none";
+ }
+ leaf-list air-interface-list {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:uuid';
+ }
+ description "List of air interfaces, which are part of the co-channel (XPIC, MIMO, ALIC) group.";
+ }
+ leaf sort-of-co-channel-group {
+ type string;
+ default "Kind of co-channel group not specified.";
+ description "Type of group of air interfaces with the same transmit and receive frequency. The values shall be chosen from the following _list:'XPIC', 'MIMO', 'ALIC';";
+ }
+ leaf-list logical-termination-point {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:uuid';
+ }
+ status deprecated;
+ description "none";
+ }
+ description "Required for configuring XPIC, MIMO and ALIC.";
+ }
+
+ /***********************
+ * package air-interface-hsb
+ **********************/
+ list mw-air-interface-hsb-end-point-pac {
+ key 'endpoint';
+ leaf role {
+ type role-type;
+ default working;
+ description "none";
+ }
+ leaf endpoint {
+ type leafref {
+ path '/core-model:forwarding-construct/core-model:fc-port/core-model:uuid';
+ }
+ description "none";
+ }
+ description "The EndPoint (EP) object class models the access to the FC function. Each EndPoint instance has a role (e.g., working, protection, protected, hub, spoke, leaf, root, etc.) with respect to the FC function. The association of the FC to LTPs is made via EndPoints (essentially the ports of the FC) where each EndPoint (EP) of the FC has a role in the context of the FC. The traffic forwarding between the associated End PointsEPs of the FC depends upon the type of FC and may be associated with FCSwitch object instances. In cases where there is protection conveys the protecting role of the access to the FC. The EP replaces the Protection Unit of a traditional protection model. It represents a protected (resilient/reliable) point or a protecting (unreliable working or protection) point.";
+ }
+ list mw-air-interface-hsb-fc-switch-pac {
+ key 'fcswitch';
+ leaf prot-type {
+ type protection-type;
+ default hsb;
+ description "Indicates the protection scheme that is used for the ProtectionGroup.";
+ }
+ leaf air-interface-hsb-configuration-is-faulty-severity {
+ type severity-type;
+ default warning;
+ description "The level of severity of an airInterfaceHsbConfigurationIsFaulty alarm shall be chosen from an enumeration.";
+ }
+ leaf air-interface-hsb-is-partly-down-severity {
+ type severity-type;
+ default warning;
+ description "The level of severity for one link out of the HSB configuration being down shall be chosen from an enumeration.";
+ }
+ leaf air-interface-hsb-is-down-severity {
+ type severity-type;
+ default warning;
+ description "The level of severity of the total HSB configuration being down shall be chosen from an enumeration.";
+ }
+ leaf fcswitch {
+ type leafref {
+ path '/core-model:forwarding-construct/core-model:fc-switch/core-model:uuid';
+ }
+ description "none";
+ }
+ description "Represents and defines a protection switch structure encapsulated in the forwarding construct. Essentially performs the function of Protection Group. Associates to 2 or more Endpoints each playing the role of a Protection Unit. One or more protection EndPoints (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) Endpoints where either protection or working can feed one or more protected Endpoint. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1). May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state.";
+ }
+
+ /***********************
+ * package air-interface-diversity
+ **********************/
+ list mw-air-interface-diversity-pac {
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container air-interface-diversity-capability {
+ config false;
+ uses air-interface-diversity-capability-g;
+ description "none";
+ }
+ container air-interface-diversity-configuration {
+ uses air-interface-diversity-configuration-g;
+ description "none";
+ }
+ container air-interface-diversity-status {
+ config false;
+ uses air-interface-diversity-status-g;
+ description "none";
+ }
+ container air-interface-diversity-current-problems {
+ config false;
+ uses air-interface-diversity-current-problems-g;
+ description "none";
+ }
+ container air-interface-diversity-current-performance {
+ config false;
+ uses air-interface-diversity-current-performance-g;
+ description "none";
+ }
+ container air-interface-diversity-historical-performances {
+ config false;
+ uses air-interface-diversity-historical-performances-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-capability-g {
+ list available-kinds-of-diversity {
+ key 'diversity-name';
+ config false;
+ uses diversity-type-g;
+ description "Available types of diversity to be listed.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 2;
+ description "Available alarms to be listed. Mandatory:'airInterfaceDiversityConfigurationIsPartlyDown' (at least one air interface is down, but not all of them) and 'airInterfaceDiversityConfigurationIsDown' (all air interfaces are down). Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:'airInterfaceDiversityConfigurationIsPartlyDown' (at least one air interface is down, but not all of them) and 'airInterfaceDiversityConfigurationIsDown' (all air interfaces are down). Further alarms might be added by the device. Names are to be separated by commas.";
+ }
+ description "Describes the capabilities in implementing different types of air interface diversity.";
+ }
+ grouping air-interface-diversity-configuration-g {
+ container air-interface-diversity {
+ uses diversity-type-g;
+ description "Type of air interface diversity configured at the link.";
+ }
+ leaf-list air-interface-ltp-list {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:uuid';
+ }
+ min-elements 2;
+ description "_multiplicity:2-ThisAirInterfaceDiversity::AirInterfaceDiversityConfiguration::airInterfaceDiversity::diversityType::numberOfAirInterfacesMax";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list threshold-cross-alarm-list {
+ key 'g826-value-kind granularity-period';
+ max-elements 6;
+ uses threshold-cross-alarm-type-g;
+ description "List of threshold cross alarms to be configured.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 3;
+ uses air-interface-diversity-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-status-g {
+ leaf snir-cur {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Currently measured signal to (noise+interference) ratio of the combined signals.";
+ }
+ leaf air-interface-diversity-status {
+ type air-interface-diversity-status-type;
+ default group-down;
+ config false;
+ description "Status of the air interface bundle. ";
+ }
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time the Diversity Group entered its current operational status. ";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses air-interface-diversity-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses air-interface-diversity-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the air interface diversity configuration at a particular moment.";
+ }
+ grouping air-interface-diversity-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses air-interface-diversity-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the air interface diversity configuration for a pre-defined measurement interval.";
+ }
+
+ /***********************
+ * package pure-ethernet-structure
+ **********************/
+ list mw-pure-ethernet-structure-pac {
+ if-feature pure-ethernet;
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container pure-ethernet-structure-capability {
+ config false;
+ uses pure-ethernet-structure-capability-g;
+ description "none";
+ }
+ container pure-ethernet-structure-configuration {
+ uses pure-ethernet-structure-configuration-g;
+ description "none";
+ }
+ container pure-ethernet-structure-status {
+ config false;
+ uses pure-ethernet-structure-status-g;
+ description "none";
+ }
+ container pure-ethernet-structure-current-problems {
+ config false;
+ uses pure-ethernet-structure-current-problems-g;
+ description "none";
+ }
+ container pure-ethernet-structure-current-performance {
+ config false;
+ uses pure-ethernet-structure-current-performance-g;
+ description "none";
+ }
+ container pure-ethernet-structure-historical-performances {
+ config false;
+ uses pure-ethernet-structure-historical-performances-g;
+ description "none";
+ }
+ description "The pureEthernetStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting Ethernet traffic only.";
+ }
+ grouping pure-ethernet-structure-capability-g {
+ leaf structure-id {
+ type core-model:universal-id;
+ config false;
+ description "Identifies the Structure for bundling and container.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the device.";
+ }
+ description "Describes the logical structuring of the physical capacity provided by a pure Ethernet microwave device. Segmentation is not available. No fixed segment size. No TDM transport.";
+ }
+ grouping pure-ethernet-structure-configuration-g {
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ uses structure-problem-severity-type-g;
+ description "Severity of the type of problem to be configured.";
+ }
+ description "none";
+ }
+ grouping pure-ethernet-structure-status-g {
+ container segment-status-list {
+ config false;
+ uses segment-status-type-g;
+ description "Status of the Ethernet transport segment. Always just one segment.";
+ }
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time and date of the last update of the status information. ";
+ }
+ description "none";
+ }
+ grouping pure-ethernet-structure-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses structure-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping pure-ethernet-structure-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses structure-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the structure of an pure Ethernet microwave at a particular moment.";
+ }
+ grouping pure-ethernet-structure-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses structure-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the structure of an pure Ethernet microwave for a pre-defined measurement interval.";
+ }
+ feature pure-ethernet {
+ description "Feature 'pure-ethernet' is mandatory for device types transporting pure Ethernet.";
+ }
+
+ /***********************
+ * package hybrid-mw-structure
+ **********************/
+ list mw-hybrid-mw-structure-pac {
+ if-feature hybrid-microwave;
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container hybrid-mw-structure-capability {
+ config false;
+ uses hybrid-mw-structure-capability-g;
+ description "none";
+ }
+ container hybrid-mw-structure-configuration {
+ uses hybrid-mw-structure-configuration-g;
+ description "none";
+ }
+ container hybrid-mw-structure-status {
+ config false;
+ uses hybrid-mw-structure-status-g;
+ description "none";
+ }
+ container hybrid-mw-structure-current-problems {
+ config false;
+ uses hybrid-mw-structure-current-problems-g;
+ description "none";
+ }
+ container hybrid-mw-structure-current-performance {
+ config false;
+ uses hybrid-mw-structure-current-performance-g;
+ description "none";
+ }
+ container hybrid-mw-structure-historical-performances {
+ config false;
+ uses hybrid-mw-structure-historical-performances-g;
+ description "none";
+ }
+ description "The HybridMwStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM and Ethernet traffic.";
+ }
+ grouping hybrid-mw-structure-capability-g {
+ leaf structure-id {
+ type core-model:universal-id;
+ config false;
+ description "Identifies the Structure for bundling and container.";
+ }
+ list supported-tdm-structure-types-list {
+ key 'tdm-structure-name';
+ config false;
+ min-elements 1;
+ uses tdm-structure-type-g;
+ description "Lists the TDM frame types that are supported.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the device.";
+ }
+ description "Describes the logical structuring of the physical capacity provided by a hybrid microwave device (TDM + Ethernet). Segmentation is available. TDM transport is available.";
+ }
+ grouping hybrid-mw-structure-configuration-g {
+ container structure-kind {
+ uses tdm-structure-type-g;
+ description "TDM frame to be applied.";
+ }
+ container structure-type {
+ uses tdm-structure-type-g;
+ status deprecated;
+ description "TDM frame to be applied.";
+ }
+ leaf number-of-tdm-segments-to-be-reserved {
+ type int16;
+ default -1;
+ description "Allows to configure the number of segments reserved for TDM frames of the type specified in HybridMwStructure::HybridMwStructureConfiguration::structureType";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ uses structure-problem-severity-type-g;
+ description "Severity of the type of problem to be configured.";
+ }
+ description "none";
+ }
+ grouping hybrid-mw-structure-status-g {
+ list segment-status-list {
+ key 'segment-status-type-id';
+ config false;
+ uses segment-status-type-g;
+ description "Status of each segment (all TDM and one Ethernet). Multiplicity = HybridMwStructure::StructureConfiguration::tdmReservedNumberOfSegments + 1";
+ }
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time and date of the last update of the status information. ";
+ }
+ description "none";
+ }
+ grouping hybrid-mw-structure-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses structure-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping hybrid-mw-structure-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses structure-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the structure of a hybrid microwave at a particular moment.";
+ }
+ grouping hybrid-mw-structure-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses structure-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the structure of a hybrid microwave for a pre-defined measurement interval.";
+ }
+ feature hybrid-microwave {
+ description "Feature 'hybrid-microwave' is mandatory for device types transporting Ethernet + TDM.";
+ }
+
+ /***********************
+ * package ethernet-container
+ **********************/
+ list mw-ethernet-container-pac {
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container ethernet-container-capability {
+ config false;
+ uses ethernet-container-capability-g;
+ description "none";
+ }
+ container ethernet-container-configuration {
+ uses ethernet-container-configuration-g;
+ description "none";
+ }
+ container ethernet-container-status {
+ config false;
+ uses ethernet-container-status-g;
+ description "none";
+ }
+ container ethernet-container-current-problems {
+ config false;
+ uses ethernet-container-current-problems-g;
+ description "none";
+ }
+ container ethernet-container-current-performance {
+ config false;
+ uses ethernet-container-current-performance-g;
+ description "none";
+ }
+ container ethernet-container-historical-performances {
+ config false;
+ uses ethernet-container-historical-performances-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping ethernet-container-capability-g {
+ leaf bundling-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "This attribute has to be set on 'true', if the device allows combining resources from several air interfaces for transporting this Ethernet container.";
+ }
+ leaf packet-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case packet compression can be activated, but not configured to a certain type, packetCompressionAvail shall be set on 'true', but none of the compression level specific booleans.";
+ }
+ leaf layer2-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer 2 available at the device.";
+ }
+ leaf vlan-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on VLAN layer available at the device.";
+ }
+ leaf q-in-q-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer of a second VLAN available at the device.";
+ }
+ leaf mpls-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on mpls layer available at the device.";
+ }
+ leaf ipv4-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer 3 for IPv4 available at the device.";
+ }
+ leaf ipv6-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer 3 for IPv6 available at the device.";
+ }
+ leaf layer4-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer 4 (TCP and UDP header) available at the device.";
+ }
+ leaf encryption-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Shall be marked 'true', if Ethernet payload encryption is available.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 2;
+ description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device.";
+ }
+ description "none";
+ }
+ grouping ethernet-container-configuration-g {
+ leaf container-id {
+ type string;
+ default "No Ethernet Flow associated yet.";
+ description "ContainterID in Netconf must be the same as EthernetPortID in OpenFlow so a connection can be made between the two items, which separately exist in the controller.";
+ }
+ list segments-id-list {
+ key 'structure-id-ref segment-id-ref';
+ min-elements 1;
+ uses segment-id-type-g;
+ description "Lists the segments used for transporting this Ethernet container. In case EthernetContainer::ContainerCapability::bundlingIsAvail==0, all TypeDefinitions::segmentIdType::structureId must be identical in the list.";
+ }
+ leaf packet-compression-is-on {
+ type boolean;
+ default false;
+ description "In case packet compression is activated, but no type is activated, it is assumed that the device chooses the optimum.";
+ }
+ leaf layer2-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer 2 configured at the device.";
+ }
+ leaf vlan-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on VLAN layer configured at the device.";
+ }
+ leaf q-in-q-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer of a second VLAN configured at the device.";
+ }
+ leaf mpls-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on MPLS layer configured at the device.";
+ }
+ leaf ipv4-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer 3 for IPv4 configured at the device.";
+ }
+ leaf ipv6-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer 3 for IPv6 configured at the device.";
+ }
+ leaf layer4-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer 4 (TCP and UDP header) configured at the device.";
+ }
+ leaf encryption-is-on {
+ type boolean;
+ default false;
+ description "Activates encryption of the Ethernet payload.";
+ }
+ leaf cryptographic-key {
+ type string;
+ default "Cryptographic key not yet defined.";
+ description "Key for transforming plaintext into cipher text data.";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 2;
+ uses container-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "none";
+ }
+ grouping ethernet-container-status-g {
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time the Container entered its current operational status. ";
+ }
+ description "none";
+ }
+ grouping ethernet-container-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses container-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping ethernet-container-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses container-current-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the Ethernet container at a particular moment.";
+ }
+ grouping ethernet-container-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses container-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the Ethernet container for a pre-defined measurement interval.";
+ }
+
+ /***********************
+ * package tdm-container
+ **********************/
+ list mw-tdm-container-pac {
+ if-feature hybrid-microwave;
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container tdm-container-capability {
+ config false;
+ uses tdm-container-capability-g;
+ description "none";
+ }
+ container tdm-container-configuration {
+ uses tdm-container-configuration-g;
+ description "none";
+ }
+ container tdm-container-status {
+ config false;
+ uses tdm-container-status-g;
+ description "none";
+ }
+ container tdm-container-current-problems {
+ config false;
+ uses tdm-container-current-problems-g;
+ description "none";
+ }
+ container tdm-container-current-performance {
+ config false;
+ uses tdm-container-current-performance-g;
+ description "none";
+ }
+ container tdm-container-historical-performances {
+ config false;
+ uses tdm-container-historical-performances-g;
+ description "none";
+ }
+ description "The TdmContainer_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM traffic.";
+ }
+ grouping tdm-container-capability-g {
+ list supported-tdm-container-types-list {
+ key 'tdm-container-name';
+ config false;
+ min-elements 1;
+ uses tdm-container-type-g;
+ description "Lists the TDM containers that are supported.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 2;
+ description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device.";
+ }
+ description "Bundling is not available.";
+ }
+ grouping tdm-container-configuration-g {
+ leaf container-id {
+ type string;
+ default "No TDM Flow associated yet.";
+ description "ContainterID in Netconf must be the same as TDM Flow ID so a connection can be made between the two items, which separately exist in the controller.";
+ }
+ container container-type {
+ uses tdm-container-type-g;
+ description "Type of TDM container.";
+ }
+ container segment-id {
+ uses segment-id-type-g;
+ description "Multiplicity = 1; One segment per TDM container; Type of segment must match type of container;";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 2;
+ uses container-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "none";
+ }
+ grouping tdm-container-status-g {
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time the Container entered its current operational status. ";
+ }
+ description "none";
+ }
+ grouping tdm-container-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses container-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping tdm-container-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses container-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the TDM container at a particular moment.";
+ }
+ grouping tdm-container-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses container-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the TDM container for a pre-defined measurement interval.";
+ }
+
+ /***********************
+ * package super-classes
+ **********************/
+ grouping mw-current-problem-g {
+ leaf sequence-number {
+ type int32;
+ config false;
+ description "Unique sequence number of the current problem object.";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time and date of the problem. ";
+ }
+ leaf problem-severity {
+ type severity-type;
+ default warning;
+ config false;
+ description "Severity of the alarm.";
+ }
+ description "none";
+ }
+
+
+ /***********************
+ * package notifications
+ **********************/
+ notification object-creation-notification {
+ uses object-creation-notification-g;
+ description "none";
+ }
+ grouping object-creation-notification-g {
+ leaf counter {
+ type int32;
+ default -1;
+ description "Counts object creation notifications.";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ description "none";
+ }
+ leaf object-id-ref {
+ type core-model:universal-id;
+ description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+ leaf object-type {
+ type string;
+ default "Type of created object not specified.";
+ description "Type of Object to be chosen from the following list of values: 'MW_AirInterface_Pac', 'MW_AirInterfaceDiversity_Pac', 'MW_Structure_Pac', 'MW_PureEthernetStructure_Pac', 'MW_HybridMwStructure_Pac', 'MW_Container_Pac', 'MW_EthernetContainer_Pac' or 'MW_TdmContainer_Pac'.";
+ }
+ description "To be sent when a new MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac has to be instancieted in the controller.";
+ }
+ notification object-deletion-notification {
+ uses object-deletion-notification-g;
+ description "none";
+ }
+ grouping object-deletion-notification-g {
+ leaf counter {
+ type int32;
+ default -1;
+ description "Counts object deletion notifications.";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ description "none";
+ }
+ leaf object-id-ref {
+ type core-model:universal-id;
+ description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+ description "To be sent when a new MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac instance has to be deleted in the controller.";
+ }
+ notification attribute-value-changed-notification {
+ uses attribute-value-changed-notification-g;
+ description "none";
+ }
+ grouping attribute-value-changed-notification-g {
+ leaf counter {
+ type int32;
+ default -1;
+ description "Counts attribute value changed notifications.";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ description "none";
+ }
+ leaf object-id-ref {
+ type core-model:universal-id;
+ description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+ leaf attribute-name {
+ type string;
+ default "Attribute name not specified.";
+ description "Name of the attribute that has been changed.";
+ }
+ leaf new-value {
+ type string;
+ default "New value not specified.";
+ description "Attribute value converted to a string (xml, json, ...)";
+ }
+ description "To be sent when an attribute has changed and one or more controllers have to update their data.";
+ }
+ notification problem-notification {
+ uses problem-notification-g;
+ description "none";
+ }
+ grouping problem-notification-g {
+ leaf counter {
+ type int32;
+ default -1;
+ description "Counts problem notifications";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ description "none";
+ }
+ leaf object-id-ref {
+ type core-model:universal-id;
+ description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+ leaf problem {
+ type string;
+ default "Problem name not specified.";
+ description "Name of the problem according to AirInterface::AirInterfaceCapability::supportedAlarms or AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms or Structure::StructureCapability::supportedAlarms or PureEthernetStructure::PureEthernetStructureCapability::supportedAlarms or HybridMwStructure::HybridMwStructureCapability::supportedAlarms or Container::ContainerCapability::supportedAlarms or EthernetContainer::EthernetContainerCapability::supportedAlarms or TdmContainer::TdmContainerCapability::supportedAlarms.";
+ }
+ leaf severity {
+ type severity-type;
+ default warning;
+ description "Severity of the problem according to AirInterface::AirInterfaceConfiguration::problemSeverityList, AirInterfaceDiversity::AirInterfaceDiversityConfiguration::problemSeverityList, Structure::StructureConfiguration::problemSeverityList, PureEthernetStructure::PureEthernetStructureConfiguration::problemSeverityList, HybridMwStructure::HybridMwStructureConfiguration::problemSeverityList, Container::ContainerConfiguration::problemSeverityList, EthernetContainer::EthernetContainerConfiguration::problemSeverityList or TdmContainer::TdmContainerConfiguration::problemSeverityList";
+ }
+ description "To be sent when a problem occurs at a MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2018-10-10.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2018-10-10.yang new file mode 100644 index 000000000..d13122d28 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/microwave-model@2018-10-10.yang @@ -0,0 +1,3581 @@ +module microwave-model {
+ namespace "urn:onf:params:xml:ns:yang:microwave-model";
+ prefix microwave-model; + + import core-model { + prefix core-model; + } + import g.874.1-model { + prefix g; + } + import ietf-yang-types { + prefix yang; + } +
+ organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project";
+ contact "WG Web: <https://www.opennetworking.org/software-defined-standards/models-apis/>
+ WG List: <mailto:wireless-transport@login.opennetworking.org>
+ WG Chair: Lyndon Ong
+ <mailto:lyong@ciena.com>
+ WG Chair: Giorgio Cazzaniga
+ <mailto:giorgio.cazzaniga@sm-optics.com>
+ Editors: Thorsten Heinze
+ <mailto:thorsten.heinze@telefonica.com>
+ Shrikanth Malavalli Divakar
+ <mailto:shrikanth.divakar@wipro.com>";
+ description "This module contains a collection of YANG definitions for managing wireless networks.
+ This model is for vendor agnostic management of wireless network elements.";
+ revision 2018-10-10 {
+ description "Version 1.1";
+ reference "ONF TR 532: A YANG Data Model for Wireless Networks.";
+ }
+ revision 2017-03-24 {
+ description "Initial version";
+ reference "ONF TR 532: A YANG Data Model for Wireless Networks.";
+ }
+ /***********************
+ * package type-definitions
+ **********************/
+ typedef loop-back-type {
+ type enumeration {
+ enum rf-to-remote {
+ description "Returning the header information of the remote site back to the remote site on the radio interface between both outdoor units.";
+ }
+ enum rf-to-local {
+ description "Returning the header information of the local site back to the local site on the radio interface between both outdoor units.";
+ }
+ enum if-to-remote {
+ description "Returning the header information of the remote site back to the remote site on the intermediate frequency interface between local indoor unit and outdoor unit.";
+ }
+ enum if-to-local {
+ description "Returning the header information of the local site back to the local site on the intermediate frequency interface between local indoor unit and outdoor unit.";
+ }
+ enum none {
+ description "none";
+ }
+ enum if {
+ status deprecated;
+ description "Intermediate Frequency on the interface between indoor and outdoor unit.";
+ }
+ enum rf {
+ status deprecated;
+ description "Radio Frequency on the interface between outdoor unit and outdoor unit at the remote site.";
+ }
+ }
+ description "none";
+ }
+ typedef severity-type {
+ type enumeration {
+ enum non-alarmed {
+ description "none";
+ }
+ enum warning {
+ description "none";
+ }
+ enum minor {
+ description "none";
+ }
+ enum major {
+ description "none";
+ }
+ enum critical {
+ description "none";
+ }
+ }
+ description "According to ITU-T M.3160";
+ }
+ grouping channel-plan-type-g {
+ leaf supported-channel-plan {
+ type string;
+ config false;
+ description "Unique name (e.g. ECC/REC/(01)04_Annex 5) of a document, which describes a frequency grid that can be adjusted at the air interface. Corresponding channel plans to be delivered by the hardware vendor and to be stored by the operator in an controller/application attached database.";
+ }
+ leaf duplex-distance-is-variable {
+ type boolean;
+ default false;
+ config false;
+ description "To be set on 'true', if the distance between transmitted and received frequency is variable.";
+ }
+ leaf-list duplex-distance-list {
+ type int32;
+ units "kHz";
+ config false;
+ min-elements 1;
+ description "Distance between transmitted and received frequency. To be filled with single value, in case duplex distance is not variable. To be filled with all configurable values, in case duplex distance is variable.";
+ }
+ leaf duplex-distance {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ status deprecated;
+ description "Distance between transmitted and received frequency.";
+ }
+ leaf auto-freq-select-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the microwave radio is capable of automatically selecting the transmit frequency in unlicensed bands, this field shall contain a 'true'.";
+ }
+ list transmission-mode-list {
+ key 'transmission-mode-id';
+ config false;
+ min-elements 1;
+ uses transmission-mode-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping transmission-mode-type-g {
+ leaf transmission-mode-id {
+ type core-model:universal-id;
+ description "Indentifies the transmissionMode for internal reference.";
+ }
+ leaf transmission-mode-name {
+ type string;
+ default "Name of the transmission mode not yet defined.";
+ config false;
+ description "Name of the transmission mode. BBBB-m*-i*/t*-r*. B=four digits of channel bandwidth in MHz. m*=required number of digits for modulation name. (i*/t*=code rate.) i*=required number of digits for number of information bits. t*=required number of digits for total bits. r*=required number of digits for rate reduction factor. Example: 028-4QAM-188/204-1";
+ }
+ leaf channel-bandwidth {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;";
+ }
+ leaf modulation-scheme {
+ type int16;
+ units "symbols";
+ default -1;
+ config false;
+ description "Modulation scheme, which is base to the other characteristics described in the same transmissionModeType data type. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256').";
+ }
+ leaf code-rate {
+ type int8;
+ units "%";
+ default -1;
+ config false;
+ description "Code rate of the coding scheme in % (Net bit rate ≤ Gross bit rate · code rate).";
+ }
+ leaf symbol-rate-reduction-factor {
+ type int8;
+ default 1;
+ config false;
+ description "Reduction factor for the symbol rate. Example: value would be 4 for 1/4BPSK.";
+ }
+ leaf tx-power-min {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the minimum transmit power the modem can operate in dBm.";
+ }
+ leaf tx-power-max {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the maximum transmit power the modem can operate in dBm.";
+ }
+ leaf rx-threshold {
+ type int16;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the receive level required to decode the received signal with a Bit Error Rate of 1e-6 or less.";
+ }
+ leaf am-upshift-level {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the receive level that has to be exceeded to shift into a higher modulation scheme.";
+ }
+ leaf am-downshift-level {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Value of the receive level that has to be exceeded for not shifting into a lower modulation scheme.";
+ }
+ leaf xpic-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case this air interface type is capable of XPIC, this field shall contain a 'true'. This information shall purely relate to capabilities of the equipment type, but not to the operational capability of a specific hardware composition on site. Means for example that this attribute might contain a 'true' statement, even if an additional cable would have been required to actually operate XPIC in a specific case.";
+ }
+ description "none";
+ }
+ typedef polarization-type {
+ type enumeration {
+ enum not-specified {
+ description "none";
+ }
+ enum horizontal {
+ description "none";
+ }
+ enum vertical {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef g826-type {
+ type enumeration {
+ enum es {
+ description "Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::es .";
+ }
+ enum ses {
+ description "Severely Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::ses .";
+ }
+ enum cses {
+ description "Consecutive Severely Errored Seconds. Threshold cross alarm will relate to TypeDefinitions::AirInterfacePerformanceType::cses .";
+ }
+ enum not-specified {
+ description "none";
+ }
+ }
+ description "none";
+ }
+
+ grouping threshold-cross-alarm-type-g {
+ leaf g826-value-kind {
+ type g826-type;
+ description "Kind of performance value that shall be equipped with a threshold alarm.";
+ }
+ leaf granularity-period {
+ type g:granularity-period-type;
+ description "Period of the performance data collection.";
+ }
+ leaf alarm-raising-threshold {
+ type int32;
+ units "s";
+ default -1;
+ description "Number of events required for raising the threshold cross alarm.";
+ }
+ leaf alarm-clearing-threshold {
+ type int32;
+ units "s";
+ default -1;
+ description "Number of events required for clearing the threshold cross alarm.";
+ }
+ description "Allows defining a threshold cross alarm.
+ ";
+ }
+ grouping air-interface-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping air-interface-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping time-x-states-type-g {
+ leaf transmission-mode {
+ type leafref{
+ path '/mw-air-interface-pac/air-interface-capability/supported-channel-plan-list/transmission-mode-list/transmission-mode-id';
+ }
+ config false;
+ description "Operated transmission mode.";
+ }
+ leaf time {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Sum of all seconds the transmitter operated the transmission mode.";
+ }
+ description "none";
+ }
+ grouping air-interface-performance-type-g {
+ leaf es {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of errored seconds.";
+ }
+ leaf ses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of severely errored seconds.";
+ }
+ leaf cses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of consecutive severely errored seconds.";
+ }
+ leaf unavailability {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total time of unavailability in seconds.";
+ }
+ leaf tx-level-min {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Minimum transmit power. Signed integers are required.";
+ }
+ leaf tx-level-max {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Maximum transmit power. Signed integers are required.";
+ }
+ leaf tx-level-avg {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Averaged transmit power. Signed integers are required.";
+ }
+ leaf rx-level-min {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Minimum receive level. Signed integers are required.";
+ }
+ leaf rx-level-max {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Maximum receive level. Signed integers are required.";
+ }
+ leaf rx-level-avg {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Averaged receive level. Signed integers are required.";
+ }
+ list time-x-states-list {
+ key 'transmission-mode';
+ config false;
+ min-elements 1;
+ uses time-x-states-type-g;
+ description "Time period the transmitter operated in the respective transmission mode.";
+ }
+ leaf time2-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "Sum of all seconds the transmitter operated in e.g. BPSK.";
+ }
+ leaf time4-states-s {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time4-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time8-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time16-states-s {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time16-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time32-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time64-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time128-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time256-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time512-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time512-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time1024-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time1024-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time2048-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time2048-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time4096-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time4096-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time8192-states {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf time8192-states-l {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ status deprecated;
+ description "none";
+ }
+ leaf snir-min {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Minimum signal to (noise+interference) ratio.";
+ }
+ leaf snir-max {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Maximum signal to (noise+interference) ratio.";
+ }
+ leaf snir-avg {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Averaged signal to (noise+interference) ratio.";
+ }
+ leaf xpd-min {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Minimum cross polarization discrimination.";
+ }
+ leaf xpd-max {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Maximum cross polarization discrimination.";
+ }
+ leaf xpd-avg {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Averaged cross polarization discrimination.";
+ }
+ leaf rf-temp-min {
+ type int8;
+ units "C";
+ default -99;
+ config false;
+ description "Lowest temperature (in degree Celsius) of the radio module inside the outdoor unit.";
+ }
+ leaf rf-temp-max {
+ type int8;
+ units "C";
+ default -99;
+ config false;
+ description "Highest temperature (in degree Celsius) of the radio module inside the outdoor unit.";
+ }
+ leaf rf-temp-avg {
+ type int8;
+ units "C";
+ default -99;
+ config false;
+ description "Averaged temperature (in degree Celsius) of the radio module inside the outdoor unit.";
+ }
+ leaf defect-blocks-sum {
+ type int16;
+ units "blocks";
+ default -1;
+ config false;
+ description "Total number of blocks that were defect after receiving and could not be corrected by the FEC.";
+ }
+ leaf time-period {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total length of the measurement period.";
+ }
+ description "Consolidated performance information of the air interface.";
+ }
+ grouping air-interface-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses air-interface-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping air-interface-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses air-interface-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+ typedef protection-type {
+ type enumeration {
+ enum hsb {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef role-type {
+ type enumeration {
+ enum working {
+ description "none";
+ }
+ enum protection {
+ description "none";
+ }
+ enum protected {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping diversity-type-g {
+ leaf diversity-name {
+ type string;
+ config false;
+ description "Names to be chosen from the following list: 'spaceDiversity', 'frequencyDiversity'";
+ }
+ leaf number-of-air-interfaces-max {
+ type int8;
+ units "air interfaces";
+ default 1;
+ config false;
+ description "Maximum number of air interfaces that could be part of this kind of diversity.";
+ }
+ description "none";
+ }
+ typedef air-interface-diversity-status-type {
+ type enumeration {
+ enum group-down {
+ description "All air interfaces that are members of the diversity configuration are down.";
+ }
+ enum not-all-ai-active {
+ description "At least one, but not all of the air interfaces that are part of the diversity configuration is not working.";
+ }
+ enum all-ai-active {
+ description "All air interfaces that are part of the diversity configuration are working.";
+ }
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping air-interface-diversity-performance-type-g {
+ leaf snir-min {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Minimum signal to (noise+interference) ratio of the combined signals.";
+ }
+ leaf snir-max {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Maximum signal to (noise+interference) ratio of the combined signals.";
+ }
+ leaf snir-avg {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Average signal to (noise+interference) ratio of the combined signals.";
+ }
+ description "Consolidated performance information of the air interface diversity group.";
+ }
+ grouping air-interface-diversity-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses air-interface-diversity-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping air-interface-diversity-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses air-interface-diversity-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+ grouping tdm-structure-type-g {
+ leaf tdm-structure-name {
+ type string;
+ config false;
+ description "Names to be chosen from the following list: 'e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'";
+ }
+ leaf tdm-segment-size {
+ type int32;
+ units "kbit/s";
+ default -1;
+ config false;
+ description "Size of the TDM segment in kbit/s. Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;";
+ }
+ leaf max-number-of-segments-reservable {
+ type int8;
+ units "segments";
+ default -1;
+ config false;
+ description "Device specific maximum number of segments (not depending on current air interface configuration) that can be reserved for this type of segment on a single air interface.";
+ }
+ description "none";
+ }
+ grouping structure-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to Structure::StructureCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping structure-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to Structure::StructureCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping structure-performance-type-g {
+ leaf time-period {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total length of the measurement period in seconds.";
+ }
+ leaf es {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals.";
+ }
+ leaf ses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of severely errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals.";
+ }
+ leaf cses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Number of consecutive severely errored seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals.";
+ }
+ leaf unavailability {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total time of unavailability in seconds. 1+0: Same value as for single air interface. 1+1 and Diversity: Value representing the combined signals.";
+ }
+ leaf rx-level-min {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Minimum receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value.";
+ }
+ leaf rx-level-max {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Maximum receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value.";
+ }
+ leaf rx-level-avg {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Averaged receive level. 1+0: Same value as for single air interface. 1+1: Value representing the combined signals. Diversity: To be left on default value.";
+ }
+ description "Consolidated performance information of the Structure.";
+ }
+ grouping structure-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses structure-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping structure-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses structure-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+ grouping container-type-g {
+ leaf container-name {
+ type string;
+ config false;
+ description "Names to be chosen from the following list: 'ethernet','e1','t1','j1','e3','ds3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'";
+ }
+ leaf number-of-time-slots-required {
+ type int16;
+ units "timeslots";
+ default -1;
+ config false;
+ description "Number of time slots required for transporting this type of container. Value must be calculated by the vendor after defining the timeSlotCapacity. For containers of fixed size: numberOfTimeSlotsRequired = required bandwidth of the container divided by timeSlotCapacity. For containers of variable size the minimum (most probably 1) is to be stated.";
+ }
+ leaf tdm-time-slots-is-required {
+ type boolean;
+ default false;
+ config false;
+ description "Shall be set to '1', if this container type requires bandwidth (times slots) reserved for TDM transport.";
+ }
+ leaf bundling-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "If it is possible to combine transport resources of several radio links to transport this container type, this attribute shall be set to '1'.";
+ }
+ description "none";
+ }
+ grouping tdm-container-type-g {
+ leaf tdm-container-name {
+ type string;
+ config false;
+ description "Names to be chosen from the following list: 'e1','t1','j1','e3','t3','stm1','cpri1','cpri2','cpri3','cpri4','cpri5','cpri6' or 'cpri7'";
+ }
+ leaf tdm-container-size {
+ type int32;
+ units "kbit/s";
+ default -1;
+ config false;
+ description "Capacity required for transporting this type of container (in kbit/s). Values to be chosen from the following list: '2048','1544','34000','44736 ','155520','614400','1228800','2457600','3072000','4915200','6144000' or '9830400;";
+ }
+ description "none";
+ }
+ grouping segment-id-type-g {
+ leaf structure-id-ref {
+ type core-model:universal-id;
+ description "none";
+ }
+ leaf segment-id-ref {
+ type int16;
+ description "Combinations of structureId and segmentId must be unique inside the device to assure that every resource is used just once.";
+ }
+ description "Identifies the segments, which are used to transport the container.";
+ }
+ grouping segment-status-type-g {
+ leaf segment-status-type-id {
+ type int16;
+ config false;
+ description "none";
+ }
+ leaf segment-is-reserved-for-tdm {
+ type boolean;
+ default false;
+ config false;
+ description "The number of segments, which is configured by Structure::StructureConfiguration::tdmReservedNumberOfSegements, has to be reserved for TDM. Starting from the lowest index value, these segments have to be marked with a 'true' in segmentIsReservedForTdm.
+ ";
+ }
+ leaf operational-status {
+ type core-model:operational-state;
+ default disabled;
+ config false;
+ description "Current operational status of each segment.";
+ }
+ leaf obsolete-priority-class {
+ type int8;
+ default -1;
+ config false;
+ description "PriorityClass as inherited from the associated Container::ContainerConfiguration::priorityClass. In case the device is capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, priorityClass shall be considered, while calculating the dropOrderRank.";
+ }
+ leaf obsolete-drop-order-rank {
+ type int16;
+ default -1;
+ config false;
+ description "In case the device is NOT capable of adapting the sequence, in which segments are being dropped in case of decreasing capacity of the air interface, dropOrderRank is number of segments minus sequence number of the segment. In case the device is capable of adapting the sequence, dropOrderRank has to be calculated by the device in dependency to the assigned priorityClass.
+ _unique: within Structure::StructureStatus::segmentStatusList";
+ }
+ description "none";
+ }
+ grouping container-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to Container::ContainerCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping container-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to Container::ContainerCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping container-performance-type-g {
+ leaf tx-ethernet-bytes-max-s {
+ type int32;
+ units "Bytes/s";
+ default -1;
+ config false;
+ description "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a second and keeps the highest value within the measurement period. Field to be left blank for all types of TDM containers.";
+ }
+ leaf tx-ethernet-bytes-max-m {
+ type int64;
+ units "Bytes/min";
+ default -1;
+ config false;
+ description "Counts the number of Bytes of Ethernet traffic (before header compression) transmitted within a minute and keeps the highest value with in the measurement period. Field to be left blank for all types of TDM containers.";
+ }
+ leaf tx-ethernet-bytes-sum {
+ type int64;
+ units "Bytes";
+ default -1;
+ config false;
+ description "Total number of Bytes of Ethernet traffic (before header compression) transmitted (in direction out of the device) during the measurement period. Field to be left blank for all types of TDM containers.";
+ }
+ leaf time-period {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "Total length of the measurement period in seconds.";
+ }
+ description "Consolidated performance information of the Container.";
+ }
+ grouping container-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses container-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping container-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses container-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+ typedef mii-kind-type {
+ type enumeration {
+ enum gbic {
+ description "none";
+ }
+ enum soldered-connector {
+ description "none";
+ }
+ enum sfp-sfp-plus-sfp28 {
+ description "none";
+ }
+ enum xbi-300-pin {
+ description "none";
+ }
+ enum xenpak {
+ description "none";
+ }
+ enum xfp {
+ description "none";
+ }
+ enum xfp-e {
+ description "none";
+ }
+ enum xpak {
+ description "none";
+ }
+ enum x2 {
+ description "none";
+ }
+ enum dwdm-sfp-sfp-plus {
+ description "none";
+ }
+ enum qsfp {
+ description "none";
+ }
+ enum qsfp-plus {
+ description "none";
+ }
+ enum cxp {
+ description "none";
+ }
+ enum shielded-mini-multilane-hd-4-x {
+ description "none";
+ }
+ enum shielded-mini-multilane-hd-8-x {
+ description "none";
+ }
+ enum qsfp28 {
+ description "none";
+ }
+ enum cxp2 {
+ description "none";
+ }
+ enum cdfp-style1-style2 {
+ description "none";
+ }
+ enum shielded-mini-multilane-hd-4-x-fan-out {
+ description "none";
+ }
+ enum shielded-mini-multilane-hd-8-x-fan-out {
+ description "none";
+ }
+ enum cdfp-style3 {
+ description "none";
+ }
+ enum qsfp-micro {
+ description "none";
+ }
+ enum qsfp-dd {
+ description "none";
+ }
+ enum qsfp-plus-rate-select-v1 {
+ description "none";
+ }
+ enum qsfp-plus-rate-select-v2 {
+ description "none";
+ }
+ enum not-yet-defined {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef mdi-kind-type {
+ type enumeration {
+ enum sc {
+ description "Subscriber Connector";
+ }
+ enum fibre-channel-style-1 {
+ description "Copper connector";
+ }
+ enum fibre-channel-style-2 {
+ description "Copper connector";
+ }
+ enum bnc-tnc {
+ description "Bayonet/Threaded Neill-Concelman";
+ }
+ enum fc {
+ description "Fibre Channel coax headers";
+ }
+ enum fiber-jack {
+ description "none";
+ }
+ enum lc {
+ description "Lucent Connector";
+ }
+ enum mt-rj {
+ description "Mechanical Transfer - Registered Jack";
+ }
+ enum mu {
+ description "Multiple Optical";
+ }
+ enum sg {
+ description "none";
+ }
+ enum optical-pigtail {
+ description "none";
+ }
+ enum mpo1-x12 {
+ description "Multifiber Parallel Optic";
+ }
+ enum mpo2-x16 {
+ description "Multifiber Parallel Optic";
+ }
+ enum hssdc-ii {
+ description "High Speed Serial Data Connector";
+ }
+ enum copper-pigtail {
+ description "none";
+ }
+ enum rj45 {
+ description "8P8C, according to Clause 3 and Figures 1 through 5 of IEC 60603-7";
+ }
+ enum no-seperable-connector {
+ description "none";
+ }
+ enum mxc2-x16 {
+ description "none";
+ }
+ enum st {
+ description "according to IEC 60874-10:1992, also often called BFOC/2.5";
+ }
+ enum not-yet-defined {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef medium-kind-type {
+ type enumeration {
+ enum tp-cat3 {
+ description "none";
+ }
+ enum tp-cat5 {
+ description "none";
+ }
+ enum tp-cat6 {
+ description "none";
+ }
+ enum tp-cat8 {
+ description "none";
+ }
+ enum single-mode {
+ description "none";
+ }
+ enum multi-mode {
+ description "none";
+ }
+ enum not-yet-defined {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef pmd-name-type {
+ type enumeration {
+ enum 10-base5 {
+ description "Thick coax Medium Attachment Unit (MAU) as specified in 802.3 Clause 8";
+ }
+ enum foirl {
+ description "FOIRL Medium Attachment Unit (MAU) as specified in 802.3 Clause 9.9";
+ }
+ enum 10-base2 {
+ description "Thin coax Medium Attachment Unit (MAU) as specified in 802.3 Clause 10";
+ }
+ enum 10-broad36 {
+ description "Broadband DTE Medium Attachment Unit (MAU) as specified in 802.3 Clause 11";
+ }
+ enum 10-base-t {
+ description "Twisted-pair cabling Medium Attachment Unit (MAU) as specified in 802.3 Clause 14. Only to be applied when duplex mode unknown";
+ }
+ enum 10-base-thd {
+ description "Twisted-pair cabling Medium Attachment Unit (MAU) as specified in 802.3 Clause 14 in half duplex mode";
+ }
+ enum 10-base-tfd {
+ description "Twisted-pair cabling Medium Attachment Unit (MAU) as specified in 802.3 Clause 14 in full duplex mode";
+ }
+ enum 10-base-fp {
+ description "Passive fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 16";
+ }
+ enum 10-base-fb {
+ description "Synchronous fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 17";
+ }
+ enum 10-base-fl {
+ description "Asynchronous fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 18. Only to be applied when duplex mode unknown";
+ }
+ enum 10-base-flhd {
+ description "Asynchronous fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 18 in half duplex mode";
+ }
+ enum 10-base-flfd {
+ description "Asynchronous fiber Medium Attachment Unit (MAU) as specified in 802.3 Clause 18 in full duplex mode";
+ }
+ enum 100-base-t4 {
+ description "Four-pair Category 3 twisted-pair cabling as specified in 802.3 Clause 23";
+ }
+ enum 100-base-tx {
+ description "Two-pair Category 5 twisted-pair cabling as specified in 802.3 Clause 25. Only to be applied when duplex mode unknown";
+ }
+ enum 100-base-txhd {
+ description "Two-pair Category 5 twisted-pair cabling as specified in 802.3 Clause 25 in half duplex mode";
+ }
+ enum 100-base-txfd {
+ description "Two-pair Category 5 twisted-pair cabling as specified in 802.3 Clause 25 in full duplex mode";
+ }
+ enum 100-base-bx10-d {
+ description "One single-mode fiber Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 58";
+ }
+ enum 100-base-bx10-u {
+ description "One single-mode fiber Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 58";
+ }
+ enum 100-base-fx {
+ description "X fiber over Physical Medium Dependent (PMD) as specified in 802.3 Clause 26. Only to be applied when duplex mode unknown";
+ }
+ enum 100-base-fxhd {
+ description "X fiber over Physical Medium Dependent (PMD) as specified in 802.3 Clause 26 in half duplex mode";
+ }
+ enum 100-base-fxfd {
+ description "X fiber over Physical Medium Dependent (PMD) as specified in 802.3 Clause 26 in full duplex mode";
+ }
+ enum 100-base-lx10 {
+ description "Two fiber Physical layer entity (PHY) as specified in 802.3 Clause 58";
+ }
+ enum 100-base-t2 {
+ description "Two-pair Category 3 twisted-pair cabling as specified in 802.3 Clause 32. Only to be applied when duplex mode unknown";
+ }
+ enum 100-base-t2-hd {
+ description "Two-pair Category 3 twisted-pair cabling as specified in 802.3 Clause 32 in half duplex mode";
+ }
+ enum 100-base-t2-fd {
+ description "Two-pair Category 3 twisted-pair cabling as specified in 802.3 Clause 32 in full duplex mode";
+ }
+ enum 1000-base-x {
+ description "X as specified in 802.3 Clause 36 over undefined Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD and duplex mode unknown";
+ }
+ enum 1000-base-bx10-d {
+ description "One single-mode fiber Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 59";
+ }
+ enum 1000-base-bx10-u {
+ description "One single-mode fiber Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 59";
+ }
+ enum 1000-base-xhd {
+ description "X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) as specified in 802.3 Clause 36 over undefined Physical Medium Dependent (PMD) in half duplex mode. Not to be configured and only to be returned when underlying PMD unknown";
+ }
+ enum 1000-base-xfd {
+ description "X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) as specified in 802.3 Clause 36 over undefined Physical Medium Dependent (PMD) in full duplex mode. Not to be configured and only to be returned when underlying PMD unknown";
+ }
+ enum 1000-base-lx {
+ description "X fiber over long-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38. Only to be applied when duplex mode unknown";
+ }
+ enum 1000-base-lxhd {
+ description "X fiber over long-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38 in half duplex mode";
+ }
+ enum 1000-base-lxfd {
+ description "X fiber over long-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38 in full duplex mode";
+ }
+ enum 1000-base-lx10 {
+ description "Two fiber 10km Physical layer entity (PHY) as specified in 802.3 Clause 59";
+ }
+ enum 1000-base-sx {
+ description "X fiber over short-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38. Only to be applied when duplex mode unknown";
+ }
+ enum 1000-base-sxhd {
+ description "X fiber over short-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38 in half duplex mode";
+ }
+ enum 1000-base-sxfd {
+ description "X fiber over short-wavelength laser Physical Medium Dependent (PMD) as specified in 802.3 Clause 38 in full duplex mode";
+ }
+ enum 1000-base-cx {
+ description "X copper over 150-Ohm balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 39. Only to be applied when duplex mode unknown";
+ }
+ enum 1000-base-cxhd {
+ description "X copper over 150-Ohm balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 39 in half duplex mode";
+ }
+ enum 1000-base-cxfd {
+ description "X copper over 150-Ohm balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 39 in full duplex mode";
+ }
+ enum 1000-base-kx {
+ description "X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 70";
+ }
+ enum 1000-base-t {
+ description "Four-pair Category 5 twisted-pair cabling Physical layer entity (PHY) as specified in 802.3 Clause 40. Only to be applied when duplex mode unknown";
+ }
+ enum 1000-base-thd {
+ description "Four-pair Category 5 twisted-pair cabling Physical layer entity (PHY) as specified in 802.3 Clause 40 in half duplex mode";
+ }
+ enum 1000-base-tfd {
+ description "Four-pair Category 5 twisted-pair cabling Physical layer entity (PHY) as specified in 802.3 Clause 40 in full duplex mode";
+ }
+ enum 10-gbase-x {
+ description "X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) as specified in 802.3 Clause 48 over undefined Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD unknown";
+ }
+ enum 10-gbase-lx4 {
+ description "X fiber over 4 lane 1310nm optics as specified in 802.3 Clause 53";
+ }
+ enum 10-gbase-cx4 {
+ description "X copper over 8 pair 100-Ohm balanced cable as specified in 802.3 Clause 54";
+ }
+ enum 10-gbase-kx4 {
+ description "X Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 71";
+ }
+ enum 10-gbase-r {
+ description "R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) as specified in 802.3 Clause 49 over undefined Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD unknown";
+ }
+ enum 10-gbase-er {
+ description "R fiber over 1550nm optics as specified in 802.3 Clause 52";
+ }
+ enum 10-gbase-lr {
+ description "R fiber over 1310nm optics as specified in 802.3 Clause 52";
+ }
+ enum 10-gbase-sr {
+ description "R fiber over 850nm optics as specified in 802.3 Clause 52";
+ }
+ enum 10-gbase-lrm {
+ description "R fiber over 1310 nm optics as specified in 802.3 Clause 68";
+ }
+ enum 10-gbase-kr {
+ description "R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 72";
+ }
+ enum 10-gbase-t {
+ description "Four-pair twisted-pair balanced copper cabling Physical layer entity (PHY) as specified in 802.3 Clause 55";
+ }
+ enum 10-gbase-pr-d1 {
+ description "One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 75";
+ }
+ enum 10-gbase-pr-d2 {
+ description "One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 75";
+ }
+ enum 10-gbase-pr-d3 {
+ description "One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 75";
+ }
+ enum 10-gbase-pr-d4 {
+ description "One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Line Terminal (OLT=>office side) Physical layer entity (PHY) as specified in 802.3 Clause 75";
+ }
+ enum 10-gbase-pr-u1 {
+ description "One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 75";
+ }
+ enum 10-gbase-pr-u2 {
+ description "One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 75";
+ }
+ enum 10-gbase-pr-u3 {
+ description "One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 75";
+ }
+ enum 10-gbase-pr-u4 {
+ description "One single-mode fiber 10.3125 GBd continuous downstream / burst mode upstream Optical Network Unit (ONU=>customer side) Physical layer entity (PHY) as specified in 802.3 Clause 75";
+ }
+ enum 40-gbase-r {
+ description "Multi-lane PCS as specified in 802.3 Clause 82 over undefined Physical Medium Attachment (PMA) and Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD unknown";
+ }
+ enum 40-gbase-kr4 {
+ description "40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 84";
+ }
+ enum 40-gbase-cr4 {
+ description "40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 lane shielded copper balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 85";
+ }
+ enum 40-gbase-sr4 {
+ description "40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 lane multimode fiber Physical Medium Dependent (PMD) as specified in 802.3 Clause 86";
+ }
+ enum 4-x10-gbase-sr {
+ description "4 times 10GBASE-S compatible to 802.3 Clause 52 over 4 lane multimode fiber";
+ }
+ enum 40-gbase-lr4 {
+ description "40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 WDM lane single mode fiber Physical Medium Dependent (PMD), with long reach, as specified in 802.3 Clause 87";
+ }
+ enum 40-gbase-er4 {
+ description "40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 WDM lane single mode fiber Physical Medium Dependent (PMD), with extended reach, as specified in 802.3 Clause 87";
+ }
+ enum 40-gbase-fr {
+ description "40GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over single mode fiber Physical Medium Dependent (PMD) as specified in 802.3 Clause 89";
+ }
+ enum 100-gbase-r {
+ description "Multi-lane PCS as specified in 802.3 Clause 82 over undefined 100GBASE-R or 100GBASE-P Physical Medium Attachment (PMA) and Physical Medium Dependent (PMD). Not to be configured and only to be returned when underlying PMD unknown";
+ }
+ enum 100-gbase-cr4 {
+ description "100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 lane shielded copper balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 92";
+ }
+ enum 100-gbase-kr4 {
+ description "100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 93";
+ }
+ enum 100-gbase-kp4 {
+ description "100GBASE-P Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over an electrical backplane Physical Medium Dependent (PMD) as specified in 802.3 Clause 94";
+ }
+ enum 100-gbase-cr10 {
+ description "100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 10 lane shielded copper balanced cable Physical Medium Dependent (PMD) as specified in 802.3 Clause 85";
+ }
+ enum 100-gbase-sr4 {
+ description "100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 lane multimode fiber Physical Medium Dependent (PMD) as specified in 802.3 Clause 95";
+ }
+ enum 100-gbase-sr10 {
+ description "100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 10 lane multimode fiber Physical Medium Dependent (PMD) as specified in 802.3 Clause 86";
+ }
+ enum 2-x40-gbase-sr {
+ description "2 times 40GBASE-S compatible to 802.3 Clause 86 over 10 lane multimode fiber";
+ }
+ enum 10-x10-gbase-sr {
+ description "10 times 10GBASE-S compatible to 802.3 Clause 52 over 10 lane multimode fiber";
+ }
+ enum 12-x10-gbase-sr {
+ description "12 times 10GBASE-S compatible to 802.3 Clause 52 over 12 lane multimode fiber";
+ }
+ enum 100-gbase-lr4 {
+ description "100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 WDM lane single mode fiber Physical Medium Dependent (PMD), with long reach, as specified in 802.3 Clause 88";
+ }
+ enum 100-gbase-er4 {
+ description "100GBASE-R Physical Coding Sublayer (PCS) and Physical Medium Attachment (PMA) over 4 WDM lane single mode fiber Physical Medium Dependent (PMD), with extended reach, as specified in 802.3 Clause 88";
+ }
+ enum not-yet-defined {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping signal-ordering-type-g {
+ leaf signal-ordering-kind-name {
+ type string;
+ config false;
+ description "To be filled according to TR-541. Must be unique for referencing during configuration of the interface.";
+ }
+ leaf-list signal-list {
+ type string;
+ config false;
+ min-elements 2;
+ description "Desciption of the signals on the Media Dependent Interface (MDI), might be e.g. 'TX+' in case of e.g. 10BASE-T, might be e.g. '1,295.56 nm' in case of e.g. 100GBASE-LR4";
+ }
+ description "none";
+ }
+ grouping mau-type-g {
+ leaf mau-id {
+ type core-model:universal-id;
+ config false;
+ description "802.3 according to 30.5.1.1.1 aMAUID
+ Unique identifier of the Medium Attachment Unit (MAU) instance within the data about the device";
+ }
+ leaf mii-kind {
+ type mii-kind-type;
+ default not-yet-defined;
+ config false;
+ description "SFF8472_SFF8636
+ Kind of Medium Independent Interface (MII) provided by this Medium Attachment Unit (MAU) (e.g. SFP, moldered port)";
+ }
+ leaf mdi-kind {
+ type mdi-kind-type;
+ default not-yet-defined;
+ config false;
+ description "Kind of Medium Dependent Interface (MDI) provided by this Medium Attachment Unit (MAU)";
+ }
+ leaf required-medium-kind {
+ type medium-kind-type;
+ default not-yet-defined;
+ config false;
+ description "Kind of medium required for operating this Medium Attachment Unit (MAU), more like an information field";
+ }
+ leaf-list wavelength-min {
+ type int32;
+ units "pm";
+ config false;
+ max-elements 3;
+ description "SFF-8690
+ Minimum laser wavelength in pico meter, -1 = not applicable, 0 = not known, wavelengthMax = wavelength cannot be configured; multiplicity=0..3 for 10GBASE-LX4 according to 802.3 53.5";
+ }
+ leaf-list wavelength-max {
+ type int32;
+ units "pm";
+ config false;
+ max-elements 3;
+ description "Maximum laser wavelength in pico meter, -1 = not applicable, 0 = not known, wavelengthMin = wavelength cannot be configured; multiplicity=0..3 for 10GBASE-LX4 according to 802.3 53.5
+ SFF-8690";
+ }
+ leaf wavelength-grid-min {
+ type int32;
+ units "pm";
+ default -1;
+ config false;
+ description "Minimum grid spacing supported by the transceiver, -1 = not applicable, 0 = not known
+ SFF-8690";
+ }
+ leaf link-length-max {
+ type int32;
+ units "m";
+ default -1;
+ config false;
+ description "Indicates the maximum link length that is supported by the transceiver on the medium, which is specified in the standard referenced in TypeDefinitions::phyType::phyKind.";
+ }
+ leaf vendor-name {
+ type string;
+ default "NOT_YET_DEFINED";
+ config false;
+ description "Name of the vendor of the transceiver
+ Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::ManufacturerProperties::manufacturerName";
+ }
+ leaf vendor-oui {
+ type string;
+ default "NOT_YET_DEFINED";
+ config false;
+ description "Describes the IEEE Company identifier of the vendor of the transceiver (1st part of 802.3 ResourceTypeID)
+ 802.3 22.2.4.3.1 PHY Identifier; also referenced in 45.2.1.13 PMA/PMD package identifier
+ Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::ManufacturerProperties::manufacturerIdentifier";
+ }
+ leaf part-number {
+ type string;
+ default "NOT_YET_DEFINED";
+ config false;
+ description "802.3 22.2.4.3.1 PHY Identifier; also referenced in 45.2.1.13 PMA/PMD package identifier as six bit model number
+ Uniquely identifies the transceiver in the vendor's product lists
+ Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::EquipmentType::partTypeIdentifier";
+ }
+ leaf revision-number {
+ type string;
+ default "NOT_YET_DEFINED";
+ config false;
+ description "Identifies the revision number of the transceiver (3rd part of 802.3 ResourceTypeID)
+ 802.3 22.2.4.3.1 PHY Identifier; also referenced in 45.2.1.13 PMA/PMD package identifier as four-bit revision number
+ Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::EquipmentType::version";
+ }
+ leaf serial-number {
+ type string;
+ default "NOT_YET_DEFINED";
+ config false;
+ description "Vendor's serial number for the transceiver. 0 = not applicable
+ Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::EquipmentInstance::serialNumber";
+ }
+ leaf date-code {
+ type string;
+ default "NOT_YET_DEFINED";
+ config false;
+ description "Vendor's date code for the transceiver
+ Will be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::InvariantDetails::EquipmentInstance::manufactureDate";
+ }
+ leaf-list pmd-list {
+ type pmd-name-type;
+ config false;
+ min-elements 1;
+ description "List of Physical Medium Dependent (PMD) that can be operated
+ *** In case ordering of the signals depends on the PMD, pmdList has to be put into the datatype for the signal ordering ***";
+ }
+ list signal-ordering-list {
+ key 'signal-ordering-kind-name';
+ config false;
+ min-elements 1;
+ uses signal-ordering-type-g;
+ description "Describes the different (e.g. MDI, MDI-X) ways of ordering the signals on the physical medium";
+ }
+ leaf auto-signal-ordering-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "1 = there is a mechanism for automatically crossing over tx and rx implemented";
+ }
+ leaf short-reach-mode-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "1 = Indicates that Short Reach Mode for 10GBASE-T according to 802.3 45.2.1.64 is available";
+ }
+ leaf eee-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "1 = Indicates that Energy-Efficient Ethernet (EEE) is available at the device.";
+ }
+ leaf unidirectional-operation-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "1 = Medium Attachment Unit (MAU) able to transmit from Media Independent Interface (MII) regardless of whether the MAU has determined that a valid link has been established, 0 = MAU able to transmit from MII only when the MAU has determined that a valid link has been established
+ 802.3";
+ }
+ leaf-list supported-alarms {
+ type string;
+ config false;
+ min-elements 6;
+ description "MW IM
+ Available alarms to be listed. Mandatory:'txFault', 'rxLos', 'tempHigh', 'tempLow', 'rxLevelHigh', 'rxLevelLow'. Optional:'vccHigh', 'vccLow', 'txBiasHigh', 'txBiasLow', 'txPowerHigh', 'txPowerLow', 'laserTempHigh', 'laserTempLow', 'tecCurrentHigh', 'tecCurrentLow'. Further alarms might be added by the device. Names are to be separated by commas.";
+ }
+ description "none";
+ }
+ grouping wire-interface-problem-severity-type-g {
+ leaf problem-kind-name {
+ type string;
+ description "Name of the alarm according to WireInterface::WireInterfaceCapability::supportedAlarms";
+ }
+ leaf problem-kind-severity {
+ type severity-type;
+ default warning;
+ description "Severity of this type of alarm.";
+ }
+ description "none";
+ }
+ grouping wire-interface-current-problem-type-g {
+ leaf problem-name {
+ type string;
+ default "Problem name not specified.";
+ config false;
+ description "Name of the alarm according to WireInterface::WireInterfaceCapability::supportedAlarms";
+ }
+ uses mw-current-problem-g;
+ description "none";
+ }
+ grouping wire-interface-performance-type-g {
+ leaf es {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "802.3 30.8.1.1.13 aLineESs
+ Number of errored seconds";
+ }
+ leaf ses {
+ type int32;
+ units "s";
+ default -1;
+ config false;
+ description "802.3 30.8.1.1.12 aLineSESs
+ Number of severely errored seconds";
+ }
+ leaf symbol-error-during-carrier {
+ type int32;
+ default -1;
+ config false;
+ description "802.3 according to 30.3.2.1.5 aSymbolErrorDuringCarrier
+ Number of times when valid carrier was present and an invalid data symbol occured.";
+ }
+ leaf low-power-idle-transmitter-ms {
+ type int32;
+ units "ms";
+ default -1;
+ config false;
+ description "802.3 similar to 30.3.2.1.8 aTransmitLPIMicroseconds
+ Number of milliseconds (original counter expresses microseconds), during which the transmitter was in power save mode";
+ }
+ leaf low-power-idle-receiver-ms {
+ type int32;
+ units "ms";
+ default -1;
+ config false;
+ description "802.3 similar to 30.3.2.1.9 aReceiveLPIMicroseconds
+ Number of milliseconds (original counter expresses microseconds), during which the receiver was in power save mode";
+ }
+ description "none";
+ }
+ grouping wire-interface-current-performance-type-g {
+ container performance-data {
+ config false;
+ uses wire-interface-performance-type-g;
+ description "none";
+ }
+ uses g:otn-current-data-g;
+ description "Turns performance information into current performance information by inheriting from OTN_CurrentData.";
+ }
+ grouping wire-interface-historical-performance-type-g {
+ container performance-data {
+ config false;
+ uses wire-interface-performance-type-g;
+ description "none";
+ }
+ uses g:otn-history-data-g;
+ description "Turns performance information into historical performance information by inheriting from OTN_HistoryData.";
+ }
+
+ /***********************
+ * package object-classes
+ **********************/
+ /***********************
+ * package air-interface
+ **********************/
+ list mw-air-interface-pac {
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container air-interface-capability {
+ config false;
+ uses air-interface-capability-g;
+ description "none";
+ }
+ container air-interface-configuration {
+ uses air-interface-configuration-g;
+ description "none";
+ }
+ container air-interface-status {
+ config false;
+ uses air-interface-status-g;
+ description "none";
+ }
+ container air-interface-current-problems {
+ config false;
+ uses air-interface-current-problems-g;
+ description "none";
+ }
+ container air-interface-current-performance {
+ config false;
+ uses air-interface-current-performance-g;
+ description "none";
+ }
+ container air-interface-historical-performances {
+ config false;
+ uses air-interface-historical-performances-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping air-interface-capability-g {
+ leaf type-of-equipment {
+ type string;
+ default "Type of equipment not yet defined.";
+ config false;
+ description "This parameter indicates the equipment type. Instead of uploading the complete set of capabilities, capabilities of the same equipment type could be reused. Should be unique for a combination of modem, radio and their respective firmware.";
+ }
+ leaf tx-frequency-min {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Value of the minimum transmit frequency tunable at the air interface.";
+ }
+ leaf tx-frequency-max {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Value of the maximum transmit frequency tunable at the air interface.";
+ }
+ leaf rx-frequency-min {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Value of the minimum receive frequency tunable at the air interface.";
+ }
+ leaf rx-frequency-max {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Value of the maximum receive frequency tunable at the air interface.";
+ }
+ leaf adaptive-modulation-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the device is capable of adaptive modulation, this field shall contain a 'true'.";
+ }
+ leaf mimo-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the device is capable of MIMO, this field shall contain a 'true'.";
+ }
+ leaf mimo-channels {
+ type int8;
+ units "channels";
+ default 1;
+ config false;
+ description "Maximum number (n) of spatial multiplexing streams that can be conveyed by an n x n MIMO configuration.";
+ }
+ leaf alic-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the microwave radio is capable of Adjacent Link Interference Cancelation (canceling of interference cause by transmitters located at the same site), this field shall contain a 'true'.";
+ }
+ leaf atpc-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case the microwave radio is capable of ATPC, this field shall contain a 'true'.";
+ }
+ leaf atpc-range {
+ type int8;
+ units "dB";
+ default 0;
+ config false;
+ description "Extent of the ATPC range. This value represents a device specific maximum value. The actual range of the ATPC at a specific link might be limited by the difference between configured transmit power (AirInterface::AirInterfaceConfiguration::txPower) and minimum transmit power of the device (TypeDefinitions::TransmissionModeType::txPowerMin).";
+ }
+ leaf encryption-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Shall be marked 'true', if payload encryption is available.";
+ }
+ leaf-list supported-loop-back-kind-list {
+ type loop-back-type;
+ config false;
+ min-elements 1;
+ max-elements 2;
+ description "List of supported kinds of looping back of header information to the remote site.";
+ }
+ leaf maintenance-timer-range {
+ type string;
+ units "s";
+ default "Range of the maintenance timer not yet defined.";
+ config false;
+ description "Available time periods for maintenance configurations (e.g. the loop back of microwave header information) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360').";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 7;
+ description "Available alarms to be listed. Mandatory:'signalIsLost','rslIsExceeded','signalIDMismatching','temperatureIsExceeded','modemIsFaulty','radioIsFaulty' and 'modulationIsDownShifted'. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:'signalIsLost','rslIsExceeded','temperatureIsExceeded','modemIsFaulty','radioIsFaulty' and 'modulationIsDownShifted'. Further alarms might be added by the device. Names are to be separated by commas.";
+ }
+ list supported-channel-plan-list {
+ key 'supported-channel-plan';
+ config false;
+ min-elements 1;
+ uses channel-plan-type-g;
+ description "List of channel spacing that are supported by the device.";
+ }
+ description "Describes the 'analog' capabilities of modem and transmitter of the microwave device. Value ranges of attributes are not independently (e.g. min. and max. transmit power depends on modulation). Legal combinations of values are expressed in transmissionModeTypes.";
+ }
+ grouping air-interface-configuration-g {
+ leaf air-interface-name {
+ type string;
+ default "Air interface ID not yet defined.";
+ description "Operator specific microwave link ID (often used for coding area, type of element and sequential number).";
+ }
+ leaf remote-air-interface-name {
+ type string;
+ default "Air interface ID at the remote site not yet defined.";
+ description "Name of the air interface, which belongs to the same link, at the remote site.";
+ }
+ leaf expected-signal-id {
+ type int16;
+ description "If set on '0', the receiver ignores the signal ID of the received signal. If set on any other value, the receiver exclusively synchronizes on signals with the same signal ID.";
+ }
+ leaf transmitted-signal-id {
+ type int16;
+ description "Transmitted radio signal ID for synchronizing the receiver.";
+ }
+ leaf radio-signal-id {
+ type string;
+ default "Radio signal ID not yet defined.";
+ status deprecated;
+ description "The radioSignalId is transmitted on the air interface so the remote site of the link synchronizes on the correct transmitter. The local radio MUST NOT synchronize on a radio signal with a different radioSignalId. The link ID is neither an ID necessary to span the model nor an ID referencing external data. It is just some sort of name of the link transmitted so the correct remote site can be identified in an interference situation. The value zero might be used to make the microwave to disable the link ID check.";
+ }
+ leaf tx-frequency {
+ type int32;
+ units "kHz";
+ default -1;
+ description "Center frequency of the transmit channel. The values to be configured have to exactly match the values listed in the international agreement referenced in channelPlanID. In case of automated selection of the transmit frequency this field shall describe the lowest center frequency selectable.";
+ }
+ leaf rx-frequency {
+ type int32;
+ units "kHz";
+ default -1;
+ description "Center frequency of the receive channel.";
+ }
+ leaf transmission-mode-min {
+ type core-model:universal-id;
+ description "Minimum transmission mode to be configured (in case adaptive modulation is not used, this value represents also the fixed transmission mode).";
+ }
+ leaf transmission-mode-max {
+ type core-model:universal-id;
+ description "Maximum transmission mode to be configured.";
+ }
+ leaf tx-channel-bandwidth {
+ type int32;
+ units "kHz";
+ default -1;
+ status deprecated;
+ description "Bandwidth of the transmit channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;";
+ }
+ leaf rx-channel-bandwidth {
+ type int32;
+ units "kHz";
+ default -1;
+ description "Bandwidth of the receive channel. The value shall be expressed explicitly (means in kHz) not as a reference to an international agreement. The values shall be chosen from the following _list: 3.500, 7.000, 14.000, 27.500, 28.000, 29.000, 29.650, 30.000, 40.000, 50.000, 55.000, 56.000, 59.300, 60.000, 80.000, 100.000, 112.000, 120.000, 150.000, 200.000, 250.000, 500.000, 750.000, 1.000.000, 1.250.000, 1.500.000, 1.750.000, 2.000.000;";
+ }
+ leaf polarization {
+ type polarization-type;
+ default not-specified;
+ description "Allows documenting the polarization of the air interface.";
+ }
+ leaf power-is-on {
+ type boolean;
+ default true;
+ description "Power ON. Activation of the entire radio in a split mount configuration shall be expressed as a 'true'.";
+ }
+ leaf transmitter-is-on {
+ type boolean;
+ default false;
+ description "Activation of the transmitter inside the radio shall be expressed as a 'true'.";
+ }
+ leaf receiver-is-on {
+ type boolean;
+ default true;
+ description "Maintenance Feature. Activation of the receiver inside the radio shall be expressed as a 'true'. Attribute shall also be used for RX main and RX diversity squelches in case of diversity configurations.
+ ";
+ }
+ leaf tx-power {
+ type int8;
+ units "dBm";
+ default 99;
+ description "Transmit power to be configured on the microwave link. Signed Byte is required. The actually operated transmit power might be lower depending on adaptive modulation and ATPC.";
+ }
+ leaf adaptive-modulation-is-on {
+ type boolean;
+ default false;
+ description "Adaptive Modulation. Activation of adaptive modulation shall be expressed as a 'true'.";
+ }
+ leaf modulation-min {
+ type int16;
+ units "symbols";
+ default -1;
+ status deprecated;
+ description "Minimum modulation to be configured (in case adaptive modulation is not used, this value represents also the fixed modulation). The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme.";
+ }
+ leaf modulation-max {
+ type int16;
+ units "symbols";
+ default -1;
+ status deprecated;
+ description "Maximum modulation to be configured. The value of this field is only relevant, if Adaptive Modulation has been activated. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme.";
+ }
+ leaf xpic-is-on {
+ type boolean;
+ default false;
+ description "Activation of Cross Polarization Interference Cancelation shall be expressed as a 'true'. In case XPIC is not available for the current combination of channel bandwidth and modulation or the hardware in general, this parameter shall always be set to 'false'.";
+ }
+ leaf mimo-is-on {
+ type boolean;
+ default false;
+ description "Activation of Multiple Input Multiple Output (MIMO) shall be expressed as a 'true'.";
+ }
+ leaf alic-is-on {
+ type boolean;
+ default false;
+ description "Activation of Adjacent Link Interference Cancelation (ALIC) shall be expressed as a 'true'.";
+ }
+ leaf atpc-is-on {
+ type boolean;
+ default false;
+ description "ATPC. Activation of Automated Transmit Power Control shall be expressed as a 'true'.";
+ }
+ leaf atpc-thresh-upper {
+ type int16;
+ units "dBm";
+ default 99;
+ description "If the receive level is higher than the upper threshold value, the transmitter is notified to decrease transmit power.";
+ }
+ leaf atpc-thresh-lower {
+ type int16;
+ units "dBm";
+ default 99;
+ description "If the receive level is lower than the lower threshold value, the transmitter is notified to increase transmit power.";
+ }
+ leaf atpc-tx-power-min {
+ type int8;
+ units "dBm";
+ default -99;
+ description "Transmit power, which is not to be undercut, while operating ATPC.";
+ }
+ leaf auto-freq-select-is-on {
+ type boolean;
+ default false;
+ description "Activation of automatically selecting the transmit frequency in unlicensed bands shall be expressed as a 'true'.";
+ }
+ leaf auto-freq-select-range {
+ type int8;
+ units "channels";
+ default -1;
+ description "Number of transmit channels (starting at the center frequency defined in txFrequency and with channel bandwidth according to txChannelBandwidth) that define the range within the transmit frequency can automatically been chosen. ";
+ }
+ leaf modulation-is-on {
+ type boolean;
+ default true;
+ description "Maintenance Feature. De-activation of the modulation of the carrier signal for fault management shall be expressed as a 'false'.";
+ }
+ leaf encryption-is-on {
+ type boolean;
+ default false;
+ description "Activates encryption of the payload.";
+ }
+ leaf cryptographic-key {
+ type string;
+ default "Cryptographic key not yet defined.";
+ description "Key for transforming plaintext into ciphertext data.";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list threshold-cross-alarm-list {
+ key 'g826-value-kind granularity-period';
+ max-elements 6;
+ uses threshold-cross-alarm-type-g;
+ description "List of threshold cross alarms to be configured.";
+ }
+ leaf loop-back-kind-on {
+ type loop-back-type;
+ default none;
+ description "Maintenance Feature. The currently configured type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site.";
+ }
+ leaf maintenance-timer {
+ type int32;
+ units "s";
+ default -1;
+ description "Time of existence of any maintenance configuration (e.g. the loop back of microwave header information). Valid values are defined in AirInterface::AirInterfaceCapability::maintenanceTimerRange.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 6;
+ uses air-interface-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "Configuration of the radio link.";
+ }
+ grouping air-interface-status-g {
+ leaf tx-frequency-cur {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Center frequency of the currently operated transmit channel.";
+ }
+ leaf rx-frequency-cur {
+ type int32;
+ units "kHz";
+ default -1;
+ config false;
+ description "Center frequency of the currently operated receive channel.";
+ }
+ leaf tx-level-cur {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Current transmit level.";
+ }
+ leaf rx-level-cur {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Current receive level.";
+ }
+ leaf transmission-mode-cur {
+ type leafref {
+ path '/mw-air-interface-pac/air-interface-capability/supported-channel-plan-list/transmission-mode-list/transmission-mode-id';
+ }
+ config false;
+ description "Currently operated transmission mode according to definitions in Capabilities.";
+ }
+ leaf modulation-cur {
+ type int16;
+ units "symbols";
+ default -1;
+ config false;
+ status deprecated;
+ description "Currently operated modulation on transmit path. The modulation scheme shall be described by the number of states in the phase diagram (e.g. BPSK->'2' or 256QAM->'256'). Allowed values are defined in TypeDefinitions::transmissionModeType::modulationScheme.";
+ }
+ leaf code-rate-cur {
+ type int8;
+ units "%";
+ default -1;
+ config false;
+ status deprecated;
+ description "Code rate of the currently operated coding scheme (Net bit rate ? Gross bit rate ? code rate).";
+ }
+ leaf received-signal-id {
+ type int16;
+ default -1;
+ config false;
+ description "ID of the signal, which the receiver is currently synchronized on.";
+ }
+ leaf snir-cur {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Currently measured signal to (noise+interference) ratio.";
+ }
+ leaf xpd-cur {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Currently measured cross polarization discrimination.";
+ }
+ leaf rf-temp-cur {
+ type int8;
+ units "Celsius";
+ default -99;
+ config false;
+ description "Current temperature (in degree Celsius) of the radio module inside the outdoor unit.";
+ }
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time the Air Interface entered its current operational status. "; + }
+ leaf radio-power-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If the radio unit has power and is switched on, this shall be expressed as a 'true'.";
+ }
+ leaf link-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If connection is established to the remote site with the same linkID, this shall be expressed as a 'true'.";
+ }
+ leaf xpic-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If XPIC is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf mimo-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If MIMO is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf alic-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If Adjacent Link Interference Cancelation (ALIC) is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf atpc-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If ATPC is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf auto-freq-select-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "If automated frequency selection is currently actually working (not just configured), this shall be expressed as a 'true'.";
+ }
+ leaf loop-back-kind-up {
+ type loop-back-type;
+ default none;
+ config false;
+ description "The currently active (not just configured) type of looping back of the air interface header shall be expressed here. The received header is returned to the remote site.";
+ }
+ leaf local-end-point-id {
+ type string;
+ default "not-supported";
+ config false;
+ description "The value of the localEndPointId is a vendor specific identifier of the air interface, used by the node to discover a microwave radio link.";
+ }
+ leaf remote-end-point-id {
+ type string;
+ default "not-supported";
+ config false;
+ description "The value of the remoteEndPointId is a vendor specific identifier or the airinterface at the remote side, used to by the node to discover a microwave radio link.";
+ }
+ description "Measurements of current values on the air interface and operational status of the device.";
+ }
+ grouping air-interface-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses air-interface-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping air-interface-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses air-interface-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the air interface at a particular moment.";
+ }
+ grouping air-interface-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses air-interface-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the air interface for a pre-defined measurement interval.";
+ }
+ list co-channel-group {
+ key 'co-channel-group-id';
+ uses co-channel-group-g;
+ description "none";
+ }
+ grouping co-channel-group-g {
+ leaf co-channel-group-id {
+ type core-model:universal-id;
+ description "none";
+ }
+ leaf-list air-interface-list {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:uuid';
+ }
+ description "List of air interfaces, which are part of the co-channel (XPIC, MIMO, ALIC) group.";
+ }
+ leaf sort-of-co-channel-group {
+ type string;
+ default "Kind of co-channel group not specified.";
+ description "Type of group of air interfaces with the same transmit and receive frequency. The values shall be chosen from the following _list:'XPIC', 'MIMO', 'ALIC';";
+ }
+ leaf-list logical-termination-point {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:uuid';
+ }
+ status deprecated;
+ description "none";
+ }
+ description "Required for configuring XPIC, MIMO and ALIC.";
+ }
+
+ /***********************
+ * package air-interface-hsb
+ **********************/
+ list mw-air-interface-hsb-end-point-pac {
+ key 'endpoint';
+ leaf role {
+ type role-type;
+ default working;
+ description "none";
+ }
+ leaf endpoint {
+ type leafref {
+ path '/core-model:forwarding-construct/core-model:fc-port/core-model:uuid';
+ }
+ description "none";
+ }
+ description "The EndPoint (EP) object class models the access to the FC function. Each EndPoint instance has a role (e.g., working, protection, protected, hub, spoke, leaf, root, etc.) with respect to the FC function. The association of the FC to LTPs is made via EndPoints (essentially the ports of the FC) where each EndPoint (EP) of the FC has a role in the context of the FC. The traffic forwarding between the associated End PointsEPs of the FC depends upon the type of FC and may be associated with FCSwitch object instances. In cases where there is protection conveys the protecting role of the access to the FC. The EP replaces the Protection Unit of a traditional protection model. It represents a protected (resilient/reliable) point or a protecting (unreliable working or protection) point.";
+ }
+ list mw-air-interface-hsb-fc-switch-pac {
+ key 'fcswitch';
+ leaf prot-type {
+ type protection-type;
+ default hsb;
+ description "Indicates the protection scheme that is used for the ProtectionGroup.";
+ }
+ leaf air-interface-hsb-configuration-is-faulty-severity {
+ type severity-type;
+ default warning;
+ description "The level of severity of an airInterfaceHsbConfigurationIsFaulty alarm shall be chosen from an enumeration.";
+ }
+ leaf air-interface-hsb-is-partly-down-severity {
+ type severity-type;
+ default warning;
+ description "The level of severity for one link out of the HSB configuration being down shall be chosen from an enumeration.";
+ }
+ leaf air-interface-hsb-is-down-severity {
+ type severity-type;
+ default warning;
+ description "The level of severity of the total HSB configuration being down shall be chosen from an enumeration.";
+ }
+ leaf fcswitch {
+ type leafref {
+ path '/core-model:forwarding-construct/core-model:fc-switch/core-model:uuid';
+ }
+ description "none";
+ }
+ description "Represents and defines a protection switch structure encapsulated in the forwarding construct. Essentially performs the function of Protection Group. Associates to 2 or more Endpoints each playing the role of a Protection Unit. One or more protection EndPoints (standby/backup) provide protection for one or more working (i.e. regular/main/preferred) Endpoints where either protection or working can feed one or more protected Endpoint. May be used in revertive or non-revertive (symmetric) mode. When in revertive mode may define waitToRestore time. May be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 ane 1:1). May be lockout (prevented from switching), force switched or manual switched. Will indicate switch state and change of state.";
+ }
+
+ /***********************
+ * package air-interface-diversity
+ **********************/
+ list mw-air-interface-diversity-pac {
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container air-interface-diversity-capability {
+ config false;
+ uses air-interface-diversity-capability-g;
+ description "none";
+ }
+ container air-interface-diversity-configuration {
+ uses air-interface-diversity-configuration-g;
+ description "none";
+ }
+ container air-interface-diversity-status {
+ config false;
+ uses air-interface-diversity-status-g;
+ description "none";
+ }
+ container air-interface-diversity-current-problems {
+ config false;
+ uses air-interface-diversity-current-problems-g;
+ description "none";
+ }
+ container air-interface-diversity-current-performance {
+ config false;
+ uses air-interface-diversity-current-performance-g;
+ description "none";
+ }
+ container air-interface-diversity-historical-performances {
+ config false;
+ uses air-interface-diversity-historical-performances-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-capability-g {
+ list available-kinds-of-diversity {
+ key 'diversity-name';
+ config false;
+ uses diversity-type-g;
+ description "Available types of diversity to be listed.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 2;
+ description "Available alarms to be listed. Mandatory:'airInterfaceDiversityConfigurationIsPartlyDown' (at least one air interface is down, but not all of them) and 'airInterfaceDiversityConfigurationIsDown' (all air interfaces are down). Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:'airInterfaceDiversityConfigurationIsPartlyDown' (at least one air interface is down, but not all of them) and 'airInterfaceDiversityConfigurationIsDown' (all air interfaces are down). Further alarms might be added by the device. Names are to be separated by commas.";
+ }
+ description "Describes the capabilities in implementing different types of air interface diversity.";
+ }
+ grouping air-interface-diversity-configuration-g {
+ container air-interface-diversity {
+ uses diversity-type-g;
+ description "Type of air interface diversity configured at the link.";
+ }
+ leaf-list air-interface-ltp-list {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:uuid';
+ }
+ min-elements 2;
+ description "_multiplicity:2-ThisAirInterfaceDiversity::AirInterfaceDiversityConfiguration::airInterfaceDiversity::diversityType::numberOfAirInterfacesMax";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list threshold-cross-alarm-list {
+ key 'g826-value-kind granularity-period';
+ max-elements 6;
+ uses threshold-cross-alarm-type-g;
+ description "List of threshold cross alarms to be configured.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 3;
+ uses air-interface-diversity-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-status-g {
+ leaf snir-cur {
+ type int8;
+ units "dB";
+ default -99;
+ config false;
+ description "Currently measured signal to (noise+interference) ratio of the combined signals.";
+ }
+ leaf air-interface-diversity-status {
+ type air-interface-diversity-status-type;
+ default group-down;
+ config false;
+ description "Status of the air interface bundle. ";
+ }
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time the Diversity Group entered its current operational status. "; + }
+ description "none";
+ }
+ grouping air-interface-diversity-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses air-interface-diversity-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping air-interface-diversity-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses air-interface-diversity-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the air interface diversity configuration at a particular moment.";
+ }
+ grouping air-interface-diversity-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses air-interface-diversity-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the air interface diversity configuration for a pre-defined measurement interval.";
+ }
+
+ /***********************
+ * package pure-ethernet-structure
+ **********************/
+ list mw-pure-ethernet-structure-pac {
+ if-feature pure-ethernet;
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container pure-ethernet-structure-capability {
+ config false;
+ uses pure-ethernet-structure-capability-g;
+ description "none";
+ }
+ container pure-ethernet-structure-configuration {
+ uses pure-ethernet-structure-configuration-g;
+ description "none";
+ }
+ container pure-ethernet-structure-status {
+ config false;
+ uses pure-ethernet-structure-status-g;
+ description "none";
+ }
+ container pure-ethernet-structure-current-problems {
+ config false;
+ uses pure-ethernet-structure-current-problems-g;
+ description "none";
+ }
+ container pure-ethernet-structure-current-performance {
+ config false;
+ uses pure-ethernet-structure-current-performance-g;
+ description "none";
+ }
+ container pure-ethernet-structure-historical-performances {
+ config false;
+ uses pure-ethernet-structure-historical-performances-g;
+ description "none";
+ }
+ description "The pureEthernetStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting Ethernet traffic only.";
+ }
+ grouping pure-ethernet-structure-capability-g {
+ leaf structure-id {
+ type core-model:universal-id;
+ config false;
+ description "Identifies the Structure for bundling and container.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the device.";
+ }
+ description "Describes the logical structuring of the physical capacity provided by a pure Ethernet microwave device. Segmentation is not available. No fixed segment size. No TDM transport.";
+ }
+ grouping pure-ethernet-structure-configuration-g {
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ uses structure-problem-severity-type-g;
+ description "Severity of the type of problem to be configured.";
+ }
+ description "none";
+ }
+ grouping pure-ethernet-structure-status-g {
+ container segment-status-list {
+ config false;
+ uses segment-status-type-g;
+ description "Status of the Ethernet transport segment. Always just one segment.";
+ }
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time and date of the last update of the status information. "; + }
+ description "none";
+ }
+ grouping pure-ethernet-structure-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses structure-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping pure-ethernet-structure-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses structure-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the structure of an pure Ethernet microwave at a particular moment.";
+ }
+ grouping pure-ethernet-structure-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses structure-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the structure of an pure Ethernet microwave for a pre-defined measurement interval.";
+ }
+ feature pure-ethernet {
+ description "Feature 'pure-ethernet' is mandatory for device types transporting pure Ethernet.";
+ }
+
+ /***********************
+ * package hybrid-mw-structure
+ **********************/
+ list mw-hybrid-mw-structure-pac {
+ if-feature hybrid-microwave;
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container hybrid-mw-structure-capability {
+ config false;
+ uses hybrid-mw-structure-capability-g;
+ description "none";
+ }
+ container hybrid-mw-structure-configuration {
+ uses hybrid-mw-structure-configuration-g;
+ description "none";
+ }
+ container hybrid-mw-structure-status {
+ config false;
+ uses hybrid-mw-structure-status-g;
+ description "none";
+ }
+ container hybrid-mw-structure-current-problems {
+ config false;
+ uses hybrid-mw-structure-current-problems-g;
+ description "none";
+ }
+ container hybrid-mw-structure-current-performance {
+ config false;
+ uses hybrid-mw-structure-current-performance-g;
+ description "none";
+ }
+ container hybrid-mw-structure-historical-performances {
+ config false;
+ uses hybrid-mw-structure-historical-performances-g;
+ description "none";
+ }
+ description "The HybridMwStructure_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM and Ethernet traffic.";
+ }
+ grouping hybrid-mw-structure-capability-g {
+ leaf structure-id {
+ type core-model:universal-id;
+ config false;
+ description "Identifies the Structure for bundling and container.";
+ }
+ list supported-tdm-structure-types-list {
+ key 'tdm-structure-name';
+ config false;
+ min-elements 1;
+ uses tdm-structure-type-g;
+ description "Lists the TDM frame types that are supported.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:non. Names are to be separated by commas. Further alarms might be added by the device.";
+ }
+ description "Describes the logical structuring of the physical capacity provided by a hybrid microwave device (TDM + Ethernet). Segmentation is available. TDM transport is available.";
+ }
+ grouping hybrid-mw-structure-configuration-g {
+ container structure-kind {
+ uses tdm-structure-type-g;
+ description "TDM frame to be applied.";
+ }
+ container structure-type {
+ uses tdm-structure-type-g;
+ status deprecated;
+ description "TDM frame to be applied.";
+ }
+ leaf number-of-tdm-segments-to-be-reserved {
+ type int16;
+ default -1;
+ description "Allows to configure the number of segments reserved for TDM frames of the type specified in HybridMwStructure::HybridMwStructureConfiguration::structureType";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ uses structure-problem-severity-type-g;
+ description "Severity of the type of problem to be configured.";
+ }
+ description "none";
+ }
+ grouping hybrid-mw-structure-status-g {
+ list segment-status-list {
+ key 'segment-status-type-id';
+ config false;
+ uses segment-status-type-g;
+ description "Status of each segment (all TDM and one Ethernet). Multiplicity = HybridMwStructure::StructureConfiguration::tdmReservedNumberOfSegments + 1";
+ }
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time and date of the last update of the status information. "; + }
+ description "none";
+ }
+ grouping hybrid-mw-structure-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses structure-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping hybrid-mw-structure-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses structure-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the structure of a hybrid microwave at a particular moment.";
+ }
+ grouping hybrid-mw-structure-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses structure-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the structure of a hybrid microwave for a pre-defined measurement interval.";
+ }
+ feature hybrid-microwave {
+ description "Feature 'hybrid-microwave' is mandatory for device types transporting Ethernet + TDM.";
+ }
+
+ /***********************
+ * package ethernet-container
+ **********************/
+ list mw-ethernet-container-pac {
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container ethernet-container-capability {
+ config false;
+ uses ethernet-container-capability-g;
+ description "none";
+ }
+ container ethernet-container-configuration {
+ uses ethernet-container-configuration-g;
+ description "none";
+ }
+ container ethernet-container-status {
+ config false;
+ uses ethernet-container-status-g;
+ description "none";
+ }
+ container ethernet-container-current-problems {
+ config false;
+ uses ethernet-container-current-problems-g;
+ description "none";
+ }
+ container ethernet-container-current-performance {
+ config false;
+ uses ethernet-container-current-performance-g;
+ description "none";
+ }
+ container ethernet-container-historical-performances {
+ config false;
+ uses ethernet-container-historical-performances-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping ethernet-container-capability-g {
+ leaf bundling-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "This attribute has to be set on 'true', if the device allows combining resources from several air interfaces for transporting this Ethernet container.";
+ }
+ leaf packet-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "In case packet compression can be activated, but not configured to a certain type, packetCompressionAvail shall be set on 'true', but none of the compression level specific booleans.";
+ }
+ leaf layer2-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer 2 available at the device.";
+ }
+ leaf vlan-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on VLAN layer available at the device.";
+ }
+ leaf q-in-q-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer of a second VLAN available at the device.";
+ }
+ leaf mpls-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on mpls layer available at the device.";
+ }
+ leaf ipv4-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer 3 for IPv4 available at the device.";
+ }
+ leaf ipv6-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer 3 for IPv6 available at the device.";
+ }
+ leaf layer4-compression-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Packet compression on layer 4 (TCP and UDP header) available at the device.";
+ }
+ leaf encryption-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Shall be marked 'true', if Ethernet payload encryption is available.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 2;
+ description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device.";
+ }
+ description "none";
+ }
+ grouping ethernet-container-configuration-g {
+ leaf container-id {
+ type string;
+ default "No Ethernet Flow associated yet.";
+ description "ContainterID in Netconf must be the same as EthernetPortID in OpenFlow so a connection can be made between the two items, which separately exist in the controller.";
+ }
+ list segments-id-list {
+ key 'structure-id-ref segment-id-ref';
+ min-elements 1;
+ uses segment-id-type-g;
+ description "Lists the segments used for transporting this Ethernet container. In case EthernetContainer::ContainerCapability::bundlingIsAvail==0, all TypeDefinitions::segmentIdType::structureId must be identical in the list.";
+ }
+ leaf packet-compression-is-on {
+ type boolean;
+ default false;
+ description "In case packet compression is activated, but no type is activated, it is assumed that the device chooses the optimum.";
+ }
+ leaf layer2-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer 2 configured at the device.";
+ }
+ leaf vlan-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on VLAN layer configured at the device.";
+ }
+ leaf q-in-q-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer of a second VLAN configured at the device.";
+ }
+ leaf mpls-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on MPLS layer configured at the device.";
+ }
+ leaf ipv4-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer 3 for IPv4 configured at the device.";
+ }
+ leaf ipv6-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer 3 for IPv6 configured at the device.";
+ }
+ leaf layer4-compression-is-on {
+ type boolean;
+ default false;
+ description "Packet compression on layer 4 (TCP and UDP header) configured at the device.";
+ }
+ leaf encryption-is-on {
+ type boolean;
+ default false;
+ description "Activates encryption of the Ethernet payload.";
+ }
+ leaf cryptographic-key {
+ type string;
+ default "Cryptographic key not yet defined.";
+ description "Key for transforming plaintext into cipher text data.";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 2;
+ uses container-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "none";
+ }
+ grouping ethernet-container-status-g {
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time the Container entered its current operational status. "; + }
+ description "none";
+ }
+ grouping ethernet-container-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses container-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping ethernet-container-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses container-current-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the Ethernet container at a particular moment.";
+ }
+ grouping ethernet-container-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses container-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the Ethernet container for a pre-defined measurement interval.";
+ }
+
+ /***********************
+ * package tdm-container
+ **********************/
+ list mw-tdm-container-pac {
+ if-feature hybrid-microwave;
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container tdm-container-capability {
+ config false;
+ uses tdm-container-capability-g;
+ description "none";
+ }
+ container tdm-container-configuration {
+ uses tdm-container-configuration-g;
+ description "none";
+ }
+ container tdm-container-status {
+ config false;
+ uses tdm-container-status-g;
+ description "none";
+ }
+ container tdm-container-current-problems {
+ config false;
+ uses tdm-container-current-problems-g;
+ description "none";
+ }
+ container tdm-container-current-performance {
+ config false;
+ uses tdm-container-current-performance-g;
+ description "none";
+ }
+ container tdm-container-historical-performances {
+ config false;
+ uses tdm-container-historical-performances-g;
+ description "none";
+ }
+ description "The TdmContainer_Pac and its attached classes MUST be provided on management interfaces of microwave devices, which are transporting TDM traffic.";
+ }
+ grouping tdm-container-capability-g {
+ list supported-tdm-container-types-list {
+ key 'tdm-container-name';
+ config false;
+ min-elements 1;
+ uses tdm-container-type-g;
+ description "Lists the TDM containers that are supported.";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 2;
+ description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the vendor.";
+ }
+ leaf supported-alarms {
+ type string;
+ default "Supported alarms not yet defined.";
+ config false;
+ status deprecated;
+ description "Available alarms to be listed. Mandatory:'framingIsFaulty' and 'containerIsDown'. Further alarms might be added by the device.";
+ }
+ description "Bundling is not available.";
+ }
+ grouping tdm-container-configuration-g {
+ leaf container-id {
+ type string;
+ default "No TDM Flow associated yet.";
+ description "ContainterID in Netconf must be the same as TDM Flow ID so a connection can be made between the two items, which separately exist in the controller.";
+ }
+ container container-type {
+ uses tdm-container-type-g;
+ description "Type of TDM container.";
+ }
+ container segment-id {
+ uses segment-id-type-g;
+ description "Multiplicity = 1; One segment per TDM container; Type of segment must match type of container;";
+ }
+ leaf performance-monitoring-collection-is-on {
+ type boolean;
+ default false;
+ description "Enables measurement, collection, storage and access to performance data.";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 2;
+ uses container-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "none";
+ }
+ grouping tdm-container-status-g {
+ leaf last-status-change {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time the Container entered its current operational status. "; + }
+ description "none";
+ }
+ grouping tdm-container-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses container-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping tdm-container-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses container-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the TDM container at a particular moment.";
+ }
+ grouping tdm-container-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses container-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the TDM container for a pre-defined measurement interval.";
+ }
+
+ /***********************
+ * package wire-interface
+ **********************/
+ list wire-interface-pac {
+ key 'layer-protocol';
+ leaf layer-protocol {
+ type leafref {
+ path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid';
+ }
+ description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid";
+ }
+ container wirebased-interface-capability {
+ config false;
+ uses wire-interface-capability-g;
+ description "none";
+ }
+ container wirebased-interface-configuration {
+ uses wire-interface-configuration-g;
+ description "none";
+ }
+ container wirebased-interface-status {
+ config false;
+ uses wire-interface-status-g;
+ description "none";
+ }
+ container wirebased-interface-current-problems {
+ config false;
+ uses wire-interface-current-problems-g;
+ description "none";
+ }
+ container wirebased-interface-current-performance {
+ config false;
+ uses wire-interface-current-performance-g;
+ description "none";
+ }
+ container wirebased-interface-historical-performances {
+ config false;
+ uses wire-interface-historical-performances-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping wire-interface-capability-g {
+ list available-mau-list {
+ key 'mau-id';
+ config false;
+ uses mau-type-g;
+ description "List of Medium Attachment Units (MAUs) that are available for being selected. If rate and service configuration (e.g. SFF-8079) are not supported, the MAU determined by hardware shall be described.
+ ";
+ }
+ leaf auto-pmd-negotiation-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "Parameter
+ 1 = Indicates that device is supporting Auto-negotiation";
+ }
+ leaf auto-pmd-negotiation-max-is-avail {
+ type boolean;
+ default false;
+ config false;
+ description "1 = Indicates that device is supporting definition of the maximum speed/Medium Attached Unit (MAU) automatically chosen when (autoNegotiationIsOn=1)";
+ }
+ leaf-list supported-loop-back-kind-list {
+ type loop-back-type;
+ config false;
+ min-elements 1;
+ max-elements 5;
+ description "List of supported kinds of looping back of header information to the remote site.
+ 802.3 45.2.1.12.1 PMA remote loopback ability";
+ }
+ leaf maintenance-timer-range {
+ type string;
+ units "Byte";
+ default "Range of the maintenance timer not yet defined.";
+ config false;
+ description "MW IM
+ Available time periods for maintenance configurations (e.g. the loop back) to be described. Concrete values shall be separated by commas (e.g. '10, 60, 360'). Ranges shall be expressed as two values separated by a minus (e.g. '10-360').";
+ }
+ leaf-list supported-alarm-list {
+ type string;
+ config false;
+ min-elements 6;
+ description "Available alarms to be listed. Mandatory:'txFault', 'rxLos', 'tempHigh', 'tempLow', 'rxLevelHigh', 'rxLevelLow'. Optional:'vccHigh', 'vccLow', 'txBiasHigh', 'txBiasLow', 'txPowerHigh', 'txPowerLow', 'laserTempHigh', 'laserTempLow', 'tecCurrentHigh', 'tecCurrentLow'. Further alarms might be added by the device. Names are to be separated by commas.";
+ }
+ description "none";
+ }
+ grouping wire-interface-configuration-g {
+ leaf wire-interface-name {
+ type string;
+ default "Not yet defined.";
+ description "Text field for the wire interface being named by the operator. Ideally used for entering unique numbers or names for unambiguously identifying the connection within the network
+ Parameter";
+ }
+ leaf remote-wire-interface-name {
+ type string;
+ default "Not yet defined.";
+ description "Learning from MW IM
+ Text field for defining the wire interface this one is connected with. Ideally used for entering unique numbers or names for unambiguously identifying the connection within the network";
+ }
+ leaf interface-is-on {
+ type boolean;
+ default true;
+ description "1 = Activation of the interface (it gets powered and can be managed even if the transceiver is not yet transmitting or receiving). In case there is no Medium Attachment Unit (MAU) (e.g. no SFP in the cage) SETting (interfaceIsOn=1) must be ignored and GETing must return (interfaceIsOn=0)
+ 802.3 according 30.3.2.2.1 acPhyAdminControl";
+ }
+ leaf-list transceiver-is-on-list {
+ type boolean;
+ min-elements 1;
+ max-elements 11;
+ description "802.3 22.?.? and additionally 802.3 45.2.1.8 PMD transmit disable register (Register 1.9)
+ 1 = Activation of the transmitter and receiver (e.g. laser) of the PHY; transceiverIsOnList[0]:total interface; transceiverIsOnList[1..10] different lanes of a multilane Medium Attachment Unit (MAU)";
+ }
+ leaf auto-pmd-negotiation-is-on {
+ type boolean;
+ default false;
+ description "Parameter
+ 1 = Auto-negotiation is switched on";
+ }
+ leaf fixed-pmd {
+ type pmd-name-type;
+ default not-yet-defined;
+ description "If (autoPmdNegotiationIsOn=0) configuration of the concrete kind of Physical Medium Dependent (PMD). If (autoNegotiationIsOn=1) value of this field becomes irrelevant";
+ }
+ leaf auto-pmd-negotiation-max {
+ type pmd-name-type;
+ default not-yet-defined;
+ description "Parameter
+ If (autoNegotiationIsOn=1) AND (autoNegotiationMauMaxIsAvail=1) configuration of the maximum speed/Physical Medium Dependent (PMD), which is automatically chosen by Auto-negotiation";
+ }
+ leaf auto-signal-ordering-is-on {
+ type boolean;
+ default false;
+ description "1 = e.g. auto-MDI-X is switched on";
+ }
+ leaf fixed-signal-ordering {
+ type core-model:universal-id;
+ description "If (autoSignalOrderingIsOn=0) configuration of the concrete kind of signal ordering on the media (e.g. MDI, or MDI-X). If (autoSignalOrderingIsOn=1) value of this field becomes irrelevant";
+ }
+ leaf short-reach-mode-is-on {
+ type boolean;
+ default false;
+ description "Activation of the Short Reach Mode for 10GBASE-T according to 802.3 45.2.1.64";
+ }
+ leaf unidirectional-operation-is-on {
+ type boolean;
+ default false;
+ description "If (autoNegotiationIsOn=1) OR manualDuplexSelection=0 (=half duplex), this bit is ignored. When autoNegotiationIsOn=0 AND manualDuplexSelection=1 (=full duplex): 1 = Enable transmit from media independent interface regardless of whether the PHY has determined that a valid link has been established, 0 = Enable transmit from media independent interface only when the PHY has determined that a valid link has been established
+ 802.3
+ Parameter";
+ }
+ leaf-list wavelength-list {
+ type int32;
+ units "pm";
+ max-elements 4;
+ description "Wavelength of the signal of laser in pico meter; multiplicity=0..3 for 10GBASE-LX4 according to 802.3 53.5
+ SFF-8690";
+ }
+ leaf temperature-high-threshold {
+ type int8;
+ units "Celsius";
+ default -99;
+ description "Threshold for alarming high temperature values.
+ Will move to somewhere in the Physical Segment of the Core IM";
+ }
+ leaf temperature-low-threshold {
+ type int8;
+ units "Celsius";
+ default -99;
+ description "Threshold for alarming low temperature values.
+ Will move to somewhere in the Physical Segment of the Core IM";
+ }
+ leaf rxlevel-high-threshold {
+ type int8;
+ units "dBm";
+ default 99;
+ description "Threshold for alarming high RX levels.";
+ }
+ leaf rxlevel-low-threshold {
+ type int8;
+ units "dBm";
+ default 99;
+ description "Threshold for alarming low RX levels.";
+ }
+ leaf loop-back-kind-on {
+ type string;
+ description "Parameter
+ 802.3 according 22.2.4.1.2 Loopback
+ Maintenance Feature. The currently configured type of looping back of the wire interface header shall be expressed here. The received header is returned to the remote site.
+ Activation of local loopback mode on physical layer";
+ }
+ leaf isolation-is-on {
+ type boolean;
+ default false;
+ description "1 = Activation of the separation of the PHY from higher network layers
+ 802.3";
+ }
+ leaf restart-pmd-negotiation-is-on {
+ type boolean;
+ default false;
+ description "Restarts the auto negotiation process
+ 802.3";
+ }
+ leaf reset-mau-is-on {
+ type boolean;
+ default false;
+ description "802.3
+ Resets the entire Medium Access Unit (MAU)";
+ }
+ leaf maintenance-timer {
+ type int32;
+ default -1;
+ description "Parameter and MW IM
+ Time of existence of any maintenance configuration (e.g. the loop back). Valid values are defined in WireInterface::WireInterfaceCapability::maintenanceTimerRange";
+ }
+ list problem-kind-severity-list {
+ key 'problem-kind-name';
+ min-elements 6;
+ uses wire-interface-problem-severity-type-g;
+ description "Severity of the problem to be configured.";
+ }
+ description "none";
+ }
+ grouping wire-interface-status-g {
+ leaf interface-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "802.3 according 30.3.2.1.7 aPhyAdminState
+ 1 = A Physical layer entity (PHY) exists (including Medium Attachment Unit (e.g. SFP) ) and it is powered and can be managed";
+ }
+ leaf-list receive-signal-is-detected {
+ type boolean;
+ config false;
+ min-elements 1;
+ max-elements 11;
+ description "802.3 45.2.1.9 PMD receive signal detect
+ 1 = Receiver (e.g. laser) detects signal; receiveSignalIsDetected[0]:total interface; receiveSignalIsDetected[1..10] different lanes of a multilane Medium Attachment Unit (MAU)";
+ }
+ leaf pmd-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "Inverse of 802.3 45.2.1.2.3 Fault (1.1.7)
+ If (interfaceIsUp=1) BUT 0 = there is a fault in either transmit or receive path";
+ }
+ leaf pmd-cur {
+ type pmd-name-type;
+ default not-yet-defined;
+ config false;
+ description "Indicates the kind of Physical Medium Dependent (PMD) currently operated at this interface";
+ }
+ container signal-ordering-kind-cur {
+ config false;
+ uses signal-ordering-type-g;
+ description "Reference on a SignalOrderingType for expressing the currently active way of ordering the signals on the physical medium. Must contain a value as defined in TypeDefinitions::SignalOrderingType::signalOrderingKindName";
+ }
+ leaf eee-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "1 = Energy Efficient Ethernet is supported at both ends of the link and it is activated";
+ }
+ leaf link-is-up {
+ type boolean;
+ default false;
+ config false;
+ description "Parameter
+ 1 = (transceiverIsUp=1) AND communication is established to the remote site";
+ }
+ leaf link-is-idle {
+ type boolean;
+ default false;
+ config false;
+ description "1 = (linkIsUp=1) AND (eeeIsAvail=1) AND (eeeIsOn=1) AND link is currently in idle mode. If Energy Efficient Ethernet is not supported or switched off, this attribute must be 0.";
+ }
+ leaf tx-level-cur {
+ type int8;
+ units "dBm";
+ default 99;
+ config false;
+ description "Current transmit power";
+ }
+ leaf-list rx-level-cur {
+ type int8;
+ units "dBm";
+ config false;
+ min-elements 1;
+ max-elements 4;
+ description "Current receive power; Also used for receive signal power measured at the Medium Dependent Interface (MDI) of 10GBASE-T during training as described in 802.3 55.4.3.1";
+ }
+ leaf temp-cur {
+ type int8;
+ units "Celsius";
+ default -99;
+ config false;
+ description "Current temperature (in degree Celsius) inside the transceiver
+ To be moved to CoreModel::CorePhysicalModel-Initial::EquipmentDetail::ObjectClasses::DynamicDetails::PhysicalProperties ";
+ }
+ leaf loop-back-kind-up {
+ type loop-back-type;
+ default none;
+ config false;
+ description "Paramter and MW IM
+ The currently active (not just configured) type of looping back of the wire interface header shall be expressed here. The received header is returned to the remote site.";
+ }
+ description "none";
+ }
+ grouping wire-interface-current-problems-g {
+ list current-problem-list {
+ key 'sequence-number';
+ config false;
+ uses wire-interface-current-problem-type-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping wire-interface-current-performance-g {
+ list current-performance-data-list {
+ key 'scanner-id';
+ config false;
+ min-elements 1;
+ max-elements 2;
+ uses wire-interface-current-performance-type-g;
+ description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too.";
+ }
+ description "Aggregated performance information of the air interface at a particular moment.";
+ }
+ grouping wire-interface-historical-performances-g {
+ list historical-performance-data-list {
+ key 'history-data-id';
+ config false;
+ uses wire-interface-historical-performance-type-g;
+ description "none";
+ }
+ description "Aggregated performance information of the air interface for a pre-defined measurement interval.";
+ }
+
+ /***********************
+ * package super-classes
+ **********************/
+ grouping mw-current-problem-g {
+ leaf sequence-number {
+ type int32;
+ config false;
+ description "Unique sequence number of the current problem object.";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ config false;
+ description "Time and date of the problem. "; + }
+ leaf problem-severity {
+ type severity-type;
+ default warning;
+ config false;
+ description "Severity of the alarm.";
+ }
+ description "none";
+ }
+
+
+ /***********************
+ * package notifications
+ **********************/
+ notification object-creation-notification {
+ uses object-creation-notification-g;
+ description "none";
+ }
+ grouping object-creation-notification-g {
+ leaf counter {
+ type int32;
+ default -1;
+ description "Counts object creation notifications.";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ description "none";
+ }
+ leaf object-id-ref {
+ type core-model:universal-id;
+ description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+ leaf object-type {
+ type string;
+ default "Type of created object not specified.";
+ description "Type of Object to be chosen from the following list of values: 'MW_AirInterface_Pac', 'MW_AirInterfaceDiversity_Pac', 'MW_Structure_Pac', 'MW_PureEthernetStructure_Pac', 'MW_HybridMwStructure_Pac', 'MW_Container_Pac', 'MW_EthernetContainer_Pac' or 'MW_TdmContainer_Pac'.";
+ }
+ description "To be sent when a new MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac has to be instancieted in the controller.";
+ }
+ notification object-deletion-notification {
+ uses object-deletion-notification-g;
+ description "none";
+ }
+ grouping object-deletion-notification-g {
+ leaf counter {
+ type int32;
+ default -1;
+ description "Counts object deletion notifications.";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ description "none";
+ }
+ leaf object-id-ref {
+ type core-model:universal-id;
+ description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+ description "To be sent when a new MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac instance has to be deleted in the controller.";
+ }
+ notification attribute-value-changed-notification {
+ uses attribute-value-changed-notification-g;
+ description "none";
+ }
+ grouping attribute-value-changed-notification-g {
+ leaf counter {
+ type int32;
+ default -1;
+ description "Counts attribute value changed notifications.";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ description "none";
+ }
+ leaf object-id-ref {
+ type core-model:universal-id;
+ description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+ leaf attribute-name {
+ type string;
+ default "Attribute name not specified.";
+ description "Name of the attribute that has been changed.";
+ }
+ leaf new-value {
+ type string;
+ default "New value not specified.";
+ description "Attribute value converted to a string (xml, json, ...)";
+ }
+ description "To be sent when an attribute has changed and one or more controllers have to update their data.";
+ }
+ notification problem-notification {
+ uses problem-notification-g;
+ description "none";
+ }
+ grouping problem-notification-g {
+ leaf counter {
+ type int32;
+ default -1;
+ description "Counts problem notifications";
+ }
+ leaf time-stamp {
+ type yang:date-and-time;
+ default "2017-01-01T00:00:00.0Z";
+ description "none";
+ }
+ leaf object-id-ref {
+ type core-model:universal-id;
+ description "ID of the affected MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+ leaf problem {
+ type string;
+ default "Problem name not specified.";
+ description "Name of the problem according to AirInterface::AirInterfaceCapability::supportedAlarms or AirInterfaceDiversity::AirInterfaceDiversityCapability::supportedAlarms or Structure::StructureCapability::supportedAlarms or PureEthernetStructure::PureEthernetStructureCapability::supportedAlarms or HybridMwStructure::HybridMwStructureCapability::supportedAlarms or Container::ContainerCapability::supportedAlarms or EthernetContainer::EthernetContainerCapability::supportedAlarms or TdmContainer::TdmContainerCapability::supportedAlarms.";
+ }
+ leaf severity {
+ type severity-type;
+ default warning;
+ description "Severity of the problem according to AirInterface::AirInterfaceConfiguration::problemSeverityList, AirInterfaceDiversity::AirInterfaceDiversityConfiguration::problemSeverityList, Structure::StructureConfiguration::problemSeverityList, PureEthernetStructure::PureEthernetStructureConfiguration::problemSeverityList, HybridMwStructure::HybridMwStructureConfiguration::problemSeverityList, Container::ContainerConfiguration::problemSeverityList, EthernetContainer::EthernetContainerConfiguration::problemSeverityList or TdmContainer::TdmContainerConfiguration::problemSeverityList";
+ }
+ description "To be sent when a problem occurs at a MW_AirInterface_Pac, MW_AirInterfaceDiversity_Pac, MW_Structure_Pac, MW_PureEthernetStructure_Pac, MW_HybridMwStructure_Pac, MW_Container_Pac, MW_EthernetContainer_Pac or MW_TdmContainer_Pac.";
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/nc-notifications@2008-07-14.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/nc-notifications@2008-07-14.yang new file mode 100644 index 000000000..9ef5ed088 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/nc-notifications@2008-07-14.yang @@ -0,0 +1,95 @@ +module nc-notifications { + + namespace "urn:ietf:params:xml:ns:netmod:notification"; + prefix "manageEvent"; + + import ietf-yang-types{ prefix yang; } + import notifications { prefix ncEvent; } + + organization + "IETF NETCONF WG"; + + contact + "netconf@ietf.org"; + + description + "Conversion of the 'manageEvent' XSD in the NETCONF + Notifications RFC."; + + reference + "RFC 5277"; + + revision 2008-07-14 { + description "RFC 5277 version."; + } + + container netconf { + description "Top-level element in the notification namespace"; + + config false; + + container streams { + description + "The list of event streams supported by the system. When + a query is issued, the returned set of streams is + determined based on user privileges."; + + list stream { + description + "Stream name, description and other information."; + key name; + min-elements 1; + + leaf name { + description + "The name of the event stream. If this is the default + NETCONF stream, this must have the value 'NETCONF'."; + type ncEvent:streamNameType; + } + + leaf description { + description + "A description of the event stream, including such + information as the type of events that are sent over + this stream."; + type string; + mandatory true; + } + + leaf replaySupport { + description + "A description of the event stream, including such + information as the type of events that are sent over + this stream."; + type boolean; + mandatory true; + } + + leaf replayLogCreationTime { + description + "The timestamp of the creation of the log used to support + the replay function on this stream. Note that this might + be earlier then the earliest available notification in + the log. This object is updated if the log resets for + some reason. This object MUST be present if replay is + supported."; + type yang:date-and-time; // xsd:dateTime is wrong! + } + } + } + } + + notification replayComplete { + description + "This notification is sent to signal the end of a replay + portion of a subscription."; + } + + notification notificationComplete { + description + "This notification is sent to signal the end of a notification + subscription. It is sent in the case that stopTime was + specified during the creation of the subscription.."; + } + +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/notifications@2008-07-14.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/notifications@2008-07-14.yang new file mode 100644 index 000000000..1d0671166 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/notifications@2008-07-14.yang @@ -0,0 +1,82 @@ +module notifications { + + namespace "urn:ietf:params:xml:ns:netconf:notification:1.0"; + prefix "ncEvent"; + + import ietf-yang-types { prefix yang; revision-date "2013-07-15";} + + organization + "IETF NETCONF WG"; + + contact + "netconf@ops.ietf.org"; + + description + "Conversion of the 'ncEvent' XSD in the + NETCONF Notifications RFC."; + + reference + "RFC 5277."; + + revision 2008-07-14 { + description "RFC 5277 version."; + } + + typedef streamNameType { + description + "The name of an event stream."; + type string; + } + + rpc create-subscription { + description + "The command to create a notification subscription. It + takes as argument the name of the notification stream + and filter. Both of those options limit the content of + the subscription. In addition, there are two time-related + parameters, startTime and stopTime, which can be used to + select the time interval of interest to the notification + replay feature."; + + input { + leaf stream { + description + "An optional parameter that indicates which stream of events + is of interest. If not present, then events in the default + NETCONF stream will be sent."; + type streamNameType; + default "NETCONF"; + } + + anyxml filter { + description + "An optional parameter that indicates which subset of all + possible events is of interest. The format of this + parameter is the same as that of the filter parameter + in the NETCONF protocol operations. If not present, + all events not precluded by other parameters will + be sent."; + } + + leaf startTime { + description + "A parameter used to trigger the replay feature and + indicates that the replay should start at the time + specified. If start time is not present, this is not a + replay subscription."; + type yang:date-and-time; + } + + leaf stopTime { + // must ". >= ../startTime"; + description + "An optional parameter used with the optional replay + feature to indicate the newest notifications of + interest. If stop time is not present, the notifications + will continue until the subscription is terminated. + Must be used with startTime."; + type yang:date-and-time; + } + } + } +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/notifications@2018-05-30.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/notifications@2018-05-30.yang new file mode 100644 index 000000000..296577d87 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/notifications@2018-05-30.yang @@ -0,0 +1,97 @@ +module notifications { + yang-version 1; + namespace "urn:ietf:params:xml:ns:netconf:notification:1.0"; + prefix ncEvent; + + import ietf-yang-types { + prefix yang; + } + + organization + "IETF NETCONF WG"; + contact + "netconf@ops.ietf.org"; + description + "Conversion of the 'ncEvent' XSD in the + NETCONF Notifications RFC."; + reference "RFC 5277."; + + revision 2018-05-30 { + description + "First step to a common notification yang."; + reference + "RFC 5277: NETCONF Event Notifications"; + } + revision 2008-07-14 { + description + "Initial version"; + reference + "RFC 5277: NETCONF Event Notifications"; + } + + typedef streamNameType { + type string; + description + "The name of an event stream."; + } + + rpc create-subscription { + description + "The command to create a notification subscription. It + takes as argument the name of the notification stream + and filter. Both of those options limit the content of + the subscription. In addition, there are two time-related + parameters, startTime and stopTime, which can be used to + select the time interval of interest to the notification + replay feature."; + input { + leaf stream { + type streamNameType; + default "NETCONF"; + description + "An optional parameter that indicates which stream of events + is of interest. If not present, then events in the default + NETCONF stream will be sent."; + } + anyxml filter { + description + "An optional parameter that indicates which subset of all + possible events is of interest. The format of this + parameter is the same as that of the filter parameter + in the NETCONF protocol operations. If not present, + all events not precluded by other parameters will + be sent."; + } + leaf startTime { + type yang:date-and-time; + description + "A parameter used to trigger the replay feature and + indicates that the replay should start at the time + specified. If start time is not present, this is not a + replay subscription."; + } + leaf stopTime { + type yang:date-and-time; + description + "An optional parameter used with the optional replay + feature to indicate the newest notifications of + interest. If stop time is not present, the notifications + will continue until the subscription is terminated. + Must be used with startTime."; + } + } + } + container notification { + config false; + description + "internal struct to start a notification"; + leaf eventTime { + type yang:date-and-time; + mandatory true; + description + "The time the event was generated by the event source. This + parameter is of type dateTime and compliant to [RFC3339]. + Implementations must support time zones."; + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-core-model-conditional-packages@2017-04-02.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-core-model-conditional-packages@2017-04-02.yang new file mode 100644 index 000000000..44c99b10e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-core-model-conditional-packages@2017-04-02.yang @@ -0,0 +1,350 @@ +module onf-core-model-conditional-packages { + namespace "urn:onf:params:xml:ns:yang:onf-core-model-conditional-packages"; + prefix onf-core-model-conditional-packages; + import core-model { + prefix core-model; + } + import microwave-model { + prefix microwave-model; + } + organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project"; + contact "WG Web: <https://www.opennetworking.org/technical-communities/areas/specification/1931-optical-transport> + WG List: <mailto:wireless-transport@login.opennetworking.org> + WG Chair: Lyndon Ong + <mailto:lyong@ciena.com> + WG Chair: Giorgio Cazzaniga + <mailto:giorgio.cazzaniga@sm-optics.com> + Editors: Thorsten Heinze + <mailto:thorsten.heinze@telefonica.com> + Martin Skorupski + <mailto:martin.skorupski@highstreet-technologies.com>"; + description "This model adds conditional packages to the ONF CoreModel in order to support fault management for object classes NetworkElement, Equipment and Holder."; + revision 2017-04-02 { + description "Initial version"; + reference "ONF TR 532: A YANG Data Model for Wireless Networks."; + } + /*********************** + * package type-definitions + **********************/ + grouping current-problem-type-g { + leaf problem-name { + type string; + default "not-specified"; + config false; + description "Name of the alarm according capability::supportedAlarms."; + } + uses microwave-model:mw-current-problem-g; + description "none"; + } + grouping network-element-current-problem-type-g { + leaf problem-name { + type string; + default "not-specified"; + config false; + description "Name of the alarm according capability::supportedAlarms."; + } + leaf object-reference { + type string; + config false; + description "An explaining string of the related object class. This is necesseary, because the current problem list of the NetworkElement object class acts as a container for all alarms, where its object classes are not modeled."; + } + uses microwave-model:mw-current-problem-g; + description "none"; + } + grouping problem-severity-type-g { + leaf problem-type-name { + type string; + description "Name of the alarm according to Capability::supportedAlarms"; + } + leaf problem-type-severity { + type microwave-model:severity-type; + description "Severity of this type of alarm."; + } + description "none"; + } + typedef processing-type { + type enumeration { + enum done { + description "none"; + } + enum processing { + description "none"; + } + } + description "none"; + } + + /*********************** + * package object-classes + **********************/ + /*********************** + * package network-element + **********************/ + container network-element-pac { + leaf network-element { + type leafref { + path '/core-model:network-element/core-model:uuid'; + } + description "none"; + } + container network-element-capability { + config false; + uses network-element-capability-g; + description "none"; + } + container network-element-configuration { + uses network-element-configuration-g; + description "none"; + } + container network-element-status { + config false; + uses network-element-status-g; + description "none"; + } + container network-element-current-problems { + config false; + uses network-element-current-problems-g; + description "none"; + } + description "none"; + } + grouping network-element-capability-g { + leaf-list supported-alarms { + type string; + config false; + description "none"; + } + description "none"; + } + grouping network-element-configuration-g { + list problem-type-severity-list { + key 'problem-type-name'; + uses problem-severity-type-g; + description "Severity of the problem to be configured."; + } + leaf trigger-refresh { + type boolean; + description "A trigger to instruct the netconf server to refresh its internal database/cache. + It is primary used for alarms status, but could be used for anything else too. + It is assumed that the refresh mechanism takes some time. + In order to indicate the process to the controller a refreshStatus attribute is used."; + } + description "none"; + } + grouping network-element-status-g { + leaf refresh-status { + type processing-type; + config false; + description "none"; + } + description "none"; + } + grouping network-element-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses network-element-current-problem-type-g; + description "none"; + } + description "none"; + } + + /*********************** + * package equipment + **********************/ + list equipment-pac { + key 'equipment'; + leaf equipment { + type leafref { + path '/core-model:equipment/core-model:uuid'; + } + description "none"; + } + container equipment-capability { + config false; + uses equipment-capability-g; + description "none"; + } + container equipment-configuration { + uses equipment-configuration-g; + description "none"; + } + container equipment-status { + config false; + uses equipment-status-g; + description "none"; + } + container equipment-current-problems { + config false; + uses equipment-current-problems-g; + description "none"; + } + description "none"; + } + grouping equipment-capability-g { + leaf-list supported-alarms { + type string; + config false; + description "Available alarms to be listed. Names are to be separated by commas."; + } + description "none"; + } + grouping equipment-configuration-g { + list problem-type-severity-list { + key 'problem-type-name'; + uses problem-severity-type-g; + description "Severity of the problem to be configured."; + } + description "none"; + } + grouping equipment-status-g { + description "none"; + } + grouping equipment-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses current-problem-type-g; + description "none"; + } + description "none"; + } + + /*********************** + * package holder + **********************/ + list holder-pac { + key 'holder'; + leaf holder { + type leafref { + path '/core-model:equipment/core-model:contained-holder/core-model:uuid'; + } + description "none"; + } + container holder-capability { + config false; + uses holder-capability-g; + description "none"; + } + container holder-configuration { + uses holder-configuration-g; + description "none"; + } + container holder-status { + config false; + uses holder-status-g; + description "none"; + } + container holder-current-problems { + config false; + uses holder-current-problems-g; + description "none"; + } + description "none"; + } + grouping holder-capability-g { + leaf-list supported-alarms { + type string; + config false; + description "Available alarms to be listed. Names are to be separated by commas."; + } + description "none"; + } + grouping holder-configuration-g { + list problem-type-severity-list { + key 'problem-type-name'; + uses problem-severity-type-g; + description "Severity of the problem to be configured."; + } + description "none"; + } + grouping holder-status-g { + description "none"; + } + grouping holder-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses current-problem-type-g; + description "none"; + } + description "none"; + } + + /*********************** + * package connector + **********************/ + list connector-pac { + key 'connector'; + leaf connector { + type leafref { + path '/core-model:equipment/core-model:exposed-cable/core-model:connector/core-model:uuid'; + } + description "none"; + } + container connector-capability { + config false; + uses connector-capability-g; + description "none"; + } + container connector-configuration { + uses connector-configuration-g; + description "none"; + } + container connector-status { + config false; + uses connector-status-g; + description "none"; + } + container connector-current-problems { + config false; + uses connector-current-problems-g; + description "none"; + } + description "none"; + } + grouping connector-capability-g { + leaf-list supported-alarms { + type string; + config false; + description "Available alarms to be listed. Names are to be separated by commas."; + } + description "none"; + } + grouping connector-configuration-g { + list problem-type-severity-list { + key 'problem-type-name'; + uses problem-severity-type-g; + description "Severity of the problem to be configured."; + } + leaf remote-end-point { + type string; + description "A network wide identifier of the remote connector. The value is used for topology discovery. +Please see also ConnectorStatus::localEndPoint."; + } + description "none"; + } + grouping connector-status-g { + leaf local-end-point { + type string; + description "A network wide global identifier of the this connector, which can be used to discover the physical connectivitiy. +The value should contain the network element name, because the network element software can assume that the network element name is unique in the network. +The value should be formated: +<connector:uuid>@<network-element-name> + +Please see also ConnectorConfiguration::remoteEndPoint"; + } + description "none"; + } + grouping connector-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses current-problem-type-g; + description "none"; + } + description "none"; + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-ethernet-conditional-packages@2017-04-02.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-ethernet-conditional-packages@2017-04-02.yang new file mode 100644 index 000000000..4d6fb7c25 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-ethernet-conditional-packages@2017-04-02.yang @@ -0,0 +1,88 @@ +module onf-ethernet-conditional-packages { + namespace "urn:onf:params:xml:ns:yang:onf-ethernet-conditional-packages"; + prefix onf-ethernet-conditional-packages; + import core-model { + prefix core-model; + } + organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project"; + contact "WG Web: <https://www.opennetworking.org/technical-communities/areas/specification/1931-optical-transport> + WG List: <mailto:wireless-transport@login.opennetworking.org> + WG Chair: Lyndon Ong + <mailto:lyong@ciena.com> + WG Chair: Giorgio Cazzaniga + <mailto:giorgio.cazzaniga@sm-optics.com> + Editors: Thorsten Heinze + <mailto:thorsten.heinze@telefonica.com> + Martin Skorupski + <mailto:martin.skorupski@highstreet-technologies.com>"; + description "This model adds conditional packages to the ONF CoreModel in order address Ethernet use cases."; + revision 2017-04-02 { + description "Initial version"; + reference "ONF TR 532: A YANG Data Model for Wireless Networks."; + } + /*********************** + * package object-classes + **********************/ + list ethernet-pac { + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "none"; + } + container ethernet-capability { + config false; + uses ethernet-capability-g; + description "none"; + } + container ethernet-configuration { + uses ethernet-configuration-g; + description "none"; + } + container ethernet-status { + config false; + uses ethernet-status-g; + description "none"; + } + container ethernet-current-problems { + config false; + uses ethernet-current-problems-g; + description "none"; + } + container ethernet-current-performance { + config false; + uses ethernet-current-performance-g; + description "none"; + } + container ethernet-historical-performances { + config false; + uses ethernet-historical-performances-g; + description "none"; + } + description "none"; + } + grouping ethernet-capability-g { + description "none"; + } + grouping ethernet-configuration-g { + leaf vlan-id { + type int16; + description "value = 0: frames on ingress must be untagged, frames on egress get untagged; value = any other positive integer < 4096: frames on ingress must be tagged with this VLAN ID, frames on egress either already have or get this VLAN ID attached;"; + } + description "none"; + } + grouping ethernet-status-g { + description "none"; + } + grouping ethernet-current-problems-g { + description "none"; + } + grouping ethernet-current-performance-g { + description "none"; + } + grouping ethernet-historical-performances-g { + description "none"; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-otn-odu-conditional-packages@2017-10-20.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-otn-odu-conditional-packages@2017-10-20.yang new file mode 100644 index 000000000..89d6cbfcf --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-otn-odu-conditional-packages@2017-10-20.yang @@ -0,0 +1,361 @@ +module onf-otn-odu-conditional-packages { + namespace "urn:onf:params:xml:ns:yang:onf-otn-odu-conditional-packages"; + prefix onf-otn-odu-conditional-packages; + import core-model { + prefix core-model; + } + organization "ONF (Open Networking Foundation) Open Transport Working Group"; + contact "WG Web: <https://www.opennetworking.org/technical-communities/areas/specification/1931-optical-transport> + WG Chair: Lyndon Ong + <mailto:lyong@ciena.com> + Editors: Mohit Chamania + <MChamania@advaoptical.com> + Dzmitry Khomchanka + <dzmitry.khomchanka@vpi-minsk.com> + Martin Skorupski + <mailto:martin.skorupski@highstreet-technologies.com>"; + description "This model adds conditional packages to the ONF CoreModel 1.2 + in order address OTN ODU use cases. It is a temorary model for + demontration purposes and bases on the ideas an concepts of + TAPI. However, modifications for a pure southbound were + nessesary."; + revision 2017-10-20 { + description "Initial version"; + reference "ONF TR 512: Core Model."; + } + /*********************** + * package type-definitions (copied from TAPI; revision: 2017-05-31) + **********************/ + typedef mapping-type { + type enumeration { + enum amp { + description "none"; + } + enum bmp { + description "none"; + } + enum gfp-f { + description "none"; + } + enum gmp { + description "none"; + } + enum ttp-gfp-bmp { + description "none"; + } + enum null { + description "none"; + } + } + description "none"; + } + typedef odu-named-payload-type { + type enumeration { + enum unknown { + description "none"; + } + enum uninterpretable { + description "none"; + } + } + description "none"; + } + typedef odu-slot-size { + type enumeration { + enum 1-g-25 { + description "none"; + } + enum 2-g-5 { + description "none"; + } + } + description "none"; + } + typedef odu-type { + type enumeration { + enum odu-0 { + description "none"; + } + enum odu-1 { + description "none"; + } + enum odu-2 { + description "none"; + } + enum odu-2-e { + description "none"; + } + enum odu-3 { + description "none"; + } + enum odu-4 { + description "none"; + } + enum odu-flex { + description "none"; + } + enum odu-cn { + description "none"; + } + } + description "none"; + } + grouping odu-payload-type-g { + leaf named-payload-type { + type odu-named-payload-type; + description "none"; + } + leaf hex-payload-type { + type uint64; + description "none"; + } + description "none"; + } + /*********************** + * package object-classes + **********************/ + + /*********************** + * OTN ODU Connection (ODU-CTP) + **********************/ + list otn-odu-connection-pac { + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "none"; + } + container otn-odu-connection-capability { + config false; + uses otn-odu-connection-capability-g; + description "none"; + } + container otn-odu-connection-configuration { + uses otn-odu-connection-configuration-g; + description "none"; + } + container otn-odu-connection-status { + config false; + uses otn-odu-connection-status-g; + description "none"; + } + container otn-odu-connection-current-problems { + config false; + uses otn-odu-connection-current-problems-g; + description "none"; + } + container otn-odu-connection-current-performance { + config false; + uses otn-odu-connection-current-performance-g; + description "none"; + } + container otn-odu-connection-historical-performances { + config false; + uses otn-odu-connection-historical-performances-g; + description "none"; + } + description "none"; + } + grouping otn-odu-connection-capability-g { + container accepted-payload-type { + uses odu-payload-type-g; + description + "This attribute is applicable when the ODU CTP object + instance represents a lower order ODU CTP Sink at the + client layer of the ODUP/ODU[i]j or ODUP/ODUj-21 adaptation + function. + This attribute is a 2-digit Hex code that indicates the new + accepted payload type. + Valid values are defined in Table 15-8 of ITU-T + Recommendation G.709 with one additional value + UN_INTERPRETABLE."; + } + description "none"; + } + grouping otn-odu-connection-configuration-g { + leaf-list tributary-slot-list { + type uint64; + description + "This attribute contains a set of distinct (i.e. unique) + integers (e.g. 2, 3, 5, 9, 15 representing the tributary + slots TS2, TS3, TS5, TS9 and TS15) which represents the + resources occupied by the Low Order ODU Link Connection + (e.g. carrying an ODUflex with a bit rate of 6.25G). + This attribute applies when the LO ODU_ConnectionTerminationPoint + connects with an HO ODU_TrailTerminationPoint object. + It will not apply if this ODU_ConnectionTerminationPoint + object directly connects to an OTU_TrailTerminationPoint + object (i.e. OTU has no trib slots). + The upper bound of the integer allowed in this set is a + function of the HO-ODU server layer to which the ODU + connection has been mapped (adapted). + Thus, for example, M=8/32/80 for ODU2/ODU3/ODU4 server + layers (respectively). Note that the value of this + attribute can be changed only in the case of ODUflex and + has to be through specific operations (i.e. not be changing + the attribute tributarySlotList directly)."; + } + leaf tributary-port-number { + type uint64; + description + "This attribute identifies the tributary port number that is + associated with the ODU CTP. + range of type : The value range depends on the size of the + Tributary Port Number (TPN) field used which depends on th + server-layer ODU or OTU. + In case of ODUk mapping into OTUk, there is no TPN field, + so the tributaryPortNumber shall be zero. + In case of LO ODUj mapping over ODU1, ODU2 or ODU3, the TPN + is encoded in a 6-bit field so the value range is 0-63. + See clause 14.4.1/G.709-2016. + In case of LO ODUj mapping over ODU4, the TPN is encoded in + a 7-bit field so the value range is 0-127. + See clause 14.4.1.4/G.709-2016. + In case of ODUk mapping over ODUCn, the TPN is encoded in a + 14-bit field so the value range is 0-16383. See clause + 20.4.1.1/G.709-2016. + "; + } + leaf accepted-m-si { + type string; + description + "This attribute is applicable when the ODU CTP object + instance represents a lower order ODU1 or ODU2 CTP Sink at + the client layer of the ODU3P/ODU12 adaptation function or + represents a lower order ODUj CTP Sink at the client layer + of the ODUP/ODUj-21 adaptation function. This attribute is + a 1-byte field that represents the accepted multiplex + structure of the adaptation function. "; + } + leaf opu-tributary-slot-size { + type odu-slot-size; + description + "This attribute is applicable for ODU2 and ODU3 CTP only. + [sko] Why that? + It indicates the slot size of the ODU CTP."; + } + leaf auto-payload-type { + type boolean; + description + "This attribute is applicable when the ODU CTP object + instance represents a lower order ODU CTP Source at the + client layer of the ODUP/ODUj-21 adaptation function. The + value of true of this attribute configures that the + adaptation source function shall fall back to the payload + type PT=20 if the conditions specified in 14.3.10.1/G.798 + are satisfied. "; + } + leaf configured-mapping-type { + type mapping-type; + description + "This attributes indicates the configured mapping type."; + } + leaf configured-client-type { + type string; + description + "This attribute configures the type of the client CTP of the + server ODU TTP."; + } + description + "This Pac contains the attributes associated with the ODU-CTP."; + } + grouping otn-odu-connection-status-g { + description "none"; + } + grouping otn-odu-connection-current-problems-g { + description "none"; + } + grouping otn-odu-connection-current-performance-g { + description "none"; + } + grouping otn-odu-connection-historical-performances-g { + description "none"; + } + + + /*********************** + * OTN ODU Termination (ODU-TTP) + **********************/ + list otn-odu-termination-pac { + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "none"; + } + container otn-odu-termination-capability { + config false; + uses otn-odu-termination-capability-g; + description "none"; + } + container otn-odu-termination-configuration { + uses otn-odu-termination-configuration-g; + description "none"; + } + container otn-odu-termination-status { + config false; + uses otn-odu-termination-status-g; + description "none"; + } + container otn-odu-termination-current-problems { + config false; + uses otn-odu-termination-current-problems-g; + description "none"; + } + container otn-odu-termination-current-performance { + config false; + uses otn-odu-termination-current-performance-g; + description "none"; + } + container otn-odu-termination-historical-performances { + config false; + uses otn-odu-termination-historical-performances-g; + description "none"; + } + description "none"; + } + grouping otn-odu-termination-capability-g { + description "none"; + } + grouping otn-odu-termination-configuration-g { + leaf odu-type { + type odu-type; + description "This attribute specifies the type of the ODU + termination point."; + } + leaf odu-rate { + type uint64; + description "This attribute indicates the rate of the ODU + terminatinon point. + This attribute is Set at create; i.e., once created + it cannot be changed directly. + In case of resizable ODU flex, its value can be + changed via HAO (not directly on the attribute)."; + } + leaf odu-rate-tolerance { + type uint64; + units "ppm"; + description "This attribute indicates the rate tolerance of the + ODU termination point. + Valid values are real value in the unit of ppm. + Standardized values are defined in Table 7-2/G.709. + "; + } + description "none"; + } + grouping otn-odu-termination-status-g { + description "none"; + } + grouping otn-odu-termination-current-problems-g { + description "none"; + } + grouping otn-odu-termination-current-performance-g { + description "none"; + } + grouping otn-odu-termination-historical-performances-g { + description "none"; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-ptp-dataset@2017-05-08.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-ptp-dataset@2017-05-08.yang new file mode 100644 index 000000000..41a1c3935 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/onf-ptp-dataset@2017-05-08.yang @@ -0,0 +1,125 @@ +module onf-ptp-dataset { + namespace "urn:onf:params:xml:ns:yang:onf-ptp-dataset"; + prefix ptp-ex; + + import ietf-yang-types { + prefix yang; + } + import core-model { + prefix core-model; + } + import ietf-ptp-dataset { + prefix ptp; + } + + organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project"; + contact "WG Web: <https://www.opennetworking.org/technical-communities/areas/specification/1931-optical-transport> + WG List: <mailto:wireless-transport@login.opennetworking.org> + WG Chair: Lyndon Ong + <mailto:lyong@ciena.com> + Editors: Alfons Mittermaier + <mailto:alfons.mittermaier@@highstreet-technologies.com> + Martin Skorupski + <mailto:martin.skorupski@highstreet-technologies.com>"; + description "This module contains a collection of YANG definitions to extent ptp-dataset."; + revision 2017-05-08 { + description "Initial version"; + reference "A YANG Data Model extending ptp-dataset."; + } + + augment "/ptp:instance-list/ptp:default-ds" { + description + "Addition of data nodes for the default data set of the clock."; + + leaf local-priority { + type uint8; + default 128; + description + "none"; + reference + "ITU-T G.8275.1 Precision time protocol telecom profile for phase/time + synchronization with full timing support from the network + Chapter 6.3.2"; + } + + leaf max-steps-removed { + type uint8; + default 128; + description + "none"; + reference + "ITU-T G.8275.1 Precision time protocol telecom profile for phase/time + synchronization with full timing support from the network + Chapter 6.3"; + } + + leaf multicast-mac-address { + type yang:mac-address; + description + "none"; + } + + leaf designated-enabled { + type boolean; + default true; + description + "A PTP Clock needs to be enabled by management."; + } + } + + augment "/ptp:instance-list/ptp:port-ds-list" { + description + "Addition of data nodes for the default data set of the clock."; + + leaf master-only { + type boolean; + default true; + description + "Indicates that port can only be a master."; + } + + leaf local-priority { + type uint8; + default 128; + description + "Local priority as used for alternate BMCA"; + reference + "ITU-T G.8275.1 Precision time protocol telecom profile for phase/time + synchronization with full timing support from the network + Chapter 6.3.2"; + } + + leaf designated-enabled { + type boolean; + default true; + description + "A PTP Port needs to be enabled by management."; + reference + "IEEE 1588-2008 IEEE Standard for a Precision Clock Synchronization Protocol + for Networked Measurement and Control Systems + Chapter 9.2"; + } + + leaf delay-asymmetry { + type int64; + default 0; + description + "As per PTP Known path asymmetry in ns."; + reference + "ITU-T G.8275.1 Precision time protocol telecom profile for phase/time + synchronization with full timing support from the network + Chapter 7.4.2"; + } + + leaf logical-termination-point { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:uuid'; + } + description + "A reference to a LTP of layer-protocol-name 'ETY' or 'MWPS', which is used + to discover the PTP topology."; + } + + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/photonic-media@2018-09-24.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/photonic-media@2018-09-24.yang new file mode 100644 index 000000000..8ad209546 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/photonic-media@2018-09-24.yang @@ -0,0 +1,207 @@ +module photonic-media { + + namespace "urn:onf:params:xml:ns:yang:otsi-interface"; + prefix otsi-interface; + + import core-model { + prefix core-model; + } + + import tapi-photonic-media{ + prefix tapi-photonic-media; + } + + import tapi-oam{ + prefix tapi-oam; + } + + import ietf-yang-types { + prefix yang; + } + + organization "ONF (Open Networking Foundation) Open Transport Working Group - Wireless Transport Project"; + contact "WG Web: <https://www.opennetworking.org/software-defined-standards/models-apis/> + WG List: <mailto:wireless-transport@login.opennetworking.org> + WG Chair: Lyndon Ong + <mailto:lyong@ciena.com> + WG Chair: Giorgio Cazzaniga + <mailto:giorgio.cazzaniga@sm-optics.com> + Editors: Thorsten Heinze + <mailto:thorsten.heinze@telefonica.com> + Shrikanth Malavalli Divakar + <mailto:shrikanth.divakar@wipro.com>"; + description "This module contains a collection of YANG definitions for managing Optical networks. + This model is for vendor agnostic management of Optical Transport."; + + revision 2018-09-24 { + description "Version 1.0"; + reference "ONF TR-XXX: A YANG Data Model for Optical Transport."; + } + + /*********************** + * package type-definitions + **********************/ + typedef severity-type { + type enumeration { + enum non-alarmed { + description "none"; + } + enum warning { + description "none"; + } + enum minor { + description "none"; + } + enum major { + description "none"; + } + enum critical { + description "none"; + } + } + description "According to ITU-T M.3160"; + } + + + grouping otsi-interface-performance-type-g{ + container fec-properties-pac{ + uses tapi-photonic-media:fec-properties-pac-g; + description "none"; + } + description "none"; + } + + grouping otsi-interface-current-performance-type-g { + container performance-data { + config false; + uses otsi-interface-performance-type-g; + description "none"; + } + uses tapi-oam:pm-current-data-g; + description "Turns performance information into current performance information by inheriting from TAPI OAM current data."; + } + + grouping otsi-interface-historical-performance-type-g { + container performance-data { + config false; + uses otsi-interface-performance-type-g; + description "none"; + } + uses tapi-oam:pm-history-data-g; + description "Turns performance information into historical performance information by inheriting from TAPI OAM History data."; + } + + grouping otsi-interface-current-performance-g { + list current-performance-data-list { + key 'local-id'; + config false; + min-elements 1; + max-elements 2; + uses otsi-interface-current-performance-type-g; + description "At least values of the counters, which are reset every 15 minutes, are to be provided. If available, the current values of the counters, which are reset every 24 hour, can be provided, too."; + } + description "Aggregated performance information of the air interface at a particular moment."; + } + + grouping otsi-interface-historical-performances-g { + list historical-performance-data-list { + key 'local-id'; + config false; + uses otsi-interface-historical-performance-type-g; + description "none"; + } + description "Aggregated performance information of the air interface for a pre-defined measurement interval."; + } + + grouping otsi-interface-current-problem-type-g { + leaf problem-name { + type string; + default "Problem name not specified."; + config false; + description "Name of the alarm according to AirInterface::AirInterfaceCapability::supportedAlarms"; + } + uses otsi-current-problem-g; + description "none"; + } + + grouping otsi-interface-current-problems-g { + list current-problem-list { + key 'sequence-number'; + config false; + uses otsi-interface-current-problem-type-g; + description "none"; + } + description "none"; + } + + /*********************** + * package object-classes + **********************/ + /*********************** + * package otsi-interface + **********************/ + list otsi-interface-pac { + key 'layer-protocol'; + leaf layer-protocol { + type leafref { + path '/core-model:network-element/core-model:ltp/core-model:lp/core-model:uuid'; + } + description "CoreModel-CoreNetworkModule-ObjectClasses:NetworkElement/_ltpRefList/_lpList/uuid"; + } + container otsi-interface-capability { + config false; + uses tapi-photonic-media:otsi-capability-pac-g; + description "none"; + } + container otsi-interface-configuration { + uses tapi-photonic-media:otsi-termination-config-pac-g; + description "none"; + } + container otsi-interface-status { + config false; + uses tapi-photonic-media:otsi-termination-pac-g; + description "none"; + } + container otsi-interface-current-problems { + config false; + uses otsi-interface-current-problems-g; + description "none"; + } + container otsi-interface-current-performance { + config false; + uses otsi-interface-current-performance-g; + description "none"; + } + container otsi-interface-historical-performances { + config false; + uses otsi-interface-historical-performances-g; + description "none"; + } + description "none"; + } + + /*********************** + * package super-classes + **********************/ + grouping otsi-current-problem-g { + leaf sequence-number { + type int32; + config false; + description "Unique sequence number of the current problem object."; + } + leaf time-stamp { + type yang:date-and-time; + default "2017-01-01T00:00:00.0Z"; + config false; + description "Time and date of the problem. "; + } + leaf problem-severity { + type severity-type; + default warning; + config false; + description "Severity of the alarm."; + } + description "none"; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-common@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-common@2018-08-31.yang new file mode 100644 index 000000000..6489e0ee4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-common@2018-08-31.yang @@ -0,0 +1,666 @@ +module tapi-common {
+ namespace "urn:onf:otcc:yang:tapi-common";
+ prefix tapi-common;
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "
+ This module contains TAPI Common Model definitions.
+ Source: TapiCommon.uml
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0
+ ";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+
+ /*************************
+ * definitions of refrences
+ *************************/
+ grouping service-interface-point-ref-g {
+ leaf service-interface-point-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-common:service-interface-point/tapi-common:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ /***********************
+ * package object-classes
+ **********************/
+ grouping admin-state-pac-g {
+ leaf administrative-state {
+ type administrative-state;
+ description "none";
+ }
+ leaf operational-state {
+ type operational-state;
+ config false;
+ description "none";
+ }
+ leaf lifecycle-state {
+ type lifecycle-state;
+ config false;
+ description "none";
+ }
+ description "Provides state attributes that are applicable to an entity that can be administered. Such an entity also has operational and lifecycle aspects.";
+ }
+ grouping global-class-g {
+ leaf uuid {
+ type uuid;
+ description "UUID: An identifier that is universally unique within an identifier space, where the identifier space is itself globally unique, and immutable. An UUID carries no semantics with respect to the purpose or state of the entity.
+ UUID here uses string representation as defined in RFC 4122. The canonical representation uses lowercase characters.
+ Pattern: [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}
+ Example of a UUID in string representation: f81d4fae-7dec-11d0-a765-00a0c91e6bf6";
+ }
+ list name {
+ key 'value-name';
+ uses name-and-value-g;
+ description "List of names. A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity.";
+ }
+ description "The TAPI GlobalComponent serves as the super class for all TAPI entities that can be directly retrieved by their ID. As such, these are first class entities and their ID is expected to be globally unique. ";
+ }
+ grouping lifecycle-state-pac-g {
+ leaf lifecycle-state {
+ type lifecycle-state;
+ config false;
+ description "none";
+ }
+ description "Provides state attributes for an entity that has lifeccycle aspects only.";
+ }
+ grouping local-class-g {
+ leaf local-id {
+ type string;
+ description "none";
+ }
+ list name {
+ key 'value-name';
+ uses name-and-value-g;
+ description "List of names. A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity.";
+ }
+ description "The TAPI GlobalComponent serves as the super class for all TAPI entities that can be directly retrieved by their ID. As such, these are first class entities and their ID is expected to be globally unique. ";
+ }
+ grouping operational-state-pac-g {
+ leaf operational-state {
+ type operational-state;
+ config false;
+ description "none";
+ }
+ leaf lifecycle-state {
+ type lifecycle-state;
+ config false;
+ description "none";
+ }
+ description "Provides state attributes that are applicable to an entity that reflects operational aspects. Such an entity is expected to also have lifecycle aspects.";
+ }
+ container context {
+ uses tapi-context-g;
+ presence "Root container for all TAPI interaction";
+ description "none";
+ }
+ grouping tapi-context-g {
+ list service-interface-point {
+ key 'uuid';
+ uses service-interface-point-g;
+ description "none";
+ }
+ uses global-class-g;
+ description "The Network Control Domain (NCD) object class represents the scope of control that a particular SDN controller has with respect to a particular network, (i.e., encompassing a designated set of interconnected (virtual) network elements).";
+ }
+ grouping resource-spec-g {
+ uses global-class-g;
+ description "none";
+ }
+ grouping service-spec-g {
+ uses global-class-g;
+ description "none";
+ }
+ grouping service-interface-point-g {
+ leaf layer-protocol-name {
+ type layer-protocol-name;
+ config false;
+ description "Usage of layerProtocolName [>1] in the ServiceInterfacePoint should be considered experimental";
+ }
+ leaf-list supported-layer-protocol-qualifier {
+ type layer-protocol-qualifier;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ uses resource-spec-g;
+ uses admin-state-pac-g;
+ uses capacity-pac-g;
+ description "The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers.
+ The structure of LTP supports all transport protocols including circuit and packet forms.";
+ }
+ grouping capacity-pac-g {
+ container total-potential-capacity {
+ config false;
+ uses capacity-g;
+ description "An optimistic view of the capacity of the TopologicalEntity assuming that any shared capacity is available to be taken.";
+ }
+ container available-capacity {
+ config false;
+ uses capacity-g;
+ description "Capacity available to be assigned.";
+ }
+ description "The TopologicalEntity derives capacity from the underlying realization.
+ A TopologicalEntity may be an abstraction and virtualization of a subset of the underlying capability offered in a view or may be directly reflecting the underlying realization.
+ A TopologicalEntity may be directly used in the view or may be assigned to another view for use.
+ The clients supported by a multi-layer TopologicalEntity may interact such that the resources used by one client may impact those available to another. This is derived from the LTP spec details.
+ Represents the capacity available to user (client) along with client interaction and usage.
+ A TopologicalEntity may reflect one or more client protocols and one or more members for each profile.";
+ }
+ grouping termination-pac-g {
+ leaf termination-direction {
+ type termination-direction;
+ config false;
+ description "The overall directionality of the LP.
+ - A BIDIRECTIONAL LP will have some SINK and/or SOURCE flowss.
+ - A SINK LP can only contain elements with SINK flows or CONTRA_DIRECTION_SOURCE flows
+ - A SOURCE LP can only contain SOURCE flows or CONTRA_DIRECTION_SINK flows";
+ }
+ leaf termination-state {
+ type termination-state;
+ config false;
+ description "Indicates whether the layer is terminated and if so how.";
+ }
+ description "Each transport layer is represented by a LayerProtocol (LP) instance. The LayerProtocol instances it can be used for controlling termination and monitoring functionality.
+ It can also be used for controlling the adaptation (i.e. encapsulation and/or multiplexing of client signal), tandem connection monitoring, traffic conditioning and/or shaping functionality at an intermediate point along a connection.
+ Where the client – server relationship is fixed 1:1 and immutable, the layers can be encapsulated in a single LTP instance. Where the is a n:1 relationship between client and server, the layers must be split over two separate instances of LTP. ";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ identity LAYER_PROTOCOL_QUALIFIER {
+ description "none";
+ }
+ typedef administrative-state {
+ type enumeration {
+ enum LOCKED {
+ description "Users are administratively prohibited from making use of the resource.";
+ }
+ enum UNLOCKED {
+ description "Users are allowed to use the resource";
+ }
+ }
+ description "The possible values of the administrativeState.";
+ }
+ typedef date-and-time {
+ type string;
+ description "This primitive type defines the date and time according to the following structure:
+ yyyyMMddhhmmss.s[Z|{+|-}HHMm] where:
+ yyyy 0000..9999 year
+ MM 01..12 month
+ dd 01..31 day
+ hh 00..23 hour
+ mm 00..59 minute
+ ss 00..59 second
+ s .0...9 tenth of second (set to .0 if EMS or NE cannot support this granularity)
+ Z Z indicates UTC (rather than local time)
+ {+|-} + or - delta from UTC
+ HH 00..23 time zone difference in hours
+ Mm 00..59 time zone difference in minutes.";
+ }
+ typedef directive-value {
+ type enumeration {
+ enum MINIMIZE {
+ description "none";
+ }
+ enum MAXIMIZE {
+ description "none";
+ }
+ enum ALLOW {
+ description "none";
+ }
+ enum DISALLOW {
+ description "none";
+ }
+ enum DONT_CARE {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef forwarding-direction {
+ type enumeration {
+ enum BIDIRECTIONAL {
+ description "The Fowarding entity supports both BIDIRECTIONAL flows at all Ports (i.e. all Ports have both an INPUT flow and an OUTPUT flow defined)";
+ }
+ enum UNIDIRECTIONAL {
+ description "The Forwarding entity has Ports that are either INPUT or OUTPUT. It has no BIDIRECTIONAL Ports.";
+ }
+ enum UNDEFINED_OR_UNKNOWN {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ }
+ description "The directionality of a Forwarding entity.";
+ }
+ typedef layer-protocol-name {
+ type enumeration {
+ enum ODU {
+ description "Models the ODU layer as per ITU-T G.872";
+ }
+ enum ETH {
+ description "Models the ETH layer as per ITU-T G.8010";
+ }
+ enum DSR {
+ description "Models a Digital Signal of an unspecified rate. This value can be used when the intent is to respresent an generic digital layer signal without making any statement on its format or overhead (processing) capabilities.";
+ }
+ enum PHOTONIC_MEDIA {
+ description "Models the OCH, OTSi, OTSiA, OTSiG, OMS, OTS and Media channels as per ITU-T G.872 (2017) version 4";
+ }
+ }
+ description "Provides a controlled list of layer protocol names and indicates the naming authority.
+ Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference.
+ Layer protocol names include:
+ - Layer 1 (L1): OTU, ODU
+ - Layer 2 (L2): Carrier Grade Ethernet (ETY, ETH), MPLS-TP (MT)
+ ";
+ }
+ typedef lifecycle-state {
+ type enumeration {
+ enum PLANNED {
+ description "The resource is planned but is not present in the network.";
+ }
+ enum POTENTIAL_AVAILABLE {
+ description "The supporting resources are present in the network but are shared with other clients; or require further configuration before they can be used; or both.
+ o When a potential resource is configured and allocated to a client it is moved to the installed state for that client.
+ o If the potential resource has been consumed (e.g. allocated to another client) it is moved to the planned state for all other clients.";
+ }
+ enum POTENTIAL_BUSY {
+ description "The supporting resources are present in the network but are shared with other clients; or require further configuration before they can be used; or both.
+ o When a potential resource is configured and allocated to a client it is moved to the installed state for that client.
+ o If the potential resource has been consumed (e.g. allocated to another client) it is moved to the planned state for all other clients.";
+ }
+ enum INSTALLED {
+ description "The resource is present in the network and is capable of providing the service expected.";
+ }
+ enum PENDING_REMOVAL {
+ description "The resource has been marked for removal";
+ }
+ }
+ description "The possible values of the lifecycleState.";
+ }
+ grouping name-and-value-g {
+ leaf value-name {
+ type string;
+ description "The name of the value. The value need not have a name.";
+ }
+ leaf value {
+ type string;
+ description "The value";
+ }
+ description "A scoped name-value pair";
+ }
+ typedef operational-state {
+ type enumeration {
+ enum DISABLED {
+ description "The resource is unable to meet the SLA of the user of the resource. If no (explicit) SLA is defined the resource is disabled if it is totally inoperable and unable to provide service to the user.";
+ }
+ enum ENABLED {
+ description "The resource is partially or fully operable and available for use";
+ }
+ }
+ description "The possible values of the operationalState.";
+ }
+ typedef port-direction {
+ type enumeration {
+ enum BIDIRECTIONAL {
+ description "The Port has both an INPUT flow and an OUTPUT flow defined.";
+ }
+ enum INPUT {
+ description "The Port only has definition for a flow into the Forwarding entity (i.e. an ingress flow).";
+ }
+ enum OUTPUT {
+ description "The Port only has definition for a flow out of the Forwarding entity (i.e. an egress flow).";
+ }
+ enum UNIDENTIFIED_OR_UNKNOWN {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ }
+ description "The orientation of flow at the Port of a Forwarding entity";
+ }
+ typedef port-role {
+ type enumeration {
+ enum SYMMETRIC {
+ description "none";
+ }
+ enum ROOT {
+ description "none";
+ }
+ enum LEAF {
+ description "none";
+ }
+ enum TRUNK {
+ description "none";
+ }
+ enum UNKNOWN {
+ description "none";
+ }
+ }
+ description "The role of an end in the context of the function of the forwarding entity that it bounds";
+ }
+ typedef termination-direction {
+ type enumeration {
+ enum BIDIRECTIONAL {
+ description "A Termination with both SINK and SOURCE flows.";
+ }
+ enum SINK {
+ description "The flow is up the layer stack from the server side to the client side.
+ Considering an example of a Termination function within the termination entity, a SINK flow:
+ - will arrive at at the base of the termination function (the server side) where it is essentially at an INPUT to the termination component
+ - then will be decoded and deconstructed
+ - then relevant parts of the flow will be sent out of the termination function (the client side) where it is essentially at an OUTPUT from the termination component
+ A SINK termination is one that only supports a SINK flow.
+ A SINK termiation can be bound to an OUTPUT Port of a Forwarding entity";
+ }
+ enum SOURCE {
+ description "The flow is down the layer stack from the server side to the client side.
+ Considering an example of a Termination function within the termination entity, a SOURCE flow:
+ - will arrive at at the top of the termination function (the client side) where it is essentially at an INPUT to the termination component
+ - then will be assembled with various overheads etc and will be coded
+ - then coded form of the assembly of flow will be sent out of the termination function (the server side) where it is essentially at an OUTPUT from the termination component
+ A SOURCE termination is one that only supports a SOURCE flow.
+ A SOURCE termiation can be bound to an INPUT Port of a Forwarding entity";
+ }
+ enum UNDEFINED_OR_UNKNOWN {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ }
+ description "The directionality of a termination entity";
+ }
+ typedef termination-state {
+ type enumeration {
+ enum LP_CAN_NEVER_TERMINATE {
+ description "A non-flexible case that can never be terminated.";
+ }
+ enum LT_NOT_TERMINATED {
+ description "A flexible termination that can terminate but is currently not terminated.";
+ }
+ enum TERMINATED_SERVER_TO_CLIENT_FLOW {
+ description "A flexible termination that is currently terminated for server to client flow only.";
+ }
+ enum TERMINATED_CLIENT_TO_SERVER_FLOW {
+ description "A flexible termination that is currently terminated for client to server flow only.";
+ }
+ enum TERMINATED_BIDIRECTIONAL {
+ description "A flexible termination that is currently terminated in both directions of flow.";
+ }
+ enum LT_PERMENANTLY_TERMINATED {
+ description "A non-flexible termination that is always terminated (in both directions of flow for a bidirectional case and in the one direction of flow for both unidirectional cases).";
+ }
+ enum TERMINATION_STATE_UNKNOWN {
+ description "There TerminationState cannot be determined.";
+ }
+ }
+ description "Provides support for the range of behaviours and specific states that an LP can take with respect to termination of the signal.
+ Indicates to what degree the LayerTermination is terminated.";
+ }
+ typedef uuid {
+ type string;
+ description "The univeral ID value where the mechanism for generation is defned by some authority not directly referenced in the structure.
+ UUID here uses string representation as defined in RFC 4122. The canonical representation uses lowercase characters.
+ Pattern: [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}
+ Example of a UUID in string representation: f81d4fae-7dec-11d0-a765-00a0c91e6bf6";
+ }
+ grouping capacity-g {
+ container total-size {
+ uses capacity-value-g;
+ description "Total capacity of the TopologicalEntity in MB/s. In case of bandwidthProfile, this is expected to same as the committedInformationRate.";
+ }
+ container bandwidth-profile {
+ uses bandwidth-profile-g;
+ description "none";
+ }
+ description "Information on capacity of a particular TopologicalEntity.";
+ }
+ grouping bandwidth-profile-g {
+ leaf bw-profile-type {
+ type bandwidth-profile-type;
+ description "none";
+ }
+ container committed-information-rate {
+ uses capacity-value-g;
+ description "none";
+ }
+ container committed-burst-size {
+ uses capacity-value-g;
+ description "none";
+ }
+ container peak-information-rate {
+ uses capacity-value-g;
+ description "none";
+ }
+ container peak-burst-size {
+ uses capacity-value-g;
+ description "none";
+ }
+ leaf color-aware {
+ type boolean;
+ description "none";
+ }
+ leaf coupling-flag {
+ type boolean;
+ description "none";
+ }
+ description "none";
+ }
+ grouping capacity-value-g {
+ leaf value {
+ type uint64;
+ description "none";
+ }
+ leaf unit {
+ type capacity-unit;
+ description "none";
+ }
+ description "The Capacity (Bandwidth) values that are applicable for digital layers.";
+ }
+ typedef capacity-unit {
+ type enumeration {
+ enum TB {
+ description "Indicates that the integer CapacityValue is in TeraBytes";
+ }
+ enum TBPS {
+ description "Indicates that the integer CapacityValue is in Terabit-per-second";
+ }
+ enum GB {
+ description "Indicates that the integer CapacityValue is in GigaBytes";
+ }
+ enum GBPS {
+ description "Indicates that the integer CapacityValue is in Gigabit-per-second";
+ }
+ enum MB {
+ description "Indicates that the integer CapacityValue is in MegaBytes";
+ }
+ enum MBPS {
+ description "Indicates that the integer CapacityValue is in Megabit-per-second";
+ }
+ enum KB {
+ description "Indicates that the integer CapacityValue is in KiloBytes";
+ }
+ enum KBPS {
+ description "Indicates that the integer CapacityValue is in Kilobit-per-second";
+ }
+ enum GHz {
+ description "none";
+ }
+ enum MHz {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef bandwidth-profile-type {
+ type enumeration {
+ enum MEF_10.x {
+ description "none";
+ }
+ enum RFC_2697 {
+ description "none";
+ }
+ enum RFC_2698 {
+ description "none";
+ }
+ enum RFC_4115 {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping time-range-g {
+ leaf end-time {
+ type date-and-time;
+ description "none";
+ }
+ leaf start-time {
+ type date-and-time;
+ description "none";
+ }
+ description "none";
+ }
+ grouping time-period-g {
+ leaf value {
+ type uint64;
+ description "none";
+ }
+ leaf unit {
+ type time-unit;
+ description "none";
+ }
+ description "none";
+ }
+ typedef time-unit {
+ type enumeration {
+ enum YEARS {
+ description "none";
+ }
+ enum MONTHS {
+ description "none";
+ }
+ enum DAYS {
+ description "none";
+ }
+ enum HOURS {
+ description "none";
+ }
+ enum MINUTES {
+ description "none";
+ }
+ enum SECONDS {
+ description "none";
+ }
+ enum MILLISECONDS {
+ description "none";
+ }
+ enum MICROSECONDS {
+ description "none";
+ }
+ enum NANOSECONDS {
+ description "none";
+ }
+ enum PICOSECONDS {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping time-interval-g {
+ list period {
+ min-elements 1;
+ max-elements 5;
+ uses time-period-g;
+ description "none";
+ }
+ description "none";
+ }
+ typedef layer-protocol-qualifier {
+ type identityref {
+ base LAYER_PROTOCOL_QUALIFIER;
+ }
+ description "This enumeration is used to qualify the sub-layers (if applicable) for a specific LayerProtocol.
+ This extensible enumeration is intentionally empty in the common module and will be augmented with layer-specific values in the respective technology-specific modules.
+ Examples:
+ - LayerProtocolName := OPTICAL_DATA_UNIT
+ LayerProtocolQualifier := 'ODU_FLEX', 'ODU_0', 'ODU_1', 'ODU_2', 'ODU_2E', 'ODU_3', 'ODU_4'', 'ODU_CBR'', 'ODU_GFP'', 'ODU_GFP_HAO', etc
+ - LayerProtocolName := DIGITAL_SIGNAL_RATE
+ LayerProtocolQualifier := 'GBE', '10_GBE_WAN', '10_GBE_LAN', '100_GBE', 'FC_100', 'FC_200', 'FC_400', 'FC_800', 'FC_1200', 'FC_1600', 'FC_3200', 'STM_1', 'STM_4', 'STM_16', 'STM_64', 'STM_256', 'OC_3', 'OC_12', 'OC_48', 'OC_192', 'OC_768', 'OTU_1', 'OTU_2', 'OTU_2E', 'OTU_3', 'OTU_4', 'GPON', 'XGPON', 'IB_SDR', 'IB_DDR', 'IB_QDR', 'SBCON_ESCON', 'DVB_ASI', 'SDI', 'SDI_1G5', 'SDI_3G', etc
+ - LayerProtocolName := PHOTONIC_MEDIA
+ LayerProtocolQualifier := OCH, OTSi, OTSiA, NMC, NMCA, SMC, SMCA, OMS, OTS
+ ";
+ }
+
+ /***********************
+ * package interfaces
+ **********************/
+ rpc get-service-interface-point-details {
+ description "none";
+ input {
+ leaf sip-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container sip {
+ uses service-interface-point-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-service-interface-point-list {
+ description "none";
+ output {
+ list sip {
+ uses service-interface-point-g;
+ description "none";
+ }
+ }
+ }
+ rpc update-service-interface-point {
+ description "none";
+ input {
+ leaf sip-id-or-name {
+ type string;
+ description "none";
+ }
+ leaf state {
+ type administrative-state;
+ description "none";
+ }
+ }
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-connectivity@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-connectivity@2018-08-31.yang new file mode 100644 index 000000000..be0841982 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-connectivity@2018-08-31.yang @@ -0,0 +1,718 @@ +module tapi-connectivity { + namespace "urn:onf:otcc:yang:tapi-connectivity"; + prefix tapi-connectivity; + import tapi-common { + prefix tapi-common; + } + import tapi-topology { + prefix tapi-topology; + } + import tapi-path-computation { + prefix tapi-path-computation; + } + organization "ONF OTCC (Open Transport Configuration & Control) Project"; + contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>"; + description " + This module contains TAPI Connectivity Model definitions. + Source: TapiConnectivity.uml + Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. + License: This module is distributed under the Apache License 2.0"; + revision 2018-08-31 { + description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>"; + reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>"; + } + revision 2018-03-07 { + description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>"; + reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>"; + } + revision 2018-02-16 { + description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>"; + reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>"; + } + revision 2018-01-02 { + description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>"; + reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>"; + } + augment "/tapi-common:context" { + uses connectivity-context-g; + description "Augments the base TAPI Context with ConnectivityService information"; + } + augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" { + uses cep-list-g; + description "none"; + } + + /************************* + * definitions of references + *************************/ + grouping connectivity-service-ref-g { + leaf connectivity-service-uuid { + type leafref { + path '/tapi-common:context/tapi-connectivity:connectivity-service/tapi-connectivity:uuid'; + } + description "none"; + } + description "none"; + } + + grouping connectivity-service-end-point-ref-g { + uses connectivity-service-ref-g; + leaf connectivity-service-end-point-local-id { + type leafref { + path '/tapi-common:context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point/tapi-connectivity:local-id'; + } + description "none"; + } + description "none"; + } + grouping connection-end-point-ref-g { + uses tapi-topology:node-edge-point-ref-g; + leaf connection-end-point-uuid { + type leafref { + path '/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point/tapi-connectivity:uuid'; + } + description "none"; + } + description "none"; + } + + grouping connection-ref-g { + leaf connection-uuid { + type leafref { + path '/tapi-common:context/tapi-connectivity:connection/tapi-connectivity:uuid'; + } + description "none"; + } + description "none"; + } + + grouping switch-control-ref-g { + uses connection-ref-g; + leaf switch-control-uuid { + type leafref { + path '/tapi-common:context/tapi-connectivity:connection/tapi-connectivity:switch-control/tapi-connectivity:uuid'; + } + description "none"; + } + description "none"; + } + + grouping route-ref-g { + uses connection-ref-g; + leaf route-local-id { + type leafref { + path '/tapi-common:context/tapi-connectivity:connection/tapi-connectivity:route/tapi-connectivity:local-id'; + } + description "none"; + } + description "none"; + } + + /*********************** + * package object-classes + **********************/ + grouping connection-g { + list connection-end-point { + uses connection-end-point-ref-g; + key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid'; + config false; + min-elements 2; + description "none"; + } + list lower-connection { + uses connection-ref-g; + key 'connection-uuid'; + config false; + description "An Connection object supports a recursive aggregation relationship such that the internal construction of an Connection can be exposed as multiple lower level Connection objects (partitioning). + Aggregation is used as for the Node/Topology to allow changes in hierarchy. + Connection aggregation reflects Node/Topology aggregation. + The FC represents a Cross-Connection in an NE. The Cross-Connection in an NE is not necessarily the lowest level of FC partitioning."; + } + list supported-client-link { + uses tapi-topology:link-ref-g; + key 'topology-uuid link-uuid'; + config false; + description "none"; + } + list route { + key 'local-id'; + config false; + uses route-g; + description "none"; + } + list switch-control { + key 'uuid'; + config false; + uses switch-control-g; + description "none"; + } + leaf direction { + type tapi-common:forwarding-direction; + config false; + description "none"; + } + leaf layer-protocol-name { + type tapi-common:layer-protocol-name; + config false; + description "none"; + } + uses tapi-common:resource-spec-g; + uses tapi-common:operational-state-pac-g; + description "The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms. + At the lowest level of recursion, a FC represents a cross-connection within an NE."; + } + grouping connection-end-point-g { + leaf layer-protocol-name { + type tapi-common:layer-protocol-name; + config false; + description "none"; + } + leaf layer-protocol-qualifier { + type tapi-common:layer-protocol-qualifier; + config false; + description "none"; + } + container parent-node-edge-point { + uses tapi-topology:node-edge-point-ref-g; + config false; + description "none"; + } + list client-node-edge-point { + uses tapi-topology:node-edge-point-ref-g; + key 'topology-uuid node-uuid node-edge-point-uuid'; + config false; + description "none"; + } + list aggregated-connection-end-point { + uses connection-end-point-ref-g; + key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid'; + config false; + description "none"; + } + leaf connection-port-direction { + type tapi-common:port-direction; + config false; + description "The orientation of defined flow at the EndPoint."; + } + leaf connection-port-role { + type tapi-common:port-role; + config false; + description "Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function. "; + } + uses tapi-common:resource-spec-g; + uses tapi-common:operational-state-pac-g; + uses tapi-common:termination-pac-g; + description "The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers. + The structure of LTP supports all transport protocols including circuit and packet forms."; + } + grouping connectivity-constraint-g { + leaf service-layer { + type tapi-common:layer-protocol-name; + description "none"; + } + leaf service-type { + type service-type; + description "none"; + } + leaf service-level { + type string; + description "An abstract value the meaning of which is mutually agreed – typically represents metrics such as - Class of service, priority, resiliency, availability"; + } + container requested-capacity { + uses tapi-common:capacity-g; + description "none"; + } + leaf connectivity-direction { + type tapi-common:forwarding-direction; + description "none"; + } + container schedule { + uses tapi-common:time-range-g; + description "none"; + } + container coroute-inclusion { + uses connectivity-service-ref-g; + description "none"; + } + list diversity-exclusion { + uses connectivity-service-ref-g; + key 'connectivity-service-uuid'; + description "none"; + } + description "none"; + } + grouping connectivity-service-g { + list end-point { + key 'local-id'; + min-elements 2; + uses connectivity-service-end-point-g; + description "none"; + } + list connection { + uses connection-ref-g; + key 'connection-uuid'; + config false; + description "none"; + } + uses tapi-common:service-spec-g; + uses connectivity-constraint-g; + uses tapi-path-computation:routing-constraint-g; + uses tapi-path-computation:topology-constraint-g; + uses resilience-constraint-g; + uses tapi-common:admin-state-pac-g; + description "The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms. + At the lowest level of recursion, a FC represents a cross-connection within an NE."; + } + grouping connectivity-service-end-point-g { + leaf layer-protocol-name { + type tapi-common:layer-protocol-name; + description "none"; + } + leaf layer-protocol-qualifier { + type tapi-common:layer-protocol-qualifier; + description "none"; + } + container service-interface-point { + uses tapi-common:service-interface-point-ref-g; + description "none"; + } + list connection-end-point { + uses connection-end-point-ref-g; + key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid'; + config false; + description "none"; + } + container capacity { + uses tapi-common:capacity-g; + description "none"; + } + leaf direction { + type tapi-common:port-direction; + description "The orientation of defined flow at the EndPoint."; + } + leaf role { + type tapi-common:port-role; + description "Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function. "; + } + leaf protection-role { + type protection-role; + description "To specify the protection role of this Port when create or update ConnectivityService."; + } + uses tapi-common:local-class-g; + uses tapi-common:admin-state-pac-g; + description "The association of the FC to LTPs is made via EndPoints. + The EndPoint (EP) object class models the access to the FC function. + The traffic forwarding between the associated EPs of the FC depends upon the type of FC and may be associated with FcSwitch object instances. + In cases where there is resilience the EndPoint may convey the resilience role of the access to the FC. + It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. + The EP replaces the Protection Unit of a traditional protection model. + The ForwadingConstruct can be considered as a component and the EndPoint as a Port on that component"; + } + grouping route-g { + list connection-end-point { + uses connection-end-point-ref-g; + key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid'; + config false; + min-elements 2; + description "none"; + } + uses tapi-common:local-class-g; + description "The FC Route (FcRoute) object class models the individual routes of an FC. + The route of an FC object is represented by a list of FCs at a lower level. + Note that depending on the service supported by an FC, an the FC can have multiple routes."; + } + grouping connectivity-context-g { + list connectivity-service { + key 'uuid'; + uses connectivity-service-g; + description "none"; + } + list connection { + key 'uuid'; + config false; + uses connection-g; + description "none"; + } + description "none"; + } + grouping switch-g { + list selected-connection-end-point { + uses connection-end-point-ref-g; + key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid'; + min-elements 1; + description "none"; + } + list selected-route { + uses route-ref-g; + key 'connection-uuid route-local-id'; + min-elements 1; + description "none"; + } + leaf selection-control { + type selection-control; + description "Degree of administrative control applied to the switch selection."; + } + leaf selection-reason { + type selection-reason; + config false; + description "The reason for the current switch selection."; + } + leaf switch-direction { + type tapi-common:port-direction; + description "Indicates whether the switch selects from ingress to the FC or to egress of the FC, or both."; + } + uses tapi-common:local-class-g; + description "The class models the switched forwarding of traffic (traffic flow) between FcPorts (ConnectionEndPoints) and is present where there is protection functionality in the FC (Connection). + If an FC exposes protection (having two or more FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects to represent the alternative flow choices visible at the edge of the FC. + The FC switch represents and defines a protection switch structure encapsulated in the FC. + Essentially performs one of the functions of the Protection Group in a traditional model. It associates to 2 or more FcPorts each playing the role of a Protection Unit. + One or more protection, i.e. standby/backup, FcPorts provide protection for one or more working (i.e. regular/main/preferred) FcPorts where either protection or working can feed one or more protected FcPort. + The switch may be used in revertive or non-revertive (symmetric) mode. When in revertive mode it may define a waitToRestore time. + It may be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 and 1:1). + It may be locked out (prevented from switching), force switched or manual switched. + It will indicate switch state and change of state. + The switch can be switched away from all sources such that it becomes open and hence two coordinated switches can both feed the same LTP so long as at least one of the two is switched away from all sources (is 'open'). + The ability for a Switch to be 'high impedance' allows bidirectional ForwardingConstructs to be overlaid on the same bidirectional LTP where the appropriate control is enabled to prevent signal conflict. + This ability allows multiple alternate routes to be present that otherwise would be in conflict."; + } + grouping switch-control-g { + list sub-switch-control { + uses switch-control-ref-g; + key 'connection-uuid switch-control-uuid'; + description "none"; + } + list switch { + key 'local-id'; + uses switch-g; + description "none"; + } + uses tapi-common:resource-spec-g; + uses resilience-constraint-g; + description "Represents the capability to control and coordinate switches, to add/delete/modify FCs and to add/delete/modify LTPs/LPs so as to realize a protection scheme."; + } + grouping resilience-constraint-g { + container resilience-type { + uses tapi-topology:resilience-type-g; + description "none"; + } + leaf restoration-coordinate-type { + type coordinate-type; + description " The coordination mechanism between multi-layers."; + } + leaf restore-priority { + type uint64; + description "none"; + } + leaf reversion-mode { + type reversion-mode; + description "Indcates whether the protection scheme is revertive or non-revertive."; + } + leaf wait-to-revert-time { + type uint64; + default "15"; + description "If the protection system is revertive, this attribute specifies the time, in minutes, to wait after a fault clears on a higher priority (preferred) resource before reverting to the preferred resource."; + } + leaf hold-off-time { + type uint64; + description "This attribute indicates the time, in milliseconds, between declaration of signal degrade or signal fail, and the initialization of the protection switching algorithm."; + } + leaf is-lock-out { + type boolean; + description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of. + This overrides all other protection control states including forced. + If the item is locked out then it cannot be used under any circumstances. + Note: Only relevant when part of a protection scheme."; + } + leaf is-frozen { + type boolean; + description "Temporarily prevents any switch action to be taken and, as such, freezes the current state. + Until the freeze is cleared, additional near-end external commands are rejected and fault condition changes and received APS messages are ignored. + All administrative controls of any aspect of protection are rejected."; + } + leaf is-coordinated-switching-both-ends { + type boolean; + description "Is operating such that switching at both ends of each flow acorss the FC is coordinated at both ingress and egress ends."; + } + leaf max-switch-times { + type uint64; + description "Used to limit the maximum swtich times. When work fault disappears , and traffic return to the original work path, switch counter reset."; + } + leaf-list preferred-restoration-layer { + type tapi-common:layer-protocol-name; + description "Indicate which layer this resilience parameters package configured for."; + } + description "A list of control parameters to apply to a switch."; + } + grouping cep-list-g { + list connection-end-point { + key 'uuid'; + uses connection-end-point-g; + description "none"; + } + description "none"; + } + + /*********************** + * package type-definitions + **********************/ + typedef service-type { + type enumeration { + enum POINT_TO_POINT_CONNECTIVITY { + description "none"; + } + enum POINT_TO_MULTIPOINT_CONNECTIVITY { + description "none"; + } + enum MULTIPOINT_CONNECTIVITY { + description "none"; + } + enum ROOTED_MULTIPOINT_CONNECTIVITY { + description "none"; + } + } + description "none"; + } + typedef reversion-mode { + type enumeration { + enum REVERTIVE { + description "An FC switched to a lower priority (non-preferred) resource will revert to a higher priority (preferred) resource when that recovers (potentially after some hold-off time)."; + } + enum NON-REVERTIVE { + description "An FC switched to a lower priority (non-preferred) resource will not revert to a higher priority (preferred) resource when that recovers."; + } + } + description "The reversion mode associated with protection."; + } + typedef selection-control { + type enumeration { + enum LOCK_OUT { + description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of. + This overrides all other protection control states including forced. + If the item is locked out then it cannot be used under any circumstances. + Note: Only relevant when part of a protection scheme."; + } + enum NORMAL { + description "none"; + } + enum MANUAL { + description "none"; + } + enum FORCED { + description "none"; + } + } + description "Possible degrees of administrative control applied to the Route selection."; + } + typedef selection-reason { + type enumeration { + enum LOCKOUT { + description "none"; + } + enum NORMAL { + description "none"; + } + enum MANUAL { + description "none"; + } + enum FORCED { + description "none"; + } + enum WAIT_TO_REVERT { + description "none"; + } + enum SIGNAL_DEGRADE { + description "none"; + } + enum SIGNAL_FAIL { + description "none"; + } + } + description "The cause of the current route selection."; + } + typedef coordinate-type { + type enumeration { + enum NO_COORDINATE { + description "none"; + } + enum HOLD_OFF_TIME { + description "none"; + } + enum WAIT_FOR_NOTIFICATION { + description "none"; + } + } + description "none"; + } + typedef protection-role { + type enumeration { + enum WORK { + description "none"; + } + enum PROTECT { + description "none"; + } + enum PROTECTED { + description "none"; + } + enum NA { + description "none"; + } + enum WORK_RESTORE { + description "none"; + } + enum PROTECT_RESTORE { + description "none"; + } + } + description "none"; + } + + /*********************** + * package interfaces + **********************/ + rpc get-connection-details { + description "none"; + input { + leaf service-id-or-name { + type string; + description "none"; + } + leaf connection-id-or-name { + type string; + description "none"; + } + } + output { + container connection { + uses connection-g; + description "none"; + } + } + } + rpc get-connectivity-service-list { + description "none"; + output { + list service { + uses connectivity-service-g; + description "none"; + } + } + } + rpc get-connectivity-service-details { + description "none"; + input { + leaf service-id-or-name { + type string; + description "none"; + } + } + output { + container service { + uses connectivity-service-g; + description "none"; + } + } + } + rpc create-connectivity-service { + description "none"; + input { + list end-point { + key 'local-id'; + min-elements 2; + uses connectivity-service-end-point-g; + description "none"; + } + container connectivity-constraint { + uses connectivity-constraint-g; + description "none"; + } + container routing-constraint { + uses tapi-path-computation:routing-constraint-g; + description "none"; + } + container topology-constraint { + uses tapi-path-computation:topology-constraint-g; + description "none"; + } + list resilience-constraint { + uses resilience-constraint-g; + description "none"; + } + leaf state { + type string; + description "none"; + } + } + output { + container service { + uses connectivity-service-g; + description "none"; + } + } + } + rpc update-connectivity-service { + description "none"; + input { + leaf service-id-or-name { + type string; + description "none"; + } + container end-point { + uses connectivity-service-end-point-g; + description "none"; + } + container connectivity-constraint { + uses connectivity-constraint-g; + description "none"; + } + container routing-constraint { + uses tapi-path-computation:routing-constraint-g; + description "none"; + } + container topology-constraint { + uses tapi-path-computation:topology-constraint-g; + description "none"; + } + list resilience-constraint { + uses resilience-constraint-g; + description "none"; + } + leaf state { + type string; + description "none"; + } + } + output { + container service { + uses connectivity-service-g; + description "none"; + } + } + } + rpc delete-connectivity-service { + description "none"; + input { + leaf service-id-or-name { + type string; + description "none"; + } + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-dsr@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-dsr@2018-08-31.yang new file mode 100644 index 000000000..68e1fbf1c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-dsr@2018-08-31.yang @@ -0,0 +1,204 @@ +module tapi-dsr {
+ namespace "urn:onf:otcc:yang:tapi-dsr";
+ prefix tapi-dsr;
+ import tapi-common {
+ prefix tapi-common;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "none";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ /***********************
+ * package type-definitions
+ **********************/
+ identity DIGITAL_SIGNAL_TYPE {
+ base tapi-common:LAYER_PROTOCOL_QUALIFIER;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_GigE {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_10_GigE_LAN {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_10_GigE_WAN {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_40_GigE {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_100_GigE {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_FC_100 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_FC_200 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_FC_400 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_FC_800 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_FC_1200 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_FC_1600 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_FC_3200 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_STM_1 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_STM_4 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_STM_16 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_STM_64 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_STM_256 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OC_3 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OC_12 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OC_48 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OC_192 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OC_768 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OTU_1 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OTU_2 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OTU_2E {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OTU_3 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_OTU_4 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_GPON {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_XGPON {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_IB_SDR {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_IB_DDR {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_IB_QDR {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_SBCON_ESCON {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_DVB_ASI {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_SDI {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_SDI_1G5 {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ identity DIGITAL_SIGNAL_TYPE_SDI_3G {
+ base DIGITAL_SIGNAL_TYPE;
+ description "none";
+ }
+ typedef digital-signal-type {
+ type identityref {
+ base DIGITAL_SIGNAL_TYPE;
+ }
+ description "none";
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-eth@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-eth@2018-08-31.yang new file mode 100644 index 000000000..e8c44e7c0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-eth@2018-08-31.yang @@ -0,0 +1,1770 @@ +module tapi-eth {
+ namespace "urn:onf:otcc:yang:tapi-eth";
+ prefix tapi-eth;
+ import tapi-common {
+ prefix tapi-common;
+ }
+ import tapi-topology {
+ prefix tapi-topology;
+ }
+ import tapi-connectivity {
+ prefix tapi-connectivity;
+ }
+ import tapi-oam {
+ prefix tapi-oam;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "This module contains TAPI ETH Model definitions.
+ Source: TapiEth.uml
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {
+ uses eth-connection-end-point-spec-g;
+ description "Augments the base LayerProtocol information in ConnectionEndPoint with ETH-specific information";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job" {
+ uses eth-loopback-job-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:meg" {
+ uses eth-meg-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:meg/tapi-oam:mep" {
+ uses eth-mep-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:meg/tapi-oam:mip" {
+ uses eth-mip-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job" {
+ uses eth-pro-active-2way-measurement-job-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job" {
+ uses eth-link-trace-job-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job" {
+ uses eth-test-job-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job" {
+ uses eth-pro-active-1way-measurement-job-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-pro-active-dm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
+ uses eth-pro-active-dm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-pro-active-lm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
+ uses eth-pro-active-lm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-on-demand-dm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-on-demand-1-lm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-on-demand-1-dm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-pro-active-1-dm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
+ uses eth-pro-active-1-dm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-pro-active-1-lm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
+ uses eth-pro-active-1-lm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job" {
+ uses eth-on-demand-1way-measurement-job-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job" {
+ uses eth-on-demand-2way-measurement-job-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
+ uses eth-on-demand-1-dm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
+ uses eth-on-demand-1-lm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
+ uses eth-on-demand-dm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-on-demand-lm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
+ uses eth-on-demand-lm-performance-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {
+ uses eth-1-dm-threshold-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {
+ uses eth-1-lm-threshold-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {
+ uses eth-dm-threshold-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {
+ uses eth-lm-threshold-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-link-trace-result-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-test-result-data-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
+ uses eth-loopback-result-data-g;
+ description "none";
+ }
+ /***********************
+ * package object-classes
+ **********************/
+ grouping eth-ctp-pac-g {
+ leaf-list auxiliary-function-position-sequence {
+ type uint64;
+ description "This attribute indicates the positions (i.e., the relative order) of all the MEP, MIP, and TCS objects which are associated with the CTP.";
+ }
+ leaf vlan-config {
+ type uint64;
+ description "This attribute models the ETHx/ETH-m_A_So_MI_Vlan_Config information defined in G.8021.
+ range of type : -1, 0, 1..4094";
+ }
+ leaf csf-rdi-fdi-enable {
+ type boolean;
+ description "This attribute models the MI_CSFrdifdiEnable information defined in G.8021.";
+ }
+ leaf csf-report {
+ type boolean;
+ description "This attribute models the MI_CSF_Reported information defined in G.8021.
+ range of type : true, false";
+ }
+ leaf-list filter-config-snk {
+ type mac-address;
+ description "This attribute models the FilteConfig MI defined in 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are:
+ 01-80-C2-00-00-10,
+ 01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and
+ 01-80-C2-00-00-20 to 01-80-C2-00-00-2F.
+ The filter action is Pass or Block.
+ If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action.
+ If none of the above addresses match, the ETH_CI_D is passed.";
+ }
+ leaf mac-length {
+ type uint64;
+ default "2000";
+ description "This attribute models the MAC_Lenght MI defined in 8.6/G.8021 for the MAC Length Check process. It indicates the allowed maximum frame length in bytes.
+ range of type : 1518, 1522, 2000";
+ }
+ container filter-config {
+ uses control-frame-filter-g;
+ description "This attribute models the FilterConfig MI defined in section 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are:
+ - All bridges address: 01-80-C2-00-00-10,
+ - Reserved addresses: 01-80-C2-00-00-00 to 01-80-C2-00-00-0F,
+ - GARP Application addresses: 01-80-C2-00-00-20 to 01-80-C2-00-00-2F.
+ The filter action is Pass or Block.
+ If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action.
+ If none of the above addresses match, the ETH_CI_D is passed.";
+ }
+ leaf is-ssf-reported {
+ type boolean;
+ description "This attribute provisions whether the SSF defect should be reported as fault cause or not.
+ It models the ETH-LAG_FT_Sk_MI_SSF_Reported defined in G.8021.";
+ }
+ leaf pll-thr {
+ type uint64;
+ description "This attribute provisions the threshold for the number of active ports. If the number of active ports is more than zero but less than the provisioned threshold, a cPLL (Partial Link Loss) is raised. See section 9.7.1.2 of G.8021.
+ range of type : 0..number of ports";
+ }
+ leaf actor-oper-key {
+ type uint64;
+ config false;
+ description "See 802.1AX:
+ The current operational value of the Key for the Aggregator. The administrative Key value may differ from the operational Key value for the reasons discussed in 5.6.2.
+ The meaning of particular Key values is of local significance.
+ range of type : 16 bit";
+ }
+ leaf actor-system-id {
+ type mac-address;
+ description "See 802.1AX:
+ A MAC address used as a unique identifier for the System that contains this Aggregator.";
+ }
+ leaf actor-system-priority {
+ type uint64;
+ description "See 802.1AX:
+ Indicating the priority associated with the Actor’s System ID.
+ range of type : 2-octet";
+ }
+ leaf collector-max-delay {
+ type uint64;
+ description "See 802.1AX:
+ The value of this attribute defines the maximum delay, in tens of microseconds, that may be imposed by the Frame Collector between receiving a frame from an Aggregator Parser, and either delivering the frame to its MAC Client or discarding the frame (see IEEE 802.1AX clause 5.2.3.1.1).
+ range of type : 16-bit";
+ }
+ leaf data-rate {
+ type uint64;
+ config false;
+ description "See 802.1AX:
+ The current data rate, in bits per second, of the aggregate link. The value is calculated as N times the data rate of a single link in the aggregation, where N is the number of active links.";
+ }
+ leaf partner-oper-key {
+ type uint64;
+ config false;
+ description "See 802.1AX:
+ The current operational value of the Key for the Aggregator’s current protocol Partner. If the aggregation is manually configured, this Key value will be a value assigned by the local System.
+ range of type : 16-bit";
+ }
+ leaf partner-system-id {
+ type mac-address;
+ config false;
+ description "See 802.1AX:
+ A MAC address consisting of the unique identifier for the current protocol Partner of this Aggregator. A value of zero indicates that there is no known Partner. If the aggregation is manually configured, this System ID value will be a value assigned by the local System.";
+ }
+ leaf partner-system-priority {
+ type uint64;
+ config false;
+ description "See 802.1AX:
+ Indicates the priority associated with the Partner’s System ID. If the aggregation is manually configured, this System Priority value will be a value assigned by the local System.
+ range of type : 2-octet";
+ }
+ leaf csf-config {
+ type csf-config;
+ description "This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021.
+ range of type : true, false";
+ }
+ container traffic-shaping {
+ uses traffic-shaping-pac-g;
+ description "none";
+ }
+ container traffic-conditioning {
+ uses traffic-conditioning-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping eth-connection-end-point-spec-g {
+ container ety-term {
+ uses ety-termination-pac-g;
+ description "none";
+ }
+ container eth-term {
+ uses eth-termination-pac-g;
+ description "none";
+ }
+ container eth-ctp {
+ uses eth-ctp-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping eth-termination-pac-g {
+ container priority-regenerate {
+ uses priority-mapping-g;
+ description "This attribute models the ETHx/ETH-m _A_Sk_MI_P_Regenerate information defined in G.8021.";
+ }
+ leaf ether-type {
+ type vlan-type;
+ description "This attribute models the ETHx/ETH-m _A_Sk_MI_Etype information defined in G.8021.";
+ }
+ leaf-list filter-config-1 {
+ type mac-address;
+ description "This attribute models the ETHx/ETH-m_A_Sk_MI_Filter_Config information defined in G.8021.
+ It indicates the configured filter action for each of the 33 group MAC addresses for control frames.
+ The 33 MAC addresses are:
+ 01-80-C2-00-00-10,
+ 01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and
+ 01-80-C2-00-00-20 to 01-80-C2-00-00-2F.
+ The filter action is Pass or Block.
+ If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action.
+ If none of the above addresses match, the ETH_CI_D is passed.
+ range of type : MacAddress:
+ 01-80-C2-00-00-10,
+ 01-80-C2-00-00-00 to
+ 01-80-C2-00-00-0F, and
+ 01-80-C2-00-00-20 to
+ 01-80-C2-00-00-2F;
+ ActionEnum:
+ PASS, BLOCK";
+ }
+ leaf frametype-config {
+ type frame-type;
+ description "This attribute models the ETHx/ETH-m_A_Sk_MI_Frametype_Config information defined in G.8021.
+ range of type : see Enumeration";
+ }
+ leaf port-vid {
+ type vid;
+ default "1";
+ description "This attribute models the ETHx/ETH-m _A_Sk_MI_PVID information defined in G.8021.";
+ }
+ leaf priority-code-point-config {
+ type pcp-coding;
+ description "This attribute models the ETHx/ETH-m _A_Sk_MI_PCP_Config information defined in G.8021.
+ range of type : see Enumeration";
+ }
+ description "This object class models the Ethernet Flow Termination function located at a layer boundary.";
+ }
+ grouping ety-termination-pac-g {
+ leaf is-fts-enabled {
+ type boolean;
+ description "This attribute indicates whether Forced Transmitter Shutdown (FTS) is enabled or not. It models the ETYn_TT_So_MI_FTSEnable information.";
+ }
+ leaf is-tx-pause-enabled {
+ type boolean;
+ description "This attribute identifies whether the Transmit Pause process is enabled or not. It models the MI_TxPauseEnable defined in G.8021.";
+ }
+ leaf phy-type {
+ type ety-phy-type;
+ config false;
+ description "This attribute identifies the PHY type of the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.2.";
+ }
+ leaf-list phy-type-list {
+ type ety-phy-type;
+ config false;
+ description "This attribute identifies the possible PHY types that could be supported at the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.3.";
+ }
+ description "none";
+ }
+ grouping traffic-conditioning-pac-g {
+ list prio-config-list {
+ config false;
+ uses priority-configuration-g;
+ description "This attribute indicates the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue.";
+ }
+ list cond-config-list {
+ config false;
+ uses traffic-conditioning-configuration-g;
+ description "This attribute indicates for the conditioner process the conditioning parameters:
+ - Queue ID: Indicates the Queue ID
+ - Committed Information Rate (CIR): number of bits per second
+ - Committed Burst Size (CBS): number of bytes
+ - Excess Information Rate (EIR): number of bits per second
+ - Excess Burst Size (EBS): number of bytes
+ - Coupling flag (CF): 0 or 1
+ - Color mode (CM): color-blind and color-aware.";
+ }
+ leaf codirectional {
+ type boolean;
+ config false;
+ description "This attribute indicates the direction of the conditioner. The value of true means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the sink part of the containing CTP. The value of false means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the source part of the containing CTP.";
+ }
+ description "This object class models the ETH traffic conditioning function as defined in G.8021.
+ Basic attributes: codirectional, condConfigList, prioConfigList";
+ }
+ grouping traffic-shaping-pac-g {
+ list prio-config-list {
+ config false;
+ uses priority-configuration-g;
+ description "This attribute configures the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue.";
+ }
+ list queue-config-list {
+ config false;
+ uses queue-configuration-g;
+ description "This attribute configures the Queue depth and Dropping threshold parameters of the Queue process. The Queue depth sets the maximum size of the queue in bytes. An incoming ETH_CI traffic unit is dropped if there is insufficient space in the queue to hold the whole unit. The Dropping threshold sets the threshold of the queue. If the queue is filled beyond this threshold, incoming ETH_CI traffic units accompanied by the ETH_CI_DE signal set are dropped.";
+ }
+ leaf sched-config {
+ type scheduling-configuration;
+ config false;
+ description "This attribute configures the scheduler process. The value of this attribute is for further study because it is for further study in G.8021.
+ Scheduler is a pointer to a Scheduler object, which is to be defined in the future (because in G.8021, this is FFS).
+ Note that the only significance of the GTCS function defined in G.8021 is the use of a common scheduler for shaping. Given that, G.8052 models the common scheduler feature by having a common value for this attribute.";
+ }
+ leaf codirectional {
+ type boolean;
+ config false;
+ description "This attribute indicates the direction of the shaping function. The value of true means that the shaping (modeled as a TCS Source according to G.8021) is associated with the source part of the containing CTP. The value of false means that the shaping (modeled as a TCS Source according to G.8021) is associated with the sink part of the containing CTP.";
+ }
+ description "This object class models the ETH traffic shaping function as defined in G.8021.
+ Basic attribute: codirectional, prioConfigList, queueConfigList, schedConfig";
+ }
+ grouping eth-meg-spec-g {
+ leaf client-mel {
+ type uint64;
+ description "none";
+ }
+ description "none";
+ }
+ grouping eth-mep-spec-g {
+ container eth-mep-common {
+ uses eth-mep-common-g;
+ description "none";
+ }
+ container eth-mep-source-pac {
+ uses eth-mep-source-g;
+ description "none";
+ }
+ container eth-mep-sink {
+ uses eth-mep-sink-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping eth-mip-spec-g {
+ description "none";
+ }
+ grouping eth-loopback-job-g {
+ container eth-lb-msg {
+ uses eth-oam-msg-common-pac-g;
+ description "none";
+ }
+ leaf number {
+ type uint64;
+ description "G.8052: This parameter specifies how many LB messages to be sent for the LB_Series process.";
+ }
+ description "This class represents the Loopback (LB) process (send a series of LB messages carrying a test pattern to a particular MEP). The termination occurs at specified stop time (schedule attribute of OamJob).
+ This class models also the 'loopback discover' process, when destinationAddress is multicast.
+ When number is greater than 1, then the process is to perform a Loopback (LB) Series process (send a series of N LB messages to a particular MEP/MIP. ";
+ }
+ grouping eth-mep-common-g {
+ leaf mep-mac {
+ type mac-address;
+ config false;
+ description "This attribute contains the MAC Address of the MEP.";
+ }
+ leaf is-cc-enabled {
+ type boolean;
+ description "This attribute models the MI_CC_Enable signal defined in G.8021 and configured as specified in G8051.";
+ }
+ leaf cc-period {
+ type oam-period;
+ description "This attribute models the MI_CC_Period signal defined in G.8021 and configured as specified in G8051.
+ It is the period at which the CCM message should be sent.
+ Default values are: 3.33 ms for PS, 100 ms for PM, 1 s for FM.";
+ }
+ leaf cc-priority {
+ type uint64 {
+ range "0..7";
+ }
+ default "7";
+ description "This attribute models the MI_CC_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the CCM message should be sent.";
+ }
+ leaf lck-period {
+ type oam-period;
+ description "This attribute models the MI_LCK_Period signal defined in G.8021 and configured as specified in G8051. It is the frequency at which the LCK messages should be sent.
+ range of type : 1s, 1min";
+ }
+ leaf lck-priority {
+ type uint64 {
+ range "0..7";
+ }
+ default "7";
+ description "This attribute models the MI_LCK_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the LCK messages should be sent.";
+ }
+ description "Basic attributes: adminState, clientMel, megIdentifier, mepMac
+ Continuity Check Process related attributes: ccPeriod, ccPriority, isCcEnabled
+ Lock Process related attributes: lckPeriod, lckPriority
+ This object class models the MEP functions that are common to MEP Sink and MEP Source.";
+ }
+ grouping eth-mep-sink-g {
+ leaf-list dm-1-priority {
+ type uint64;
+ description "This attribute indicates the list of 1DM priorities for the MepSink.";
+ }
+ leaf ais-priority {
+ type uint64 {
+ range "0..7";
+ }
+ default "7";
+ description "This attribute models the MI_AIS_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the AIS messages should be sent.";
+ }
+ leaf ais-period {
+ type oam-period;
+ description "This attribute models the MI_AIS_Period signal defined in G.8021 and configured as specified in G8051. It is the frequency at which the AIS messages should be sent.
+ range of type : 1s, 1min";
+ }
+ leaf is-csf-reported {
+ type boolean;
+ default "true";
+ description "This attribute models the MI_CSF_Reported signal defined in G.8021 and configured as specified in G8051. It configures whether the secondary failure CSF should be reported or not.";
+ }
+ leaf is-csf-rdi-fdi-enabled {
+ type boolean;
+ default "true";
+ description "This attribute models the MI_CSFrdifdiEnable signal defined in G.8021 and configured as specified in G8051.";
+ }
+ container bandwidth-report {
+ config false;
+ uses bandwidth-report-g;
+ description "This attribute models the content of the bandwidth report received by the MEP Sink from the peer MEP Source.";
+ }
+ leaf lm-degm {
+ type uint64;
+ default "10";
+ description "This attribute defines the number of consecutive bad seconds necessary for the 'degraded' detection. See also section 'Degraded signal defect (dDEG)' in G.8021.";
+ }
+ leaf lm-deg-thr {
+ type uint64;
+ default "30";
+ description "This attribute defines the threshold for declaring a 'bad second'. See also section 'Degraded signal defect (dDEG)' in G.8021.";
+ }
+ leaf lm-m {
+ type uint64 {
+ range "2..10";
+ }
+ default "10";
+ description "This attribute defines the number of consecutive good seconds necessary for the clearing of 'degraded'. See also section 'Degraded signal defect (dDEG)' in G.8021.";
+ }
+ leaf lm-tf-min {
+ type uint64;
+ description "This attribute defines the necessary number of transmitted frames to enable the detection of 'bad seconds'. See also section 'Degraded signal defect (dDEG)' in G.8021.";
+ }
+ description "1DM related attribute: 1DmPriority
+ AIS Process related attributes: aisPeriod, aisPriority
+ Bandwidth notification Process related attribute: bandwidthReport
+ Basic attribute: peerMepRefList
+ CSF Process related attributes: isCsfRdiFdiEnabled, isCsfReported
+ Defect correlation Process related attribute: currentProblemList
+ This object class models the MEP sink function. Instance of this object class can be created and contained by ETH CTP or TTP objects.
+ It also provides the management of the dual-ended maintenance job, such as test.
+ This object contains the configuration parameters for detecting 'degraded signal' (DEG).";
+ }
+ grouping eth-mep-source-g {
+ leaf aps-priority {
+ type uint64 {
+ range "0..7";
+ }
+ default "7";
+ description "This attribute specifies the priority of the APS messages.
+ See section 8.1.5 APS insert process in G.8021.";
+ }
+ leaf csf-priority {
+ type uint64 {
+ range "0..7";
+ }
+ default "7";
+ description "This attribute models the MI_CSF_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the CSF messages should be sent";
+ }
+ leaf csf-period {
+ type oam-period;
+ description "This attribute models the MI_CSF_Period signal defined in G.8021 and configured as specified in G8051. It is the period at which the CSF messages should be sent.
+ range of type : 1s, 1min";
+ }
+ leaf csf-config {
+ type csf-config;
+ description "This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021.";
+ }
+ description "APS Process related attribute: apsPriority
+ Basic attribute: mepIdentifier
+ CSF Process related attributes: csfConfig, csfPeriod, csfPriority
+ Link trace related operation: linkTrace
+ Loopback related operations: loopbackDiscover, loopbackSeries, loopbackTest, loopbackTestTerminate
+ On demand measurement job control related operation: establishOnDemandDualEndedMeasurementJobSource
+ Proactive measurement job control related operation: establishProActiveDualEndedMeasurementJobSource
+ Test related operations: testInitiatorStart, testInitiatorTerminate
+ This object class models the MEP source function. Instance of this object class can be created and contained by ETH CTP or TTP objects.
+ It also provides the management of single-ended maintenance jobs, such as loopback test, loopback discover, loopback series, link trace, and dual-ended maintenance job, such as test.";
+ }
+ grouping eth-link-trace-job-g {
+ container eth-lt-msg {
+ uses eth-oam-operation-common-pac-g;
+ description "none";
+ }
+ leaf time-to-live {
+ type uint64;
+ description "G.8052: This parameter provides the Time To Live (TTL) parameter of the Link Track protocol.
+ The TTL parameter allows the receiver (MIP or MEP) of the LTM frame to determine if the frame can be terminated. TTL is decremented every time the LTM frame is relayed. LTM frame with TTL<=1 is terminated and not relayed.";
+ }
+ description "This class represents the Link Trace (LT) process for fault localization or for discovering the intermediate MIPs along the link from the MEP Source to a target MEP or MIP. An LTM frame will be sent from the MEP source to the target MEP/MIP.
+ The termination occurs at specified stop time (schedule attribute of OamJob).";
+ }
+ grouping eth-test-job-g {
+ container eth-test-msg {
+ uses eth-oam-msg-common-pac-g;
+ description "none";
+ }
+ description "This class represents the 1-way on-demand in-service or out-of-service diagnostic test. The diagnostic test includes verifying bandwidth throughput, frame loss, bit errors, etc. TST frames are transmitted.
+ The termination occurs at specified stop time (schedule attribute of OamJob).";
+ }
+ grouping eth-on-demand-measurement-job-control-sink-g {
+ leaf responder-mep-id {
+ type string;
+ description "none";
+ }
+ leaf source-address {
+ type mac-address;
+ description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";
+ }
+ leaf priority {
+ type uint64;
+ default "7";
+ description "This attribute contains the priority of the OAM PDU frames.
+ range of type : 0, 1, 2, 3, 4, 5, 6, 7";
+ }
+ leaf test-identifier {
+ type uint64;
+ description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.
+ range of type : 0..(2^32) - 1";
+ }
+ description "This object class represents an on-demand measurement job controller sink for 1-way measurements. It is created as a result of an establishOnDemandDualEndedMeasurementJobSink() operation. It is deleted either automatically after the measurement job has completed (stop time reached) and the performance data AVC notification has been sent, or by an explicit abortOnDemandMeasurementJob() operation when the measurement job is running.";
+ }
+ grouping eth-on-demand-measurement-job-control-source-g {
+ leaf controller-mep-id {
+ type string;
+ description "none";
+ }
+ leaf oam-pdu-generation-type {
+ type oam-pdu-generation-type;
+ description "This attribute contains the pattern that is used for the generation of OAM PDUs.";
+ }
+ leaf destination-address {
+ type mac-address;
+ description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";
+ }
+ leaf priority {
+ type uint64;
+ default "7";
+ description "This attribute contains the priority of the OAM PDU frames.
+ range of type : 0, 1, 2, 3, 4, 5, 6, 7";
+ }
+ leaf message-period {
+ type message-period;
+ description "This attribute contains the frequency of the OAM message (PDU) generation within a series.
+ Note that the value 0 means that only one OAM message per measurement interval is generated.
+ range of type : See corresponding Enum.";
+ }
+ leaf repetition-period {
+ type repetition-period;
+ description "This attribute contains the time between the start of two measurement intervals. This IS applicable for the repetitive instance type and MAY be applicable for the repetitive series type.
+ Note that a value of 0 means not applicable (NA), which is for the cases of single instance, single series, or repetitive series without extra gap in between the measurement intervals (i.e., also as known as continuous series).";
+ }
+ leaf measurement-interval {
+ type uint64;
+ description "This attribute contains the discrete non overlapping periods of time (in seconds) during which measurements are performed (i.e., OAM messages are generated) and reports are gathered at the end of the measurement intervals. Note that the value 0 means a degenerated measurement interval with a single OAM message and the report is sent as immediately as possible.
+ range of type : Non-negative";
+ }
+ leaf test-identifier {
+ type uint64;
+ description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.
+ Note: The attribute is not used in case of LMM/LMR measurement.
+ range of type : 0..(2^32) - 1";
+ }
+ leaf data-tlv-length {
+ type uint64;
+ description "This parameter provides the size of the optional data TLV.
+ Non-negative integer represents the number of bytes for the length of the padding TLV.
+ Notes:
+ When configuring this parameter one should be aware of the maximum allowed total frame size limitation.
+ The attribute is not used in case of 2-way loss measurement.
+ range of type : Depends on the allowed MTU size.";
+ }
+ description "Basic attributes: destinationAddress, priority
+ Measurement configuration related attributes: oamPduGenerationType, startTime, stopTime, messagePeriod, repetitionPeriod, measurementInterval
+ Optional attributes: dataTlvLength, testIdentifier
+ This object class represents an on-demand measurement job controller source for 1-way measurements. It is created as a result of an establishOnDemandDualEndedMeasurementJobSource() operation. It is deleted either automatically after the measurement job has completed (stop time reached), or by an explicit abortOnDemandMeasurementJob() operation while the measurement job is running.";
+ }
+ grouping eth-pro-active-measurement-job-control-sink-g {
+ leaf responder-mep-id {
+ type string;
+ description "none";
+ }
+ leaf is-enabled {
+ type boolean;
+ default "true";
+ description "This attribute identifies the state of the measurement job. If set to TRUE, the MEP performs proactive Performance Measurement.";
+ }
+ leaf source-address {
+ type mac-address;
+ description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";
+ }
+ leaf test-identifier {
+ type uint64;
+ description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.
+ range of type : 0..(2^32) - 1";
+ }
+ description "This object class allows the control of the proactive 1-way measurement. It is created as a part of an establishProActiveDualEndedMeasurementJobSink() operation. Lifecycle: A pre-condition of deleting the object is that the “Enable” attribute should have the value “FALSE”.";
+ }
+ grouping eth-pro-active-measurement-job-control-source-g {
+ leaf controller-mep-id {
+ type string;
+ description "none";
+ }
+ leaf is-enabled {
+ type boolean;
+ default "true";
+ description "This attribute identifies the state of the measurement job. If set to TRUE, the MEP performs proactive Performance Measurement.";
+ }
+ leaf destination-address {
+ type mac-address;
+ description "This attribute provides the Unicast MAC address of the intented destination.";
+ }
+ leaf priority {
+ type uint64 {
+ range "0..7";
+ }
+ default "7";
+ description "This attribute contains the priority value on which the MEP performs the measurement. When the measurement is enabled, the MEP should use this value to encode the priority of generated measurement frames. The EMF usese this value to assign the “P” parameter of the measurement operation.";
+ }
+ leaf period {
+ type oam-period;
+ description "This attribute indicates the period (frequency) of the measurement frame transmission.
+ range of type : 100ms, 1s, 10s";
+ }
+ leaf test-identifier {
+ type uint64;
+ description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.
+ Note: The attribute is not used in case of 2-way loss measurement.
+ range of type : 0..(2^32) - 1";
+ }
+ leaf data-tlv-length {
+ type uint64;
+ description "This parameter provides the size of the optional data TLV.
+ Non-negative integer represents the number of bytes for the length of the padding TLV.
+ Notes:
+ When configuring this parameter one should be aware of the maximum allowed total frame size limitation.
+ The attribute is not used in case of 2-way loss measurement.
+ range of type : Depends on the allowed MTU size.";
+ }
+ description "This object class represents a proactive measurement job controller source for 1way measurements. It is created as a part of an establishProactiveDualEndedMeasurementJobSource() operation.";
+ }
+ grouping eth-pro-active-1-dm-performance-data-g {
+ container pro-active-near-end-1-dm-parameters {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the statistical near end performnace parameters.";
+ }
+ description "This object class represents the PM current data collected in a pro-active delay measurement job (using 1DM).";
+ }
+ grouping eth-pro-active-1-lm-performance-data-g {
+ container pro-active-near-end-1-lm-parameters {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute contains the statistical near end performnace parameters.";
+ }
+ description "This object class represents the PM current data collected in a pro-active loss measurement job (using 1SL).";
+ }
+ grouping eth-pro-active-dm-performance-data-g {
+ container pro-active-bi-dir-dm-parameters {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the statistical bidirectional performnace parameters.";
+ }
+ container pro-active-far-end-dm-parameters {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the statistical far end performnace parameters.";
+ }
+ container pro-active-near-end-dm-parameters {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the statistical near end performnace parameters.";
+ }
+ description "This object class represents the PM current data collected in a pro-active delay measurement job (using DMM/DMR).";
+ }
+ grouping eth-pro-active-lm-performance-data-g {
+ container pro-active-far-end-lm-parameters {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute contains the statistical far end performnace parameters.";
+ }
+ container pro-active-near-end-lm-parameters {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute contains the statistical near end performnace parameters.";
+ }
+ leaf bidirectional-uas {
+ type uint64;
+ description "This attribute contains the bidirectional UAS (unavailable seconds) detected in the monitoring interval.
+ range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";
+ }
+ description "This object class represents the PM current data collected in a pro-active loss measurement job (using LMM/LMR or SLM/SLR).";
+ }
+ grouping eth-on-demand-1-dm-performance-data-g {
+ container on-demand-near-end-1-dm-parameters {
+ uses on-demand-dm-performance-parameters-g;
+ description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";
+ }
+ description "none";
+ }
+ grouping eth-on-demand-1-lm-performance-data-g {
+ container on-demand-near-end-1-lm-parameters {
+ uses on-demand-lm-performance-parameters-g;
+ description "This attribute contains the results of an on-demand synthetic loss measurement job in the ingress direction.";
+ }
+ description "none";
+ }
+ grouping eth-on-demand-dm-performance-data-g {
+ container on-demand-far-end-dm-parameters {
+ uses on-demand-dm-performance-parameters-g;
+ description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";
+ }
+ container on-demand-near-end-dm-parameters {
+ uses on-demand-dm-performance-parameters-g;
+ description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";
+ }
+ description "none";
+ }
+ grouping eth-on-demand-lm-performance-data-g {
+ container on-demand-far-end-lm-parameters {
+ uses on-demand-lm-performance-parameters-g;
+ description "This attribute contains the results of an on-demand synthetic loss measurement job in the egress direction.";
+ }
+ container on-demand-near-end-lm-parameters {
+ uses on-demand-lm-performance-parameters-g;
+ description "This attribute contains the results of an on-demand synthetic loss measurement job in the ingress direction.";
+ }
+ description "none";
+ }
+ grouping eth-pro-active-1way-measurement-job-g {
+ container pro-active-control-1way-source {
+ uses eth-pro-active-measurement-job-control-source-g;
+ description "none";
+ }
+ container pro-active-control-1way-sink {
+ uses eth-pro-active-measurement-job-control-sink-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping eth-pro-active-2way-measurement-job-g {
+ container pro-active-control-2way-source {
+ uses eth-pro-active-measurement-job-control-source-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping eth-on-demand-2way-measurement-job-g {
+ container on-demand-control-2way-source {
+ uses eth-on-demand-measurement-job-control-source-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping eth-on-demand-1way-measurement-job-g {
+ container on-demand-control-1way-source {
+ uses eth-on-demand-measurement-job-control-source-g;
+ description "none";
+ }
+ container on-demand-control-1way-sink {
+ uses eth-on-demand-measurement-job-control-sink-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping eth-1-dm-threshold-data-g {
+ container near-end-1-dm-cross-threshold {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the near end cross threshold values of the delay measurements.";
+ }
+ container near-end-1-dm-clear-threshold {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the near end clear threshold values of the delay measurements.";
+ }
+ description "This data type contains the threshold values for frame delay related 1-way measurements.";
+ }
+ grouping eth-1-lm-threshold-data-g {
+ container near-end-1-lm-cross-threshold {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute contains the near end cross threshold values of the loss measurements.";
+ }
+ container near-end-1-lm-clear-threshold {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the near end clear threshold values of the loss measurements.";
+ }
+ description "This data type contains the threshold values for frame loss related 1-way measurements.";
+ }
+ grouping eth-dm-threshold-data-g {
+ container near-end-dm-cross-threshold {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the near end cross threshold values of the delay measurements.";
+ }
+ container near-end-dm-clear-threshold {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the near end clear threshold values of the delay measurements.";
+ }
+ container far-end-dm-cross-threshold {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the far end cross threshold values of the delay measurements.";
+ }
+ container far-end-dm-clear-threshold {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the far end clear threshold values of the delay measurements.";
+ }
+ container bi-dir-dm-cross-threshold {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the bidirectional cross threshold values of the delay measurements.";
+ }
+ container bi-dir-dm-clear-threshold {
+ uses statistical-dm-performance-parameters-g;
+ description "This attribute contains the bidirectional clear threshold values of the delay measurements.";
+ }
+ description "This data type contains the threshold values for frame delay related 2-way measurements.";
+ }
+ grouping eth-lm-threshold-data-g {
+ container near-end-lm-cross-threshold {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute contains the near end cross threshold values of the loss measurements.";
+ }
+ container near-end-lm-clear-threshold {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the near end clear threshold values of the loss measurements.";
+ }
+ container far-end-lm-cross-threshold {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute contains the far end cross threshold values of the loss measurements.";
+ }
+ container far-end-lm-clear-threshold {
+ uses statistical-lm-performance-parameters-g;
+ description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the far end clear threshold values of the loss measurements.";
+ }
+ leaf bi-dir-lm-uas-cross-threshold {
+ type uint64;
+ description "This attribute contains the bidirectional cross threshold value of the UAS loss measurement.";
+ }
+ leaf bi-dir-lm-uas-clear-threshold {
+ type uint64;
+ description "This attribute is only valid for the UAS parameter working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the bidirectional clear threshold value of the UAS loss measurement.";
+ }
+ description "This data type contains the threshold values for frame loss related 2-way measurements.";
+ }
+ grouping eth-loopback-result-data-g {
+ leaf rec-lbr-frames {
+ type uint64;
+ config false;
+ description "G.8052: This parameter returns the total number of received LBR messages, including the out of order LBR frames.";
+ }
+ leaf out-of-order-lbr-frames {
+ type uint64;
+ config false;
+ description "G.8052: This parameter returns the number of LBR traffic unites (messages) that were received out of order (OO).";
+ }
+ leaf sent-lbm-frames {
+ type uint64;
+ config false;
+ description "G.8052: This parameter returns the total number of sent LBM frames.";
+ }
+ leaf crc-lbr-frames {
+ type uint64;
+ config false;
+ description "G.8052: This parameter returns the number of LBR frames where the CRC in the pattern failed.";
+ }
+ leaf ber-lbr-frames {
+ type uint64;
+ config false;
+ description "G.8052: This parameter returns the number of LBR frames where there was a bit error in the pattern.";
+ }
+ leaf-list detected-peer-mep {
+ type mac-address;
+ config false;
+ description "G.8052: This parameter returns the MAC addresses of the discovered peer MEPs of the subject MEP.";
+ }
+ description "none";
+ }
+ grouping eth-link-trace-result-data-g {
+ list result-list {
+ config false;
+ uses link-trace-result-g;
+ description "G.8052: This parameter returns the results of the LT process. It contains a list of the result received from the individual LTR frames.
+ The result from the individual LTR frame include the Source Mac Address, the TTL, and TLV.";
+ }
+ description "none";
+ }
+ grouping eth-test-result-data-g {
+ leaf sent-tst-frames {
+ type uint64;
+ config false;
+ description "G.8052: This parameter returns the total number of sent TST frames.";
+ }
+ description "none";
+ }
+ grouping eth-oam-operation-common-pac-g {
+ leaf destination-address {
+ type mac-address;
+ description "G.8052: This parameter provides the destination address, i.e., the MAC Address of the target MEP or MIP.";
+ }
+ leaf priority {
+ type uint64;
+ default "7";
+ description "G.8052: This parameter provides the priority to be used in the LBM frame.";
+ }
+ description "none";
+ }
+ grouping eth-oam-msg-common-pac-g {
+ leaf period {
+ type oam-period;
+ description "G.8052: This parameter provides the periodicity of the TST OAM messages.";
+ }
+ leaf drop-eligibility {
+ type boolean;
+ description "G.8052: This parameter provides the eligibility of frames with unicast ETH-TST information to be discarded when congestion conditions are encountered.";
+ }
+ leaf data-tlv-length {
+ type uint64;
+ description "G.8052: This parameter provides the length (in number of octet) of the optional Data TLV to be included in the TST frame.";
+ }
+ leaf test-pattern {
+ type uint64;
+ description "G.8052: This parameter provides the test pattern to be used in the optional Data TLV.
+ Examples of test patterns include pseudo-random bit sequence (PRBS) 2^31-1 as specified in clause 5.8 of [ITU-T O.150], all '0' pattern, etc.
+ The following values of pattern types are defined:
+ 0: 'Null signal without CRC-32'
+ 1: 'Null signal with CRC-32'
+ 2: 'PRBS 2^31-1 without CRC-32'
+ 3: 'PRBS 2^31-1 with CRC-32'.";
+ }
+ uses eth-oam-operation-common-pac-g;
+ description "none";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ identity ETH_OAM_JOB_TYPE {
+ base tapi-oam:OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_1DM {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_1SLM {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_LM_CCM {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_LM_LMM {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_SLM {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_DM {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_LTC {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_LBK {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ identity ETH_OAM_JOB_TYPE_ETH_TEST {
+ base ETH_OAM_JOB_TYPE;
+ description "none";
+ }
+ grouping priority-configuration-g {
+ leaf priority {
+ type uint64 {
+ range "0..7";
+ }
+ description "none";
+ }
+ leaf queue-id {
+ type uint64 {
+ range "1..8";
+ }
+ description "none";
+ }
+ description "none";
+ }
+ grouping queue-configuration-g {
+ leaf queue-id {
+ type uint64;
+ description "This attribute indicates the queue id.";
+ }
+ leaf queue-depth {
+ type uint64;
+ description "This attribute defines the depth of the queue in bytes.";
+ }
+ leaf queue-threshold {
+ type uint64;
+ description "This attribute defines the threshold of the queue in bytes.";
+ }
+ description "none";
+ }
+ grouping traffic-conditioning-configuration-g {
+ leaf cir {
+ type uint64;
+ description "This attribute indicates the Committed Information Rate in bits/s.";
+ }
+ leaf cbs {
+ type uint64;
+ description "This attribute indicates the Committed Burst Size in bytes.";
+ }
+ leaf eir {
+ type uint64;
+ description "This attribute indicates the Excess Information Rate in bits/s.";
+ }
+ leaf ebs {
+ type uint64;
+ description "This attribute indicates the Excess Burst Size in bytes.";
+ }
+ leaf coupling-flag {
+ type boolean;
+ description "This attribute indicates the coupling flag.";
+ }
+ leaf colour-mode {
+ type colour-mode;
+ description "This attribute indicates the colour mode.";
+ }
+ leaf queue-id {
+ type uint64 {
+ range "1..8";
+ }
+ description "This attribute indicates the queue id.";
+ }
+ description "none";
+ }
+ typedef mac-address {
+ type string;
+ description "This primitive data type contains an Ethernet MAC address defined by IEEE 802a. The format of the address consists of 12 hexadecimal characters, grouped in pairs and separated by '-' (e.g., 03-27-AC-75-3E-1D).";
+ }
+ grouping priority-mapping-g {
+ leaf priority-0 {
+ type uint64 {
+ range "0..7";
+ }
+ description "This attribute defines the new priority value for the old priority value 0.";
+ }
+ leaf priority-1 {
+ type uint64 {
+ range "0..7";
+ }
+ default "1";
+ description "This attribute defines the new priority value for the old priority value 1.";
+ }
+ leaf priority-2 {
+ type uint64 {
+ range "0..7";
+ }
+ default "2";
+ description "This attribute defines the new priority value for the old priority value 2.";
+ }
+ leaf priority-3 {
+ type uint64 {
+ range "0..7";
+ }
+ default "3";
+ description "This attribute defines the new priority value for the old priority value 3.";
+ }
+ leaf priority-4 {
+ type uint64 {
+ range "0..7";
+ }
+ default "4";
+ description "This attribute defines the new priority value for the old priority value 4.";
+ }
+ leaf priority-5 {
+ type uint64 {
+ range "0..7";
+ }
+ default "5";
+ description "This attribute defines the new priority value for the old priority value 5.";
+ }
+ leaf priority-6 {
+ type uint64 {
+ range "0..7";
+ }
+ default "6";
+ description "This attribute defines the new priority value for the old priority value 6.";
+ }
+ leaf priority-7 {
+ type uint64 {
+ range "0..7";
+ }
+ default "7";
+ description "This attribute defines the new priority value for the old priority value 7.";
+ }
+ description "This data type provides the priority mapping done in the 'P Regenerate' process defined in G.8021.";
+ }
+ typedef vid {
+ type string;
+ description "This primitive type models the 12 Bit VLAN identifier of a VLAN tag.";
+ }
+ typedef modify-cross-connection-data {
+ type string;
+ description "none";
+ }
+ grouping address-tuple-g {
+ leaf address {
+ type mac-address;
+ description "This attribute contains the MAC address of the address tuple.";
+ }
+ leaf-list port-list {
+ type mac-address;
+ description "This attribute contains the ports associated to the MAC address in the address tuple.";
+ }
+ description "This data type contains an address tuple consisting of a MAC address and a corresponding port list.";
+ }
+ typedef scheduling-configuration {
+ type string;
+ description "The syntax of this dataType is pending on the specification in G.8021, which is for further study.";
+ }
+ grouping control-frame-filter-g {
+ leaf c-2-00-00-10 {
+ type boolean;
+ description "This attribute identifies the 'All LANs Bridge Management Group Address'.";
+ }
+ leaf c-2-00-00-00 {
+ type boolean;
+ description "This attribute identifies the STP/RSTP/MSTP protocol address.";
+ }
+ leaf c-2-00-00-01 {
+ type boolean;
+ description "This attribute identifies the IEEE MAC-specific Control Protocols group address (PAUSE protocol).";
+ }
+ leaf c-2-00-00-02 {
+ type boolean;
+ description "This attribute identifies the IEEE 802.3 Slow_Protocols_Multicast address (LACP/LAMP or Link OAM protocols).";
+ }
+ leaf c-2-00-00-03 {
+ type boolean;
+ description "This attribute identifies the Nearest non-TPMR Bridge group address (Port Authentication protocol).";
+ }
+ leaf c-2-00-00-04 {
+ type boolean;
+ description "This attribute identifies the IEEE MAC-specific Control Protocols group address.";
+ }
+ leaf c-2-00-00-05 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-06 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-07 {
+ type boolean;
+ description "This attribute identifies the Metro Ethernet Forum E-LMI protocol group address.";
+ }
+ leaf c-2-00-00-08 {
+ type boolean;
+ description "This attribute identifies the Provider Bridge Group address.";
+ }
+ leaf c-2-00-00-09 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-0-a {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-0-b {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-0-c {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-0-d {
+ type boolean;
+ description "This attribute identifies the Provider Bridge MVRP address.";
+ }
+ leaf c-2-00-00-0-e {
+ type boolean;
+ description "This attribute identifies the Individual LAN Scope group address, Nearest Bridge group address (LLDP protocol).";
+ }
+ leaf c-2-00-00-0-f {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-20 {
+ type boolean;
+ description "This attribute identifies the Customer and Provider Bridge MMRP address.";
+ }
+ leaf c-2-00-00-21 {
+ type boolean;
+ description "This attribute identifies the Customer Bridge MVRP address.";
+ }
+ leaf c-2-00-00-22 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-23 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-24 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-25 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-26 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-27 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-28 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-29 {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-2-a {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-2-b {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-2-c {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-2-d {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-2-e {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ leaf c-2-00-00-2-f {
+ type boolean;
+ description "Reserved for future standardization.";
+ }
+ description "This data type identifies the filter action for each of the 33 group MAC addresses (control frames).
+ Value 'false' means block: The frame is discarded by the filter process.
+ Value 'true' means pass: The frame is passed unchanged through the filter process.";
+ }
+ grouping bandwidth-report-g {
+ leaf source-mac-address {
+ type mac-address;
+ description "The sourceMacAddress is the address from the far end.";
+ }
+ leaf port-id {
+ type uint64;
+ description "This attribute returns the far end port identifier.";
+ }
+ leaf nominal-bandwidth {
+ type uint64;
+ description "This attribute returns the configured bandwidth";
+ }
+ leaf current-bandwidth {
+ type uint64;
+ description "This attribute returns the current bandwidth.";
+ }
+ description "Data type for the bandwidth report.";
+ }
+ typedef admin-state {
+ type enumeration {
+ enum LOCK {
+ description "none";
+ }
+ enum NORMAL {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef colour-mode {
+ type enumeration {
+ enum COLOUR_BLIND {
+ description "none";
+ }
+ enum COLOUR_AWARE {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef csf-config {
+ type enumeration {
+ enum DISABLED {
+ description "This literal covers the following states of the CSF related MI informations:
+ - MI_CSF_Enable is false
+ - MI_CSFrdifdi_Enable is false
+ - MI_CSFdci_Enable is false.";
+ }
+ enum ENABLED {
+ description "This literal covers the following states of the CSF related MI informations:
+ - MI_CSF_Enable is true
+ - MI_CSFrdifdi_Enable is false
+ - MI_CSFdci_Enable is false.";
+ }
+ enum ENABLED_WITH_RDI_FDI {
+ description "This literal covers the following states of the CSF related MI informations:
+ - MI_CSF_Enable is true
+ - MI_CSFrdifdi_Enable is true
+ - MI_CSFdci_Enable is false.";
+ }
+ enum ENABLED_WITH_RDI_FDI_DCI {
+ description "This literal covers the following states of the CSF related MI informations:
+ - MI_CSF_Enable is true
+ - MI_CSFrdifdi_Enable is true
+ - MI_CSFdci_Enable is true.";
+ }
+ enum ENABLED_WITH_DCI {
+ description "This literal covers the following states of the CSF related MI informations:
+ - MI_CSF_Enable is true
+ - MI_CSFrdifdi_Enable is false
+ - MI_CSFdci_Enable is true.";
+ }
+ }
+ description "none";
+ }
+ typedef ety-phy-type {
+ type enumeration {
+ enum OTHER {
+ description "none";
+ }
+ enum UNKNOWN {
+ description "none";
+ }
+ enum NONE {
+ description "none";
+ }
+ enum 2BASE_TL {
+ description "none";
+ }
+ enum 10MBIT_S {
+ description "none";
+ }
+ enum 10PASS_TS {
+ description "none";
+ }
+ enum 100BASE_T4 {
+ description "none";
+ }
+ enum 100BASE_X {
+ description "none";
+ }
+ enum 100BASE_T2 {
+ description "none";
+ }
+ enum 1000BASE_X {
+ description "none";
+ }
+ enum 1000BASE_T {
+ description "none";
+ }
+ enum 10GBASE-X {
+ description "none";
+ }
+ enum 10GBASE_R {
+ description "none";
+ }
+ enum 10GBASE_W {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef frame-type {
+ type enumeration {
+ enum ADMIT_ONLY_VLAN_TAGGED_FRAMES {
+ description "none";
+ }
+ enum ADMIT_ONLY_UNTAGGED_AND_PRIORITY_TAGGED_FRAMES {
+ description "none";
+ }
+ enum ADMIT_ALL_FRAMES {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef oam-period {
+ type enumeration {
+ enum 3_33MS {
+ description "Default for protection.";
+ }
+ enum 10MS {
+ description "none";
+ }
+ enum 100MS {
+ description "none";
+ }
+ enum 1S {
+ description "none";
+ }
+ enum 10S {
+ description "none";
+ }
+ enum 1MIN {
+ description "none";
+ }
+ enum 10MIN {
+ description "none";
+ }
+ }
+ description "Provides the frequency for the OAM PDU insertion.";
+ }
+ typedef pcp-coding {
+ type enumeration {
+ enum 8P0D {
+ description "none";
+ }
+ enum 7P1D {
+ description "none";
+ }
+ enum 6P2D {
+ description "none";
+ }
+ enum 5P3D {
+ description "none";
+ }
+ enum DEI {
+ description "This enumeration value means that all priorities should be drop eligible.
+ DEI = Drop Eligibility Indicator";
+ }
+ }
+ description "This enum models the coding of the Priority Code Point as defined in section 'Priority Code Point encoding' of IEEE 802.1Q.";
+ }
+ typedef vlan-type {
+ type enumeration {
+ enum C_Tag {
+ description "0x8100";
+ }
+ enum S_Tag {
+ description "0x88a8";
+ }
+ enum I_Tag {
+ description "88-e7";
+ }
+ }
+ description "This enumeration contains the Ethertypes defined in IEEE 802.1Q.";
+ }
+ typedef repetition-period {
+ type enumeration {
+ enum 1MIN {
+ description "none";
+ }
+ enum 1S {
+ description "none";
+ }
+ enum 10S {
+ description "none";
+ }
+ enum 0 {
+ description "none";
+ }
+ }
+ description "This enumeration defines the allowed values for the repetition period in on-demand measurements.
+ Note: The value 0 means that the value is not relevant.";
+ }
+ typedef message-period {
+ type enumeration {
+ enum 10MS {
+ description "none";
+ }
+ enum 100MS {
+ description "none";
+ }
+ enum 1S {
+ description "none";
+ }
+ enum 10S {
+ description "none";
+ }
+ enum 0 {
+ description "none";
+ }
+ }
+ description "This enumeration defines the allowed values for the message period in on-demand measurements.
+ Notes:
+ The value 10ms is only used in synthetic loss measurements.
+ The value 0 means that the value is not relevant.";
+ }
+ typedef oam-pdu-generation-type {
+ type enumeration {
+ enum SINGLE_INSTANCE {
+ description "none";
+ }
+ enum REPETITIVE_INSTANCE {
+ description "none";
+ }
+ enum SINGLE_SERIES {
+ description "none";
+ }
+ enum REPETITIVE_SERIES {
+ description "none";
+ }
+ }
+ description "This enumeration defines the generation pattern of the on-demand OAM PDUs (messages). ";
+ }
+ grouping on-demand-dm-performance-parameters-g {
+ leaf number-of-samples {
+ type uint64;
+ description "This attribute contains the number of received DM frames (successful samples) used for this frame delay measurement.
+ range of type : non-negative";
+ }
+ leaf-list frame-delay-list {
+ type uint64;
+ description "This attribute contains the frame delays measured in ns (nano second, 1x10e-9 seconds). The multiplicity is defined by the numberOfSamples attribute.";
+ }
+ leaf-list frame-delay-variation-list {
+ type uint64;
+ description "This attribute contains the frame delay variations measured in ns (nano second). The multiplicity is defined by (numberOfSamples - 1, for numberOfSamples > 0).";
+ }
+ description "This data type contains the results of an on-demand delay measurement job.";
+ }
+ grouping on-demand-lm-performance-parameters-g {
+ leaf total-transmitted-frames {
+ type uint64;
+ description "This attribute contains the total number of frames transmitted.";
+ }
+ leaf total-lost-frames {
+ type uint64;
+ description "This attribute contains the total number of frames lost.";
+ }
+ leaf total-frame-loss-ratio {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "This attribute contains the frame loss ratio (number of lost frames divided by the number of total frames (N_LF / N_TF)).
+ The accuracy of the value is for further study.";
+ }
+ description "This data type contains the results of an on-demand loss measurement job.";
+ }
+ grouping statistical-dm-performance-parameters-g {
+ leaf minimum-frame-delay {
+ type uint64;
+ description "This attribute contains the minimum frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";
+ }
+ leaf average-frame-delay {
+ type uint64;
+ description "This attribute contains the average frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";
+ }
+ leaf maximum-frame-delay {
+ type uint64;
+ description "This attribute contains the maximum frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";
+ }
+ leaf minimum-frame-delay-variation {
+ type uint64;
+ description "This attribute contains the minimum frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";
+ }
+ leaf average-frame-delay-variation {
+ type uint64;
+ description "This attribute contains the average frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";
+ }
+ leaf maximum-frame-delay-variation {
+ type uint64;
+ description "This attribute contains the maximum frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";
+ }
+ description "This data type contains the statistical delay measurement performance parameters.";
+ }
+ grouping statistical-lm-performance-parameters-g {
+ leaf minimum-frame-loss-ratio {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "This attribute contains the minimum frame loss ratio calculated over a period of time.
+ The accuracy of the value is for further study.";
+ }
+ leaf average-frame-loss-ratio {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "This attribute contains the average frame loss ratio calculated over a period of time.
+ The accuracy of the value is for further study.";
+ }
+ leaf maximum-frame-loss-ratio {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "This attribute contains the maximum frame loss ratio calculated over a period of time.
+ The accuracy of the value is for further study.";
+ }
+ leaf ses {
+ type uint64;
+ description "This attribute contains the SES detected in the monitoring interval.
+ range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";
+ }
+ leaf uas {
+ type uint64;
+ description "This attribute contains UAS (unavailable seconds) detected in the monitoring interval.
+ range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";
+ }
+ description "This data type contains the statistical loss measurement performance parameters.";
+ }
+ typedef eth-oam-job-type {
+ type identityref {
+ base ETH_OAM_JOB_TYPE;
+ }
+ description "none";
+ }
+ grouping link-trace-result-g {
+ leaf source-address {
+ type mac-address;
+ description "G.8052: This attribute contains the source MAC Address of an individual LTR frame result.";
+ }
+ leaf time-to-live {
+ type uint64;
+ description "G.8052: This attribute contains the Time To Live (TTL) value of an individual LTR frame result.";
+ }
+ leaf data-tlv-length {
+ type uint64;
+ description "G.8052: This attribute contains the length (in number of octets) of the Data TLV of an individual LTR frame result.";
+ }
+ description "G.8052: This data type contains the result from an individual LTR frame.";
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-notification@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-notification@2018-08-31.yang new file mode 100644 index 000000000..3ac3ef5ad --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-notification@2018-08-31.yang @@ -0,0 +1,581 @@ +module tapi-notification {
+ namespace "urn:onf:otcc:yang:tapi-notification";
+ prefix tapi-notification;
+ import tapi-common {
+ prefix tapi-common;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "
+ This module contains TAPI Notification Model definitions.
+ Source: TapiNotification.uml
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ augment "/tapi-common:context" {
+ uses notification-context-g;
+ description "Augments the base TAPI Context with NotificationService information";
+ }
+ /***********************
+ * package object-classes
+ **********************/
+ grouping notification-subscription-service-g {
+ list notification {
+ key 'uuid';
+ config false;
+ uses notification-g;
+ description "none";
+ }
+ container notification-channel {
+ uses notification-channel-g;
+ description "none";
+ }
+ container subscription-filter {
+ uses subscription-filter-g;
+ description "none";
+ }
+ leaf subscription-state {
+ type subscription-state;
+ description "none";
+ }
+ leaf-list supported-notification-types {
+ type notification-type;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ leaf-list supported-object-types {
+ type object-type;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ uses tapi-common:service-spec-g;
+ description "none";
+ }
+ grouping subscription-filter-g {
+ leaf-list requested-notification-types {
+ type notification-type;
+ config false;
+ description "none";
+ }
+ leaf-list requested-object-types {
+ type object-type;
+ config false;
+ description "none";
+ }
+ leaf-list requested-layer-protocols {
+ type tapi-common:layer-protocol-name;
+ config false;
+ description "none";
+ }
+ leaf-list requested-object-identifier {
+ type tapi-common:uuid;
+ config false;
+ description "none";
+ }
+ leaf include-content {
+ type boolean;
+ config false;
+ description "Indicates whether the published Notification includes content or just the Notification Id (which enables retrieval of the notification at the later stage)";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+ notification notification {
+ uses notification-g;
+ description "none";
+ }
+ grouping notification-g {
+ leaf notification-type {
+ type notification-type;
+ description "none";
+ }
+ leaf target-object-type {
+ type object-type;
+ description "none";
+ }
+ leaf target-object-identifier {
+ type tapi-common:uuid;
+ description "none";
+ }
+ list target-object-name {
+ key 'value-name';
+ min-elements 1;
+ uses tapi-common:name-and-value-g;
+ description "none";
+ }
+ leaf event-time-stamp {
+ type tapi-common:date-and-time;
+ description "none";
+ }
+ leaf sequence-number {
+ type uint64;
+ config false;
+ description "A monotonous increasing sequence number associated with the notification.
+ The exact semantics of how this sequence number is assigned (per channel or subscription or source or system) is left undefined.";
+ }
+ leaf source-indicator {
+ type source-indicator;
+ description "none";
+ }
+ leaf layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ description "none";
+ }
+ list changed-attributes {
+ key 'value-name';
+ uses name-and-value-change-g;
+ description "none";
+ }
+ list additional-info {
+ key 'value-name';
+ uses tapi-common:name-and-value-g;
+ description "none";
+ }
+ leaf additional-text {
+ type string;
+ description "none";
+ }
+ container tca-info {
+ uses tca-info-g;
+ description "none";
+ }
+ container alarm-info {
+ uses alarm-info-g;
+ description "none";
+ }
+ uses tapi-common:resource-spec-g;
+ description "none";
+ }
+ grouping notification-channel-g {
+ leaf stream-address {
+ type string;
+ config false;
+ description "The address/location/URI of the channel/stream to which the subscribed notifications are published.
+ This specifics of this is typically dependent on the implementation protocol & mechanism and hence is typed as a string.";
+ }
+ leaf next-sequence-no {
+ type uint64;
+ config false;
+ description "The sequence number of the next notification that will be published on the channel";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+ grouping notification-context-g {
+ list notif-subscription {
+ key 'uuid';
+ uses notification-subscription-service-g;
+ description "none";
+ }
+ list notification {
+ key 'uuid';
+ config false;
+ uses notification-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping alarm-info-g {
+ leaf is-transient {
+ type boolean;
+ config false;
+ description "none";
+ }
+ leaf perceived-severity {
+ type perceived-severity-type;
+ config false;
+ description "none";
+ }
+ leaf probable-cause {
+ type string;
+ config false;
+ description "none";
+ }
+ leaf service-affecting {
+ type service-affecting;
+ description "none";
+ }
+ description "none";
+ }
+ grouping tca-info-g {
+ leaf is-transient {
+ type boolean;
+ config false;
+ description "none";
+ }
+ leaf threshold-crossing {
+ type threshold-crossing-type;
+ description "none";
+ }
+ leaf threshold-parameter {
+ type string;
+ config false;
+ description "none";
+ }
+ leaf threshold-value {
+ type uint64;
+ config false;
+ description "none";
+ }
+ leaf perceived-severity {
+ type perceived-tca-severity;
+ description "none";
+ }
+ leaf measurement-interval {
+ type tapi-common:date-and-time;
+ description "none";
+ }
+ leaf suspect-interval-flag {
+ type boolean;
+ description "none";
+ }
+ description "none";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ grouping name-and-value-change-g {
+ leaf value-name {
+ type string;
+ description "The name of the value. The value need not have a name.";
+ }
+ leaf old-value {
+ type string;
+ description "The value";
+ }
+ leaf new-value {
+ type string;
+ description "The value";
+ }
+ description "A scoped name-value triple, including old value and new value";
+ }
+ typedef notification-type {
+ type enumeration {
+ enum OBJECT_CREATION {
+ description "Not a normal state. The system is unable to determine the correct value.";
+ }
+ enum OBJECT_DELETION {
+ description "none";
+ }
+ enum ATTRIBUTE_VALUE_CHANGE {
+ description "none";
+ }
+ enum ALARM_EVENT {
+ description "none";
+ }
+ enum THRESHOLD_CROSSING_ALERT {
+ description "none";
+ }
+ }
+ description "List of supported Notifications types.";
+ }
+ typedef object-type {
+ type enumeration {
+ enum TOPOLOGY {
+ description "none";
+ }
+ enum NODE {
+ description "none";
+ }
+ enum LINK {
+ description "none";
+ }
+ enum CONNECTION {
+ description "none";
+ }
+ enum PATH {
+ description "none";
+ }
+ enum CONNECTIVITY_SERVICE {
+ description "none";
+ }
+ enum VIRTUAL_NETWORK_SERVICE {
+ description "none";
+ }
+ enum PATH_COMPUTATION_SERVICE {
+ description "none";
+ }
+ enum NODE_EDGE_POINT {
+ description "none";
+ }
+ enum SERVICE_INTERFACE_POINT {
+ description "none";
+ }
+ enum CONNECTION_END_POINT {
+ description "none";
+ }
+ enum MAINTENANCE_ENTITY_GROUP {
+ description "none";
+ }
+ enum MAINTENANCE_ENTITY {
+ description "none";
+ }
+ enum MEG_END_POINT {
+ description "none";
+ }
+ enum MEG_INTERMEDIATE_POINT {
+ description "none";
+ }
+ enum SWITCH_CONTROL {
+ description "none";
+ }
+ enum SWITCH {
+ description "none";
+ }
+ enum ROUTE {
+ description "none";
+ }
+ enum NODE_RULE_GROUP {
+ description "none";
+ }
+ enum INTER_RULE_GROUP {
+ description "none";
+ }
+ enum RULE {
+ description "none";
+ }
+ enum OAM_JOB {
+ description "none";
+ }
+ }
+ description "The list of TAPI Global Object Class types on which Notifications can be raised.";
+ }
+ typedef source-indicator {
+ type enumeration {
+ enum RESOURCE_OPERATION {
+ description "none";
+ }
+ enum MANAGEMENT_OPERATION {
+ description "none";
+ }
+ enum UNKNOWN {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef subscription-state {
+ type enumeration {
+ enum SUSPENDED {
+ description "none";
+ }
+ enum ACTIVE {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef perceived-severity-type {
+ type enumeration {
+ enum CRITICAL {
+ description "none";
+ }
+ enum MAJOR {
+ description "none";
+ }
+ enum MINOR {
+ description "none";
+ }
+ enum WARNING {
+ description "none";
+ }
+ enum CLEARED {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef threshold-crossing-type {
+ type enumeration {
+ enum THRESHOLD_ABOVE {
+ description "none";
+ }
+ enum THRESHOLD_BELOW {
+ description "none";
+ }
+ enum CLEARED {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef service-affecting {
+ type enumeration {
+ enum SERVICE_AFFECTING {
+ description "none";
+ }
+ enum NOT_SERVICE_AFFECTING {
+ description "none";
+ }
+ enum UNKNOWN {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef perceived-tca-severity {
+ type enumeration {
+ enum WARNING {
+ description "none";
+ }
+ enum CLEAR {
+ description "none";
+ }
+ }
+ description "none";
+ }
+
+ /***********************
+ * package interfaces
+ **********************/
+ rpc get-supported-notification-types {
+ description "none";
+ output {
+ leaf-list supported-notification-types {
+ type notification-type;
+ min-elements 1;
+ description "none";
+ }
+ leaf-list supported-object-types {
+ type object-type;
+ min-elements 1;
+ description "none";
+ }
+ }
+ }
+ rpc create-notification-subscription-service {
+ description "none";
+ input {
+ container subscription-filter {
+ uses subscription-filter-g;
+ description "none";
+ }
+ leaf subscription-state {
+ type subscription-state;
+ description "none";
+ }
+ }
+ output {
+ container subscription-service {
+ uses notification-subscription-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc update-notification-subscription-service {
+ description "none";
+ input {
+ leaf subscription-id-or-name {
+ type string;
+ description "none";
+ }
+ container subscription-filter {
+ uses subscription-filter-g;
+ description "none";
+ }
+ leaf subscription-state {
+ type subscription-state;
+ description "none";
+ }
+ }
+ output {
+ container subscription-service {
+ uses notification-subscription-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc delete-notification-subscription-service {
+ description "none";
+ input {
+ leaf subscription-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container subscription-service {
+ uses notification-subscription-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-notification-subscription-service-details {
+ description "none";
+ input {
+ leaf subscription-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container subscription-service {
+ uses notification-subscription-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-notification-subscription-service-list {
+ description "none";
+ output {
+ list subscription-service {
+ uses notification-subscription-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-notification-list {
+ description "none";
+ input {
+ leaf subscription-id-or-name {
+ type string;
+ description "none";
+ }
+ leaf time-period {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ list notification {
+ uses notification-g;
+ description "none";
+ }
+ }
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-oam@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-oam@2018-08-31.yang new file mode 100644 index 000000000..787359737 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-oam@2018-08-31.yang @@ -0,0 +1,830 @@ +module tapi-oam {
+ namespace "urn:onf:otcc:yang:tapi-oam";
+ prefix tapi-oam;
+ import tapi-common {
+ prefix tapi-common;
+ }
+ import tapi-connectivity {
+ prefix tapi-connectivity;
+ }
+ import tapi-topology {
+ prefix tapi-topology;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "
+ This module contains TAPI OAM Model definitions.
+ Source: TapiOam.uml
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ augment "/tapi-common:context" {
+ uses oam-context-g;
+ description "Augments the base TAPI Context with OamService information";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {
+ uses mep-mip-list-g;
+ description "none";
+ }
+
+ /*************************
+ * definitions of references
+ *************************/
+ grouping oam-service-ref-g {
+ leaf oam-service-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:oam-service/tapi-oam:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping oam-service-end-point-ref-g {
+ uses oam-service-ref-g;
+ leaf oam-service-end-point-local-id {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:oam-service/tapi-oam:end-point/tapi-oam:local-id';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping meg-ref-g {
+ leaf meg-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:meg/tapi-oam:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping maintenance-entity-ref-g {
+ uses meg-ref-g;
+ leaf maintenance-entity-local-id {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:meg/tapi-oam:me/tapi-oam:local-id';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping mep-ref-g {
+ uses meg-ref-g;
+ leaf mep-local-id {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:meg/tapi-oam:mep/tapi-oam:local-id';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping mip-ref-g {
+ uses meg-ref-g;
+ leaf mip-local-id {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:meg/tapi-oam:mip/tapi-oam:local-id';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping oam-job-ref-g {
+ leaf oam-job-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:oam-job/tapi-oam:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping pm-current-data-ref-g {
+ uses oam-job-ref-g;
+ leaf pm-current-data-local-id {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:local-id';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping pm-history-data-ref-g {
+ uses pm-current-data-ref-g;
+ leaf pm-history-data-local-id {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data/tapi-oam:local-id';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping oam-profile-ref-g {
+ leaf oam-profile-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:oam-profile/tapi-oam:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping pm-threshold-data-ref-g {
+ uses oam-profile-ref-g;
+ leaf pm-threshold-data-local-id {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data/tapi-oam:local-id';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping pm-bin-data-ref-g {
+ uses oam-profile-ref-g;
+ leaf pm-bin-data-local-id {
+ type leafref {
+ path '/tapi-common:context/tapi-oam:oam-profile/tapi-oam:pm-bin-data/tapi-oam:local-id';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ /***********************
+ * package object-classes
+ **********************/
+ grouping mep-g {
+ container oam-service-end-point {
+ uses oam-service-end-point-ref-g;
+ config false;
+ description "none";
+ }
+ leaf layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ config false;
+ description "none";
+ }
+ leaf direction {
+ type tapi-common:termination-direction;
+ config false;
+ description "none";
+ }
+ leaf mep-identifier {
+ type string;
+ config false;
+ description "none";
+ }
+ leaf-list peer-mep-identifier {
+ type string;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ uses tapi-common:local-class-g;
+ uses tapi-common:operational-state-pac-g;
+ description "none";
+ }
+ grouping oam-job-g {
+ list oam-service-end-point {
+ uses oam-service-end-point-ref-g;
+ key 'oam-service-uuid oam-service-end-point-local-id';
+ min-elements 1;
+ max-elements 2;
+ description "none";
+ }
+ container oam-profile {
+ uses oam-profile-ref-g;
+ description "none";
+ }
+ list pm-current-data {
+ key 'local-id';
+ config false;
+ uses pm-current-data-g;
+ description "Granularity period of the CurrentData identifies the specific CurrentData instance in the scope of this OamJob.
+ For example, typically at least
+ one 15min and
+ one 24hr;
+ optionally one additional configurable (< 15min)";
+ }
+ leaf oam-job-type {
+ type oam-job-type;
+ description "none";
+ }
+ container schedule {
+ uses tapi-common:time-range-g;
+ description "none";
+ }
+ leaf creation-time {
+ type tapi-common:date-and-time;
+ config false;
+ description "none";
+ }
+ uses tapi-common:global-class-g;
+ uses tapi-common:admin-state-pac-g;
+ description "none";
+ }
+ grouping meg-g {
+ list me {
+ key 'local-id';
+ config false;
+ min-elements 1;
+ uses maintenance-entity-g;
+ description "none";
+ }
+ list mep {
+ key 'local-id';
+ config false;
+ uses mep-g;
+ description "1. ME may have 0 MEPs (case of transit domains where at least 1 MIP is present)
+ 2. ME may have 1 MEP (case of edge domaind, where the peer MEP is ouside the managed domain)
+ 3. ME may have 2 MEPs";
+ }
+ list mip {
+ key 'local-id';
+ config false;
+ uses mip-g;
+ description "ME may 0, 1, or more MIPs";
+ }
+ leaf layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ config false;
+ description "none";
+ }
+ leaf direction {
+ type tapi-common:forwarding-direction;
+ config false;
+ description "none";
+ }
+ leaf meg-level {
+ type uint64;
+ config false;
+ description "none";
+ }
+ leaf meg-identifier {
+ type string;
+ config false;
+ description "none";
+ }
+ uses tapi-common:resource-spec-g;
+ uses tapi-common:operational-state-pac-g;
+ description "none";
+ }
+ grouping maintenance-entity-g {
+ list mep {
+ uses mep-ref-g;
+ key 'meg-uuid mep-local-id';
+ config false;
+ max-elements 2;
+ description "none";
+ }
+ list mip {
+ uses mip-ref-g;
+ key 'meg-uuid mip-local-id';
+ config false;
+ description "none";
+ }
+ container connection-route {
+ uses tapi-connectivity:route-ref-g;
+ config false;
+ description "none";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+ grouping mip-g {
+ container oam-service-end-point {
+ uses oam-service-end-point-ref-g;
+ description "none";
+ }
+ leaf layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ config false;
+ description "none";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+ grouping oam-service-g {
+ list end-point {
+ key 'local-id';
+ min-elements 1;
+ uses oam-service-end-point-g;
+ description "none";
+ }
+ container meg {
+ uses meg-ref-g;
+ config false;
+ description "none";
+ }
+ container oam-profile {
+ uses oam-profile-ref-g;
+ description "none";
+ }
+ uses tapi-common:service-spec-g;
+ uses tapi-common:admin-state-pac-g;
+ uses oam-constraint-g;
+ description "none";
+ }
+ grouping oam-context-g {
+ list oam-service {
+ key 'uuid';
+ uses oam-service-g;
+ description "none";
+ }
+ list meg {
+ key 'uuid';
+ config false;
+ uses meg-g;
+ description "none";
+ }
+ list oam-job {
+ key 'uuid';
+ uses oam-job-g;
+ description "none";
+ }
+ list oam-profile {
+ key 'uuid';
+ uses oam-profile-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping oam-service-end-point-g {
+ container service-interface-point {
+ uses tapi-common:service-interface-point-ref-g;
+ description "none";
+ }
+ container connectivity-service-end-point {
+ uses tapi-connectivity:connectivity-service-end-point-ref-g;
+ description "none";
+ }
+ container mep {
+ uses mep-ref-g;
+ config false;
+ description "none";
+ }
+ container mip {
+ uses mip-ref-g;
+ config false;
+ description "none";
+ }
+ leaf layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ description "none";
+ }
+ leaf direction {
+ type tapi-common:port-direction;
+ description "none";
+ }
+ uses tapi-common:local-class-g;
+ uses tapi-common:admin-state-pac-g;
+ description "none";
+ }
+ grouping mep-mip-list-g {
+ list mip {
+ uses mip-ref-g;
+ key 'meg-uuid mip-local-id';
+ description "none";
+ }
+ list mep {
+ uses mep-ref-g;
+ key 'meg-uuid mep-local-id';
+ description "none";
+ }
+ description "none";
+ }
+ grouping oam-constraint-g {
+ leaf layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ description "none";
+ }
+ leaf direction {
+ type tapi-common:forwarding-direction;
+ description "none";
+ }
+ leaf meg-level {
+ type uint64;
+ description "none";
+ }
+ description "none";
+ }
+ grouping pm-current-data-g {
+ list pm-history-data {
+ key 'local-id';
+ config false;
+ uses pm-history-data-g;
+ description "in case of 24hr Current Data, at least 1 History Data.
+ In case of 15min Current Data, at least 16 History Data.
+ In case of <15min, the number of History Data shall be able to cover a span of 4 hours.";
+ }
+ container granularity-period {
+ uses tapi-common:time-period-g;
+ description "none";
+ }
+ leaf timestamp {
+ type tapi-common:date-and-time;
+ config false;
+ description "This attribute indicates the start of the current monitoring interval.
+ The value is bound to the quarter of an hour in case of a 15 minute interval and bound to the hour in case of a 24 hour interval.";
+ }
+ container elapsed-time {
+ uses tapi-common:time-interval-g;
+ description "none";
+ }
+ leaf suspect-interval-flag {
+ type boolean;
+ description "This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are:
+ – Suspect data were detected by the actual resource doing data collection.
+ – Transition of the administrativeState attribute to/from the 'lock' state.
+ – Transition of the operationalState to/from the 'disabled' state.
+ – Scheduler setting that inhibits the collection function.
+ – The performance counters were reset during the interval.
+ – The currentData (or subclass) object instance was created during the monitoring period.";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+ grouping pm-history-data-g {
+ container granularity-period {
+ uses tapi-common:time-period-g;
+ description "none";
+ }
+ leaf period-end-time {
+ type tapi-common:date-and-time;
+ description "none";
+ }
+ leaf suspect-interval-flag {
+ type boolean;
+ config false;
+ description "This attribute indicates that the performance data may not be reliable.";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+ grouping oam-profile-g {
+ list pm-threshold-data {
+ key 'local-id';
+ min-elements 1;
+ uses pm-threshold-data-g;
+ description "none";
+ }
+ list pm-bin-data {
+ key 'local-id';
+ min-elements 1;
+ uses pm-bin-data-g;
+ description "none";
+ }
+ uses tapi-common:global-class-g;
+ description "none";
+ }
+ grouping pm-threshold-data-g {
+ container granularity-period {
+ uses tapi-common:time-period-g;
+ description "none";
+ }
+ leaf is-transient {
+ type boolean;
+ description "none";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+ grouping pm-bin-data-g {
+ container granularity-period {
+ uses tapi-common:time-period-g;
+ description "none";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ identity OAM_JOB_TYPE {
+ description "none";
+ }
+ typedef oam-job-type {
+ type identityref {
+ base OAM_JOB_TYPE;
+ }
+ description "none";
+ }
+
+ /***********************
+ * package interfaces
+ **********************/
+ rpc create-oam-service {
+ description "none";
+ input {
+ list end-point {
+ min-elements 1;
+ uses oam-service-end-point-g;
+ description "none";
+ }
+ container oam-constraint {
+ uses oam-constraint-g;
+ description "none";
+ }
+ leaf state {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container service {
+ uses oam-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc delete-oam-service {
+ description "none";
+ input {
+ leaf service-id {
+ type string;
+ description "none";
+ }
+ }
+ }
+ rpc get-oam-service {
+ description "none";
+ input {
+ leaf service-id {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container service {
+ uses oam-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc create-oam-job {
+ description "none";
+ input {
+ leaf oam-job-type {
+ type oam-job-type;
+ description "none";
+ }
+ list oam-service-end-point {
+ min-elements 1;
+ max-elements 2;
+ uses oam-service-end-point-g;
+ description "none";
+ }
+ container oam-profile {
+ uses oam-profile-g;
+ description "none";
+ }
+ leaf state {
+ type string;
+ description "none";
+ }
+ leaf schedule {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container oam-job {
+ uses oam-job-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-oam-job {
+ description "none";
+ input {
+ leaf job-id {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container oam-job {
+ uses oam-job-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-oam-service-list {
+ description "none";
+ output {
+ list service {
+ uses oam-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-meg {
+ description "none";
+ input {
+ leaf service-id {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container meg {
+ uses meg-g;
+ description "none";
+ }
+ }
+ }
+ rpc update-oam-service {
+ description "none";
+ input {
+ leaf service-id {
+ type string;
+ description "none";
+ }
+ list end-point {
+ uses oam-service-end-point-g;
+ description "none";
+ }
+ container oam-constraint {
+ uses oam-constraint-g;
+ description "none";
+ }
+ leaf state {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container service {
+ uses oam-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc delete-oam-job {
+ description "none";
+ input {
+ leaf job-id {
+ type string;
+ description "none";
+ }
+ }
+ }
+ rpc update-oam-job {
+ description "none";
+ input {
+ leaf job-id {
+ type string;
+ description "none";
+ }
+ container oam-profile {
+ uses oam-profile-g;
+ description "none";
+ }
+ leaf state {
+ type string;
+ description "none";
+ }
+ leaf schedule {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container oam-job {
+ uses oam-job-g;
+ description "none";
+ }
+ }
+ }
+ rpc create-oam-service-end-point {
+ description "none";
+ input {
+ leaf service-id {
+ type string;
+ description "none";
+ }
+ leaf sip-id {
+ type string;
+ description "none";
+ }
+ leaf c-sep-id {
+ type string;
+ description "none";
+ }
+ leaf layer {
+ type string;
+ description "none";
+ }
+ leaf direction {
+ type string;
+ description "none";
+ }
+ leaf state {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container end-point {
+ uses oam-service-end-point-g;
+ description "none";
+ }
+ }
+ }
+ rpc delete-oam-service-end-point {
+ description "none";
+ input {
+ leaf service-id {
+ type string;
+ description "none";
+ }
+ leaf o-sep-id {
+ type string;
+ description "none";
+ }
+ }
+ }
+ rpc update-oam-service-end-point {
+ description "none";
+ input {
+ leaf service-id {
+ type string;
+ description "none";
+ }
+ leaf o-sep-id {
+ type string;
+ description "none";
+ }
+ leaf state {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container end-point {
+ uses oam-service-end-point-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-oam-service-end-point {
+ description "none";
+ input {
+ leaf service-id {
+ type string;
+ description "none";
+ }
+ leaf o-sep-id {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container end-point {
+ uses oam-service-end-point-g;
+ description "none";
+ }
+ }
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-odu@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-odu@2018-08-31.yang new file mode 100644 index 000000000..7b6382ddb --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-odu@2018-08-31.yang @@ -0,0 +1,687 @@ +module tapi-odu {
+ namespace "urn:onf:otcc:yang:tapi-odu";
+ prefix tapi-odu;
+ import tapi-common {
+ prefix tapi-common;
+ }
+ import tapi-connectivity {
+ prefix tapi-connectivity;
+ }
+ import tapi-topology {
+ prefix tapi-topology;
+ }
+ import tapi-oam {
+ prefix tapi-oam;
+ }
+ import tapi-dsr {
+ prefix tapi-dsr;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "
+ This module contains TAPI Odu Model definitions.
+ Source: TapiOdu.uml
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {
+ uses odu-node-edge-point-spec-g;
+ description "Augments the base LayerProtocol information in NodeEdgePoint with ODU-specific information";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {
+ uses odu-connection-end-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:meg/tapi-oam:mep" {
+ uses odu-connection-end-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-oam:meg/tapi-oam:mip" {
+ uses odu-mip-spec-g;
+ description "none";
+ }
+ /***********************
+ * package object-classes
+ **********************/
+ grouping odu-termination-and-client-adaptation-pac-g {
+ leaf opu-tributary-slot-size {
+ type odu-slot-size;
+ config false;
+ description "This attribute is applicable for ODU2 and ODU3 CTP only. It indicates the slot size of the ODU CTP.";
+ }
+ leaf auto-payload-type {
+ type boolean;
+ config false;
+ description "This attribute is applicable when the ODU CTP object instance represents a lower order ODU CTP Source at the client layer of the ODUP/ODUj-21 adaptation function. The value of true of this attribute configures that the adaptation source function shall fall back to the payload type PT=20 if the conditions specified in 14.3.10.1/G.798 are satisfied. ";
+ }
+ leaf configured-client-type {
+ type tapi-dsr:digital-signal-type;
+ config false;
+ description "This attribute configures the type of the client CTP of the server ODU TTP.";
+ }
+ leaf configured-mapping-type {
+ type mapping-type;
+ config false;
+ description "This attributes indicates the configured mapping type.";
+ }
+ container accepted-payload-type {
+ config false;
+ uses odu-payload-type-g;
+ description "This attribute is applicable when the ODU CTP object instance represents a lower order ODU CTP Sink at the client layer of the ODUP/ODU[i]j or ODUP/ODUj-21 adaptation function.
+ This attribute is a 2-digit Hex code that indicates the new accepted payload type.
+ Valid values are defined in Table 15-8 of ITU-T Recommendation G.709 with one additional value UN_INTERPRETABLE.";
+ }
+ description "This Pac contains the attributes associated with the client adaptation function of the server layer TTP
+ It is present only if the CEP contains a TTP";
+ }
+ grouping odu-connection-end-point-spec-g {
+ container odu-common {
+ uses odu-common-pac-g;
+ description "none";
+ }
+ container odu-term-and-adapter {
+ config false;
+ uses odu-termination-and-client-adaptation-pac-g;
+ description "none";
+ }
+ container odu-ctp {
+ config false;
+ uses odu-ctp-pac-g;
+ description "none";
+ }
+ container odu-protection {
+ config false;
+ uses odu-protection-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping odu-pool-pac-g {
+ leaf client-capacity {
+ type uint64;
+ description "none";
+ }
+ leaf max-client-instances {
+ type uint64;
+ config false;
+ description "none";
+ }
+ leaf max-client-size {
+ type uint64;
+ config false;
+ description "none";
+ }
+ description "none";
+ }
+ grouping odu-node-edge-point-spec-g {
+ container odu-pool {
+ config false;
+ uses odu-pool-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping odu-ctp-pac-g {
+ leaf-list tributary-slot-list {
+ type uint64;
+ config false;
+ description "This attribute contains a set of distinct (i.e. unique) integers (e.g. 2, 3, 5, 9, 15 representing the tributary slots TS2, TS3, TS5, TS9 and TS15) which represents the resources occupied by the Low Order ODU Link Connection (e.g. carrying an ODUflex with a bit rate of 6.25G).
+ This attribute applies when the LO ODU_ ConnectionTerminationPoint connects with an HO ODU_TrailTerminationPoint object.
+ It will not apply if this ODU_ ConnectionTerminationPoint object directly connects to an OTU_TrailTerminationPoint object (i.e. OTU has no trib slots).
+ The upper bound of the integer allowed in this set is a function of the HO-ODU server layer to which the ODU connection has been mapped (adapted).
+ Thus, for example, M=8/32/80 for ODU2/ODU3/ODU4 server layers (respectively). Note that the value of this attribute can be changed only in the case of ODUflex and has to be through specific operations (i.e. not be changing the attribute tributarySlotList directly).";
+ }
+ leaf tributary-port-number {
+ type uint64;
+ config false;
+ description "This attribute identifies the tributary port number that is associated with the ODU CTP.
+ range of type : The value range depends on the size of the Tributary Port Number (TPN) field used which depends on th server-layer ODU or OTU.
+ In case of ODUk mapping into OTUk, there is no TPN field, so the tributaryPortNumber shall be zero.
+ In case of LO ODUj mapping over ODU1, ODU2 or ODU3, the TPN is encoded in a 6-bit field so the value range is 0-63. See clause 14.4.1/G.709-2016.
+ In case of LO ODUj mapping over ODU4, the TPN is encoded in a 7-bit field so the value range is 0-127. See clause 14.4.1.4/G.709-2016.
+ In case of ODUk mapping over ODUCn, the TPN is encoded in a 14-bit field so the value range is 0-16383. See clause 20.4.1.1/G.709-2016.
+ ";
+ }
+ leaf accepted-msi {
+ type string;
+ config false;
+ description "This attribute is applicable when the ODU CTP object instance represents a lower order ODU1 or ODU2 CTP Sink at the client layer of the ODU3P/ODU12 adaptation function or represents a lower order ODUj CTP Sink at the client layer of the ODUP/ODUj-21 adaptation function. This attribute is a 1-byte field that represents the accepted multiplex structure of the adaptation function. ";
+ }
+ description "This Pac contains the attributes associated with the CTP
+ It is present only if the CEP contains a CTP";
+ }
+ grouping odu-mep-spec-g {
+ container odu-mep {
+ uses odu-mep-pac-g;
+ description "none";
+ }
+ container odu-ncm {
+ config false;
+ uses odu-ncm-pac-g;
+ description "none";
+ }
+ container odu-tcm {
+ config false;
+ uses odu-tcm-mep-pac-g;
+ description "none";
+ }
+ container odu-defect {
+ uses odu-defect-pac-g;
+ description "none";
+ }
+ container odu-pm {
+ uses odu-pm-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping odu-protection-pac-g {
+ leaf aps-enable {
+ type boolean;
+ default "true";
+ description "This attribute is for enabling/disabling the automatic protection switching (APS) capability at the transport adaptation function that is represented by the ODU_ConnectionTerminationPoint object class. It triggers the MI_APS_EN signal to the transport adaptation function.";
+ }
+ leaf aps-level {
+ type uint64;
+ description "This attribute is for configuring the automatic protection switching (APS) level that should operate at the transport adaptation function that is represented by the ODU_ConnectionTerminationPoint object class. It triggers the MI_APS_LVL signal to the transport adaptation function. The value 0 means path and the values 1 through 6 mean TCM level 1 through 6 respectively.";
+ }
+ description "none";
+ }
+ grouping odu-ncm-pac-g {
+ leaf-list tcm-fields-in-use {
+ type uint64;
+ config false;
+ description "This attribute indicates the used TCM fields of the ODU OH.";
+ }
+ description "none";
+ }
+ grouping odu-tcm-mep-pac-g {
+ leaf tcm-extension {
+ type tcm-extension;
+ description "none";
+ }
+ leaf tcm-mode {
+ type tcm-mode;
+ description "This attribute specifies the TCM mode at the entity. Valid values are: Operational, Monitor, and Transparent.";
+ }
+ leaf codirectional {
+ type boolean;
+ config false;
+ description "This attribute specifies the directionality of the ODUT MEP with respect to the associated ODU CEP. The value of TRUE means that the sink part of the ODUT MEP terminates the same signal direction as the sink part of the ODU CEP. The Source part behaves similarly. This attribute is meaningful only on objects instantiated under ODU CEP, and at least one among ODU CEP and the subordinate object is bidirectional.";
+ }
+ leaf ac-status-source {
+ type tcm-status;
+ config false;
+ description "This attribute indicates the status of the accepted TCM. ";
+ }
+ leaf ac-status-sink {
+ type tcm-status;
+ config false;
+ description "This attribute indicates the status of the accepted TCM. ";
+ }
+ leaf admin-state-source {
+ type tapi-common:administrative-state;
+ description "This attribute provides the capability to provision the LOCK signal at the source, which is one of the ODU maintenance signals. When a Tandem Connection endpoint is set to admin state locked, it will insert the ODU-LCK signal in the source direction.";
+ }
+ leaf admin-state-sink {
+ type tapi-common:administrative-state;
+ description "This attribute provides the capability to provision the LOCK signal at the sink, which is one of the ODU maintenance signals. When a Tandem Connection endpoint is set to admin state locked, it will insert the ODU-LCK signal in the downstream direction.";
+ }
+ uses odu-tcm-mip-pac-g;
+ description "none";
+ }
+ grouping odu-mip-spec-g {
+ container odu-mip {
+ config false;
+ uses odu-mip-pac-g;
+ description "none";
+ }
+ container odu-ncm {
+ config false;
+ uses odu-ncm-pac-g;
+ description "none";
+ }
+ container odu-tcm {
+ config false;
+ uses odu-tcm-mip-pac-g;
+ description "none";
+ }
+ container odu-pm {
+ uses odu-pm-pac-g;
+ description "none";
+ }
+ container odu-defect {
+ uses odu-defect-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping odu-mip-pac-g {
+ leaf acti {
+ type string;
+ config false;
+ description "The Trail Trace Identifier (TTI) information recovered (Accepted) from the TTI overhead position at the sink of a trail.";
+ }
+ leaf ex-dapi {
+ type string;
+ description "The Expected Destination Access Point Identifier (ExDAPI), provisioned by the managing system, to be compared with the TTI accepted at the overhead position of the sink for the purpose of checking the integrity of connectivity.";
+ }
+ leaf ex-sapi {
+ type string;
+ description "The Expected Source Access Point Identifier (ExSAPI), provisioned by the managing system, to be compared with the TTI accepted at the overhead position of the sink for the purpose of checking the integrity of connectivity.
+ ";
+ }
+ leaf tim-act-disabled {
+ type boolean;
+ default "true";
+ description "This attribute provides the control capability for the managing system to enable or disable the Consequent Action function when detecting Trace Identifier Mismatch (TIM) at the trail termination sink.";
+ }
+ leaf tim-det-mode {
+ type tim-det-mo;
+ description "This attribute indicates the mode of the Trace Identifier Mismatch (TIM) Detection function allowed values: OFF, SAPIonly, DAPIonly, SAPIandDAPI";
+ }
+ leaf deg-m {
+ type uint64;
+ description "This attribute indicates the threshold level for declaring a Degraded Signal defect (dDEG). A dDEG shall be declared if DegM consecutive bad PM Seconds are detected.";
+ }
+ container deg-thr {
+ uses deg-thr-g;
+ description "This attribute indicates the threshold level for declaring a performance monitoring (PM) Second to be bad. The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.";
+ }
+ description "none";
+ }
+ grouping odu-tcm-mip-pac-g {
+ leaf tcm-field {
+ type uint64;
+ config false;
+ description "This attribute indicates the tandem connection monitoring field of the ODU OH.";
+ }
+ description "none";
+ }
+ grouping odu-mep-pac-g {
+ leaf dm-source {
+ type boolean;
+ description "This attribute is for configuring the delay measurement process at the trail termination function represented by the subject TTP object class. It models the MI_DM_Source MI signal. If MI_DM_Source is false, then the value of the DMp bit is determined by the RI_DM. If MI_DM_Source is true, then the value of the DMp bit is set to MI_DMValue.";
+ }
+ leaf dm-value {
+ type boolean;
+ description "This attribute is for setting the DMp and DMti bits of the delay measurement process. The value of 'true' sets the DMp and DMti bits to 0 and the value of 'false' to 1.";
+ }
+ leaf txti {
+ type string;
+ description "The Trail Trace Identifier (TTI) information, provisioned by the managing system at the termination source, to be placed in the TTI overhead position of the source of a trail for transmission.
+ ";
+ }
+ uses odu-mip-pac-g;
+ description "none";
+ }
+ grouping odu-common-pac-g {
+ leaf odu-type {
+ type odu-type;
+ config false;
+ description "This attribute specifies the type of the ODU termination point.";
+ }
+ leaf odu-rate {
+ type uint64;
+ config false;
+ description "This attribute indicates the rate of the ODU terminatino point.
+ This attribute is Set at create; i.e., once created it cannot be changed directly.
+ In case of resizable ODU flex, its value can be changed via HAO (not directly on the attribute).
+ ";
+ }
+ leaf odu-rate-tolerance {
+ type uint64;
+ config false;
+ description "This attribute indicates the rate tolerance of the ODU termination point.
+ Valid values are real value in the unit of ppm.
+ Standardized values are defined in Table 7-2/G.709.";
+ }
+ description "none";
+ }
+ grouping odu-pm-pac-g {
+ leaf n-bbe {
+ type uint64;
+ description "Near-end Background Block Error";
+ }
+ leaf f-bbe {
+ type uint64;
+ config false;
+ description "Far-end Background Block Error";
+ }
+ leaf n-ses {
+ type uint64;
+ description "Near-end Severely Errored Second";
+ }
+ leaf f-ses {
+ type uint64;
+ description "Far-end Severely Errored Second";
+ }
+ container uas {
+ uses uas-choice-g;
+ description "UnAvailable Second";
+ }
+ description "Instance of this object class contains the ODUP layer-specific Current Data. This object class is a subclass of the OTN_CurrentData object class.
+ PM data attributes: fBbe, fSes, nBbe, nSes. uas";
+ }
+ grouping odu-defect-pac-g {
+ leaf bdi {
+ type boolean;
+ config false;
+ description "Backward Defect Indication";
+ }
+ leaf deg {
+ type boolean;
+ config false;
+ description "Signal Degraded";
+ }
+ leaf lck {
+ type boolean;
+ config false;
+ description "Locked";
+ }
+ leaf oci {
+ type boolean;
+ config false;
+ description "Open Connection Indicator";
+ }
+ leaf ssf {
+ type boolean;
+ config false;
+ description "Server Signal Failure";
+ }
+ leaf tim {
+ type boolean;
+ config false;
+ description "Trail Trace Identifier Mismatch";
+ }
+ description "The valid list of defects raised on the entity. If the value of any attribute is true, then the corresponding defect is raised.";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ identity ODU_TYPE {
+ base tapi-common:LAYER_PROTOCOL_QUALIFIER;
+ description "none";
+ }
+ identity ODU_TYPE_ODU0 {
+ base ODU_TYPE;
+ description "none";
+ }
+ identity ODU_TYPE_ODU1 {
+ base ODU_TYPE;
+ description "none";
+ }
+ identity ODU_TYPE_ODU2 {
+ base ODU_TYPE;
+ description "none";
+ }
+ identity ODU_TYPE_ODU2E {
+ base ODU_TYPE;
+ description "none";
+ }
+ identity ODU_TYPE_ODU3 {
+ base ODU_TYPE;
+ description "none";
+ }
+ identity ODU_TYPE_ODU4 {
+ base ODU_TYPE;
+ description "none";
+ }
+ identity ODU_TYPE_ODU_FLEX {
+ base ODU_TYPE;
+ description "none";
+ }
+ identity ODU_TYPE_ODU_CN {
+ base ODU_TYPE;
+ description "none";
+ }
+ typedef odu-type {
+ type identityref {
+ base ODU_TYPE;
+ }
+ description "none";
+ }
+ typedef mapping-type {
+ type enumeration {
+ enum AMP {
+ description "none";
+ }
+ enum BMP {
+ description "none";
+ }
+ enum GFP-F {
+ description "none";
+ }
+ enum GMP {
+ description "none";
+ }
+ enum TTP_GFP_BMP {
+ description "none";
+ }
+ enum NULL {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef tim-det-mo {
+ type enumeration {
+ enum DAPI {
+ description "none";
+ }
+ enum SAPI {
+ description "none";
+ }
+ enum BOTH {
+ description "none";
+ }
+ enum OFF {
+ description "none";
+ }
+ }
+ description "List of modes for trace identifier mismatch detection.";
+ }
+ typedef odu-slot-size {
+ type enumeration {
+ enum 1G25 {
+ description "none";
+ }
+ enum 2G5 {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping odu-payload-type-g {
+ leaf named-payload-type {
+ type odu-named-payload-type;
+ description "none";
+ }
+ leaf hex-payload-type {
+ type uint64;
+ description "none";
+ }
+ description "none";
+ }
+ typedef odu-named-payload-type {
+ type enumeration {
+ enum UNKNOWN {
+ description "none";
+ }
+ enum UNINTERPRETABLE {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping deg-thr-g {
+ leaf deg-thr-value {
+ type uint64;
+ description "Percentage of detected errored blocks";
+ }
+ leaf deg-thr-type {
+ type deg-thr-type;
+ description "Number of errored blocks";
+ }
+ leaf percentage-granularity {
+ type percentage-granularity;
+ description "none";
+ }
+ description "Degraded Threshold, specify either the percentage or the number of Errored Blocks in the defined interval.
+ degThrValue when type is PERCENTAGE:
+ percentageGranularity is used to indicate the number of decimal points
+ So if percentageGranularity is ones, a value of 1 in degThrValue would indicate 1%, a value of 10 = 10%, a value of 100 = 100%
+ So if percentageGranularity is thousandths a value of 1 in degThrValue would indicate 0.001%, a value of 1000 = 1%, a value of 1000000 = 100%
+ degThrValue when type is NUMBER_ERROR_BLOCKS:
+ Number of Errored Blocks is captured in an integer value.";
+ }
+ typedef deg-thr-type {
+ type enumeration {
+ enum PERCENTAGE {
+ description "Choice of % or Number of errored blocks";
+ }
+ enum NUMBER_ERRORED_BLOCKS {
+ description "Number of % or blocks";
+ }
+ }
+ description "The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.";
+ }
+ typedef tcm-status {
+ type enumeration {
+ enum NO_SOURCE_TC {
+ description "TCM byte 3 (bits 6 7 8) -- 0 0 0, No source Tandem Connection";
+ }
+ enum IN_USE_WITHOUT_IAE {
+ description "TCM byte 3 (bits 6 7 8) -- 0 0 1, In use without IAE (Incoming Alignment Error)";
+ }
+ enum IN_USE_WITH_IAE {
+ description "TCM byte 3 (bits 6 7 8) -- 0 1 0, In use with IAE (Incoming Alignment Error)";
+ }
+ enum RESERVED_1 {
+ description "TCM byte 3 (bits 6 7 8) -- 0 1 1, Reserved for future international standardization";
+ }
+ enum RESERVED_2 {
+ description "TCM byte 3 (bits 6 7 8) -- 1 0 0, Reserved for future international standardization";
+ }
+ enum LCK {
+ description "TCM byte 3 (bits 6 7 8) -- 1 0 1, Maintenance signal: ODU-LCK";
+ }
+ enum OCI {
+ description "TCM byte 3 (bits 6 7 8) -- 1 1 0, Maintenance signal: ODU-OCI";
+ }
+ enum AIS {
+ description "TCM byte 3 (bits 6 7 8) -- 1 1 1, Maintenance signal: ODU-AIS";
+ }
+ }
+ description "See Table 15-5/G.709/Y.1331 ";
+ }
+ typedef tcm-mode {
+ type enumeration {
+ enum OPERATIONAL {
+ description "none";
+ }
+ enum TRANSPARENT {
+ description "none";
+ }
+ enum MONITOR {
+ description "none";
+ }
+ }
+ description "List of value modes for the sink side of the tandem connection monitoring function.";
+ }
+ typedef tcm-monitoring {
+ type enumeration {
+ enum INTRUSIVE {
+ description "none";
+ }
+ enum NON-INTRUSIVE {
+ description "none";
+ }
+ }
+ description "Monitoring types for the tandem connection monitoring function.";
+ }
+ typedef tcm-extension {
+ type enumeration {
+ enum NORMAL {
+ description "none";
+ }
+ enum PASS-THROUGH {
+ description "none";
+ }
+ enum ERASE {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef percentage-granularity {
+ type enumeration {
+ enum ONES {
+ description "none";
+ }
+ enum ONE_TENTHS {
+ description "value * (1/10)";
+ }
+ enum ONE_HUNDREDTHS {
+ description "value * (1/100)";
+ }
+ enum ONE_THOUSANDTHS {
+ description "value * (1/1000)";
+ }
+ }
+ description "none";
+ }
+ grouping uas-choice-g {
+ leaf bidirectional {
+ type boolean;
+ default "true";
+ description "none";
+ }
+ leaf uas {
+ type uint64;
+ description "none";
+ }
+ leaf nuas {
+ type uint64;
+ description "none";
+ }
+ leaf fuas {
+ type uint64;
+ description "none";
+ }
+ description "If bidirectional is TRUE then use the uas attribute, if bidirectional is FALSE use the nuas, and fuas attributes";
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-path-computation@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-path-computation@2018-08-31.yang new file mode 100644 index 000000000..a29fd9d91 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-path-computation@2018-08-31.yang @@ -0,0 +1,436 @@ +module tapi-path-computation { + namespace "urn:onf:otcc:yang:tapi-path-computation"; + prefix tapi-path-computation; + import tapi-topology { + prefix tapi-topology; + } + import tapi-common { + prefix tapi-common; + } + organization "ONF OTCC (Open Transport Configuration & Control) Project"; + contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>"; + description " + This module contains TAPI Path Computation Model definitions. + Source: TapiPathComputation.uml + Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved. + License: This module is distributed under the Apache License 2.0"; + revision 2018-08-31 { + description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>"; + reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>"; + } + revision 2018-03-07 { + description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>"; + reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>"; + } + revision 2018-02-16 { + description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>"; + reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>"; + } + revision 2018-01-02 { + description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>"; + reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>"; + } + augment "/tapi-common:context" { + uses path-computation-context-g; + description "Augments the base TAPI Context with PathComputationService information"; + } + + /************************* + * definitions of refrences + *************************/ + grouping path-ref-g { + leaf path-uuid { + type leafref { + path '/tapi-common:context/tapi-path-computation:path/tapi-path-computation:uuid'; + } + description "none"; + } + description "none"; + } + + /*********************** + * package object-classes + **********************/ + grouping path-g { + list link { + uses tapi-topology:link-ref-g; + key 'topology-uuid link-uuid'; + config false; + min-elements 1; + description "none"; + } + container routing-constraint { + config false; + uses routing-constraint-g; + description "none"; + } + leaf direction { + type tapi-common:forwarding-direction; + description "none"; + } + leaf layer-protocol-name { + type tapi-common:layer-protocol-name; + config false; + description "none"; + } + uses tapi-common:resource-spec-g; + description "Path is described by an ordered list of TE Links. A TE Link is defined by a pair of Node/NodeEdgePoint IDs. A Connection is realized by concatenating link resources (associated with a Link) and the lower-level connections (cross-connections) in the different nodes"; + } + grouping path-service-end-point-g { + container service-interface-point { + uses tapi-common:service-interface-point-ref-g; + config false; + description "none"; + } + leaf layer-protocol-name { + type tapi-common:layer-protocol-name; + config false; + description "none"; + } + leaf layer-protocol-qualifier { + type tapi-common:layer-protocol-qualifier; + description "none"; + } + container capacity { + uses tapi-common:capacity-g; + description "none"; + } + leaf role { + type tapi-common:port-role; + config false; + description "Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function. "; + } + leaf direction { + type tapi-common:port-direction; + config false; + description "The orientation of defined flow at the EndPoint."; + } + uses tapi-common:local-class-g; + description "The association of the FC to LTPs is made via EndPoints. + The EndPoint (EP) object class models the access to the FC function. + The traffic forwarding between the associated EPs of the FC depends upon the type of FC and may be associated with FcSwitch object instances. + In cases where there is resilience the EndPoint may convey the resilience role of the access to the FC. + It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point. + The EP replaces the Protection Unit of a traditional protection model. + The ForwadingConstruct can be considered as a component and the EndPoint as a Port on that component"; + } + grouping path-computation-service-g { + list path { + uses path-ref-g; + key 'path-uuid'; + config false; + min-elements 1; + description "none"; + } + list end-point { + key 'local-id'; + min-elements 2; + max-elements 2; + uses path-service-end-point-g; + description "none"; + } + container routing-constraint { + uses routing-constraint-g; + description "none"; + } + container topology-constraint { + uses topology-constraint-g; + description "none"; + } + container objective-function { + uses path-objective-function-g; + description "none"; + } + container optimization-constraint { + uses path-optimization-constraint-g; + description "none"; + } + uses tapi-common:service-spec-g; + description "none"; + } + grouping path-objective-function-g { + leaf bandwidth-optimization { + type tapi-common:directive-value; + config false; + description "none"; + } + leaf concurrent-paths { + type tapi-common:directive-value; + config false; + description "none"; + } + leaf cost-optimization { + type tapi-common:directive-value; + config false; + description "none"; + } + leaf link-utilization { + type tapi-common:directive-value; + config false; + description "none"; + } + leaf resource-sharing { + type tapi-common:directive-value; + config false; + description "none"; + } + uses tapi-common:local-class-g; + description "none"; + } + grouping path-optimization-constraint-g { + leaf traffic-interruption { + type tapi-common:directive-value; + config false; + description "none"; + } + uses tapi-common:local-class-g; + description "none"; + } + grouping routing-constraint-g { + list cost-characteristic { + key 'cost-name'; + uses tapi-topology:cost-characteristic-g; + description "The list of costs where each cost relates to some aspect of the TopologicalEntity."; + } + list latency-characteristic { + key 'traffic-property-name'; + uses tapi-topology:latency-characteristic-g; + description "The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic."; + } + list risk-diversity-characteristic { + key 'risk-characteristic-name'; + uses tapi-topology:risk-characteristic-g; + description "none"; + } + leaf diversity-policy { + type diversity-policy; + description "none"; + } + leaf route-objective-function { + type route-objective-function; + description "none"; + } + leaf route-direction { + type tapi-common:forwarding-direction; + description "none"; + } + leaf is-exclusive { + type boolean; + default "true"; + description "To distinguish if the resources are to be exclusive to the service"; + } + description "none"; + } + grouping path-computation-context-g { + list path-comp-service { + key 'uuid'; + uses path-computation-service-g; + description "none"; + } + list path { + key 'uuid'; + config false; + uses path-g; + description "none"; + } + description "none"; + } + grouping topology-constraint-g { + list include-topology { + uses tapi-topology:topology-ref-g; + key 'topology-uuid'; + config false; + description "none"; + } + list avoid-topology { + uses tapi-topology:topology-ref-g; + key 'topology-uuid'; + config false; + description "none"; + } + list include-path { + uses tapi-path-computation:path-ref-g; + key 'path-uuid'; + config false; + description "none"; + } + list exclude-path { + uses tapi-path-computation:path-ref-g; + key 'path-uuid'; + config false; + description "none"; + } + list include-link { + uses tapi-topology:link-ref-g; + key 'topology-uuid link-uuid'; + config false; + description "This is a loose constraint - that is it is unordered and could be a partial list "; + } + list exclude-link { + uses tapi-topology:link-ref-g; + key 'topology-uuid link-uuid'; + config false; + description "none"; + } + list include-node { + uses tapi-topology:node-ref-g; + key 'topology-uuid node-uuid'; + config false; + description "This is a loose constraint - that is it is unordered and could be a partial list"; + } + list exclude-node { + uses tapi-topology:node-ref-g; + key 'topology-uuid node-uuid'; + config false; + description "none"; + } + leaf-list preferred-transport-layer { + type tapi-common:layer-protocol-name; + config false; + description "soft constraint requested by client to indicate the layer(s) of transport connection that it prefers to carry the service. This could be same as the service layer or one of the supported server layers"; + } + description "none"; + } + + /*********************** + * package type-definitions + **********************/ + typedef route-objective-function { + type enumeration { + enum MIN_WORK_ROUTE_HOP { + description "none"; + } + enum MIN_WORK_ROUTE_COST { + description "none"; + } + enum MIN_WORK_ROUTE_LATENCY { + description "none"; + } + enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_HOP { + description "none"; + } + enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_COST { + description "none"; + } + enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_LATENCY { + description "none"; + } + enum LOAD_BALANCE_MAX_UNUSED_CAPACITY { + description "none"; + } + } + description "none"; + } + typedef diversity-policy { + type enumeration { + enum SRLG { + description "none"; + } + enum SRNG { + description "none"; + } + enum SNG { + description "none"; + } + enum NODE { + description "none"; + } + enum LINK { + description "none"; + } + } + description "none"; + } + + /*********************** + * package interfaces + **********************/ + rpc compute-p-2-p-path { + description "none"; + input { + list sep { + min-elements 2; + max-elements 2; + uses path-service-end-point-g; + description "none"; + } + container routing-constraint { + uses routing-constraint-g; + description "none"; + } + container topology-constraint { + uses topology-constraint-g; + description "none"; + } + container objective-function { + uses path-objective-function-g; + description "none"; + } + } + output { + container service { + uses path-computation-service-g; + description "none"; + } + } + } + rpc optimize-p-2-p-path { + description "none"; + input { + leaf path-id-or-name { + type string; + description "none"; + } + container routing-constraint { + uses routing-constraint-g; + description "none"; + } + container optimization-constraint { + uses path-optimization-constraint-g; + description "none"; + } + container objective-function { + uses path-objective-function-g; + description "none"; + } + } + output { + container service { + uses path-computation-service-g; + description "none"; + } + } + } + rpc delete-p-2-p-path { + description "none"; + input { + leaf path-id-or-name { + type string; + description "none"; + } + } + output { + container service { + uses path-computation-service-g; + description "none"; + } + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-photonic-media@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-photonic-media@2018-08-31.yang new file mode 100644 index 000000000..cf326b33f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-photonic-media@2018-08-31.yang @@ -0,0 +1,746 @@ +module tapi-photonic-media {
+ namespace "urn:onf:otcc:yang:tapi-photonic-media";
+ prefix tapi-photonic-media;
+ import tapi-common {
+ prefix tapi-common;
+ }
+ import tapi-connectivity {
+ prefix tapi-connectivity;
+ }
+ import tapi-topology {
+ prefix tapi-topology;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "
+ This module contains TAPI PhotonicMedia Model definitions.
+ Source: TapiPhotonicMedia.uml
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {
+ uses otsi-connection-end-point-spec-g;
+ description "Augments the base LayerProtocol information in ConnectionEndPoint with OCH-specific information";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {
+ uses media-channel-node-edge-point-spec-g;
+ description "Augments the base LayerProtocol information in NodeEdgePoint with OCH-specific information";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {
+ uses otsi-assembly-connection-end-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-common:service-interface-point" {
+ uses otsi-service-interface-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point" {
+ uses otsi-connectivity-service-end-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-common:service-interface-point" {
+ uses media-channel-service-interface-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point" {
+ uses media-channel-service-interface-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {
+ uses media-channel-connection-end-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {
+ uses ots-connection-end-point-spec-g;
+ description "none";
+ }
+ augment "/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:connection-end-point" {
+ uses media-channel-assembly-spec-g;
+ description "none";
+ }
+ /***********************
+ * package object-classes
+ **********************/
+ grouping otsi-gserver-adaptation-pac-g {
+ leaf number-of-otsi {
+ type uint64;
+ config false;
+ description "none";
+ }
+ description "none";
+ }
+ grouping otsi-connection-end-point-spec-g {
+ container otsi-termination {
+ config false;
+ uses otsi-termination-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping otsi-termination-pac-g {
+ container selected-central-frequency {
+ config false;
+ uses central-frequency-or-wavelength-g;
+ description "none";
+ }
+ container selected-application-identifier {
+ config false;
+ uses application-identifier-g;
+ description "This attribute indicates the selected Application Identifier that is used by the OCh trail termination function. The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code.";
+ }
+ leaf selected-modulation {
+ type modulation-technique;
+ default "UNDEFINED";
+ config false;
+ description "This parameter defines the modulation used at the source";
+ }
+ container selected-spectrum {
+ config false;
+ uses spectrum-g;
+ description "none";
+ }
+ container transmited-power {
+ config false;
+ uses power-properties-pac-g;
+ description "Measured power at the Transmitter.";
+ }
+ container received-power {
+ uses power-properties-pac-g;
+ description "none";
+ }
+ container laser-properties {
+ config false;
+ uses laser-properties-pac-g;
+ description "Laser properties.";
+ }
+ description "Provides status information only.";
+ }
+ grouping media-channel-pool-capability-pac-g {
+ list supportable-spectrum {
+ config false;
+ uses spectrum-g;
+ description "none";
+ }
+ list available-spectrum {
+ config false;
+ uses spectrum-g;
+ description "none";
+ }
+ list occupied-spectrum {
+ config false;
+ uses spectrum-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping media-channel-node-edge-point-spec-g {
+ container mc-pool {
+ config false;
+ uses media-channel-pool-capability-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping otsi-routing-spec-g {
+ leaf optical-routing-strategy {
+ type optical-routing-strategy;
+ description "none";
+ }
+ description "none";
+ }
+ grouping media-channel-properties-pac-g {
+ container occupied-spectrum {
+ config false;
+ uses spectrum-g;
+ description "none";
+ }
+ container measured-power-ingress {
+ config false;
+ uses power-properties-pac-g;
+ description "none";
+ }
+ container measured-power-egress {
+ uses power-properties-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping otsi-assembly-connection-end-point-spec-g {
+ container otsi-adapter {
+ config false;
+ uses otsi-gserver-adaptation-pac-g;
+ description "none";
+ }
+ container fec-parameters {
+ config false;
+ uses fec-properties-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping otsi-capability-pac-g {
+ list supportable-lower-central-frequency {
+ config false;
+ uses central-frequency-or-wavelength-g;
+ description "The lower frequency of the channel spectrum";
+ }
+ list supportable-upper-central-frequency {
+ config false;
+ uses central-frequency-or-wavelength-g;
+ description "The Upper frequency of the channel spectrum";
+ }
+ list supportable-application-identifier {
+ config false;
+ uses application-identifier-g;
+ description "The list of supportable ApplicationIdentifiers.";
+ }
+ leaf-list supportable-modulation {
+ type modulation-technique;
+ config false;
+ description "This parameter defines the modulation used at the source";
+ }
+ container total-power-warn-threshold {
+ config false;
+ uses total-power-threshold-pac-g;
+ description "none";
+ }
+ description "Can read the status of the warning for the upper value that the power can reach.";
+ }
+ grouping otsi-service-interface-point-spec-g {
+ container otsi-capability {
+ config false;
+ uses otsi-capability-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping otsi-connectivity-service-end-point-spec-g {
+ container otsi-config {
+ uses otsi-termination-config-pac-g;
+ description "none";
+ }
+ container nmc-config {
+ uses media-channel-config-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping otsi-termination-config-pac-g {
+ container central-frequency {
+ uses central-frequency-or-wavelength-g;
+ description "The central frequency of the laser. It is the oscillation frequency of the corresponding electromagnetic wave";
+ }
+ container application-identifier {
+ uses application-identifier-g;
+ description "This attribute indicates the selected Application Identifier.";
+ }
+ leaf modulation {
+ type modulation-technique;
+ description "The modulation techniqu selected at the source.";
+ }
+ leaf laser-control {
+ type laser-control-type;
+ description "Laser control can be FORCED-ON, FORCED-OFF or AUTOMATIC-LASER-SHUTDOWN";
+ }
+ container transmit-power {
+ uses power-properties-pac-g;
+ description "Transmit power as requested.";
+ }
+ leaf total-power-warn-threshold-upper {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "Configure the Max, Default and Min values for the Upper power threshold.";
+ }
+ leaf total-power-warn-threshold-lower {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "Configure Max, Default and Min values for lower power threshold.";
+ }
+ description "none";
+ }
+ grouping fec-properties-pac-g {
+ leaf pre-fec-ber {
+ type uint64;
+ config false;
+ description "counter: bit error rate before correction by FEC";
+ }
+ leaf post-fec-ber {
+ type uint64;
+ config false;
+ description "counter: bit error rate after correction by FEC";
+ }
+ leaf corrected-bytes {
+ type uint64;
+ config false;
+ description "Bytes corrected between those that were received corrupted";
+ }
+ leaf corrected-bits {
+ type uint64;
+ config false;
+ description "Bits corrected between those that were received corrupted";
+ }
+ leaf uncorrectable-bytes {
+ type uint64;
+ config false;
+ description "Bytes that could not be corrected by FEC";
+ }
+ leaf uncorrectable-bits {
+ type uint64;
+ config false;
+ description "Bits that could not be corrected by FEC";
+ }
+ description "none";
+ }
+ grouping media-channel-service-interface-point-spec-g {
+ container mc-pool {
+ config false;
+ uses media-channel-pool-capability-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping media-channel-connectivity-service-end-point-spec-g {
+ container mc-config {
+ uses media-channel-config-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping media-channel-config-pac-g {
+ container spectrum {
+ uses spectrum-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping media-channel-connection-end-point-spec-g {
+ container media-channel {
+ config false;
+ uses media-channel-properties-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping ots-connection-end-point-spec-g {
+ container ots-media-channel {
+ config false;
+ uses media-channel-properties-pac-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping media-channel-assembly-spec-g {
+ description "none";
+ }
+ grouping laser-properties-pac-g {
+ leaf laser-status {
+ type laser-control-status-type;
+ config false;
+ description "none";
+ }
+ leaf laser-application-type {
+ type laser-type;
+ config false;
+ description "The type of laser, its operational wavelengths, and its applications. String size 255.";
+ }
+ leaf laser-bias-current {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ config false;
+ description "The Bias current of the laser that is the medium polarization current of the laser.";
+ }
+ leaf laser-temperature {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ config false;
+ description "The temperature of the laser";
+ }
+ description "none";
+ }
+ grouping power-properties-pac-g {
+ leaf total-power {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "The total power at any point in a channel specified in dBm.
+ range of type : -99.000..99.000";
+ }
+ leaf power-spectral-density {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ config false;
+ description "This describes how power of a signal is distributed over frequency specified in nW/MHz
+ range of type : -2147483648..2147483648";
+ }
+ description "Indication with severity warning raised when a total power value measured is above the threshold.";
+ }
+ grouping total-power-threshold-pac-g {
+ leaf total-power-upper-warn-threshold-default {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "Can read the value of the default threshold that was set";
+ }
+ leaf total-power-upper-warn-threshold-min {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "Can read the value of the lower threshold that was set";
+ }
+ leaf total-power-upper-warn-threshold-max {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "Can read the value of the upper threshold that was set";
+ }
+ leaf total-power-lower-warn-threshold-default {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "Can read the value of the default threshold that was set";
+ }
+ leaf total-power-lower-warn-threshold-max {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "Can read the value of the upper threshold that was set";
+ }
+ leaf total-power-lower-warn-threshold-min {
+ type decimal64 {
+ fraction-digits 7;
+ }
+ description "Can read the value of the lower threshold that was set";
+ }
+ description "none";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ identity SPECTRUM_TYPE {
+ base tapi-common:LAYER_PROTOCOL_QUALIFIER;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_OTSi {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_OTSiA {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_OTSiG {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_NMC {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_NMCA {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_SMC {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_SMCA {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_OCH {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_OMS {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ identity SPECTRUM_TYPE_OTS {
+ base SPECTRUM_TYPE;
+ description "none";
+ }
+ grouping application-identifier-g {
+ leaf application-identifier-type {
+ type application-identifier-type;
+ description "The ITU-T recommendation which defines the application code format.";
+ }
+ leaf application-code {
+ type string;
+ description "none";
+ }
+ description "The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code.";
+ }
+ grouping central-frequency-or-wavelength-g {
+ leaf grid-type {
+ type grid-type;
+ description "Specifies the frequency grid standard used to determine the nominal central frequency and frequency slot width";
+ }
+ leaf adjustment-granularity {
+ type adjustment-granularity;
+ description "Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency (in THz)";
+ }
+ leaf central-frequency {
+ type uint64;
+ description "The central frequency of the laser specified in MHz. It is the oscillation frequency of the corresponding electromagnetic wave. ";
+ }
+ leaf channel-number {
+ type uint64;
+ description "As per ITU-T G.694.1, this attribute is denoted as 'n' and is used to calculate the nominal central frequency (in THz) as follows:
+ 193.1 + <channelNumber> × <adjustmentGranularity> where channelNumber is a positive or negative integer including 0 and adjustment_granularity is the nominal central frequency granularity in THz";
+ }
+ description "This data-type holds the central frequency directly or optionally the information to determine the nominal central frequency of a FIXED grid (DWDM or CWDM) and FLEX grid type systems.
+ As per ITU-T G.694.1, the nominal central frequency (in THz) is calculated as follows:
+ 193.1 + <channelNumber> × <adjustmentGranularity> where channelNumber is a positive or negative integer including 0 and <adjustment_granularity> is the nominal central frequency granularity in THz
+ For FIXED grid types, the adjustmentGranularity is one of (0.1/0.05/0.025/0.0125) THz corresponding to channel spacing of one of (100/50/25/12.5) GHz
+ For FLEX grid type, the adjusmentGranularity is 0.00625 THz and the slot width is variable in increments of 12.5 GHz";
+ }
+ typedef optical-routing-strategy {
+ type enumeration {
+ enum OPTIMAL_OSNR {
+ description "none";
+ }
+ enum NO_RELAY {
+ description "none";
+ }
+ enum MIN_RELAY {
+ description "none";
+ }
+ enum PREFERRED_NO_CHANGE_WAVELENGTH_AS_RESTORE {
+ description "none";
+ }
+ enum PREFERRED_NO_SKIPPING_WAVELENGTH {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef application-identifier-type {
+ type enumeration {
+ enum PROPRIETARY {
+ description "none";
+ }
+ enum ITUT_G959_1 {
+ description "none";
+ }
+ enum ITUT_G698_1 {
+ description "none";
+ }
+ enum ITUT_G698_2 {
+ description "none";
+ }
+ enum ITUT_G696_1 {
+ description "none";
+ }
+ enum ITUT_G695 {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef grid-type {
+ type enumeration {
+ enum DWDM {
+ description "Fixed frequency grid in C & L bands as specified in ITU-T G.694.1
+ ";
+ }
+ enum CWDM {
+ description "Fixed frequency grid as specified in ITU-T G.694.2";
+ }
+ enum FLEX {
+ description "Flexible frequency grid as specified in ITU-T G.694.1. In this case,
+ - the allowed frequency slots have a nominal central frequency (in THz) defined by:
+ 193.1 + n × 0.00625 where n is a positive or negative integer including 0 and 0.00625 is the nominal central frequency granularity in THz
+ - and a slot width defined by:
+ 12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz.
+ Any combination of frequency slots is allowed as long as no two frequency slots overlap.";
+ }
+ enum GRIDLESS {
+ description "none";
+ }
+ enum UNSPECIFIED {
+ description "Unspecified/proprietary frequency grid";
+ }
+ }
+ description "The frequency grid standard that specify reference set of frequencies used to denote allowed nominal central frequencies that may be used for defining applications.";
+ }
+ typedef adjustment-granularity {
+ type enumeration {
+ enum G_100GHZ {
+ description "100000 MHz";
+ }
+ enum G_50GHZ {
+ description "50000 MHz";
+ }
+ enum G_25GHZ {
+ description "25000 MHz";
+ }
+ enum G_12_5GHZ {
+ description "12500 MHz";
+ }
+ enum G_6_25GHZ {
+ description "6250 MHz";
+ }
+ enum G_3_125GHZ {
+ description "3125 MHz";
+ }
+ enum UNCONSTRAINED {
+ description "none";
+ }
+ }
+ description "Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency";
+ }
+ grouping spectrum-g {
+ leaf upper-frequency {
+ type uint64;
+ description "The upper frequency bound of the media channel spectrum specified in MHz";
+ }
+ leaf lower-frequency {
+ type uint64;
+ description "The lower frequency bound of the media channel spectrum specified in MHz";
+ }
+ container frequency-slot {
+ uses frequency-slot-g;
+ description "none";
+ }
+ description "This data-type holds the spectrum information in termsof upper/lower frequency directly or optionally the information to determin this in terms of the nominal central frequency and spectral width for a FIXED grid (DWDM or CWDM) and FLEX grid type systems.";
+ }
+ typedef modulation-technique {
+ type enumeration {
+ enum RZ {
+ description "none";
+ }
+ enum NRZ {
+ description "none";
+ }
+ enum BPSK {
+ description "none";
+ }
+ enum DPSK {
+ description "none";
+ }
+ enum QPSK {
+ description "none";
+ }
+ enum 8QAM {
+ description "none";
+ }
+ enum 16QAM {
+ description "none";
+ }
+ enum UNDEFINED {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping frequency-slot-g {
+ container central-frequency {
+ uses central-frequency-or-wavelength-g;
+ description "none";
+ }
+ leaf spectral-width {
+ type uint64;
+ description "Width of the media channel spectrum specified in MHz";
+ }
+ leaf slot-width-number {
+ type uint64;
+ description "As per ITU-T G.694.1, this attribute is denoted as 'm' and is used to calculate the slot width (in GHz) as follows:
+ 12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz.";
+ }
+ description "The frequency range allocated to a slot and unavailable to other slots within a flexible grid. A frequency slot is defined by its nominal central frequency. As per ITU-T G.694.1 the slot width is calculated as follows:
+ 12.5 × <slotWidthNumber> where slotWidthNumber is a positive integer and 12.5 is the slot width granularity in GHz";
+ }
+ typedef laser-type {
+ type enumeration {
+ enum PUMP {
+ description "none";
+ }
+ enum MODULATED {
+ description "none";
+ }
+ enum PULSE {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef spectrum-type {
+ type identityref {
+ base SPECTRUM_TYPE;
+ }
+ description "none";
+ }
+ typedef laser-control-type {
+ type enumeration {
+ enum FORCED-ON {
+ description "none";
+ }
+ enum FORCED-OFF {
+ description "none";
+ }
+ enum AUTOMATIC-LASER-SHUTDOWN {
+ description "none";
+ }
+ enum UNDEFINED {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef laser-control-status-type {
+ type enumeration {
+ enum ON {
+ description "none";
+ }
+ enum OFF {
+ description "none";
+ }
+ enum PULSING {
+ description "none";
+ }
+ enum UNDEFINED {
+ description "none";
+ }
+ }
+ description "none";
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-topology@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-topology@2018-08-31.yang new file mode 100644 index 000000000..020284675 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-topology@2018-08-31.yang @@ -0,0 +1,701 @@ +module tapi-topology {
+ namespace "urn:onf:otcc:yang:tapi-topology";
+ prefix tapi-topology;
+ import tapi-common {
+ prefix tapi-common;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "
+ This module contains TAPI Topology Model definitions.
+ Source: TapiTopology.uml
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ augment "/tapi-common:context" {
+ uses topology-context-g;
+ description "Augments the base TAPI Context with TopologyService information";
+ }
+
+ /*************************
+ * definitions of refrences
+ *************************/
+
+ grouping topology-ref-g {
+ leaf topology-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-topology:topology/tapi-topology:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping link-ref-g {
+ uses topology-ref-g;
+ leaf link-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-topology:topology/tapi-topology:link/tapi-topology:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping node-ref-g {
+ uses topology-ref-g;
+ leaf node-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping node-edge-point-ref-g {
+ uses node-ref-g;
+ leaf node-edge-point-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-topology:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ grouping node-rule-group-ref-g {
+ uses node-ref-g;
+ leaf node-rule-group-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-topology:topology/tapi-topology:node/tapi-topology:node-rule-group/tapi-topology:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ /***********************
+ * package object-classes
+ **********************/
+ grouping link-g {
+ list node-edge-point {
+ uses node-edge-point-ref-g;
+ key 'topology-uuid node-uuid node-edge-point-uuid';
+ config false;
+ min-elements 2;
+ description "none";
+ }
+ leaf-list layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ leaf direction {
+ type tapi-common:forwarding-direction;
+ config false;
+ description "The directionality of the Link.
+ Is applicable to simple Links where all LinkEnds are BIDIRECTIONAL (the Link will be BIDIRECTIONAL) or UNIDIRECTIONAL (the Link will be UNIDIRECTIONAL).
+ Is not present in more complex cases.";
+ }
+ container resilience-type {
+ uses resilience-type-g;
+ description "none";
+ }
+ uses tapi-common:resource-spec-g;
+ uses tapi-common:admin-state-pac-g;
+ uses tapi-common:capacity-pac-g;
+ uses transfer-cost-pac-g;
+ uses transfer-integrity-pac-g;
+ uses transfer-timing-pac-g;
+ uses risk-parameter-pac-g;
+ uses validation-pac-g;
+ uses layer-protocol-transition-pac-g;
+ description "The Link object class models effective adjacency between two or more ForwardingDomains (FD). ";
+ }
+ grouping node-g {
+ list owned-node-edge-point {
+ key 'uuid';
+ config false;
+ uses node-edge-point-g;
+ description "none";
+ }
+ list aggregated-node-edge-point {
+ uses node-edge-point-ref-g;
+ key 'topology-uuid node-uuid node-edge-point-uuid';
+ config false;
+ description "none";
+ }
+ list node-rule-group {
+ key 'uuid';
+ uses node-rule-group-g;
+ description "none";
+ }
+ container encap-topology {
+ uses topology-ref-g;
+ config false;
+ description "none";
+ }
+ leaf-list layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ uses tapi-common:resource-spec-g;
+ uses tapi-common:admin-state-pac-g;
+ uses tapi-common:capacity-pac-g;
+ uses transfer-cost-pac-g;
+ uses transfer-integrity-pac-g;
+ uses transfer-timing-pac-g;
+ description "The ForwardingDomain (FD) object class models the ForwardingDomain topological component which is used to effect forwarding of transport characteristic information and offers the potential to enable forwarding.
+ At the lowest level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs). ";
+ }
+ grouping topology-g {
+ list node {
+ key 'uuid';
+ config false;
+ uses node-g;
+ description "none";
+ }
+ list link {
+ key 'uuid';
+ config false;
+ uses link-g;
+ description "none";
+ }
+ leaf-list layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ config false;
+ min-elements 1;
+ description "none";
+ }
+ uses tapi-common:resource-spec-g;
+ description "The ForwardingDomain (FD) object class models the ForwardingDomain topological component which is used to effect forwarding of transport characteristic information and offers the potential to enable forwarding.
+ At the lowest level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs). ";
+ }
+ grouping layer-protocol-transition-pac-g {
+ leaf-list transitioned-layer-protocol-name {
+ type string;
+ min-elements 2;
+ description "Provides the ordered structure of layer protocol transitions encapsulated in the TopologicalEntity. The ordering relates to the LinkPort role.";
+ }
+ description "Relevant for a Link that is formed by abstracting one or more LTPs (in a stack) to focus on the flow and deemphasize the protocol transformation.
+ This abstraction is relevant when considering multi-layer routing.
+ The layer protocols of the LTP and the order of their application to the signal is still relevant and need to be accounted for. This is derived from the LTP spec details.
+ This Pac provides the relevant abstractions of the LTPs and provides the necessary association to the LTPs involved.
+ Links that included details in this Pac are often referred to as Transitional Links.";
+ }
+ grouping node-edge-point-g {
+ leaf layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ config false;
+ description "none";
+ }
+ leaf-list supported-cep-layer-protocol-qualifier {
+ type tapi-common:layer-protocol-qualifier;
+ min-elements 1;
+ description "none";
+ }
+ list aggregated-node-edge-point {
+ uses node-edge-point-ref-g;
+ key 'topology-uuid node-uuid node-edge-point-uuid';
+ config false;
+ description "none";
+ }
+ list mapped-service-interface-point {
+ uses tapi-common:service-interface-point-ref-g;
+ key 'service-interface-point-uuid';
+ config false;
+ description "NodeEdgePoint mapped to more than ServiceInterfacePoint (slicing/virtualizing) or a ServiceInterfacePoint mapped to more than one NodeEdgePoint (load balancing/Resilience) should be considered experimental";
+ }
+ leaf link-port-direction {
+ type tapi-common:port-direction;
+ config false;
+ description "The orientation of defined flow at the LinkEnd.";
+ }
+ leaf link-port-role {
+ type tapi-common:port-role;
+ config false;
+ description "Each LinkEnd of the Link has a role (e.g., symmetric, hub, spoke, leaf, root) in the context of the Link with respect to the Link function. ";
+ }
+ uses tapi-common:resource-spec-g;
+ uses tapi-common:admin-state-pac-g;
+ uses tapi-common:termination-pac-g;
+ uses tapi-common:capacity-pac-g;
+ description "The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers.
+ The structure of LTP supports all transport protocols including circuit and packet forms.";
+ }
+ grouping risk-parameter-pac-g {
+ list risk-characteristic {
+ key 'risk-characteristic-name';
+ config false;
+ min-elements 1;
+ uses risk-characteristic-g;
+ description "A list of risk characteristics for consideration in an analysis of shared risk. Each element of the list represents a specific risk consideration.";
+ }
+ description "The risk characteristics of a TopologicalEntity come directly from the underlying physical realization.
+ The risk characteristics propagate from the physical realization to the client and from the server layer to the client layer, this propagation may be modified by protection.
+ A TopologicalEntity may suffer degradation or failure as a result of a problem in a part of the underlying realization.
+ The realization can be partitioned into segments which have some relevant common failure modes.
+ There is a risk of failure/degradation of each segment of the underlying realization.
+ Each segment is a part of a larger physical/geographical unit that behaves as one with respect to failure (i.e. a failure will have a high probability of impacting the whole unit (e.g. all cables in the same duct).
+ Disruptions to that larger physical/geographical unit will impact (cause failure/errors to) all TopologicalEntities that use any part of that larger physical/geographical entity.
+ Any TopologicalEntity that uses any part of that larger physical/geographical unit will suffer impact and hence each TopologicalEntity shares risk.
+ The identifier of each physical/geographical unit that is involved in the realization of each segment of a Topological entity can be listed in the RiskParameter_Pac of that TopologicalEntity.
+ A segment has one or more risk characteristic.
+ Shared risk between two TopologicalEntities compromises the integrity of any solution that use one of those TopologicalEntity as a backup for the other.
+ Where two TopologicalEntities have a common risk characteristic they have an elevated probability of failing simultaneously compared to two TopologicalEntities that do not share risk characteristics.";
+ }
+ grouping transfer-cost-pac-g {
+ list cost-characteristic {
+ key 'cost-name';
+ config false;
+ min-elements 1;
+ uses cost-characteristic-g;
+ description "The list of costs where each cost relates to some aspect of the TopologicalEntity.";
+ }
+ description "The cost characteristics of a TopologicalEntity not necessarily correlated to the cost of the underlying physical realization.
+ They may be quite specific to the individual TopologicalEntity e.g. opportunity cost. Relates to layer capacity
+ There may be many perspectives from which cost may be considered for a particular TopologicalEntity and hence many specific costs and potentially cost algorithms.
+ Using an entity will incur a cost. ";
+ }
+ grouping transfer-integrity-pac-g {
+ leaf error-characteristic {
+ type string;
+ config false;
+ description "Describes the degree to which the signal propagated can be errored.
+ Applies to TDM systems as the errored signal will be propagated and not packet as errored packets will be discarded.";
+ }
+ leaf loss-characteristic {
+ type string;
+ config false;
+ description "Describes the acceptable characteristic of lost packets where loss may result from discard due to errors or overflow.
+ Applies to packet systems and not TDM (as for TDM errored signals are propagated unless grossly errored and overflow/underflow turns into timing slips).";
+ }
+ leaf repeat-delivery-characteristic {
+ type string;
+ config false;
+ description "Primarily applies to packet systems where a packet may be delivered more than once (in fault recovery for example).
+ It can also apply to TDM where several frames may be received twice due to switching in a system with a large differential propagation delay.";
+ }
+ leaf delivery-order-characteristic {
+ type string;
+ config false;
+ description "Describes the degree to which packets will be delivered out of sequence.
+ Does not apply to TDM as the TDM protocols maintain strict order.";
+ }
+ leaf unavailable-time-characteristic {
+ type string;
+ config false;
+ description "Describes the duration for which there may be no valid signal propagated.";
+ }
+ leaf server-integrity-process-characteristic {
+ type string;
+ config false;
+ description "Describes the effect of any server integrity enhancement process on the characteristics of the TopologicalEntity.";
+ }
+ description "Transfer intergrity characteristic covers expected/specified/acceptable characteristic of degradation of the transfered signal.
+ It includes all aspects of possible degradation of signal content as well as any damage of any form to the total TopologicalEntity and to the carried signals.
+ Note that the statement is of total impact to the TopologicalEntity so any partial usage of the TopologicalEntity (e.g. a signal that does not use full capacity) will only suffer its portion of the impact.";
+ }
+ grouping transfer-timing-pac-g {
+ list latency-characteristic {
+ key 'traffic-property-name';
+ config false;
+ min-elements 1;
+ uses latency-characteristic-g;
+ description "The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic.";
+ }
+ description "A TopologicalEntity will suffer effects from the underlying physical realization related to the timing of the information passed by the TopologicalEntity.";
+ }
+ grouping validation-pac-g {
+ list validation-mechanism {
+ key 'validation-mechanism';
+ config false;
+ min-elements 1;
+ uses validation-mechanism-g;
+ description "Provides details of the specific validation mechanism(s) used to confirm the presence of an intended topologicalEntity.";
+ }
+ description "Validation covers the various adjacenct discovery and reachability verification protocols. Also may cover Information source and degree of integrity.";
+ }
+ grouping network-topology-service-g {
+ list topology {
+ uses topology-ref-g;
+ key 'topology-uuid';
+ config false;
+ description "none";
+ }
+ uses tapi-common:service-spec-g;
+ description "none";
+ }
+ grouping topology-context-g {
+ container nw-topology-service {
+ config false;
+ uses network-topology-service-g;
+ description "none";
+ }
+ list topology {
+ key 'uuid';
+ config false;
+ uses topology-g;
+ description "none";
+ }
+ description "none";
+ }
+ grouping inter-rule-group-g {
+ list rule {
+ key 'local-id';
+ min-elements 1;
+ uses rule-g;
+ description "none";
+ }
+ list associated-node-rule-group {
+ uses node-rule-group-ref-g;
+ key 'topology-uuid node-uuid node-rule-group-uuid';
+ min-elements 2;
+ description "none";
+ }
+ uses tapi-common:resource-spec-g;
+ uses tapi-common:capacity-pac-g;
+ uses transfer-cost-pac-g;
+ uses transfer-timing-pac-g;
+ uses risk-parameter-pac-g;
+ description "none";
+ }
+ grouping node-rule-group-g {
+ list rule {
+ key 'local-id';
+ min-elements 1;
+ uses rule-g;
+ description "none";
+ }
+ list node-edge-point {
+ uses node-edge-point-ref-g;
+ key 'topology-uuid node-uuid node-edge-point-uuid';
+ min-elements 1;
+ description "none";
+ }
+ list composed-rule-group {
+ uses node-rule-group-ref-g;
+ key 'topology-uuid node-uuid node-rule-group-uuid';
+ description "none";
+ }
+ list inter-rule-group {
+ key 'uuid';
+ uses inter-rule-group-g;
+ description "none";
+ }
+ uses tapi-common:resource-spec-g;
+ uses tapi-common:capacity-pac-g;
+ uses transfer-cost-pac-g;
+ uses transfer-timing-pac-g;
+ uses risk-parameter-pac-g;
+ description "none";
+ }
+ grouping rule-g {
+ leaf rule-type {
+ type rule-type;
+ description "none";
+ }
+ leaf forwarding-rule {
+ type forwarding-rule;
+ description "none";
+ }
+ leaf override-priority {
+ type uint64;
+ description "none";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+
+ /***********************
+ * package type-definitions
+ **********************/
+ grouping cost-characteristic-g {
+ leaf cost-name {
+ type string;
+ description "The cost characteristic will related to some aspect of the TopologicalEntity (e.g. $ cost, routing weight). This aspect will be conveyed by the costName.";
+ }
+ leaf cost-value {
+ type string;
+ description "The specific cost.";
+ }
+ leaf cost-algorithm {
+ type string;
+ description "The cost may vary based upon some properties of the TopologicalEntity. The rules for the variation are conveyed by the costAlgorithm.";
+ }
+ description "The information for a particular cost characteristic.";
+ }
+ grouping latency-characteristic-g {
+ leaf traffic-property-name {
+ type string;
+ description "The identifier of the specific traffic property to which the queuing latency applies.";
+ }
+ leaf fixed-latency-characteristic {
+ type string;
+ config false;
+ description "A TopologicalEntity suffers delay caused by the realization of the servers (e.g. distance related; FEC encoding etc.) along with some client specific processing. This is the total average latency effect of the TopologicalEntity";
+ }
+ leaf queing-latency-characteristic {
+ type string;
+ description "The specific queuing latency for the traffic property.";
+ }
+ leaf jitter-characteristic {
+ type string;
+ config false;
+ description "High frequency deviation from true periodicity of a signal and therefore a small high rate of change of transfer latency.
+ Applies to TDM systems (and not packet).";
+ }
+ leaf wander-characteristic {
+ type string;
+ config false;
+ description "Low frequency deviation from true periodicity of a signal and therefore a small low rate of change of transfer latency.
+ Applies to TDM systems (and not packet).";
+ }
+ description "Provides information on latency characteristic for a particular stated trafficProperty.";
+ }
+ grouping risk-characteristic-g {
+ leaf risk-characteristic-name {
+ type string;
+ description "The name of the risk characteristic. The characteristic may be related to a specific degree of closeness.
+ For example a particular characteristic may apply to failures that are localized (e.g. to one side of a road) where as another characteristic may relate to failures that have a broader impact (e.g. both sides of a road that crosses a bridge).
+ Depending upon the importance of the traffic being routed different risk characteristics will be evaluated.";
+ }
+ leaf-list risk-identifier-list {
+ type string;
+ min-elements 1;
+ description "A list of the identifiers of each physical/geographic unit (with the specific risk characteristic) that is related to a segment of the TopologicalEntity.";
+ }
+ description "The information for a particular risk characteristic where there is a list of risk identifiers related to that characteristic.";
+ }
+ grouping validation-mechanism-g {
+ leaf validation-mechanism {
+ type string;
+ description "Name of mechanism used to validate adjacency";
+ }
+ leaf layer-protocol-adjacency-validated {
+ type string;
+ description "State of validatiion";
+ }
+ leaf validation-robustness {
+ type string;
+ description "Quality of validation (i.e. how likely is the stated validation to be invalid)";
+ }
+ description "Identifies the validation mechanism and describes the characteristics of that mechanism";
+ }
+ typedef forwarding-rule {
+ type enumeration {
+ enum MAY_FORWARD_ACROSS_GROUP {
+ description "none";
+ }
+ enum MUST_FORWARD_ACROSS_GROUP {
+ description "none";
+ }
+ enum CANNOT_FORWARD_ACROSS_GROUP {
+ description "none";
+ }
+ enum NO_STATEMENT_ON_FORWARDING {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef rule-type {
+ type enumeration {
+ enum FORWARDING {
+ description "none";
+ }
+ enum CAPACITY {
+ description "none";
+ }
+ enum COST {
+ description "none";
+ }
+ enum TIMING {
+ description "none";
+ }
+ enum RISK {
+ description "none";
+ }
+ enum GROUPING {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ grouping resilience-type-g {
+ leaf restoration-policy {
+ type restoration-policy;
+ description "none";
+ }
+ leaf protection-type {
+ type protection-type;
+ description "none";
+ }
+ description "none";
+ }
+ typedef restoration-policy {
+ type enumeration {
+ enum PER_DOMAIN_RESTORATION {
+ description "none";
+ }
+ enum END_TO_END_RESTORATION {
+ description "none";
+ }
+ enum NA {
+ description "none";
+ }
+ }
+ description "none";
+ }
+ typedef protection-type {
+ type enumeration {
+ enum NO_PROTECTON {
+ description "none";
+ }
+ enum ONE_PLUS_ONE_PROTECTION {
+ description "none";
+ }
+ enum ONE_PLUS_ONE_PROTECTION_WITH_DYNAMIC_RESTORATION {
+ description "none";
+ }
+ enum PERMANENT_ONE_PLUS_ONE_PROTECTION {
+ description "none";
+ }
+ enum ONE_FOR_ONE_PROTECTION {
+ description "none";
+ }
+ enum DYNAMIC_RESTORATION {
+ description "none";
+ }
+ enum PRE_COMPUTED_RESTORATION {
+ description "none";
+ }
+ }
+ description "none";
+ }
+
+ /***********************
+ * package interfaces
+ **********************/
+ rpc get-topology-details {
+ description "none";
+ input {
+ leaf topology-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container topology {
+ uses topology-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-node-details {
+ description "none";
+ input {
+ leaf topology-id-or-name {
+ type string;
+ description "none";
+ }
+ leaf node-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container node {
+ uses node-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-node-edge-point-details {
+ description "none";
+ input {
+ leaf topology-id-or-name {
+ type string;
+ description "none";
+ }
+ leaf node-id-or-name {
+ type string;
+ description "none";
+ }
+ leaf ep-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container node-edge-point {
+ uses node-edge-point-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-link-details {
+ description "none";
+ input {
+ leaf topology-id-or-name {
+ type string;
+ description "none";
+ }
+ leaf link-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container link {
+ uses link-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-topology-list {
+ description "none";
+ output {
+ list topology {
+ uses topology-g;
+ description "none";
+ }
+ }
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-virtual-network@2018-08-31.yang b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-virtual-network@2018-08-31.yang new file mode 100644 index 000000000..50d8828db --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/preload.cache.schema/tapi-virtual-network@2018-08-31.yang @@ -0,0 +1,252 @@ +module tapi-virtual-network {
+ namespace "urn:onf:otcc:yang:tapi-virtual-network";
+ prefix tapi-virtual-network;
+ import tapi-topology {
+ prefix tapi-topology;
+ }
+ import tapi-common {
+ prefix tapi-common;
+ }
+ organization "ONF OTCC (Open Transport Configuration & Control) Project";
+ contact " + Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI> + Project List: <mailto:transport-api@opennetworking.org> + Editor: Karthik Sethuraman + <mailto:karthik.sethuraman@necam.com>";
+ description "
+ This module contains TAPI Virtual Network Model definitions.
+ Source: TapiVirtualNetwork.uml
+ Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
+ License: This module is distributed under the Apache License 2.0";
+ revision 2018-08-31 {
+ description "ONF Transport API version 2.1.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
+ }
+ revision 2018-03-07 {
+ description "ONF Transport API version 2.0.2 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
+ }
+ revision 2018-02-16 {
+ description "ONF Transport API version 2.0.1 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
+ }
+ revision 2018-01-02 {
+ description "ONF Transport API version 2.0.0 + This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool. + Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
+ reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model + <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
+ }
+ augment "/tapi-common:context" {
+ uses virtual-network-context-g;
+ description "Augments the base TAPI Context with VirtualNetworkService information";
+ }
+ /*************************
+ * definitions of refrences
+ *************************/
+ grouping virtual-nw-service-ref-g {
+ leaf virtual-nw-service-uuid {
+ type leafref {
+ path '/tapi-common:context/tapi-virtual-network:virtual-nw-service/tapi-virtual-network:uuid';
+ }
+ description "none";
+ }
+ description "none";
+ }
+
+ /***********************
+ * package object-classes
+ **********************/
+ grouping virtual-network-constraint-g {
+ container src-service-end-point {
+ uses tapi-common:service-interface-point-ref-g;
+ config false;
+ description "none";
+ }
+ container sink-service-end-point {
+ uses tapi-common:service-interface-point-ref-g;
+ config false;
+ description "none";
+ }
+ list diversity-exclusion {
+ uses virtual-nw-service-ref-g;
+ key 'virtual-nw-service-uuid';
+ config false;
+ description "none";
+ }
+ container requested-capacity {
+ uses tapi-common:capacity-g;
+ description "none";
+ }
+ leaf service-level {
+ type string;
+ description "An abstract value the meaning of which is mutually agreed – typically represents metrics such as - Class of service, priority, resiliency, availability";
+ }
+ leaf-list service-layer {
+ type tapi-common:layer-protocol-name;
+ description "none";
+ }
+ list cost-characteristic {
+ key 'cost-name';
+ uses tapi-topology:cost-characteristic-g;
+ description "The list of costs where each cost relates to some aspect of the TopologicalEntity.";
+ }
+ list latency-characteristic {
+ key 'traffic-property-name';
+ uses tapi-topology:latency-characteristic-g;
+ description "The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic.";
+ }
+ uses tapi-common:local-class-g;
+ description "none";
+ }
+ grouping virtual-network-service-g {
+ container topology {
+ uses tapi-topology:topology-ref-g;
+ config false;
+ description "none";
+ }
+ list end-point {
+ key 'local-id';
+ min-elements 2;
+ uses virtual-network-service-end-point-g;
+ description "none";
+ }
+ list vnw-constraint {
+ key 'local-id';
+ min-elements 1;
+ uses virtual-network-constraint-g;
+ description "none";
+ }
+ leaf schedule {
+ type string;
+ description "none";
+ }
+ container state {
+ uses tapi-common:admin-state-pac-g;
+ description "none";
+ }
+ leaf-list layer-protocol-name {
+ type tapi-common:layer-protocol-name;
+ min-elements 1;
+ description "none";
+ }
+ uses tapi-common:service-spec-g;
+ description "The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms.
+ At the lowest level of recursion, a FC represents a cross-connection within an NE.";
+ }
+ grouping virtual-network-service-end-point-g {
+ container service-interface-point {
+ uses tapi-common:service-interface-point-ref-g;
+ config false;
+ description "none";
+ }
+ leaf role {
+ type tapi-common:port-role;
+ config false;
+ description "Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root) in the context of the FC with respect to the FC function. ";
+ }
+ leaf direction {
+ type tapi-common:port-direction;
+ config false;
+ description "The orientation of defined flow at the EndPoint.";
+ }
+ leaf service-layer {
+ type tapi-common:layer-protocol-name;
+ config false;
+ description "none";
+ }
+ uses tapi-common:local-class-g;
+ description "The association of the FC to LTPs is made via EndPoints.
+ The EndPoint (EP) object class models the access to the FC function.
+ The traffic forwarding between the associated EPs of the FC depends upon the type of FC and may be associated with FcSwitch object instances.
+ In cases where there is resilience the EndPoint may convey the resilience role of the access to the FC.
+ It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point.
+ The EP replaces the Protection Unit of a traditional protection model.
+ The ForwadingConstruct can be considered as a component and the EndPoint as a Port on that component";
+ }
+ grouping virtual-network-context-g {
+ list virtual-nw-service {
+ key 'uuid';
+ uses virtual-network-service-g;
+ description "none";
+ }
+ description "none";
+ }
+
+ /***********************
+ * package interfaces
+ **********************/
+ rpc create-virtual-network-service {
+ description "none";
+ input {
+ list sep {
+ min-elements 2;
+ uses virtual-network-service-end-point-g;
+ description "none";
+ }
+ container vnw-constraint {
+ uses virtual-network-constraint-g;
+ description "none";
+ }
+ leaf conn-schedule {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container service {
+ uses virtual-network-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc delete-virtual-network-service {
+ description "none";
+ input {
+ leaf service-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container service {
+ uses virtual-network-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-virtual-network-service-details {
+ description "none";
+ input {
+ leaf service-id-or-name {
+ type string;
+ description "none";
+ }
+ }
+ output {
+ container service {
+ uses virtual-network-service-g;
+ description "none";
+ }
+ }
+ }
+ rpc get-virtual-network-service-list {
+ description "none";
+ output {
+ list service {
+ uses virtual-network-service-g;
+ description "none";
+ }
+ }
+ }
+
+}
diff --git a/sdnr/wt/devicemanager/provider/src/main/resources/version.properties b/sdnr/wt/devicemanager/provider/src/main/resources/version.properties new file mode 100644 index 000000000..80373399e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/resources/version.properties @@ -0,0 +1,3 @@ +# Proberties filled in by maven during build process +version = ${project.version} +build = ${buildtime} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/AaiTest.java b/sdnr/wt/devicemanager/provider/src/main/test/AaiTest.java new file mode 100644 index 000000000..397239eb6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/AaiTest.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import java.util.ArrayList; +import java.util.List; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.aaiConnector.impl.AaiProviderClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.InventoryInformation; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.HtDevicemanagerConfiguration; + +public class AaiTest { + + public static void main(String[] args) + { + HtDevicemanagerConfiguration cfg=HtDevicemanagerConfiguration.getTestConfiguration(); + + AaiProviderClient provider = new AaiProviderClient(cfg, null); + + String mountPointName = "testDevice 01"; + String type="Unit"; + String model="Horizon Compact+"; + String vendor="DragonWave-X"; + String ipv4="127.0.0.1"; + String ipv6="::1"; + List<String> ifInfos = new ArrayList<>(); + ifInfos.add("LP-MWPS-RADIO"); + InventoryInformation ii=new InventoryInformation(type, model, vendor, ipv4, ipv6, ifInfos); + System.out.println("registering device"); + provider.onDeviceRegistered(mountPointName,ii); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + System.out.println("unregistering device"); + provider.onDeviceUnregistered(mountPointName); + System.out.println("finished"); + try { + provider.close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/AkkaConfigTest.java b/sdnr/wt/devicemanager/provider/src/main/test/AkkaConfigTest.java new file mode 100644 index 000000000..40a19101f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/AkkaConfigTest.java @@ -0,0 +1,194 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.AkkaConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.AkkaConfig.ClusterNodeInfo; + +public class AkkaConfigTest { + + private static String getAkkaConfigSingleNodeText() + { +return "\n" + + "odl-cluster-data {\n" + + " akka {\n" + + " remote {\n" + + " artery {\n" + + " enabled = off\n" + + " canonical.hostname = \"127.0.0.1\"\n" + + " canonical.port = 2550\n" + + " }\n" + + " netty.tcp {\n" + + " hostname = \"127.0.0.1\"\n" + + " port = 2550\n" + + " }\n" + + " # when under load we might trip a false positive on the failure detector\n" + + " # transport-failure-detector {\n" + + " # heartbeat-interval = 4 s\n" + + " # acceptable-heartbeat-pause = 16s\n" + + " # }\n" + + " }\n" + + "\n" + + " cluster {\n" + + " # Remove \".tcp\" when using artery.\n" + + " seed-nodes = [\"akka.tcp://opendaylight-cluster-data@127.0.0.1:2550\"]\n" + + "\n" + + " roles = [\n" + + " \"member-1\"\n" + + " ]\n" + + "\n" + + " }\n" + + "\n" + + " persistence {\n" + + " # By default the snapshots/journal directories live in KARAF_HOME. You can choose to put it somewhere else by\n" + + " # modifying the following two properties. The directory location specified may be a relative or absolute path. \n" + + " # The relative path is always relative to KARAF_HOME.\n" + + "\n" + + " # snapshot-store.local.dir = \"target/snapshots\"\n" + + " # journal.leveldb.dir = \"target/journal\"\n" + + "\n" + + " journal {\n" + + " leveldb {\n" + + " # Set native = off to use a Java-only implementation of leveldb.\n" + + " # Note that the Java-only version is not currently considered by Akka to be production quality.\n" + + "\n" + + " # native = off\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + } + private static String getAkkaConfigClusterNodeText() + { + return "\n" + + "odl-cluster-data {\n" + + "\n" + + " akka {\n" + + " loglevel = \"\"\n" + + " remote {\n" + + " netty.tcp {\n" + + " hostname = \"zltcmtn23arbc01.2f0377.mtn23a.tci.att.com\"\n" + + " port = 2550\n" + + " }\n" + + " }\n" + + " actor {\n" + + " debug{\n" + + " autoreceive = on\n" + + " lifecycle = on\n" + + " unhandled = on\n" + + " fsm = on\n" + + " event-stream = on\n" + + " }\n" + + " }\n" + + " cluster {\n" + + " seed-nodes = [\"akka.tcp://opendaylight-cluster-data@zltcmtn23arbc01.2f0377.mtn23a.tci.att.com:2550\", \"akka.tcp://opendaylight-cluster-data@zltcmtn23arbc02.2f0377.mtn23a.tci.att.com:2550\", \"akka.tcp://opendaylight-cluster-data@zltcmtn23arbc03.2f0377.mtn23a.tci.att.com:2550\", \"akka.tcp://opendaylight-cluster-data@zltcmtn23brbc01.f84e7a.mtn23b.tci.att.com:2550\", \"akka.tcp://opendaylight-cluster-data@zltcmtn23brbc02.f84e7a.mtn23b.tci.att.com:2550\", \"akka.tcp://opendaylight-cluster-data@zltcmtn23brbc03.f84e7a.mtn23b.tci.att.com:2550\"]\n" + + " seed-node-timeout = 15s\n" + + " roles = [\"member-1\"]\n" + + "\n" + + " }\n" + + " persistence {\n" + + " journal-plugin-fallback {\n" + + " circuit-breaker {\n" + + " max-failures = 10\n" + + " call-timeout = 60s\n" + + " reset-timeout = 30s\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n" + + "\n" + + "odl-cluster-rpc {\n" + + "\n" + + " akka {\n" + + " loglevel = \"\"\n" + + " remote {\n" + + " netty.tcp {\n" + + " hostname = \"zltcmtn23arbc01.2f0377.mtn23a.tci.att.com\"\n" + + " port = 2551\n" + + " }\n" + + " }\n" + + " actor {\n" + + " debug{\n" + + " autoreceive = on\n" + + " lifecycle = on\n" + + " unhandled = on\n" + + " fsm = on\n" + + " event-stream = on\n" + + " }\n" + + " }\n" + + " cluster {\n" + + " seed-nodes = [\"akka.tcp://odl-cluster-rpc@zltcmtn23arbc01.2f0377.mtn23a.tci.att.com:2551\", \"akka.tcp://odl-cluster-rpc@zltcmtn23arbc02.2f0377.mtn23a.tci.att.com:2551\", \"akka.tcp://odl-cluster-rpc@zltcmtn23arbc03.2f0377.mtn23a.tci.att.com:2551\", \"akka.tcp://odl-cluster-rpc@zltcmtn23brbc01.f84e7a.mtn23b.tci.att.com:2551\", \"akka.tcp://odl-cluster-rpc@zltcmtn23brbc02.f84e7a.mtn23b.tci.att.com:2551\", \"akka.tcp://odl-cluster-rpc@zltcmtn23brbc03.f84e7a.mtn23b.tci.att.com:2551\"]\n" + + " seed-node-timeout = 15s\n" + + " }\n" + + " persistence {\n" + + " journal-plugin-fallback {\n" + + " circuit-breaker {\n" + + " max-failures = 10\n" + + " call-timeout = 60s\n" + + " reset-timeout = 30s\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}\n" + + "\n" + + ""; + } + public static void main(String[] args) + { + AkkaConfig cfg; + try { + System.out.println("testing clusternode config1"); + System.out.println("==========================="); + cfg = AkkaConfig.parse(getAkkaConfigClusterNodeText()); + System.out.println("succeeded: "); + System.out.println(cfg.toString()); + System.out.println(String.format("found %d cluster nodes",cfg.getClusterConfig().getSeedNodes().size())); + for(ClusterNodeInfo n : cfg.getClusterConfig().getSeedNodes()) + { + System.out.println(n.toString()); + } + } catch (Exception e) { + System.out.println("failed: "+e.getMessage()); + } + try { + System.out.println("testing singlenode config1"); + System.out.println("==========================="); + cfg = AkkaConfig.parse(getAkkaConfigSingleNodeText()); + System.out.println("succeeded: "); + System.out.println(cfg.toString()); + } catch (Exception e) { + System.out.println("failed: "+e.getMessage()); + } + try { + System.out.println("testing clusternode config1"); + System.out.println("==========================="); + cfg = AkkaConfig.load("/home/herbert/Nextcloud/captured-karaf-logs/akka.conf"); + System.out.println("succeeded: "); + System.out.println(cfg.toString()); + System.out.println(String.format("found %d cluster nodes",cfg.getClusterConfig().getSeedNodes().size())); + for(ClusterNodeInfo n : cfg.getClusterConfig().getSeedNodes()) + { + System.out.println(n.toString()); + } + } catch (Exception e) { + System.out.println("failed: "+e.getMessage()); + } + + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/ClusterConfigTest.java b/sdnr/wt/devicemanager/provider/src/main/test/ClusterConfigTest.java new file mode 100644 index 000000000..1f2f183fd --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/ClusterConfigTest.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.AkkaConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.GeoConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.HtDevicemanagerConfiguration; + +public class ClusterConfigTest { + + public static void main(String[] args) + { + final String geoconf="/home/herbert/Nextcloud/captured-karaf-logs/geo.conf"; + final String akkconf="/home/herbert/Nextcloud/captured-karaf-logs/akka.conf"; + final String devmgrprop=""; + + + try { + GeoConfig geo = geoconf==null?null:GeoConfig.load(geoconf); + AkkaConfig akkaConfig = AkkaConfig.load(akkconf); + //HtDevicemanagerConfiguration config = HtDevicemanagerConfiguration.getTestConfiguration(devmgrprop); + String hostName = "0.0.0.0"; + hostName=akkaConfig.getClusterConfig().getHostName(hostName); + String clusterDBName=akkaConfig.getClusterConfig().getDBClusterName(null); + String nodeName=String.format("node%d.%s",akkaConfig.getClusterConfig().getRoleMemberIndex(),clusterDBName); + + System.out.println("hostname="+hostName); + System.out.println("clusterdbName="+clusterDBName); + System.out.println("nodename="+nodeName); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/ConfigTest.java b/sdnr/wt/devicemanager/provider/src/main/test/ConfigTest.java new file mode 100644 index 000000000..48cf2db72 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/ConfigTest.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.AaiConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.DcaeConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.EsConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.HtDevicemanagerConfiguration; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.PmConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.ToggleAlarmConfig; + +public class ConfigTest { + + public static void main(String[] args) + { + HtDevicemanagerConfiguration config; + DcaeConfig c; + EsConfig c3; + AaiConfig c4; + PmConfig c5; + ToggleAlarmConfig c6; + /*config= = HtDevicemanagerConfiguration.getTestConfiguration(); + c=config.getDcae(); + c2=AotsMConfig.getAots(config); + c3=config.getEs(); + c4= config.getAai(); + c5 = config.getPm(); + System.out.println(c.toString()); + System.out.println(c2.toString()); + System.out.println(c3.toString()); + System.out.println(c4.toString()); + System.out.println(c5.toString()); + IConfigChangedListener listener = new IConfigChangedListener() { + + @Override + public void onConfigChanged() { + System.out.println("sth changed"); + AaiConfig c=AaiConfig.reload(); + System.out.println(c.toString()); + } + }; + System.out.println("start listening for changes"); + + config.registerConfigChangedListener(listener ); + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + config.unregisterConfigChangedListener(listener); + System.out.println("finished"); + */ + HtDevicemanagerConfiguration.clear(); + config = HtDevicemanagerConfiguration.getTestConfiguration("/home/herbert/tmp/devicemanager.properties"); + c=config.getDcae(); + c3=config.getEs(); + c4 = config.getAai(); + c5 = config.getPm(); + c6 = config.getToggleAlarm(); + System.out.println(c.toString()); + System.out.println(c3.toString()); + System.out.println(c4.toString()); + System.out.println(c5.toString()); + System.out.println(c6.toString()); + + + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/ESWebAPITest.java b/sdnr/wt/devicemanager/provider/src/main/test/ESWebAPITest.java new file mode 100644 index 000000000..9f9962a55 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/ESWebAPITest.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import java.io.IOException; + +import org.json.JSONException; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseWebAPIClient; + +public class ESWebAPITest { + + public static void main(String[] args) + { + HtDatabaseWebAPIClient client=new HtDatabaseWebAPIClient(); + try { + String response=client.sendRequest("/mwtn/mediator-server/_search", "GET", new JSONObject("{\"match\":{\"id\":id}}")); + System.out.println(response); + } catch (JSONException | IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/GeoConfigTest.java b/sdnr/wt/devicemanager/provider/src/main/test/GeoConfigTest.java new file mode 100644 index 000000000..36e60e177 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/GeoConfigTest.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.GeoConfig; + +public class GeoConfigTest { + + + private static String getClusterGeoConfigContent() + { +return "\n" + + "lumina-geo-cluster {\n" + + " primary_roles = [\n" + + " \"member-1\",\"member-2\",\"member-3\"\n" + + " ]\n" + + " secondary_roles = [\n" + + " \"member-4\",\"member-5\",\"member-6\"\n" + + " ]\n" + + " ip_roles_table = [\n" + + "\n" + + " {\n" + + "role=\"member-1\"\n" + + "ip=\"zltcmtn23arbc01.2f0377.mtn23a.tci.att.com\"\n" + + "},\n" + + "{\n" + + "role=\"member-2\"\n" + + "ip=\"zltcmtn23arbc02.2f0377.mtn23a.tci.att.com\"\n" + + "},\n" + + "{\n" + + "role=\"member-3\"\n" + + "ip=\"zltcmtn23arbc03.2f0377.mtn23a.tci.att.com\"\n" + + "},\n" + + "{\n" + + "role=\"member-4\"\n" + + "ip=\"zltcmtn23brbc01.f84e7a.mtn23b.tci.att.com\"\n" + + "},\n" + + "{\n" + + "role=\"member-5\"\n" + + "ip=\"zltcmtn23brbc02.f84e7a.mtn23b.tci.att.com\"\n" + + "},\n" + + "{\n" + + "role=\"member-6\"\n" + + "ip=\"zltcmtn23brbc03.f84e7a.mtn23b.tci.att.com\"\n" + + "}\n" + + " \n" + + " ]\n" + + "}\n" + + "\n" + + "\n" + + "\n" + + "\n" + + ""; + } + public static void main(String[] args) + { + GeoConfig config; + try { + System.out.println("testing clusternode geo config1"); + System.out.println("==========================="); + config = GeoConfig.parse(getClusterGeoConfigContent()); + System.out.println("succeeded: "); + System.out.println(config.toString()); + System.out.println("primary roles:"); + System.out.println(config.getPrimaryRoles().toString()); + System.out.println("secondary roles:"); + System.out.println(config.getSecondaryRoles().toString()); + + } catch (Exception e) { + System.out.println("failed: "+e.getMessage()); + } + try { + System.out.println("testing clusternode geo config1"); + System.out.println("==========================="); + config = GeoConfig.load("/home/herbert/Nextcloud/captured-karaf-logs/geo.conf"); + System.out.println("succeeded: "); + System.out.println(config.toString()); + System.out.println("primary roles:"); + System.out.println(config.getPrimaryRoles().toString()); + System.out.println("secondary roles:"); + System.out.println(config.getSecondaryRoles().toString()); + + } catch (Exception e) { + System.out.println("failed: "+e.getMessage()); + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/ResTest.java b/sdnr/wt/devicemanager/provider/src/main/test/ResTest.java new file mode 100644 index 000000000..17e8d3076 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/ResTest.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import java.io.IOException; +import java.util.List; + +import org.json.JSONException; +import org.json.JSONObject; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.internalTypes.Resources; + +public class ResTest { + + private static void testDuplicateKeyJSON() + { + try + { + String str=Resources.getFileContent("/elasticsearch/index/mwtn/modelDescription/CoreModel-ForMicrowave.json"); + + JSONObject o=new JSONObject(str) { + + @Override + public JSONObject putOnce(String key, Object value) throws JSONException { + + + Object storedValue; + if (key != null && value != null) { + if ((storedValue = this.opt(key)) != null ) { + if(!storedValue.equals(value)) { //Only through Exception for different values with same key + //Replace + System.out.println("duplicate found"); + this.remove(key); + this.put(key, value); + + } else { + return this; + } + } else { + this.put(key, value); + } + } + return this; + } + }; + System.out.println(o.toString()); + } + catch(IOException err) + { + err.printStackTrace(); + } + } + public static void main(String[] args) + { + JSONObject o=Resources.getJSONFile("/elasticsearch/index/sdnevents/sdneventsMapping.json"); + System.out.println(o==null?"null":o.toString()); + + List<JSONObject> list=Resources.getJSONFiles("/elasticsearch/index", true); + System.out.println("found "+list.size()+" valid json files"); + + testDuplicateKeyJSON(); + + } +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/TestFileChangeNotification.java b/sdnr/wt/devicemanager/provider/src/main/test/TestFileChangeNotification.java new file mode 100644 index 000000000..812ce4770 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/TestFileChangeNotification.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import java.io.File; +import java.io.IOException; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class TestFileChangeNotification { + /** + * Check every now and then that a certain file has not changed. If it has, then + * call the {@link #doOnChange} method. + * + * @author JunHo Yoon + * @since 3.1.1 + */ + public static abstract class FileWatchdog extends Thread { + + private static final Logger LOGGER = LoggerFactory.getLogger(FileWatchdog.class); + /** + * The default delay between every file modification check, set to 60 + * seconds. + */ + public static final long DEFAULT_DELAY = 60000; + /** + * The name of the file to observe for changes. + */ + private String filename; + + /** + * The delay to observe between every check. By default set + * {@link #DEFAULT_DELAY}. + */ + private long delay = DEFAULT_DELAY; + + private File file; + private long lastModified = 0; + private boolean warnedAlready = false; + private boolean interrupted = false; + + protected FileWatchdog(String filename) { + this.filename = filename; + file = new File(filename); + setDaemon(true); + checkAndConfigure(); + } + + /** + * Set the delay to observe between each check of the file changes. + * + * @param delay + * the frequency of file watch. + */ + public void setDelay(long delay) { + this.delay = delay; + } + + /** + * abstract method to be run when the file is changed. + */ + protected abstract void doOnChange(); + + protected void checkAndConfigure() { + boolean fileExists; + try { + fileExists = file.exists(); + } catch (SecurityException e) { + LOGGER.warn("Was not allowed to read check file existence, file:[" + filename + "]."); + interrupted = true; // there is no point in continuing + return; + } + + if (fileExists) { + long l = file.lastModified(); // this can also throw a + if (lastModified ==0) { + lastModified = l; // is very unlikely. + } + if (l > lastModified) { // however, if we reached this point this + lastModified = l; // is very unlikely. + doOnChange(); + warnedAlready = false; + } + } else { + if (!warnedAlready) { + LOGGER.debug("[" + filename + "] does not exist."); + warnedAlready = true; + } + } + } + + @Override + public void run() { + while (!interrupted && !isInterrupted()) { + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + } + checkAndConfigure(); + } + } + } + + public static class SomeWatchFile extends FileWatchdog{ + + protected SomeWatchFile(String filename) { + super(filename); + this.setDelay(1000); + } + + @Override + protected void doOnChange() { + System.out.println("File has changed"); + } + } + + public static void main(String args[]) throws IOException { + SomeWatchFile someWatchFile = new SomeWatchFile ("watchedFile.txt"); + someWatchFile.start(); + + String fileName = "watchedFile.txt"; + File tempFile = new File(fileName); + tempFile.createNewFile(); + + System.out.println("1. Press F5 in eclipse to see and modify 2. Press enter to exit"); + System.in.read(); + System.out.println("Remove file "+fileName); + tempFile.delete(); + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/UntilTest.java b/sdnr/wt/devicemanager/provider/src/main/test/UntilTest.java new file mode 100644 index 000000000..fdf62c2d6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/UntilTest.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +public class UntilTest { + + public static void main(String[] args) { + + System.out.println("Test"); + int retry=0, maxRetries=3; + boolean noErrorIndication=false; + + do { + + if (retry > 0) + System.out.println("Sleep"); + noErrorIndication = retry == 0; + System.out.println(retry+ " " + noErrorIndication); + + } while (noErrorIndication == false && retry++ < maxRetries); + + System.out.println("Done "+noErrorIndication+" "+retry); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/ZonedDateTimeTimesTest.java b/sdnr/wt/devicemanager/provider/src/main/test/ZonedDateTimeTimesTest.java new file mode 100644 index 000000000..860a46ba6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/ZonedDateTimeTimesTest.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ +import java.time.ZonedDateTime; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.maintenance.database.types.EsMaintenanceFilter; + +public class ZonedDateTimeTimesTest { + + public static void main(String[] args) { + + + EsMaintenanceFilter fi = new EsMaintenanceFilter(); + + System.out.println("Default 1: "+fi); + + + fi.setEndAsString("2018-01-01T10:00:00+05:00"); + + System.out.println("Default 2: "+fi); + + System.out.println("As String: "+fi.getEndAsString()); + + + ZonedDateTime start = ZonedDateTime.parse("2018-01-01T10:00:00+05:00"); + ZonedDateTime end = ZonedDateTime.parse("2019-01-01T10:00:00+05:00"); + ZonedDateTime now; + + now = ZonedDateTime.parse("2017-05-01T10:00:00+05:00"); + System.out.println("Vor: "+EsMaintenanceFilter.isInPeriod(start, end, now)); + + now = ZonedDateTime.parse("2018-05-01T10:00:00+05:00"); + System.out.println("in: "+EsMaintenanceFilter.isInPeriod(start, end, now)); + + now = ZonedDateTime.parse("2019-05-01T10:00:00+05:00"); + System.out.println("nach: "+EsMaintenanceFilter.isInPeriod(start, end, now)); + + } + + +} diff --git a/sdnr/wt/devicemanager/provider/src/main/test/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/DBPluginExtractTest.java b/sdnr/wt/devicemanager/provider/src/main/test/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/DBPluginExtractTest.java new file mode 100644 index 000000000..4da7251d2 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/main/test/org/onap/ccsdk/features/sdnr/wt/devicemanager/base/database/DBPluginExtractTest.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.base.database; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtDatabaseNode; + +public class DBPluginExtractTest { + + public static void main(String[] args) + { + HtDatabaseNode.checkorcreateplugins("/home/herbert/test"); + } +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/ExampleHttpClient.java b/sdnr/wt/devicemanager/provider/src/test/java/ExampleHttpClient.java new file mode 100644 index 000000000..c5426e3b6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/ExampleHttpClient.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ + + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.http.BaseHTTPClient; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.http.BaseHTTPResponse; + +/* + * base... baseURL, e.g. http://10.10.55.11:8432/api/paut/ + * + * usage: this.sendRequest() + * uri... all after the baseURL => request-url=base+uri + * headers: https://developer.mozilla.org/de/docs/Web/HTTP/Headers + * + */ +public class ExampleHttpClient extends BaseHTTPClient{ + + private final String username; + private final String password; + + /* + * for normal http request without ssl client certificate authorization + */ + public ExampleHttpClient(String base, boolean trustAllCerts,String user,String passwd) + { + super(base,trustAllCerts); + this.username=user; + this.password=passwd; + int timeout=60000;//http timeout in ms + this.setTimeout(timeout); + + + } + /* + * for client cert authorization + */ + public ExampleHttpClient(String base, boolean trustAllCerts, String certFilename, String passphrase, + int sslCertType) { + super(base, trustAllCerts, certFilename, passphrase, sslCertType); + this.username=""; + this.password=""; + + } + + + public void doExamplePost(String param1,int param2) throws IOException + { + String uri="network/pnf/id"; + String method="GET"; + String body=String.format("{\"param1\":\"%s\",\"param1\":%d}",param1,param2); + Map<String, String> headers = new HashMap<String,String>(); + headers.put("Accept-Encoding", "utf-8"); + headers.put("Authorization", BaseHTTPClient.getAuthorizationHeaderValue(this.username, this.password)); + BaseHTTPResponse response=this.sendRequest(uri, method, body, headers ); + + if(response.code==BaseHTTPResponse.CODE200) + { + + } + + + } +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/TestMappEquipment.java b/sdnr/wt/devicemanager/provider/src/test/java/TestMappEquipment.java new file mode 100644 index 000000000..fd7773554 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/TestMappEquipment.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * ============LICENSE_START======================================================================== + * ONAP : ccsdk feature sdnr wt + * ================================================================================================= + * Copyright (C) 2019 highstreet technologies GmbH 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========================================================================== + ******************************************************************************/ + +public class TestMappEquipment<T> { + + public static void main(String[] args) { + + /* + MyEquipmentBuilder eb = new MyEquipmentBuilder(); + eb.setAdministrativeState(AdministrativeState.Unlocked); + eb.setCategory((new CategoryBuilder()).setCategory(EquipmentCategory.Rack).build()); + + Equipment e2 = eb.build(); + + String inspect = HtDatabaseEventsService.inspect(e2,0); + System.out.println("Inspect: "+inspect); + + String json = HtDatabaseEventsService.toJson(e2); + System.out.println("JSON: "+json); + */ + + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/DcaePrivateTester.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/DcaePrivateTester.java new file mode 100644 index 000000000..e9ccc53b3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/DcaePrivateTester.java @@ -0,0 +1,110 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.dcaeConnector.test; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.net.URLConnection; +import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +public class DcaePrivateTester { + + + public static void test(URL url, boolean readFromServer) throws Exception { + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType) { + } + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType) { + } + } }; + // Install the all-trusting trust manager + final SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + // Create all-trusting host name verifier + HostnameVerifier allHostsValid = (hostname, session) -> true; + + // Install the all-trusting host verifier + HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); + + //URL url = new URL("https://www.google.com"); + URLConnection con = url.openConnection(); + System.out.println("Connection background: "+con.getClass().getName()+" "+url.getHost()); + + if (readFromServer) { + final Reader reader = new InputStreamReader(con.getInputStream()); + final BufferedReader br = new BufferedReader(reader); + String line = ""; + while ((line = br.readLine()) != null) { + System.out.println(line); + } + br.close(); + } /**/ + } // End of main + + + +// httpTestUrl=https://plan.fritz.box:9092/ux/# +// keyStore=etc/clientkeystore +// keyStorePassword=daylight2016 + public static void main(String[] args) { + + String urlString = "https://www.google.de"; + //String urlString = "https://plan.fritz.box:9092/ux/#"; + //String urlString = "http://plan.fritz.box:9091/ux/#"; + //String urlString = "http://127.0.0.1:30000/eventListener/v3"; + + try { + test(new URL(urlString), true); + } catch (Exception e) { + System.out.println("(..something..) failed"); + e.printStackTrace(); + } + /* + System.out.println("Test HTTPS"); + + final HttpsClient httpTestClient; + httpTestClient = new HttpsClient(); + + httpTestClient.testIt( + //"https://plan.fritz.box:9092/ux/#", + "https://www.google.de", + "/home/herbert/odl/distribution-karaf-0.5.1-Boron-SR1/etc/clientkeystore", + "daylight2016" + );/**/ + + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/DcaeTestClient.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/DcaeTestClient.java new file mode 100644 index 000000000..ffc007a06 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/DcaeTestClient.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.dcaeConnector.test; + +import org.onap.ccsdk.features.sdnr.wt.devicemanager.config.impl.DcaeConfig; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl.DcaeMessages; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl.DcaeSenderImpl; + +public class DcaeTestClient { + + private static final boolean TESTCOLLECTOR_YES = true; + + public static void main(String[] args) { + + System.out.println("Test program to verify DCAE https connectivity"); + + //Get configuration + DcaeConfig configuration = DcaeConfig.getDefaultConfiguration(); + + if (configuration != null) { + + //Start services + System.out.println("Configuration: "+configuration); + + DcaeSenderImpl dcaeClient = new DcaeSenderImpl(configuration.getEventReveicerUrl(), configuration.getUserCredentials()); + + if (TESTCOLLECTOR_YES) { + System.out.println("Connect to testclient and send notifications"); + + DcaeMessages dcaeMessages = new DcaeMessages(dcaeClient, "ControllerName", 31, null); + + for (int t=0; t < 2; t++) { + try { + Thread.sleep(1000); //1000 milliseconds is one second. + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + System.out.println(t+". Send notification and receive answer message"); + System.out.println("Heartbeat message: "+dcaeMessages.postHeartBeat()); + System.out.println("Status of ECOMP Client: "+dcaeClient.getStatusAsString()); + } + + } else { + + System.out.println("Connect to server and receive initial answer."); + System.out.println("Message: "+dcaeClient.testConnectServer()); + + } + + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/HttpsClient.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/HttpsClient.java new file mode 100644 index 000000000..6ff18b48f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/dcaeConnector/test/HttpsClient.java @@ -0,0 +1,304 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.dcaeConnector.test; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLPeerUnverifiedException; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.dcaeconnector.impl.DcaeProviderClient; + +public class HttpsClient{ + + private static final MyLogger LOG = MyLogger.getLogger(DcaeProviderClient.class); + + void test() { + + TrustManager tm = new X509TrustManager() { + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + throws java.security.cert.CertificateException { + //do nothing, you're the client + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + throws java.security.cert.CertificateException { + /* chain[chain.length -1] is the candidate for the + * root certificate. + * Look it up to see whether it's in your list. + * If not, ask the user for permission to add it. + * If not granted, reject. + * Validate the chain using CertPathValidator and + * your list of trusted roots. + */ + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + //also only relevant for servers + return null; + } + }; + + TrustManager tml[] = new TrustManager[1]; + tml[0] = tm; + + + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + ctx.init(null, tml, null); + @SuppressWarnings("unused") + SSLSocketFactory sslF = ctx.getSocketFactory(); + + } catch (NoSuchAlgorithmException | KeyManagementException e) { + e.printStackTrace(); + } + + + }; + + void setupAllTrustingManager() { + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){ + @Override + public X509Certificate[] getAcceptedIssuers(){return null;} + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType){} + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType){} + }}; + + // Install the all-trusting trust manager + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) { + ; + } + } + + void testIt(String https_url, String keyStoreName, String keyStorePassword){ + + LOG.info("Message to: {} begin.", https_url); + + if (https_url.equals("off")) { + LOG.info("Function switched off"); + return; + } + + /* + KeyManagerFactory keyManagerFactory = null; + + try { + KeyStore ks = KeyStore.getInstance("JKS"); + FileInputStream in = new FileInputStream(keyStoreName); + ks.load(in, keyStorePassword.toCharArray()); + + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + FileInputStream in2 = new FileInputStream("etc/eventprovider.cert"); + X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in2); + + KeyStore.Entry newEntry = new KeyStore.TrustedCertificateEntry(cert); + ks.setEntry("someAlias", newEntry, null); + + keyManagerFactory = KeyManagerFactory.getInstance("X509"); + keyManagerFactory.init(ks, "yourKeyStorePassword".toCharArray()); + + } catch (KeyStoreException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (FileNotFoundException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (NoSuchAlgorithmException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (CertificateException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (IOException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } catch (UnrecoverableKeyException e1) { + LOG.info("Exception: {}", e1.getMessage()); + } + + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){ + @Override + public X509Certificate[] getAcceptedIssuers(){return null;} + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType){} + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType){} + }}; + */ + File file = new File(keyStoreName); + LOG.info("Setup keystore begin "+keyStoreName+" "+keyStorePassword+" Exists: "+file.exists()); + + System.setProperty("javax.net.debug","ssl"); + System.setProperty("javax.net.ssl.keyStoreType", "jks"); + System.setProperty("javax.net.ssl.keyStore", keyStoreName); + System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword); + + LOG.info("Setup keystore complete"); + + javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier( + (hostname, sslSession) -> { + LOG.info("Hostname check {}", hostname); + return true; + }); + LOG.info("Setup name verifier."); + + try { + /* + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(keyManagerFactory.getKeyManagers(), trustAllCerts, null); + SSLContext.setDefault(sslContext); + */ + + URL url = new URL(https_url); + LOG.info("Url object created"); + + HttpsURLConnection con = (HttpsURLConnection)url.openConnection(); + + LOG.info("openConnection"); + + //dumpl all cert info + print_https_cert(con); + + //dump all the content + print_content(con); + + } catch (MalformedURLException e) { + LOG.info("Exception: {}", e.getMessage()); + } catch (IOException e) { + LOG.info("Exception: {}", e.getMessage()); + } + + LOG.info("Message to: {} end.", https_url); + + } + + private void print_https_cert(HttpsURLConnection con){ + + StringBuffer logMsg = new StringBuffer(); + + if(con!=null){ + + try { + logMsg.append("Response Code : " + con.getResponseCode()); + logMsg.append("Cipher Suite : " + con.getCipherSuite()); + logMsg.append("\n"); + + Certificate[] certs = con.getServerCertificates(); + for(Certificate cert : certs){ + logMsg.append("Cert Type : " + cert.getType()); + logMsg.append("Cert Hash Code : " + cert.hashCode()); + logMsg.append("Cert Public Key Algorithm : " + cert.getPublicKey().getAlgorithm()); + logMsg.append("Cert Public Key Format : " + cert.getPublicKey().getFormat()); + logMsg.append("\n"); + } + + + } catch (SSLPeerUnverifiedException e) { + logMsg.append(e.getMessage()); + } catch (IOException e){ + logMsg.append(e.getMessage()); + } + } else { + logMsg.append("No connection"); + } + + LOG.info(logMsg.toString()); + } + + private void print_content(HttpsURLConnection con){ + + StringBuffer logMsg = new StringBuffer(); + if(con!=null){ + + try { + + + logMsg.append("****** Content of the URL ********"); + BufferedReader br = + new BufferedReader( + new InputStreamReader(con.getInputStream())); + + String input; + + while ((input = br.readLine()) != null){ + logMsg.append(input); + } + br.close(); + + + } catch (IOException e) { + logMsg.append(e.getMessage()); + } + + } else { + logMsg.append("No connection"); + } + + LOG.info(logMsg.toString()); + + } + + private static class MyLogger { + + private void out( String s, Object...oList) { + StringBuffer sb = new StringBuffer(); + sb.append("-------> "); + sb.append(s); + sb.append(" P: "); + int t = 0; + for (Object o: oList) { + sb.append("["); + sb.append(t++); + sb.append("]("); + sb.append(o.toString()); + sb.append(")"); + } + System.out.println(sb.toString()); + } + + void info( String s, Object...o) { + out(s,o); + } + + static MyLogger getLogger(Class<?> c) { + return new MyLogger(); + } + } +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/Test1dm.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/Test1dm.java new file mode 100644 index 000000000..358a17c39 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/Test1dm.java @@ -0,0 +1,175 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerImpl; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.impl.DeviceManagerService.Action; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.DataBrokerNetconfMock; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.MountPointMock; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.MountPointServiceMock; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.NotificationPublishServiceMock; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.test.mock.RpcProviderRegistryMock; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.MountPointService; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; + +public class Test1dm { + + private static int DATABASETIMEOUTSECONDS = 30; + + private static Path KARAF_ETC = Paths.get("etc"); + private static DeviceManagerImpl deviceManager; + private static MountPointMock mountPoint; + + + @BeforeClass + public static void before() throws InterruptedException, IOException { + + // Call System property to get the classpath value + Path etc = KARAF_ETC; + delete(etc); + System.out.println("Create empty:"+etc.toString()); + Files.createDirectories(etc); + + //Create mocks + DataBroker dataBroker = new DataBrokerNetconfMock(); + MountPointService mountPointService = new MountPointServiceMock(mountPoint = new MountPointMock()); + NotificationPublishService notificationPublishService = new NotificationPublishServiceMock(); + RpcProviderRegistry rpcProviderRegistry = new RpcProviderRegistryMock(); + + //start using blueprint interface + deviceManager = new DeviceManagerImpl(); + + deviceManager.setDataBroker(dataBroker); + deviceManager.setMountPointService(mountPointService); + deviceManager.setNotificationPublishService(notificationPublishService); + deviceManager.setRpcProviderRegistry(rpcProviderRegistry); + + try { + deviceManager.init(); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("Initialization status: "+deviceManager.isDevicemanagerInitializationOk()); + assertTrue("Devicemanager not initialized", deviceManager.isDevicemanagerInitializationOk()); + System.out.println("Initialization done"); + } + + @AfterClass + public static void after() throws InterruptedException, IOException { + + System.out.println("Start shutdown"); + //close using blueprint interface + try { + deviceManager.close(); + } catch (Exception e) { + System.out.println(e); + } + delete(KARAF_ETC); + + } + + @Test + public void test1() throws InterruptedException { + + System.out.println("Test1: Wait for database"); + int timeout = DATABASETIMEOUTSECONDS; + while ( !deviceManager.isDatabaseInitializationFinished() && timeout-- > 0) { + System.out.println("Test1: "+timeout); + Thread.sleep(1000); //On second + } + System.out.println("Test1: database initialized"); + } + + @Test + public void test2() { + System.out.println("Test2: slave mountpoint"); + + mountPoint.setDatabrokerAbsent(true); + NodeId nodeId = new NodeId("mountpointTest1"); + NetconfNodeBuilder nNodeBuilder = new NetconfNodeBuilder(); + + System.out.println("Call devicemanager"); + try { + deviceManager.startListenerOnNodeForConnectedState(Action.ADD, nodeId, nNodeBuilder.build()); + } catch (Exception e) { + e.printStackTrace(); + fail("Exception received."); + } + System.out.println("Test2: Done"); + + } + + @Test + public void test3() { + System.out.println("Test3: master mountpoint"); + + mountPoint.setDatabrokerAbsent(false); + NodeId nodeId = new NodeId("mountpointTest2"); + NetconfNodeBuilder nNodeBuilder = new NetconfNodeBuilder(); + + System.out.println("Call devicemanager"); + + try { + deviceManager.startListenerOnNodeForConnectedState(Action.ADD, nodeId, nNodeBuilder.build()); + } catch (Exception e) { + e.printStackTrace(); + fail("Exception received."); + } + System.out.println("Test3: Done"); + + } + + //********************* Private + + private static void delete(Path etc) throws IOException { + if (Files.exists(etc)) { + System.out.println("Found and remove:"+etc.toString()); + delete(etc.toFile()); + } + } + + private static void delete(File f) throws IOException { + if (f.isDirectory()) { + for (File c : f.listFiles()) { + delete(c); + } + } + if (!f.delete()) { + throw new FileNotFoundException("Failed to delete file: " + f); + } + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestMapper.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestMapper.java new file mode 100644 index 000000000..4166101c4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/TestMapper.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2019 Red Hat, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.onap.ccsdk.features.sdnr.wt.devicemanager.test; + +import org.junit.Test; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.database.HtMapper; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.performancemanager.impl.database.types.EsHistoricalPerformance15Minutes; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.LayerProtocolName; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.UniversalId; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.Lp; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.core.model.rev170320.logical.termination.point.g.LpBuilder; +import org.opendaylight.yang.gen.v1.urn.onf.params.xml.ns.yang.microwave.model.rev181010.air._interface.historical.performances.g.HistoricalPerformanceDataListBuilder; + +public class TestMapper { + + @Test + public void test() { + + int t = 0; + System.out.println(t++); + + HtMapper<EsHistoricalPerformance15Minutes> mapper = new HtMapper<>(EsHistoricalPerformance15Minutes.class); + System.out.println(t++); + + + Lp layerProtocol = new LpBuilder().setUuid(new UniversalId("TestId")).setLayerProtocolName(new LayerProtocolName("LayprotcolTest")).build(); + System.out.println(t++); + EsHistoricalPerformance15Minutes pmData = new EsHistoricalPerformance15Minutes("Testnode", layerProtocol); + System.out.println(t++); + + //AirInterfaceHistoricalPerformancesBuilder builder1 = new AirInterfaceHistoricalPerformancesBuilder(); + //System.out.println(t++); + + + HistoricalPerformanceDataListBuilder builder2 = new HistoricalPerformanceDataListBuilder(); + System.out.println(t++); + builder2.setPeriodEndTime(new DateAndTime("2019-06-06T12:12:12.1Z")); + System.out.println(t++); + + String json = mapper.objectToJson(pmData); + + System.out.println("Result: "+pmData); + System.out.println("Result: "+json); + + //fail("Not yet implemented"); + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/DataBrokerMountpointMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/DataBrokerMountpointMock.java new file mode 100644 index 000000000..09e0db7d1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/DataBrokerMountpointMock.java @@ -0,0 +1,77 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import org.opendaylight.controller.md.sal.binding.api.BindingService; +import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * @author herbert + * + */ +@SuppressWarnings("deprecation") +public class DataBrokerMountpointMock implements DataBroker, BindingService { + + @Override + public <T extends DataObject, L extends DataTreeChangeListener<T>> ListenerRegistration<L> registerDataTreeChangeListener( + DataTreeIdentifier<T> arg0, L arg1) { + return null; + } + + @Override + public BindingTransactionChain createTransactionChain(TransactionChainListener listener) { + return null; + } + + @Override + public ReadOnlyTransaction newReadOnlyTransaction() { + return null; + } + + @Override + public ReadWriteTransaction newReadWriteTransaction() { + return null; + } + + @Override + public WriteTransaction newWriteOnlyTransaction() { + return null; + } + + @Override + public ListenerRegistration<DataChangeListener> registerDataChangeListener(LogicalDatastoreType store, + InstanceIdentifier<?> path, DataChangeListener listener, DataChangeScope triggeringScope) { + return null; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/DataBrokerNetconfMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/DataBrokerNetconfMock.java new file mode 100644 index 000000000..77ee58729 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/DataBrokerNetconfMock.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * @author herbert + * + */ +@SuppressWarnings("deprecation") +public class DataBrokerNetconfMock implements DataBroker { + + @Override + public <T extends DataObject, L extends DataTreeChangeListener<T>> ListenerRegistration<L> registerDataTreeChangeListener( + DataTreeIdentifier<T> arg0, L arg1) { + // TODO Auto-generated method stub + return null; + } + + @Override + public BindingTransactionChain createTransactionChain(TransactionChainListener listener) { + // TODO Auto-generated method stub + return null; + } + + @Override + public ReadOnlyTransaction newReadOnlyTransaction() { + return new ReadOnlyTransactionMock(); + } + + @Override + public ReadWriteTransaction newReadWriteTransaction() { + // TODO Auto-generated method stub + return null; + } + + @Override + public WriteTransaction newWriteOnlyTransaction() { + // TODO Auto-generated method stub + return null; + } + + @Override + public ListenerRegistration<DataChangeListener> registerDataChangeListener(LogicalDatastoreType store, + InstanceIdentifier<?> path, DataChangeListener listener, DataChangeScope triggeringScope) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/MountPointMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/MountPointMock.java new file mode 100644 index 000000000..ca63dcf71 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/MountPointMock.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt sdnr-wt-devicemanager-provider + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import com.google.common.base.Optional; +import org.opendaylight.controller.md.sal.binding.api.BindingService; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * @author herbert + * + */ +public class MountPointMock implements MountPoint { + + private boolean databrokerAbsent = true; + private final DataBrokerMountpointMock dataBroker = new DataBrokerMountpointMock(); + + @Override + public InstanceIdentifier<?> getIdentifier() { + return null; + } + + @SuppressWarnings("unchecked") + @Override + public <T extends BindingService> Optional<T> getService(Class<T> service) { + + System.out.println("Requested mountpoint service: "+service.getSimpleName()+" databrokerAbsent state: "+databrokerAbsent); + + Optional<?> res = Optional.absent(); + if (service.isInstance(dataBroker)) { + res = databrokerAbsent ? Optional.absent() : Optional.of(dataBroker); + } else if (service.isInstance(org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry.class)) { + res = Optional.of(new RpcConsumerRegistryMock()); + } + return (Optional<T>)res; + } + + public void setDatabrokerAbsent( boolean state) { + this.databrokerAbsent = state; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/MountPointServiceMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/MountPointServiceMock.java new file mode 100644 index 000000000..797ccb286 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/MountPointServiceMock.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import com.google.common.base.Optional; +import org.opendaylight.controller.md.sal.binding.api.MountPoint; +import org.opendaylight.controller.md.sal.binding.api.MountPointService; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * @author herbert + * + */ +public class MountPointServiceMock implements MountPointService { + + private final MountPointMock mountpoint; + + public MountPointServiceMock(MountPointMock mountpoint) { + this.mountpoint = mountpoint; + } + + @Override + public Optional<MountPoint> getMountPoint(InstanceIdentifier<?> mountPoint) { + + Optional<MountPoint> optional = Optional.of(mountpoint); + return optional; + } + + @Override + public <T extends MountPointListener> ListenerRegistration<T> registerListener(InstanceIdentifier<?> path, + T listener) { + return null; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/NotificationPublishServiceMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/NotificationPublishServiceMock.java new file mode 100644 index 000000000..54408c451 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/NotificationPublishServiceMock.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import com.google.common.util.concurrent.ListenableFuture; +import java.util.concurrent.TimeUnit; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.yangtools.yang.binding.Notification; + +/** + * @author herbert + * + */ +public class NotificationPublishServiceMock implements NotificationPublishService { + + /* (non-Javadoc) + * @see org.opendaylight.controller.md.sal.binding.api.NotificationPublishService#offerNotification(org.opendaylight.yangtools.yang.binding.Notification) + */ + @Override + public ListenableFuture<?> offerNotification(Notification notification) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.opendaylight.controller.md.sal.binding.api.NotificationPublishService#offerNotification(org.opendaylight.yangtools.yang.binding.Notification, int, java.util.concurrent.TimeUnit) + */ + @Override + public ListenableFuture<?> offerNotification(Notification notification, int timeout, TimeUnit unit) + throws InterruptedException { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.opendaylight.controller.md.sal.binding.api.NotificationPublishService#putNotification(org.opendaylight.yangtools.yang.binding.Notification) + */ + @Override + public void putNotification(Notification notification) throws InterruptedException { + // TODO Auto-generated method stub + + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/ReadOnlyTransactionMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/ReadOnlyTransactionMock.java new file mode 100644 index 000000000..0bfe4b3eb --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/ReadOnlyTransactionMock.java @@ -0,0 +1,143 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt sdnr-wt-devicemanager-provider + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.CheckedFuture; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import org.onap.ccsdk.features.sdnr.wt.devicemanager.base.netconf.wrapperc.WrapperMicrowaveModelRev181010; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapabilityBuilder; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * @author herbert + * + */ +@SuppressWarnings("deprecation") +public class ReadOnlyTransactionMock implements ReadOnlyTransaction { + + + @Override + public Object getIdentifier() { + return null; + } + + @Override + public <T extends DataObject> CheckedFuture<Optional<T>, ReadFailedException> read(LogicalDatastoreType store, + InstanceIdentifier<T> path) { + + NetconfNodeBuilder netconfNodeBuilder = new NetconfNodeBuilder(); + netconfNodeBuilder.setConnectionStatus(ConnectionStatus.Connected); + netconfNodeBuilder.setAvailableCapabilities(getCababilitiesList(WrapperMicrowaveModelRev181010.QNAME.toString()).build()); + NetconfNode nnode = netconfNodeBuilder.build(); + NodeBuilder nodeBuilder = new NodeBuilder(); + nodeBuilder.addAugmentation(NetconfNode.class, nnode); + Node node = nodeBuilder.build(); + @SuppressWarnings("unchecked") + Optional<T> res1 = (Optional<T>) Optional.of(node); + CheckedFuture<Optional<T>, ReadFailedException> res = new CheckedFuture<Optional<T>, ReadFailedException>() { + + @Override + public void addListener(Runnable arg0, Executor arg1) { + } + + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + return false; + } + + @Override + public Optional<T> get() throws InterruptedException, ExecutionException { + return null; + } + + @Override + public Optional<T> get(long timeout, TimeUnit unit) + throws InterruptedException, ExecutionException, TimeoutException { + return null; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return false; + } + + @Override + public Optional<T> checkedGet() throws ReadFailedException { + return res1; + } + + @Override + public Optional<T> checkedGet(long arg0, TimeUnit arg1) throws TimeoutException, ReadFailedException { + return null; + } + + }; + + + return res; + } + + private AvailableCapabilitiesBuilder getCababilitiesList(String ... strings) { + return getCababilitiesList(null, strings); + } + + private AvailableCapabilitiesBuilder getCababilitiesList(AvailableCapabilitiesBuilder valueBuilder, String ... strings) { + if (valueBuilder == null) { + valueBuilder = new AvailableCapabilitiesBuilder(); + } + List<AvailableCapability> capabilites = new ArrayList<>(); + for (String s : strings) { + AvailableCapabilityBuilder capabilityBuilder = new AvailableCapabilityBuilder(); + capabilityBuilder.setCapability(s); + capabilites.add(capabilityBuilder.build()); + } + valueBuilder.setAvailableCapability(capabilites); + return valueBuilder; + } + + @Override + public void close() { + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/RpcConsumerRegistryMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/RpcConsumerRegistryMock.java new file mode 100644 index 000000000..5cac97742 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/RpcConsumerRegistryMock.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt sdnr-wt-devicemanager-provider + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; +import org.opendaylight.yangtools.yang.binding.RpcService; + +/** + * @author herbert + * + */ +public class RpcConsumerRegistryMock implements RpcConsumerRegistry { + + @Override + public <T extends RpcService> T getRpcService(Class<T> serviceInterface) { + return null; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/RpcProviderRegistryMock.java b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/RpcProviderRegistryMock.java new file mode 100644 index 000000000..831d5ae75 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/java/org/onap/ccsdk/features/sdnr/wt/devicemanager/test/mock/RpcProviderRegistryMock.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * ONAP : ccsdk feature sdnr wt + * ================================================================================ + * Copyright (C) 2019 highstreet technologies GmbH 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.ccsdk.features.sdnr.wt.devicemanager.test.mock; + +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.RpcService; + +public class RpcProviderRegistryMock implements RpcProviderRegistry { + + @Override + public <T extends RpcService> T getRpcService(Class<T> serviceInterface) { + return null; + } + + @Override + public <L extends RouteChangeListener<RpcContextIdentifier, InstanceIdentifier<?>>> ListenerRegistration<L> registerRouteChangeListener( + L listener) { + return null; + } + + + @Override + public <T extends RpcService> RoutedRpcRegistration<T> addRoutedRpcImplementation(Class<T> serviceInterface, + T implementation) throws IllegalStateException { + return null; + } + + @Override + public <T extends RpcService> RpcRegistration<T> addRpcImplementation(Class<T> serviceInterface, T implementation) + throws IllegalStateException { + System.out.println("Register class "+serviceInterface); + return null; + } + +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/aaiclient.properties b/sdnr/wt/devicemanager/provider/src/test/resources/aaiclient.properties new file mode 100644 index 000000000..3e4da05b0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/aaiclient.properties @@ -0,0 +1,165 @@ +###
+
+# ============LICENSE_START=======================================================
+
+# openECOMP : SDN-C
+
+# ================================================================================
+
+# 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=========================================================
+
+###
+
+
+
+#
+
+# Configuration file for A&AI Client
+
+#
+
+
+
+#
+
+# Certificate keystore and truststore
+
+#
+
+org.onap.ccsdk.sli.adaptors.aai.ssl.trust=/opt/logs/externals/data/stores/truststore.client.jks
+
+org.onap.ccsdk.sli.adaptors.aai.ssl.trust.psswd=adminadmin
+
+
+
+org.onap.ccsdk.sli.adaptors.aai.ssl.key=/opt/logs/externals/data/stores/keystore.client.p12
+
+org.onap.ccsdk.sli.adaptors.aai.ssl.key.psswd=adminadmin
+
+org.onap.ccsdk.sli.adaptors.aai.host.certificate.ignore=true
+
+
+
+org.onap.ccsdk.sli.adaptors.aai.application=SDNC
+
+
+
+#org.onap.ccsdk.sli.adaptors.aai.uri=https://aai-int1.test.att.com:8443
+
+org.onap.ccsdk.sli.adaptors.aai.uri=https://aai-pwt3.ecomp.cci.att.com:8443
+
+
+
+connection.timeout=60000
+
+read.timeout=60000
+
+
+
+# query
+
+org.onap.ccsdk.sli.adaptors.aai.path.query=/aai/v13/search/sdn-zone-query
+
+org.onap.ccsdk.sli.adaptors.aai.query.nodes=/aai/v13/search/nodes-query?search-node-type={node-type}&filter={entity-identifier}:EQUALS:{entity-name}
+
+org.onap.ccsdk.sli.adaptors.aai.query.generic=/aai/v13/search/generic-query?key={identifier}:{value}&start-node-type={start-node-type}&include=complex&depth=3
+
+
+
+# named query
+
+org.onap.ccsdk.sli.adaptors.aai.query.named=/aai/search/named-query
+
+
+
+#update
+
+org.onap.ccsdk.sli.adaptors.aai.update=/aai/v13/actions/update
+
+
+
+# UBB Notify
+
+org.onap.ccsdk.sli.adaptors.aai.path.notify=/aai/v13/actions/notify
+
+org.onap.ccsdk.sli.adaptors.aai.notify.selflink.fqdn=/restconf/config/L3SDN-API:services/layer3-service-list/{service-instance-id}
+
+org.onap.ccsdk.sli.adaptors.aai.notify.selflink.avpn=/restconf/config/L3AVPN-EVC-API:services/service-list/{service-instance-id}/service-data/avpn-logicalchannel-information
+
+
+
+# P-Interfaces
+
+org.onap.ccsdk.sli.adaptors.aai.path.pserver.pinterfaces=/aai/v13/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces
+
+org.onap.ccsdk.sli.adaptors.aai.path.pserver.pinterface=/aai/v13/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name}
+
+
+
+# VNF IMAGES
+
+org.onap.ccsdk.sli.adaptors.aai.path.vnf.images=/aai/v13/service-design-and-creation/vnf-images
+
+org.onap.ccsdk.sli.adaptors.aai.path.vnf.image=/aai/v13/service-design-and-creation/vnf-images/vnf-image/{att-uuid}
+
+org.onap.ccsdk.sli.adaptors.aai.path.vnf.image.query=/aai/v13/service-design-and-creation/vnf-images/vnf-image?application={application_model}&application-vendor={application_vendor}
+
+
+
+# service instance
+
+org.onap.ccsdk.sli.adaptors.aai.path.svcinst.query=/aai/v13/search/generic-query?key=service-instance.service-instance-id:{svc-instance-id}&start-node-type=service-instance&include=service-instance
+
+org.onap.ccsdk.sli.adaptors.aai.path.service.instance=/aai/v13/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}
+
+
+
+# VNF IMAGES QUERY
+
+org.onap.ccsdk.sli.adaptors.aai.path.vnf.image.query=/aai/v13/service-design-and-creation/vnf-images/vnf-image?application={application_model}&application-vendor={application_vendor}
+
+
+
+#
+
+# Formatting
+
+#
+
+org.onap.ccsdk.sli.adaptors.aai.param.format=filter=%s:%s
+
+org.onap.ccsdk.sli.adaptors.aai.param.vnf_type=vnf-type
+
+org.onap.ccsdk.sli.adaptors.aai.param.physical.location.id=physical-location-id
+
+org.onap.ccsdk.sli.adaptors.aai.param.service.type=service-type
+
+
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/test.properties b/sdnr/wt/devicemanager/provider/src/test/resources/test.properties new file mode 100644 index 000000000..943c25bd9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/test.properties @@ -0,0 +1,47 @@ +[dcae] +dcaeUserCredentials=admin:admin +dcaeUrl=off +dcaeHeartbeatPeriodSeconds=120 +dcaeTestCollector=no + +[aots] +userPassword=passwd +soapurladd=off +soapaddtimeout=10 +soapinqtimeout=20 +userName=user +inqtemplate=inqreq.tmpl.xml +assignedto=userid +addtemplate=addreq.tmpl.xml +severitypassthrough=critical,major,minor,warning +systemuser=user +prt-offset=1200 +soapurlinq=off +#smtpHost= +#smtpPort= +#smtpUsername= +#smtpPassword= +#smtpSender= +#smtpReceivers= + +[es] +esCluster=sendateodl5 + +[aai] +#keep comment +aaiHeaders=["X-TransactionId: 9999"] +aaiUrl=http://localhost:81 +aaiUserCredentials=AAI:AAI +aaiDeleteOnMountpointRemove=false +aaiTrustAllCerts=false +aaiApiVersion=aai/v13 +aaiPropertiesFile=aaiclient.properties +aaiApplicationId=SDNR +aaiPcks12ClientCertFile=/opt/logs/externals/data/stores/keystore.client.p12 +aaiPcks12ClientCertPassphrase=adminadmin +aaiClientConnectionTimeout=30000 + +[pm] +pmCluster=sendateodl5 +pmEnabled=true + |