datex.js 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/datex.min.js +3 -3
- package/index.html +16 -0
- package/package.json +1 -1
- package/src/datex.js +26 -43
- package/static/image/bg.svg +53 -53
package/README.md
CHANGED
package/dist/datex.min.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* datex v1.0.
|
|
2
|
+
* datex.js v1.0.1
|
|
3
3
|
* a datetime format library
|
|
4
4
|
* https://passer-by.com/datex/
|
|
5
5
|
*
|
|
@@ -8,6 +8,6 @@
|
|
|
8
8
|
* Released under the MIT License
|
|
9
9
|
* https://github.com/mumuy/datex
|
|
10
10
|
*
|
|
11
|
-
* Created on: 2023-04-
|
|
11
|
+
* Created on: 2023-04-13
|
|
12
12
|
*/
|
|
13
|
-
!function(e
|
|
13
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).datex=e()}(this,(function(){"use strict";let t={"en-US":{MMM:["Jan.","Feb.","Mar.","Apr.","May.","Jun.","Jul.","Aug.","Sept.","Oct.","Nov.","Dec."],MMMM:["January","February","March","April","May","June","July","August","September","October","November","December"],Do:["1st","2nd","3rd","4th","5th","6th","7th","8th","9th","10th","11th","12th","13th","14th","15th","16th","17th","18th","19th","20th","21st","22nd","23rd","24th","25th","26th","27th","28th","29th","30th","31st"],W:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],w:["Sun.","Mon.","Tues.","Wed.","Thur.","Fri.","Sat."]},"zh-CN":{MMM:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],MMMM:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],Do:["1日","2日","3日","4日","5日","6日","7日","8日","9日","10日","11日","12日","13日","14日","15日","16日","17日","18日","19日","20日","21日","22日","23日","24日","25日","26日","27日","28日","29日","30日","31日"],W:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],w:["周日","周一","周二","周三","周四","周五","周六"]}},e=t["en-US"];"undefined"!=typeof self&&self.navigator&&(e=t[self.navigator.language]);const n=["year","month","day","hour","minute","second","millsecond"];function i(){return new i.prototype.init(...arguments)}function r(t){return t instanceof i?t:i(t)}return i.prototype={_date:null,init:function(){return arguments.length>=3&&arguments[1]--,this._date=new Date(...arguments),this},getTime(){return this._date.getTime()},getUnix(){return~~(this._date.getTime()/1e3)},clone(){return i(this.getTime())},toDate(){return this._date},toObject(){let t=this._date;return{year:t.getFullYear(),month:t.getMonth()+1,day:t.getDate(),hour:t.getHours(),minute:t.getMinutes(),second:t.getSeconds(),millsecond:t.getMilliseconds(),timestamp:t.getTime(),week:t.getDay()}},toArray(){let t=this.toObject();return n.map((e=>t[e]))},toString(){return this._date.toString()},toISOString(){return this._date.toISOString()},set(t,e){let n=this._date,i=this.toObject();switch(t){case"year":n.setFullYear(e);break;case"month":n.setMonth(e-1);break;case"day":n.setDate(e);break;case"hour":n.setHours(e);break;case"minute":n.setMinutes(e);break;case"second":n.setSeconds(e);break;case"millsecond":n.setMilliseconds(e);break;case"timestamp":n.setTime(e);break;case"week":n.setDate(i.day-i.week+e)}return this},get(t){return this.toObject()[t]},change(t,e){let n=this.toObject();return this.set(t,n[t]+e)},format(t="YYYY-MM-DD HH:mm:ss"){let n=this._date,i=this.toObject(),r=n.toTimeString().match(/GMT([\+\-])(\d{2})(\d{2})/),s={YYYY:""+i.year,YY:(""+i.year).padStart(2,"0"),MM:(""+i.month).padStart(2,"0"),M:""+i.month,DD:(""+i.day).padStart(2,"0"),D:""+i.day,HH:(""+i.hour).padStart(2,"0"),H:""+i.hour,hh:(""+i.hour%12).padStart(2,"0"),h:""+i.hour%12,mm:(""+i.minute).padStart(2,"0"),m:""+i.minute,ss:(""+i.second).padStart(2,"0"),s:""+i.second,S:""+~~(i.millsecond%1e3/100),SS:""+~~(i.millsecond%1e3/10),SSS:""+i.millsecond%1e3,Z:r[1]+r[2]+":"+r[3],ZZ:r[1]+r[2]+r[3],A:["AM","PM"][~~(i.hour/12)],a:["am","pm"][~~(i.hour/12)],X:~~(i.timestamp/1e3),x:i.timestamp,Q:""+~~(i.month/3)};return s.MMM=e.MMM[i.month-1],s.MMMM=e.MMMM[i.month-1],s.Do=e.Do[i.day-1],s.W=e.W[i.week],s.w=e.w[i.week],t.replace(/Y+|M+|D+|H+|h+|m+|s+|S+|Z+|Do|A|a|X|x|Q|W|w/g,(function(t){return s[t]||""}))},startOf(t){let e=this.toObject(),r=null,s=n.indexOf(t)+1,a=this.toArray(),h=[1970,1,1,0,0,0,0].slice(s);return a.splice(s,h.length,...h),r="timestamp"==t?this.clone():"week"==t?i(e.year,e.month,e.day-e.week,0,0,0,0):i(...a),r},endOf(t){return this.startOf(t).change(t,"week"==t?7:1).change("millsecond",-1)},diffWith(t,e){if(!(t=r(t)).isValid())return!1;let i={day:864e5,hour:36e5,minute:6e4,second:1e3,millsecond:1,timestamp:1},s=this.getTime()-t.getTime(),a=0;if(e){if(i[e])a=~~(s/i[e]);else if("month"==e){a=12*(this.get("year")-1)+this.get("month")-(12*(t.get("year")-1)+t.get("month")),a<0&&this.get("day")>t.get("day")?a+=1:a>0&&this.get("day")<t.get("day")&&(a-=1)}else"year"==e&&(a=this.get("year")-t.get("year"),a<0&&(this.get("month")>t.get("month")||this.get("month")==t.get("month")&&this.get("day")>t.get("day"))?a+=1:a>0&&(this.get("month")<t.get("month")||this.get("month")==t.get("month")&&this.get("day")<t.get("day"))&&(a-=1));return a}{let e=this.clone(),i={};return n.forEach((function(n){i[n]=e.diffWith(t,n),e.set(n,t.get(n))})),i}},isBefore(t,e="timestamp"){return t=r(t),this.get(e)<t.get(e)},isAfter(t,e="timestamp"){return t=r(t),this.get(e)>t.get(e)},isSame(t,e="timestamp"){return t=r(t),this.get(e)==t.get(e)},isBetween(t,e,n="timestamp"){return t=r(t),e=r(e),this.get(n)>t.get(n)&&this.get(n)<e.get(n)},isValid(){return!isNaN(this.getTime())}},i.prototype.init.prototype=i.prototype,i}));
|
package/index.html
CHANGED
|
@@ -143,6 +143,12 @@
|
|
|
143
143
|
<span class="subtitle">isBetween</span>
|
|
144
144
|
</a>
|
|
145
145
|
</li>
|
|
146
|
+
<li>
|
|
147
|
+
<a href="#has20">
|
|
148
|
+
<span class="title">是否为有效对象</span>
|
|
149
|
+
<span class="subtitle">isValid</span>
|
|
150
|
+
</a>
|
|
151
|
+
</li>
|
|
146
152
|
</ul>
|
|
147
153
|
</div>
|
|
148
154
|
</div>
|
|
@@ -977,6 +983,16 @@
|
|
|
977
983
|
</table>
|
|
978
984
|
</div>
|
|
979
985
|
</div>
|
|
986
|
+
<div id="hash20" class="box">
|
|
987
|
+
<div class="c-hd">
|
|
988
|
+
<p class="title">是否为有效对象</p>
|
|
989
|
+
<p class="subtitle">isValid()</p>
|
|
990
|
+
</div>
|
|
991
|
+
<div class="c-bd">
|
|
992
|
+
<p>运行:datex('2008-13-12').isValid()</p>
|
|
993
|
+
<p>返回:false</p>
|
|
994
|
+
</div>
|
|
995
|
+
</div>
|
|
980
996
|
</div>
|
|
981
997
|
</div>
|
|
982
998
|
</div>
|
package/package.json
CHANGED
package/src/datex.js
CHANGED
|
@@ -17,15 +17,13 @@ let language = langMap['en-US'];
|
|
|
17
17
|
if(typeof self!='undefined'&&self.navigator){
|
|
18
18
|
language = langMap[self.navigator.language];
|
|
19
19
|
}
|
|
20
|
+
const timeList = ['year','month','day','hour','minute','second','millsecond'];
|
|
20
21
|
|
|
21
22
|
function datex(){
|
|
22
23
|
return new datex.prototype.init(...arguments);
|
|
23
24
|
}
|
|
24
25
|
function getInstance(that){
|
|
25
|
-
|
|
26
|
-
that = datex(that);
|
|
27
|
-
}
|
|
28
|
-
return that;
|
|
26
|
+
return that instanceof datex?that:datex(that);
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
datex.prototype = {
|
|
@@ -65,7 +63,7 @@ datex.prototype = {
|
|
|
65
63
|
},
|
|
66
64
|
toArray(){
|
|
67
65
|
let $ = this.toObject();
|
|
68
|
-
return [
|
|
66
|
+
return timeList.map(name=>$[name]);
|
|
69
67
|
},
|
|
70
68
|
toString(){
|
|
71
69
|
return this._date.toString();
|
|
@@ -102,8 +100,7 @@ datex.prototype = {
|
|
|
102
100
|
_.setTime(value);
|
|
103
101
|
break;
|
|
104
102
|
case 'week':
|
|
105
|
-
|
|
106
|
-
_.setDate($.day-diff);
|
|
103
|
+
_.setDate($.day-$.week+value);
|
|
107
104
|
break;
|
|
108
105
|
}
|
|
109
106
|
return this;
|
|
@@ -158,48 +155,31 @@ datex.prototype = {
|
|
|
158
155
|
startOf(unit){
|
|
159
156
|
let $ = this.toObject();
|
|
160
157
|
let that = null;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
case 'hour':
|
|
172
|
-
that = datex($.year,$.month,$.day,$.hour,0,0,0);
|
|
173
|
-
break;
|
|
174
|
-
case 'minute':
|
|
175
|
-
that = datex($.year,$.month,$.day,$.hour,$.minute,0,0);
|
|
176
|
-
break;
|
|
177
|
-
case 'second':
|
|
178
|
-
that = datex($.year,$.month,$.day,$.hour,$.minute,$.second,0);
|
|
179
|
-
break;
|
|
180
|
-
case 'millsecond':
|
|
181
|
-
case 'timestamp':
|
|
182
|
-
that = this.clone();
|
|
183
|
-
break;
|
|
184
|
-
case 'week':
|
|
185
|
-
that = datex($.year,$.month,$.day-$.week,0,0,0,0);
|
|
186
|
-
break;
|
|
158
|
+
let index = timeList.indexOf(unit)+1;
|
|
159
|
+
let dateSet = this.toArray();
|
|
160
|
+
let initSet = [1970,1,1,0,0,0,0].slice(index);
|
|
161
|
+
dateSet.splice(index,initSet.length,...initSet);
|
|
162
|
+
if(unit=='timestamp'){
|
|
163
|
+
that = this.clone();
|
|
164
|
+
}else if(unit=='week'){
|
|
165
|
+
that = datex($.year,$.month,$.day-$.week,0,0,0,0);
|
|
166
|
+
}else{
|
|
167
|
+
that = datex(...dateSet);
|
|
187
168
|
}
|
|
188
169
|
return that;
|
|
189
170
|
},
|
|
190
171
|
endOf(unit){
|
|
191
|
-
let $ = this.toObject();
|
|
192
172
|
return this.startOf(unit).change(unit,unit=='week'?7:1).change('millsecond',-1);
|
|
193
173
|
},
|
|
194
174
|
diffWith(that,unit){
|
|
195
175
|
that = getInstance(that);
|
|
196
|
-
if(
|
|
176
|
+
if(!that.isValid()){
|
|
197
177
|
return false;
|
|
198
178
|
}
|
|
199
179
|
let diffMap = {
|
|
200
|
-
'day':
|
|
201
|
-
'hour':
|
|
202
|
-
'minute':
|
|
180
|
+
'day':8.64e7,
|
|
181
|
+
'hour':3.6e6,
|
|
182
|
+
'minute':6e4,
|
|
203
183
|
'second':1000,
|
|
204
184
|
'millsecond':1,
|
|
205
185
|
'timestamp':1
|
|
@@ -230,29 +210,32 @@ datex.prototype = {
|
|
|
230
210
|
}else{
|
|
231
211
|
let clone = this.clone();
|
|
232
212
|
let hash = {};
|
|
233
|
-
|
|
213
|
+
timeList.forEach(function(unit){
|
|
234
214
|
hash[unit] = clone.diffWith(that,unit);
|
|
235
215
|
clone.set(unit,that.get(unit));
|
|
236
216
|
});
|
|
237
217
|
return hash;
|
|
238
218
|
}
|
|
239
219
|
},
|
|
240
|
-
isBefore(that,unit = '
|
|
220
|
+
isBefore(that,unit = 'timestamp'){
|
|
241
221
|
that = getInstance(that);
|
|
242
222
|
return this.get(unit)<that.get(unit);
|
|
243
223
|
},
|
|
244
|
-
isAfter(that,unit = '
|
|
224
|
+
isAfter(that,unit = 'timestamp'){
|
|
245
225
|
that = getInstance(that);
|
|
246
226
|
return this.get(unit)>that.get(unit);
|
|
247
227
|
},
|
|
248
|
-
isSame(that,unit = '
|
|
228
|
+
isSame(that,unit = 'timestamp'){
|
|
249
229
|
that = getInstance(that);
|
|
250
230
|
return this.get(unit)==that.get(unit);
|
|
251
231
|
},
|
|
252
|
-
isBetween(startDate,endDate,unit = '
|
|
232
|
+
isBetween(startDate,endDate,unit = 'timestamp'){
|
|
253
233
|
startDate = getInstance(startDate);
|
|
254
234
|
endDate = getInstance(endDate);
|
|
255
235
|
return this.get(unit)>startDate.get(unit)&&this.get(unit)<endDate.get(unit);
|
|
236
|
+
},
|
|
237
|
+
isValid(){
|
|
238
|
+
return !isNaN(this.getTime());
|
|
256
239
|
}
|
|
257
240
|
};
|
|
258
241
|
datex.prototype.init.prototype = datex.prototype;
|
package/static/image/bg.svg
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<svg width="1440px" height="448px" viewBox="0 0 1440 448" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
-
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
|
|
4
|
-
<title>编组 5备份</title>
|
|
5
|
-
<desc>Created with Sketch.</desc>
|
|
6
|
-
<defs>
|
|
7
|
-
<linearGradient x1="-5.68700053%" y1="45.5298642%" x2="84.7892757%" y2="53.934985%" id="linearGradient-1">
|
|
8
|
-
<stop stop-color="#FBFCFD" offset="0%"></stop>
|
|
9
|
-
<stop stop-color="#F8FCFF" offset="100%"></stop>
|
|
10
|
-
</linearGradient>
|
|
11
|
-
<radialGradient cx="49.4552285%" cy="50%" fx="49.4552285%" fy="50%" r="94.8348304%" gradientTransform="translate(0.494552,0.500000),scale(0.311111,1.000000),rotate(90.000000),translate(-0.494552,-0.500000)" id="radialGradient-2">
|
|
12
|
-
<stop stop-color="#FFFFFF" stop-opacity="0.5" offset="0%"></stop>
|
|
13
|
-
<stop stop-color="#EDF6FF" stop-opacity="0.578179633" offset="100%"></stop>
|
|
14
|
-
</radialGradient>
|
|
15
|
-
<rect id="path-3" x="0" y="0" width="1440" height="448"></rect>
|
|
16
|
-
<linearGradient x1="72.8463444%" y1="12.5451885%" x2="72.8463444%" y2="295.836589%" id="linearGradient-5">
|
|
17
|
-
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
|
|
18
|
-
<stop stop-color="#9FD7FF" stop-opacity="0.383058348" offset="100%"></stop>
|
|
19
|
-
</linearGradient>
|
|
20
|
-
<linearGradient x1="16.6159843%" y1="49.1386719%" x2="5.85340543%" y2="50.8613281%" id="linearGradient-6">
|
|
21
|
-
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
|
|
22
|
-
<stop stop-color="#F2F7FC" offset="100%"></stop>
|
|
23
|
-
</linearGradient>
|
|
24
|
-
<rect id="path-7" x="0" y="259" width="1440" height="189"></rect>
|
|
25
|
-
<linearGradient x1="54.7550093%" y1="16.6478641%" x2="54.7550093%" y2="112.331979%" id="linearGradient-8">
|
|
26
|
-
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
|
|
27
|
-
<stop stop-color="#D2ECFF" stop-opacity="0.225387893" offset="100%"></stop>
|
|
28
|
-
</linearGradient>
|
|
29
|
-
</defs>
|
|
30
|
-
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
31
|
-
<g id="导航方案备份">
|
|
32
|
-
<g id="编组-5备份">
|
|
33
|
-
<g id="路径备份">
|
|
34
|
-
<g id="蒙版">
|
|
35
|
-
<g transform="translate(0.000000, 0.000000)">
|
|
36
|
-
<mask id="mask-4" fill="white">
|
|
37
|
-
<use xlink:href="#path-3"></use>
|
|
38
|
-
</mask>
|
|
39
|
-
<g>
|
|
40
|
-
<use fill="url(#linearGradient-1)" xlink:href="#path-3"></use>
|
|
41
|
-
<use fill="url(#radialGradient-2)" xlink:href="#path-3"></use>
|
|
42
|
-
</g>
|
|
43
|
-
<g id="矩形备份-32" mask="url(#mask-4)">
|
|
44
|
-
<use fill="url(#linearGradient-5)" xlink:href="#path-7"></use>
|
|
45
|
-
<use fill="url(#linearGradient-6)" xlink:href="#path-7"></use>
|
|
46
|
-
</g>
|
|
47
|
-
<rect id="矩形" fill="url(#linearGradient-8)" mask="url(#mask-4)" x="0" y="166" width="1440" height="282"></rect>
|
|
48
|
-
</g>
|
|
49
|
-
</g>
|
|
50
|
-
</g>
|
|
51
|
-
</g>
|
|
52
|
-
</g>
|
|
53
|
-
</g>
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="1440px" height="448px" viewBox="0 0 1440 448" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
+
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
|
|
4
|
+
<title>编组 5备份</title>
|
|
5
|
+
<desc>Created with Sketch.</desc>
|
|
6
|
+
<defs>
|
|
7
|
+
<linearGradient x1="-5.68700053%" y1="45.5298642%" x2="84.7892757%" y2="53.934985%" id="linearGradient-1">
|
|
8
|
+
<stop stop-color="#FBFCFD" offset="0%"></stop>
|
|
9
|
+
<stop stop-color="#F8FCFF" offset="100%"></stop>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
<radialGradient cx="49.4552285%" cy="50%" fx="49.4552285%" fy="50%" r="94.8348304%" gradientTransform="translate(0.494552,0.500000),scale(0.311111,1.000000),rotate(90.000000),translate(-0.494552,-0.500000)" id="radialGradient-2">
|
|
12
|
+
<stop stop-color="#FFFFFF" stop-opacity="0.5" offset="0%"></stop>
|
|
13
|
+
<stop stop-color="#EDF6FF" stop-opacity="0.578179633" offset="100%"></stop>
|
|
14
|
+
</radialGradient>
|
|
15
|
+
<rect id="path-3" x="0" y="0" width="1440" height="448"></rect>
|
|
16
|
+
<linearGradient x1="72.8463444%" y1="12.5451885%" x2="72.8463444%" y2="295.836589%" id="linearGradient-5">
|
|
17
|
+
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
|
|
18
|
+
<stop stop-color="#9FD7FF" stop-opacity="0.383058348" offset="100%"></stop>
|
|
19
|
+
</linearGradient>
|
|
20
|
+
<linearGradient x1="16.6159843%" y1="49.1386719%" x2="5.85340543%" y2="50.8613281%" id="linearGradient-6">
|
|
21
|
+
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
|
|
22
|
+
<stop stop-color="#F2F7FC" offset="100%"></stop>
|
|
23
|
+
</linearGradient>
|
|
24
|
+
<rect id="path-7" x="0" y="259" width="1440" height="189"></rect>
|
|
25
|
+
<linearGradient x1="54.7550093%" y1="16.6478641%" x2="54.7550093%" y2="112.331979%" id="linearGradient-8">
|
|
26
|
+
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
|
|
27
|
+
<stop stop-color="#D2ECFF" stop-opacity="0.225387893" offset="100%"></stop>
|
|
28
|
+
</linearGradient>
|
|
29
|
+
</defs>
|
|
30
|
+
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
|
31
|
+
<g id="导航方案备份">
|
|
32
|
+
<g id="编组-5备份">
|
|
33
|
+
<g id="路径备份">
|
|
34
|
+
<g id="蒙版">
|
|
35
|
+
<g transform="translate(0.000000, 0.000000)">
|
|
36
|
+
<mask id="mask-4" fill="white">
|
|
37
|
+
<use xlink:href="#path-3"></use>
|
|
38
|
+
</mask>
|
|
39
|
+
<g>
|
|
40
|
+
<use fill="url(#linearGradient-1)" xlink:href="#path-3"></use>
|
|
41
|
+
<use fill="url(#radialGradient-2)" xlink:href="#path-3"></use>
|
|
42
|
+
</g>
|
|
43
|
+
<g id="矩形备份-32" mask="url(#mask-4)">
|
|
44
|
+
<use fill="url(#linearGradient-5)" xlink:href="#path-7"></use>
|
|
45
|
+
<use fill="url(#linearGradient-6)" xlink:href="#path-7"></use>
|
|
46
|
+
</g>
|
|
47
|
+
<rect id="矩形" fill="url(#linearGradient-8)" mask="url(#mask-4)" x="0" y="166" width="1440" height="282"></rect>
|
|
48
|
+
</g>
|
|
49
|
+
</g>
|
|
50
|
+
</g>
|
|
51
|
+
</g>
|
|
52
|
+
</g>
|
|
53
|
+
</g>
|
|
54
54
|
</svg>
|