1: using System;
2: using System.Collections.Generic;
3: using System.Data;
4: using System.Data.Entity;
5: using System.Linq;
6:
7: namespace Ia.Ngn.Cl.Model.Data.Huawei
8: {
9: ////////////////////////////////////////////////////////////////////////////
10:
11: /// <summary publish="true">
12: /// Defaul general support class for Huawei's Next Generation Network (NGN) data model.
13: /// </summary>
14: ///
15: /// <remarks>
16: /// Copyright © 2014-2019 Jasem Y. Al-Shamlan (info@ia.com.kw), Integrated Applications - Kuwait. All Rights Reserved.
17: ///
18: /// This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
19: /// the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
20: ///
21: /// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
22: /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
23: ///
24: /// You should have received a copy of the GNU General Public License along with this library. If not, see http://www.gnu.org/licenses.
25: ///
26: /// Copyright notice: This notice may not be removed or altered from any source distribution.
27: /// </remarks>
28: public partial class Default
29: {
30: private static string[] list;
31: private static List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev> mduDevList;
32: private static Dictionary<string, Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev> accessNameToMduDevDictionary, nddOntIdToMduDevDictionary;
33: private static DateTime accessNameToMduDevDictionaryFutureRefreshDateTime;
34:
35: private static readonly object objectLock = new object();
36:
37: ////////////////////////////////////////////////////////////////////////////
38:
39: /// <summary>
40: ///
41: /// </summary>
42: public Default() { }
43:
44: ////////////////////////////////////////////////////////////////////////////
45:
46: /// <summary>
47: ///
48: /// </summary>
49: public static Dictionary<string, Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev> AccessNameToMduDevDictionary
50: {
51: get
52: {
53: DateTime now;
54:
55: now = DateTime.UtcNow.AddHours(3);
56:
57: lock (objectLock)
58: {
59: if (accessNameToMduDevDictionary == null || accessNameToMduDevDictionary.Count == 0 || now > accessNameToMduDevDictionaryFutureRefreshDateTime) accessNameToMduDevDictionary = Ia.Ngn.Cl.Model.Data.Huawei.Default._AccessNameToMduDevDictionary(1);// 440); // one day
60:
61: return accessNameToMduDevDictionary;
62: }
63: }
64: }
65:
66: ////////////////////////////////////////////////////////////////////////////
67:
68: /// <summary>
69: ///
70: /// </summary>
71: public static Dictionary<string, Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev> _AccessNameToMduDevDictionary(int minutesToKeepDataValid)
72: {
73: DateTime now;
74:
75: now = DateTime.UtcNow.AddHours(3);
76:
77: accessNameToMduDevDictionary = new Dictionary<string, Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev>();
78:
79: accessNameToMduDevDictionaryFutureRefreshDateTime = now.AddMinutes(minutesToKeepDataValid);
80:
81: foreach (var mdu in Ia.Ngn.Cl.Model.Data.Huawei.Default.MduDevList)
82: {
83: if (!string.IsNullOrEmpty(mdu.AccessName) && !string.IsNullOrEmpty(mdu.NddOntId))
84: {
85: if (!accessNameToMduDevDictionary.ContainsKey(mdu.AccessName))
86: {
87: accessNameToMduDevDictionary[mdu.AccessName] = mdu;
88: }
89: else
90: {
91:
92: }
93: }
94: else
95: {
96:
97: }
98: }
99:
100: return accessNameToMduDevDictionary;
101: }
102:
103: ////////////////////////////////////////////////////////////////////////////
104:
105: /// <summary>
106: ///
107: /// </summary>
108: public static Dictionary<string, Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev> NddOntIdToMduDevDictionary
109: {
110: get
111: {
112: if (nddOntIdToMduDevDictionary == null || nddOntIdToMduDevDictionary.Count == 0)
113: {
114: nddOntIdToMduDevDictionary = new Dictionary<string, Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev>();
115:
116: var mduDevList = Ia.Ngn.Cl.Model.Data.Huawei.Default.MduDevList;
117:
118: foreach (var mdu in mduDevList)
119: {
120: if (!string.IsNullOrEmpty(mdu.NddOntId))
121: {
122: if (!nddOntIdToMduDevDictionary.ContainsKey(mdu.NddOntId))
123: {
124: nddOntIdToMduDevDictionary[mdu.NddOntId] = mdu;
125: }
126: else
127: {
128:
129: }
130: }
131: else
132: {
133:
134: }
135: }
136: }
137:
138: return nddOntIdToMduDevDictionary;
139: }
140: }
141:
142: ////////////////////////////////////////////////////////////////////////////
143:
144: /// <summary>
145: ///
146: /// </summary>
147: public static List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev> MduDevList
148: {
149: get
150: {
151: int did;
152: Ia.Ngn.Cl.Model.Business.Huawei.Board.MduDevBoard mduDevBoard;
153: Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev mduDev;
154: List<Ia.Ngn.Cl.Model.Huawei.EmsBoard> boardList;
155:
156: if (mduDevList == null || mduDevList.Count == 0)
157: {
158: mduDevList = new List<Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev>();
159:
160: boardList = Ia.Ngn.Cl.Model.Data.Huawei.Default.BoardListByPstnOrEthBoardTypeAndMA5616OrMA5878DevType();
161:
162: foreach (var board in boardList)//.Where(u => u.DID == 7341343))
163: {
164: did = board.EmsDev.DID;
165:
166: mduDev = (from m in mduDevList where m.Did == did select m).SingleOrDefault();
167:
168: if (mduDev != null)
169: {
170: mduDevBoard = new Ia.Ngn.Cl.Model.Business.Huawei.Board.MduDevBoard(board.BT, board.BNAME, board.BVER, board.FN, board.SN);
171: mduDev.MduDevBoardList.Add(mduDevBoard);
172: }
173: else
174: {
175: mduDev = new Ia.Ngn.Cl.Model.Business.Huawei.Dev.MduDev(did)
176: {
177: DevType = board.EmsDev.DT,
178: DevIp = board.EmsDev.DEVIP
179: };
180:
181: mduDev.MduDevBoardList = new List<Ia.Ngn.Cl.Model.Business.Huawei.Board.MduDevBoard>();
182: mduDevBoard = new Ia.Ngn.Cl.Model.Business.Huawei.Board.MduDevBoard(board.BT, board.BNAME, board.BVER, board.FN, board.SN);
183: mduDev.MduDevBoardList.Add(mduDevBoard);
184:
185: mduDevList.Add(mduDev);
186: }
187: }
188: }
189:
190: return mduDevList;
191: }
192: }
193:
194: ////////////////////////////////////////////////////////////////////////////
195:
196: /// <summary>
197: ///
198: /// </summary>
199: public static List<Ia.Ngn.Cl.Model.Huawei.EmsBoard> BoardListByPstnOrEthBoardTypeAndMA5616OrMA5878DevType()
200: {
201: List<Ia.Ngn.Cl.Model.Huawei.EmsBoard> list;
202:
203: using (var db = new Ia.Ngn.Cl.Model.Ngn())
204: {
205: list = (from ed in db.EmsDevs
206: join eb in db.EmsBoards on ed.Id equals eb.EmsDev.Id
207: where (ed.DT == "MA5616" || ed.DT == "MA5878") && (eb.BT == "PSTN" || eb.BT == "ETH")
208: select eb).Include(x => x.EmsDev).ToList();
209:
210: /*
211: select distinct * from EmsDevs ed
212: left outer join EmsBoards eb on ed.Id = eb.EmsDev_Id
213: where (ed.DT = 'MA5616' or ed.DT = 'MA5878') and (eb.BT = 'PSTN' or eb.BT = 'ETH')
214: order by ed.DT, ed.DEV
215: */
216: }
217:
218: return list;
219: }
220:
221: ////////////////////////////////////////////////////////////////////////////
222:
223: /// <summary>
224: ///
225: /// </summary>
226: public static List<Ia.Ngn.Cl.Model.Access> AccessListBy5616Or5878OntEquipmentId()
227: {
228: List<Ia.Ngn.Cl.Model.Access> list;
229:
230: using (var db = new Ia.Ngn.Cl.Model.Ngn())
231: {
232: list = (from a in db.Accesses
233: join eo in db.EmsOnts on a equals eo.Access
234: join ed in db.EmsDevs on eo.NAME equals ed.DEVIP into gj
235: from sgj in gj.DefaultIfEmpty()
236: where eo.EQUIPMENTID == "5616" || eo.EQUIPMENTID == "5878"
237: select a).ToList(); //.Include(x => x.EmsDev).ToList();
238: /*
239: select a.Id, eo.NAME, eo.ALIAS, eo.EQUIPMENTID, ed.DEVIP, ed.DEV from Accesses a
240: inner join EmsOnts eo on a.Id = eo.Access_Id
241: left outer join EmsDevs ed on ed.DEVIP = eo.NAME
242: where eo.EQUIPMENTID = '5616' or eo.EQUIPMENTID = '5878'
243: */
244: }
245:
246: return list;
247: }
248:
249: ////////////////////////////////////////////////////////////////////////////
250:
251: /// <summary>
252: ///
253: /// </summary>
254: public static string[] ListOfHuaweiOntThatWereIntiallyInstalledAndProvisionedWithNokiaMgcIp10_16_5_37BeforeNewMgcIpToCableDistributionAgreement
255: {
256: get
257: {
258: if (list == null || list.Length == 0)
259: {
260: list = new string[] { "SAA.501.2","SAA.501.10","SAA.501.11","SAA.501.13","SAA.501.19","SAA.501.20","SAA.501.21","SAA.501.22","SAA.502.1","SAA.502.7","SAA.502.8","SAA.502.11","SAA.502.12","SAA.502.14","SAA.502.16","SAA.502.18","SAA.502.19","SAA.502.22","SAA.503.1","SAA.503.2","SAA.504.4","SAA.504.6","SAA.504.10","SAA.504.11","SAA.504.12","SAA.504.13","SAA.504.15","SAA.504.17","SAA.504.18","SAA.504.24","SAA.505.2","SAA.506.8","SAA.506.10","SAA.506.16","SAA.506.18","SAA.507.16","SAA.508.3","SAA.508.8","SAA.508.16","SAA.508.17","SAA.508.18","SAA.508.20","SAA.508.21","SAA.509.5","SAA.509.7","SAA.509.8","SAA.509.12","SAA.509.13","SAA.509.14","SAA.509.17","SAA.509.19","SAA.509.20","SAA.510.4","SAA.510.5","SAA.510.14","SAA.511.3","SAA.511.4","SAA.511.9","SAA.511.10","SAA.511.13","SAA.511.16","SAA.512.2","SAA.512.13","SAA.512.14","SAA.512.15","SAA.514.1","SAA.514.2","SAA.514.5","SAA.514.6","SAA.514.8","SAA.514.11","SAA.514.12","SAA.514.13","SAA.514.14","SAA.514.15","SAA.514.16","SAA.514.22","SAA.517.7","SAA.517.8","SAA.517.9","SAA.517.10","SAA.517.12","SAA.517.15","SAA.517.16","SAA.518.2","SAA.518.3","SAA.518.5","SAA.518.11","SAA.518.14","SAA.518.16","SAA.519.1","SAA.519.2","SAA.519.6","SAA.519.10","SAA.519.15","SAA.519.16","SAA.519.17","SAA.519.18","SAA.519.23","SAA.521.4","SAA.521.10",
261: "SAA.521.20","SAA.521.23","SAA.522.1","SAA.522.6","SAA.522.9","SAA.522.10","SAA.522.11","SAA.522.13","SAA.522.16","SAA.523.1","SAA.523.2","SAA.523.3","SAA.523.5","SAA.523.7","SAA.523.9","SAA.523.10","SAA.523.12","SAA.523.13","SAA.523.14","SAA.523.15","SAA.523.16","SAA.523.18","SAA.523.19","SAA.524.1","SAA.524.3","SAA.524.6","SAA.524.8","SAA.524.9","SAA.524.10","SAA.524.11","SAA.524.12","SAA.524.14","SAA.524.17","SAA.524.18","SAA.528.3","SAA.528.5","SAA.528.6","SAA.528.7","SAA.528.10","SAA.528.11","SAA.528.15","SAA.528.17","SAA.528.19","SAA.528.20","SAA.528.21","SAA.530.1","SAA.530.5","SAA.530.6","SAA.530.7","SAA.530.8","SAA.530.9","SAA.530.10","SAA.530.11","SAA.530.12","SAA.530.13","SAA.530.16","SAA.530.17","SAA.530.19","SAA.531.1","SAA.531.4","SAA.531.6","SAA.531.7","SAA.531.15","SAA.531.17","SAA.531.19","SAA.531.20","SAA.531.22","SAA.531.23","SAA.533.2","SAA.533.8","SAA.533.9","SAA.533.17","SAA.533.19","SAA.533.20","SAA.533.21","SAA.533.23","SAA.534.1","SAA.534.2","SAA.534.3","SAA.534.4","SAA.534.10","SAA.534.12","SAA.534.18","SAA.534.20","SAA.534.21","SAA.535.1","SAA.535.15","SAA.535.16","SAA.535.17","SAA.535.18",
262: "SAA.536.1","SAA.536.2","SAA.536.3","SAA.536.4","SAA.536.6","SAA.536.9","SAA.536.13","SAA.536.15","SAA.537.1","SAA.537.4","SAA.537.6","SAA.537.7","SAA.537.8","SAA.537.9","SAA.537.10","SAA.537.13","SAA.537.14","SAA.537.15","SAA.537.16","SAA.537.22","SAA.538.1","SAA.538.4","SAA.538.9","SAA.538.10","SAA.538.14","SAA.538.15","SAA.538.17","SAA.538.18","SAA.538.19","SAA.539.2","SAA.539.3","SAA.539.5","SAA.539.6","SAA.539.7","SAA.539.8","SAA.539.9","SAA.539.18","SAA.539.19","SAA.539.20","SAA.541.2","SAA.541.6","SAA.541.7","SAA.541.9","SAA.541.10","SAA.541.13","SAA.541.15","SAA.541.21","SAA.541.23","SAA.541.24","SAA.542.1","SAA.542.3","SAA.542.6","SAA.542.7","SAA.542.8","SAA.542.9","SAA.542.21","SAA.543.5","SAA.543.9","SAA.543.10","SAA.543.16","SAA.544.4","SAA.544.10","SAA.544.11","SAA.544.12","SAA.544.15","SAA.544.22","SAA.544.23","SAA.545.9","SAA.701.1","SAA.701.2","SAA.701.3","SAA.701.4","SAA.701.5","SAA.701.6","SAA.701.7","SAA.701.9","SAA.701.10","SAA.701.11","SAA.701.13","SAA.701.14","SAA.701.15","SAA.701.16","SAA.701.17","SAA.702.1","SAA.702.2","SAA.702.3","SAA.702.4","SAA.702.5","SAA.702.8","SAA.702.9","SAA.702.10","SAA.702.12","SAA.702.14","SAA.702.16","SAA.702.17","SAA.702.21","SAA.702.22","SAA.702.23","SAA.702.24","SAA.703.2","SAA.703.3","SAA.703.11","SAA.703.14","SAA.703.15",
263: "SAA.703.17","SAA.703.19","SAA.703.20","SAA.703.23","SAA.704.3","SAA.704.4","SAA.704.6","SAA.704.7","SAA.704.9","SAA.704.10","SAA.704.13","SAA.704.15","SAA.704.16","SAA.704.17","SAA.704.18","SAA.706.5","SAA.706.6","SAA.706.7","SAA.706.8","SAA.706.11","SAA.706.12","SAA.706.15","SAA.706.16","SAA.706.17","SAA.706.20","SAA.706.21","SAA.706.23","SAA.706.24","SAA.707.2","SAA.707.5","SAA.707.7","SAA.707.10","SAA.707.12","SAA.707.13","SAA.707.15","SAA.707.17","SAA.707.19","SAA.707.20","SAA.707.21","SAA.707.22","SAA.709.1","SAA.709.3","SAA.709.7","SAA.709.8","SAA.709.14","SAA.709.15","SAA.709.18","SAA.709.19","SAA.709.23","SAA.709.24","SAA.710.3","SAA.710.4","SAA.710.12","SAA.710.15","SAA.710.16","SAA.710.19","SAA.710.21","SAA.710.22","SAA.710.24","SAA.711.1","SAA.711.3","SAA.711.5","SAA.711.9","SAA.711.11","SAA.711.12","SAA.711.13","SAA.711.14","SAA.711.16","SAA.711.18","SAA.711.19","SAA.711.20","SAA.711.23","SAA.711.24","SAA.712.2","SAA.712.3","SAA.712.4","SAA.712.6","SAA.712.7","SAA.712.9","SAA.712.12",
264: "SAA.712.16","SAA.712.18","SAA.712.19","SAA.712.20","SAA.712.21","SAA.712.26","SAA.712.27","SAA.714.2","SAA.714.3","SAA.714.8","SAA.714.11","SAA.715.5","SAA.715.7","SAA.715.8","SAA.715.9","SAA.715.10","SAA.715.11","SAA.715.12","SAA.715.15","SAA.715.18","SAA.715.19","SAA.716.2","SAA.716.3","SAA.716.4","SAA.716.6","SAA.716.8","SAA.716.11","SAA.716.12","SAA.716.15","SAA.716.17","SAA.716.20","SAA.716.21","SAA.717.3","SAA.717.5","SAA.717.7","SAA.717.10","SAA.717.13","SAA.717.14","SAA.717.15","SAA.717.18","SAA.717.20","SAA.717.21","SAA.717.22","SAA.718.1","SAA.718.2","SAA.718.3","SAA.718.5","SAA.718.6","SAA.718.7","SAA.718.11","SAA.718.22","SAA.718.23","SAA.718.24","SAA.718.25","SAA.719.2","SAA.719.4","SAA.719.8","SAA.719.9","SAA.719.10","SAA.719.11","SAA.719.12","SAA.719.14","SAA.719.17","SAA.719.20","SAA.719.23","SAA.720.3","SAA.720.4","SAA.720.6","SAA.720.7","SAA.720.10","SAA.720.13","SAA.720.14","SAA.721.2","SAA.721.3","SAA.721.4","SAA.721.7","SAA.721.8","SAA.721.10","SAA.721.11","SAA.721.12","SAA.721.13","SAA.721.14","SAA.721.18","SAA.721.19","SAA.721.20","SAA.721.23","SAA.722.11","SAA.722.12","SAA.722.13","SAA.722.16","SAA.722.17","SAA.722.18","SAA.722.19","SAA.722.22","SAA.722.24","SAA.723.2","SAA.723.3","SAA.723.4","SAA.723.7","SAA.723.9","SAA.723.13","SAA.723.15","SAA.723.17",
265: "SAA.723.19","SAA.723.20","SAA.723.22","SAA.723.23","SAA.724.5","SAA.724.6","SAA.724.8","SAA.724.11","SAA.724.14","SAA.724.15","SAA.724.16","SAA.724.17","SAA.724.18","SAA.726.2","SAA.726.7","SAA.726.8","SAA.726.9","SAA.726.10","SAA.726.11","SAA.726.12","SAA.726.13","SAA.726.14","SAA.726.17","SAA.726.20","SAA.726.21","SAA.726.22","SAA.726.23","SAA.729.2","SAA.729.3","SAA.729.4","SAA.729.5","SAA.729.6","SAA.729.10","SAA.729.11","SAA.729.14","SAA.729.17","SAA.729.18","SAA.729.19","SAA.729.20","SAA.729.21","SAA.730.4","SAA.730.5","SAA.730.8","SAA.730.9","SAA.730.11","SAA.730.12","SAA.730.13","SAA.730.14","SAA.730.22","SAA.733.2","SAA.733.3","SAA.733.5","SAA.733.6","SAA.733.9","SAA.733.10","SAA.734.1","SAA.734.2","SAA.734.3","SAA.734.4","SAA.734.5","SAA.734.6","SAA.734.7","SAA.734.11","SAA.734.12","SAA.734.13","SAA.734.15","SAA.734.17","SAA.734.19","SAA.734.20","SAA.735.7","SAA.735.8","SAA.735.10","SAA.735.12","SAA.735.14","SAA.735.19","SAA.735.22","SAA.736.3","SAA.736.4","SAA.736.7","SAA.736.8","SAA.736.9","SAA.736.10","SAA.736.17","SAA.736.18","SAA.736.21","SAA.736.22","SAA.736.23","SAA.737.5","SAA.737.6","SAA.737.8",
266: "SAA.737.11","SAA.737.13","SAA.737.15","SAA.737.16","SAA.737.18","SAA.738.4","SAA.738.7","SAA.738.8","SAA.738.11","SAA.738.13","SAA.738.14","SAA.738.16","SAA.738.18","SAA.739.1","SAA.739.2","SAA.739.3","SAA.739.13","SAA.739.14","SAA.739.15","SAA.739.18","SAA.739.19","SAA.739.20","SAA.740.7","SAA.740.20","SAA.742.2","SAA.742.3","SAA.742.5","SAA.742.6","SAA.742.7","SAA.742.11","SAA.742.12","SAA.742.14","SAA.742.15","SAA.742.17","SAA.742.18","SAA.742.20","SAA.742.21","SAA.742.23","SAA.742.25","SAA.743.4","SAA.743.7","SAA.743.9","SAA.743.10","SAA.743.13","SAA.743.16","SAA.743.19","SAA.743.21","SAA.743.22","SAA.743.23","SAA.743.24","SAA.744.5","SAA.744.6","SAA.744.7","SAA.744.22","SAA.745.12","SAA.746.12","SAA.747.2","SAA.747.4","SAA.750.1","SAA.750.6","SAA.750.7","SAA.750.12","SAA.750.16","SAA.750.19","SAA.750.20","SAA.750.26","SAA.751.1","SAA.751.2","SAA.751.3","SAA.751.7","SAA.751.8","SAA.751.13","SAA.751.16","SAA.751.17","SAA.751.18","SAA.751.22","SAA.752.1","SAA.752.3","SAA.752.5","SAA.752.11","SAA.752.13","SAA.752.14","SAA.752.15","SAA.752.17","SAA.752.18","SAA.752.21","SAA.802.6","SAA.802.8","SAA.802.10","SAA.802.11","SAA.802.12","SAA.802.13","SAA.802.16","SAA.802.17","SAA.802.20","SAA.804.3","SAA.804.4","SAA.804.5","SAA.804.6","SAA.804.11","SAA.805.21","SAA.806.24","SAA.807.1",
267: "SAA.807.7","SAA.807.16","SAA.807.17","SAA.807.20","SAA.808.2","SAA.808.4","SAA.808.5","SAA.808.8","SAA.808.9","SAA.808.13","SAA.811.3","SAA.813.1","SAA.813.3","SAA.813.4","SAA.813.5","SAA.813.10","SAA.813.12","SAA.813.15","SAA.813.16","SAA.814.2","SAA.814.3","SAA.814.5","SAA.814.9","SAA.814.11","SAA.814.16","SAA.814.18","SAA.814.19","SAA.814.23","SAA.814.24","SAA.815.1","SAA.815.2","SAA.815.7","SAA.815.9","SAA.815.10","SAA.815.11","SAA.815.12","SAA.815.13","SAA.815.14","SAA.815.15","SAA.815.16","SAA.815.18","SAA.815.19","SAA.815.20","SAA.815.21","SAA.815.26","SAA.819.1","SAA.819.2","SAA.819.4","SAA.819.5","SAA.819.6","SAA.819.8","SAA.819.13","SAA.819.17","SAA.822.9","SAA.826.18","SAA.827.13","SAA.827.14","SAA.837.21","SAA.846.4","SAA.846.10"
268: };
269: }
270:
271: return list;
272: }
273: }
274:
275: ////////////////////////////////////////////////////////////////////////////
276: ////////////////////////////////////////////////////////////////////////////
277: }
278:
279: ////////////////////////////////////////////////////////////////////////////
280: ////////////////////////////////////////////////////////////////////////////
281: }