/*
 * Copyright (c) 2018 - present.  Boling Consulting Solutions (bcsw.net)
 * Copyright 2020-present Open Networking Foundation
 *
 * 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.
 */
/*
 * NOTE: This file was generated, manual edits will be overwritten!
 *
 * Generated by 'goCodeGenerator.py':
 *              https://github.com/cboling/OMCI-parser/README.md
 */

package generated

import "github.com/deckarep/golang-set"

// Vdsl2LineConfigurationExtensionsClassID is the 16-bit ID for the OMCI
// Managed entity VDSL2 line configuration extensions
const Vdsl2LineConfigurationExtensionsClassID = ClassID(165) // 0x00a5

var vdsl2lineconfigurationextensionsBME *ManagedEntityDefinition

// Vdsl2LineConfigurationExtensions (Class ID: #165 / 0x00a5)
//	This ME extends the xDSL line configuration MEs with attributes that were originally unique to
//	ITU-T G.993.2 VDSL2. Due to continuing standards development, some attributes - and therefore
//	this ME - have also become applicable to other Recommendations, specifically [ITU-T G.992.3] and
//	[ITU-T G.992.5]. The attributes of this ME are further defined in [ITUT G.997.1]. An instance of
//	this ME is created and deleted by the OLT.
//
//	Relationships
//		An instance of this ME may be associated with zero or more instances of an xDSL UNI.////		The overall xDSL line configuration profile is modelled in several parts, all of which are
//		associated together through a common ME ID (the client PPTP xDSL UNI part 1 has a single
//		pointer, which refers to the entire set of line configuration parts).
//
//	Attributes
//		Managed Entity Id
//			This attribute uniquely identifies each instance of this ME. All xDSL and VDSL2 line
//			configuration profiles and extensions that pertain to a given PPTP xDSL UNI must share a common
//			ME ID. (R, setbycreate) (mandatory) (2-bytes)
//
//		Vdsl2 Profiles Enabling
//			The PROFILES attribute contains the ITU-T G.993.2 profiles to be allowed by the xTU-C. It is
//			coded in a bit map representation (0 if not allowed, 1 if allowed) with the following
//			definition.
//
//			Bit	Meaning
//
//			1 (LSB)	ITU-T G.993.2 profile 8a
//
//			2	ITU-T G.993.2 profile 8b
//
//			3	ITU-T G.993.2 profile 8c
//
//			4	ITU-T G.993.2 profile 8d
//
//			5	ITU-T G.993.2 profile 12a
//
//			6	ITU-T G.993.2 profile 12b
//
//			7	ITU-T G.993.2 profile 17a
//
//			8	ITU-T G.993.2 profile 30a
//
//			(R,-W, setbycreate) (mandatory for ITU-T G.993.2) (1-byte)
//
//		Vdsl2 Psd Mask Class Selection Classmask
//			NOTE 1 - A single PSD mask class may be selected per annex of [ITU-T G.993.2].
//
//			NOTE 2 - It is expected that only a single annex will be enabled at any given time, such that
//			the CLASSMASK attribute, as well as the LIMITMASK and US0DISABLE attributes below, need not be
//			vectors of values.
//
//			NOTE 3 - Attribute value 4 was formerly defined in [ITU-T G.997.1], and is no longer used.
//
//			(R,-W, setbycreate) (mandatory) (1-byte)
//
//			VDSL2 PSD mask class selection (CLASSMASK): To reduce the number of configuration possibilities,
//			the limit PSD masks are grouped in the following PSD mask classes.
//
//			-	Class 998 Annex A of [ITU-T G.993.2]: D-32, D-48, D-64, D-128
//
//			-	Class 997-M1c Annex B of [ITU-T G.993.2]: 997M1c-A-7
//
//			-	Class 997-M1x Annex B of [ITU-T G.993.2]: 997M1x-M
//
//			-	Class 997-M2x Annex B of [ITU-T G.993.2]: 997E17-M2x-NUS0, 997E30M2xNUS0
//
//			-	Class 998-M2x Annex B of [ITU-T G.993.2]: 998M2x-A, 998M2xM, 998M2x-B, 998-M2x-NUS0,
//			998E17-M2xNUS0, 998E17M2xNUS0-M, 998E30M2xNUS0, 998E30M2xNUS0M, 998E17-M2x-A
//
//			-	Class 998ADE-M2x Annex B of [ITU-T G.993.2]: 998-M2x-A, 998M2x-M, 998-M2x-B, 998-M2x-NUS0,
//			998ADE17-M2x-A, 998ADE17M2xB, 998ADE17-M2x-M, 998ADE17M2xNUS0-M, 998ADE30M2xNUS0-A,
//			998ADE30M2x-NUS0-M, HPEADE1230, HPEADE1730
//
//			-	Class 998-B Annex C: POTS-138b, POTS-276b (clause C.2.1.1 of [ITUT-G.993.2]), TCMISDN (clause
//			C.2.1.2 of [ITU-T G.993.2])
//
//			-	Class 998-CO Annex C of [ITU-T G.993.2]: POTS138co, POTS276co (clause C.2.1.1 of [ITU-T
//			G.993.2])
//
//			-	Class HPE-M1 Annex B of [ITU-T G.993.2]: HPE17M1-NUS0, HPE30M1NUS0, HPE1230-M1-NUS0,
//			HPE1730-M1-NUS0
//
//			Each class is designed such that the PSD levels of each limit PSD mask of a specific class are
//			equal in their respective passbands above 552 kHz.
//
//			The CLASSMASK attribute is defined per annex of [ITU-T G.993.2] enabled in the xTSE table (see
//			Table 9.7.12-1). It selects a single PSD mask class per annex of [ITU-T G.993.2] to be activated
//			at the very high-speed digital subscriber line transceiver unit, operator end (VTU-O). The
//			coding is as follows:
//
//		Vdsl2 Limit Psd Masks
//			The LIMITMASK attribute contains the ITU-T G.993.2 limit PSD masks of the selected PSD mask
//			class, enabled by the near-end xTU for each class of profiles. One LIMITMASK parameter is
//			defined per annex enabled in the xTSE (see Table 9.7.12-1).
//
//			The profiles are grouped in the following profile classes:
//
//			-	Class 8: Profiles 8a, 8b, 8c, 8d
//
//			-	Class 12: Profiles 12a, 12b
//
//			-	Class 17: Profile 17a
//
//			-	Class 30: Profile 30a
//
//			For each profile class, several limit PSD masks of the selected PSD mask class (CLASSMASK) may
//			be enabled. The enabling attribute is coded in a bit map representation (0 if the associated
//			mask is not allowed, 1 if it is allowed). The bit mask is defined in Table 9.7.6-1. (R,-W,
//			setbycreate) (mandatory) (8-bytes)
//
//		Vdsl2 Us0 Disabling
//			The US0DISABLE attribute specifies whether channel US0 is disabled for each limit PSD mask
//			enabled in the LIMITMASK attribute.
//
//			For each limit PSD mask enabled in the LIMITMASK attribute, one bit indicates if US0 is
//			disabled. The disabling attribute is a bit map where the value 1 specifies that US0 is disabled
//			for the associated limit mask. The bit map has the same structure as the LIMITMASK attribute.
//			(R,-W, setbycreate) (mandatory) (8-bytes)
//
//		Vdsl2 Us0 Psd Masks
//			The US0MASK attribute contains the US0 PSD masks to be allowed by the xTU-C. This attribute is
//			only defined for Annex-A of [ITUT-G.993.2]. It is represented as a bit map (0 if not allowed, 1
//			if allowed) with the definitions of Table-9.7.6-2. (R, W, setbycreate) (mandatory) (4-bytes)
//
//		Vdsl2_Carmask Table
//			VDSL2-CARMASK table: This attribute specifies restrictions, additional to the band plan, that
//			determine the set of subcarriers allowed for transmission in both upstream and downstream
//			directions.
//
//			The VDSL2-CARMASK attribute describes the not-masked subcarriers in terms of one or more
//			frequency bands. Each band is represented by start and stop subcarrier indices with a subcarrier
//			spacing of 4.3125-kHz. The valid range of subcarrier indices is from 0 to at least the index of
//			the highest allowed subcarrier in both transmission directions among all profiles enabled by the
//			VDSL2 profiles enabling (PROFILES) attribute. Up to 32 bands may be specified. Other subcarriers
//			are masked.
//
//			For profiles using 8.625 kHz tone spacing, the odd subcarrier indices i4.3125 in VDSL2-CARMASK
//			can be transformed into actual subcarrier indices i8.625 using the following rule:
//
//			- for the start frequency of each band: i8.625-=-(i4.3125 + 1)/2
//
//			- for the stop frequency of each band: i8.625-=-(i4.3125 - 1)/2.
//
//			The VDSL2-CARMASK attribute is a table where each entry comprises:
//
//			- an entry number field (1-byte, first entry numbered 1);
//
//			- band start subcarrier index (2-bytes);
//
//			- band stop subcarrier index (2-bytes).
//
//			By default, the table is empty. Entries are added or modified using the set action. Setting a
//			table entry with non-zero subcarrier references implies insertion into the table. Setting an
//			entry's subcarrier references to zero implies deletion from the table, if present.
//
//			The maximum number of bands is 32, so the maximum size of the table is 160-bytes. (R,-W)
//			(mandatory) (5 * N bytes, where N is the number of bands)
//
//		Carmask Valid
//			This attribute controls and reports the status of the VDSL2-CARMASK table. If CARMASK valid-= 1,
//			then the VDSL2-CARMASK has been effectuated on the xDSL equipment. If CARMASK valid-= 0
//			(default), then the VDSL2-CARMASK table is under construction and has not been effectuated on
//			the xDSL equipment.
//
//			This attribute behaves as follows.
//
//			If the OLT changes any of the VDSL2-CARMASK table entries or sets CARMASK valid-= 0, then
//			CARMASK valid-= 0.
//
//			If CARMASK valid-= 0 and the OLT sets CARMASK valid-= 1, then the ONU updates the xDSL equipment
//			with the contents of the table.
//
//			(R,-W) (mandatory) (1-byte)
//
//		Upboshaped
//			This attribute includes two parameters for each band. The parameters are a and b, in that order.
//			Parameter a lies in the range 4000 (40.00-dBm/Hz) to 8095 (80.95-dBm/Hz). Parameter b lies in
//			the range 0 (0.00-dBm/Hz) to 4095 (40.95-dBm/Hz). The special values a-= b-= 0 disable UPBO in
//			the respective upstream band.
//
//			The upstream electrical length parameter UPBOKL defines the electrical length expressed in
//			decibels at 1-MHz, kl0, which may also be configured by the OLT. Its value ranges from 0
//			(0.0-dB) to 1280 (128.0-dB).
//
//			If the force electrical length parameter UPBOKLF is 1, the very high-speed digital subscriber
//			line transceiver unit, remote end (VTU-R) is forced to use the electrical length from this
//			attribute (UPBOKL) to compute UPBO. Otherwise, the VDSL2 transceiver units (VTUs) determine the
//			electrical length themselves.
//
//			(R,-W) (mandatory) (23-bytes)
//
//			Upstream power back-off (UPBO) is specified in [ITUT G.993.2] to provide spectral compatibility
//			between loops of different lengths deployed in the same cable binder. The upstream transmit PSD
//			mask, UPBOMASKus is defined in clause 7.2.1.3.2 of [ITUT G.993.2].
//
//			The ITU-T G.993.2 UPBO configuration attributes a and b are set by the OLT via this attribute.
//			The reference length kl0_REF is set by the companion attribute UPBO klREF-pb, defined in the
//			following. Further details appear in [ITUT-G.997.1].
//
//		Cyclic Extension
//			The CEFLAG attribute enables (1) the optional cyclic extension values. If set to 0, the cyclic
//			extension is forced to the mandatory length 5N/32. (R,-W) (mandatory) (1-byte)
//
//		Downstream Signal_To_Noise Ratio Snr Mode
//			Downstream signal-to-noise ratio (SNR) mode: The SNRMODEds attribute controls transmitter
//			referred virtual noise in the downstream direction. If set to 1, virtual noise is disabled. If
//			set to 2, virtual noise is enabled. (R,-W) (mandatory) (1-byte)
//
//		Upstream Snr Mode
//			The SNRMODEus attribute controls transmitter referred virtual noise in the upstream direction.
//			If set to 1, virtual noise is disabled. If set to 2, virtual noise is enabled. (R,-W)
//			(mandatory) (1-byte)
//
//		Transmitter Referred Virtual Noise Downstream Table
//			Table entries for this attribute have the default value 254 for the noise PSD level. Entries are
//			added or modified using the set action. Setting an entry to a noise PSD level less than or equal
//			to 254 implies insertion into the table. Setting an entry's noise PSD level to 255 implies
//			deletion from the table, if present.
//
//			(R,-W) (optional) (3N bytes, where N is the number of breakpoints)
//
//			The TXREFVNds table defines the downstream transmitter referred virtual noise. TXREFVNds is
//			specified through a set of breakpoints. Each breakpoint comprises a subcarrier index t, with a
//			subcarrier spacing of 4.3125-kHz, and a noise PSD level at that subcarrier. The set of
//			breakpoints can then be represented as [(t1, PSD1), (t2, PSD2), ..., (tN, PSDN)]. The subcarrier
//			index t is an unsigned 2 byte integer. The noise level is 1-byte whose value ranges from 0
//			(-40-dBm/Hz) to 200 (-140-dBm/Hz), in steps of 0.5 dB. Values between 201 and 254 indicate a
//			noise PSD level of 0 W/Hz. The maximum number of breakpoints is 32; no more than 15 breakpoints
//			may be configured below the upper edge of the passband of every mode enabled for [ITU-T G.992.3]
//			and [ITUT-G.992.5].
//
//		Transmitter Referred Virtual Noise Upstream Table
//			The TXREFVNus attribute defines the upstream transmitter referred virtual noise. TXREFVNus is
//			specified through a set of breakpoints. Each breakpoint comprises a subcarrier index t, with a
//			subcarrier spacing of 4.3125-kHz, and a noise PSD level at that subcarrier. The set of
//			breakpoints can then be represented as [(t1, PSD1), (t2, PSD2), ..., (tN, PSDN)]. The subcarrier
//			index t is an unsigned 2-byte integer. The noise level is 1-byte whose value ranges from 0
//			(-40-dBm/Hz) to 200 (-140-dBm/Hz), in steps of 0.5 dB. Values between 201 and 254 indicate a
//			noise PSD level of 0-W/Hz. The maximum number of breakpoints is 16; no more than three
//			breakpoints may be configured below the upper edge of the passband of every mode enabled for
//			[ITU-T G.992.3] and [ITUT-G.992.5].
//
//			Table entries for this attribute have the default value 254 for the noise PSD level. Entries are
//			added or modified using the set action. Setting an entry to a noise PSD level less than or equal
//			to 254 implies insertion into the table. Setting an entry's noise PSD level to 255 implies
//			deletion from the table, if present.
//
//			(R,-W) (optional) (3N bytes, where N is the number of breakpoints)
//
//		Dpboshaped
//			Downstream power back-off - shaped is described in [ITUT G.997.1] as a vector of parameters that
//			modifies the downstream PSD mask.
//
//			DPBOEPSD - Assumed exchange PSD mask. This component points to a downstream xDSL PSD mask
//			profile ME. The PSD mask profile should contain no more than 16 break points. (2-bytes)
//
//			DPBOESEL - E-side electrical length. This component is the assumed loss at some reference
//			frequency of the electrical cable from the xDSL equipment to a possible flexibility point. It
//			ranges from 0 (0.0-dB) to 511 (255.5-dB) in steps of 0.5-dB. The value 0 has the special meaning
//			that it disables the DPBOSHAPED feature. (2-bytes)
//
//			The following three parameters describe the cable model. Further details appear in [ITUT
//			G.997.1]. Each is a scalar that represents the range -1 (coded as 0) to +1.5 (coded as 640) in
//			steps of 1/256.
//
//			DPBOESCMA - (2-bytes)
//
//			DPBOESCMB - (2-bytes)
//
//			DPBOESCMC - (2-bytes)
//
//			DPBOMUS - Assumed minimum usable receive PSD mask. This component ranges from 0 (0.0-dBm/Hz) to
//			255 (-127.5-dBm/Hz) in steps of 0.5 dB. (1-byte)
//
//			DPBOFMIN - The lower frequency bound above which DPBO is applied. This component ranges from 0
//			(0.00 kHz) to 2048 (8832.00 kHz) in steps of 4.3125 kHz. (2-bytes)
//
//			DPBOFMAX - The upper frequency bound below which DPBO is applied. This component ranges from 32
//			(138.00-kHz) to 6956 (29997.75-kHz) in steps of 4.3125-kHz. (2-bytes)
//
//			(R,-W) (optional) (15-bytes)
//
//		Upboklref_Pb
//			UPBOKLREF-pb: This attribute represents the reference loop length, the electrical length used to
//			compute upstream power back-off (UPBO) for each upstream band except US0, for the optional
//			equalized FEXT UPBO method. The value for each upstream band ranges from 1.8 to 63.5 dB in steps
//			of 0.1 dB, i.e., with values 18..635. The special value 0 is also allowed, with semantics as
//			defined in clause 7.2.1.3.2 of [ITUT G.993.2]. (R,-W) (optional) (2-bytes * 5 upstream bands)
//
//		Upboshaped Aele_Mode Upboelmt
//			UPBOSHAPED (AELE-MODE, UPBOELMT): This attribute defines the UPBO electrical length estimation
//			mode (AELE-MODE) and UPBO electrical length minimum threshold percentile (UPBOELMT) to be used
//			in the alternative electrical length estimation method (ELE-M1). The format of this attribute is
//			given in octet 1 of Table 12-27 of [ITU-T G.993.2]. (R,-W) (optional) (1-byte)
//
type Vdsl2LineConfigurationExtensions struct {
	ManagedEntityDefinition
	Attributes AttributeValueMap
}

// Attribute name constants

const Vdsl2LineConfigurationExtensions_Vdsl2ProfilesEnabling = "Vdsl2ProfilesEnabling"
const Vdsl2LineConfigurationExtensions_Vdsl2PsdMaskClassSelectionClassmask = "Vdsl2PsdMaskClassSelectionClassmask"
const Vdsl2LineConfigurationExtensions_Vdsl2LimitPsdMasks = "Vdsl2LimitPsdMasks"
const Vdsl2LineConfigurationExtensions_Vdsl2Us0Disabling = "Vdsl2Us0Disabling"
const Vdsl2LineConfigurationExtensions_Vdsl2Us0PsdMasks = "Vdsl2Us0PsdMasks"
const Vdsl2LineConfigurationExtensions_Vdsl2CarmaskTable = "Vdsl2CarmaskTable"
const Vdsl2LineConfigurationExtensions_CarmaskValid = "CarmaskValid"
const Vdsl2LineConfigurationExtensions_Upboshaped = "Upboshaped"
const Vdsl2LineConfigurationExtensions_CyclicExtension = "CyclicExtension"
const Vdsl2LineConfigurationExtensions_DownstreamSignalToNoiseRatioSnrMode = "DownstreamSignalToNoiseRatioSnrMode"
const Vdsl2LineConfigurationExtensions_UpstreamSnrMode = "UpstreamSnrMode"
const Vdsl2LineConfigurationExtensions_TransmitterReferredVirtualNoiseDownstreamTable = "TransmitterReferredVirtualNoiseDownstreamTable"
const Vdsl2LineConfigurationExtensions_TransmitterReferredVirtualNoiseUpstreamTable = "TransmitterReferredVirtualNoiseUpstreamTable"
const Vdsl2LineConfigurationExtensions_Dpboshaped = "Dpboshaped"
const Vdsl2LineConfigurationExtensions_UpboklrefPb = "UpboklrefPb"
const Vdsl2LineConfigurationExtensions_UpboshapedAeleModeUpboelmt = "UpboshapedAeleModeUpboelmt"

func init() {
	vdsl2lineconfigurationextensionsBME = &ManagedEntityDefinition{
		Name:    "Vdsl2LineConfigurationExtensions",
		ClassID: Vdsl2LineConfigurationExtensionsClassID,
		MessageTypes: mapset.NewSetWith(
			Create,
			Delete,
			Get,
			GetNext,
			Set,
			SetTable,
		),
		AllowedAttributeMask: 0xffff,
		AttributeDefinitions: AttributeDefinitionMap{
			0:  Uint16Field(ManagedEntityID, PointerAttributeType, 0x0000, 0, mapset.NewSetWith(Read, SetByCreate), false, false, false, 0),
			1:  ByteField(Vdsl2LineConfigurationExtensions_Vdsl2ProfilesEnabling, UnsignedIntegerAttributeType, 0x8000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 1),
			2:  ByteField(Vdsl2LineConfigurationExtensions_Vdsl2PsdMaskClassSelectionClassmask, UnsignedIntegerAttributeType, 0x4000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 2),
			3:  Uint64Field(Vdsl2LineConfigurationExtensions_Vdsl2LimitPsdMasks, UnsignedIntegerAttributeType, 0x2000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 3),
			4:  Uint64Field(Vdsl2LineConfigurationExtensions_Vdsl2Us0Disabling, UnsignedIntegerAttributeType, 0x1000, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 4),
			5:  Uint32Field(Vdsl2LineConfigurationExtensions_Vdsl2Us0PsdMasks, UnsignedIntegerAttributeType, 0x0800, 0, mapset.NewSetWith(Read, SetByCreate, Write), false, false, false, 5),
			6:  TableField(Vdsl2LineConfigurationExtensions_Vdsl2CarmaskTable, TableAttributeType, 0x0400, TableInfo{nil, 5}, mapset.NewSetWith(Read, Write), false, false, false, 6),
			7:  ByteField(Vdsl2LineConfigurationExtensions_CarmaskValid, UnsignedIntegerAttributeType, 0x0200, 0, mapset.NewSetWith(Read, Write), false, false, false, 7),
			8:  MultiByteField(Vdsl2LineConfigurationExtensions_Upboshaped, OctetsAttributeType, 0x0100, 23, toOctets("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="), mapset.NewSetWith(Read, Write), false, false, false, 8),
			9:  ByteField(Vdsl2LineConfigurationExtensions_CyclicExtension, UnsignedIntegerAttributeType, 0x0080, 0, mapset.NewSetWith(Read, Write), false, false, false, 9),
			10: ByteField(Vdsl2LineConfigurationExtensions_DownstreamSignalToNoiseRatioSnrMode, UnsignedIntegerAttributeType, 0x0040, 0, mapset.NewSetWith(Read, Write), false, false, false, 10),
			11: ByteField(Vdsl2LineConfigurationExtensions_UpstreamSnrMode, UnsignedIntegerAttributeType, 0x0020, 0, mapset.NewSetWith(Read, Write), false, false, false, 11),
			12: TableField(Vdsl2LineConfigurationExtensions_TransmitterReferredVirtualNoiseDownstreamTable, TableAttributeType, 0x0010, TableInfo{nil, 3}, mapset.NewSetWith(Read, Write), false, true, false, 12),
			13: TableField(Vdsl2LineConfigurationExtensions_TransmitterReferredVirtualNoiseUpstreamTable, TableAttributeType, 0x0008, TableInfo{nil, 3}, mapset.NewSetWith(Read, Write), false, true, false, 13),
			14: MultiByteField(Vdsl2LineConfigurationExtensions_Dpboshaped, OctetsAttributeType, 0x0004, 15, toOctets("AAAAAAAAAAAAAAAAAAAA"), mapset.NewSetWith(Read, Write), false, true, false, 14),
			15: Uint16Field(Vdsl2LineConfigurationExtensions_UpboklrefPb, UnsignedIntegerAttributeType, 0x0002, 0, mapset.NewSetWith(Read, Write), false, true, false, 15),
			16: ByteField(Vdsl2LineConfigurationExtensions_UpboshapedAeleModeUpboelmt, UnsignedIntegerAttributeType, 0x0001, 0, mapset.NewSetWith(Read, Write), false, true, false, 16),
		},
		Access:  CreatedByOlt,
		Support: UnknownSupport,
	}
}

// NewVdsl2LineConfigurationExtensions (class ID 165) creates the basic
// Managed Entity definition that is used to validate an ME of this type that
// is received from or transmitted to the OMCC.
func NewVdsl2LineConfigurationExtensions(params ...ParamData) (*ManagedEntity, OmciErrors) {
	return NewManagedEntity(*vdsl2lineconfigurationextensionsBME, params...)
}
