@alipay-inc/mpaas-ide-openapi-common 1.0.0-beta.15 → 1.0.0-beta.16
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/dist/cloudBuild.js +3 -3
- package/dist/index.js +4 -3
- package/package.json +2 -2
package/dist/cloudBuild.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
return c?{type:"private",CLOUD_BUILD_EXEC_URL:"".concat(c,"/miniApp/buildIdeMiniApp"),CLOUD_BUILD_POLL_URL:"".concat(c,"/miniApp/queryMiniAppBuildResult")}:{type:"alipay",CLOUD_BUILD_EXEC_URL:"https://hpmweb.alipay.com/tinyApp/cloudBuild/execute",CLOUD_BUILD_POLL_URL:"https://hpmweb.alipay.com/tinyApp/cloudBuild/result"};// 无build_url,则继续使用alipay云构建
|
|
3
3
|
};exports.getCloudBuildData=getCloudBuildData;// 云构建
|
|
4
4
|
var cloudBuild=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:if(a.prev=0,c=b.file,d=b.config,_fsExtra["default"].existsSync(c)){a.next=4;break}throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728\uFF01");case 4:if(e=getCloudBuildData(d),"private"!==e.type){a.next=9;break}return a.next=8,cloudBuildPrivate(b);case 8:return a.abrupt("return",a.sent);case 9:return a.next=11,cloudBuildAlipay(b);case 11:return a.abrupt("return",a.sent);case 14:throw a.prev=14,a.t0=a["catch"](0),new Error(a.t0.message);case 17:case"end":return a.stop();}},a,null,[[0,14]])}));return function(){return a.apply(this,arguments)}}();// alipay 构建
|
|
5
|
-
exports.cloudBuild=cloudBuild;var cloudBuildAlipay=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.prev=0,(0,_.logger)("cloudBuild: alipay"),c=b.file,d=b.config,e=void 0===d?{}:d,f=b.adaptorId,g=void 0===f?"mPaaS":f,h=e.appId,
|
|
5
|
+
exports.cloudBuild=cloudBuild;var cloudBuildAlipay=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.prev=0,(0,_.logger)("cloudBuild: alipay"),c=b.file,d=b.config,e=void 0===d?{}:d,f=b.adaptorId,g=void 0===f?"mPaaS":f,h=b.h5Id,i=e.appId,j=getCloudBuildData(e),k=j.CLOUD_BUILD_EXEC_URL,l=j.CLOUD_BUILD_POLL_URL,m={params:"[\"--scriptName\",\"buildpack\",\"--ADAPTOR_NAME\",\"adaptor-mpaas-".concat(g,"\",\"--limitation\",\"--preview\"]"),env:"{}",operationType:"build",extraInfo:JSON.stringify({appId:i,doneCommand:"pack",client:"IDE",scene:"IDE",fileFormat:"tar"})},(0,_.logger)("uploadBundle start",m),n={value:_fsExtra["default"].readFileSync(c),options:{filename:"".concat(i,".tar"),contentType:"application/zip"}},a.next=10,_superagent["default"].post(k).field(m).attach("file",n.value,n.options);case 10:if(o=a.sent,p=JSON.parse(o.text),p.success){a.next=14;break}throw new Error(p.msg);case 14:return q=p.data.taskId,a.next=17,pollBuildStatusAlipay({CLOUD_BUILD_POLL_URL:l,taskId:q});case 17:return r=a.sent,s=r.data,s=void 0===s?{}:s,t=s.zipFile,a.next=23,remoteFileToLocal({originFile:t,h5Id:h});case 23:return a.abrupt("return",a.sent);case 26:throw a.prev=26,a.t0=a["catch"](0),new Error(a.t0.message);case 29:case"end":return a.stop();}},a,null,[[0,26]])}));return function(){return a.apply(this,arguments)}}();// alipay 查询构建结果
|
|
6
6
|
exports.cloudBuildAlipay=cloudBuildAlipay;var pollBuildStatusAlipay=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return c=b.CLOUD_BUILD_POLL_URL,d=b.taskId,a.prev=1,a.next=4,_superagent["default"].get(c).query({taskId:d});case 4:if(e=a.sent,f=JSON.parse(e.text),f.success){a.next=8;break}throw new Error(f.msg);case 8:if("COMPLETE"!==f.status){a.next=10;break}return a.abrupt("return",f);case 10:;// 构建未完成,轮询查询
|
|
7
7
|
return a.next=13,(0,_.delay)(POLL_DELAY_TIME);case 13:return a.next=15,pollBuildStatusAlipay({CLOUD_BUILD_POLL_URL:c,taskId:d});case 15:return a.abrupt("return",a.sent);case 18:throw a.prev=18,a.t0=a["catch"](1),new Error(a.t0.message);case 21:case"end":return a.stop();}},a,null,[[1,18]])}));return function(){return a.apply(this,arguments)}}();// private 构建
|
|
8
|
-
exports.pollBuildStatusAlipay=pollBuildStatusAlipay;var cloudBuildPrivate=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.prev=0,(0,_.logger)("cloudBuild: private"),c=b.file,d=b.config,e=void 0===d?{}:d,f=e.appId,
|
|
8
|
+
exports.pollBuildStatusAlipay=pollBuildStatusAlipay;var cloudBuildPrivate=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.prev=0,(0,_.logger)("cloudBuild: private"),c=b.file,d=b.config,e=void 0===d?{}:d,f=b.h5Id,g=e.appId,h=e.workspaceId,i=e.tenantId,j=getCloudBuildData(e),k=j.CLOUD_BUILD_EXEC_URL,l=j.CLOUD_BUILD_POLL_URL,m={value:_fsExtra["default"].readFileSync(c),options:{filename:"".concat(g,".tar"),contentType:"application/zip"}},a.next=8,_superagent["default"].post(k).field({appId:g,workspaceId:h,tenantId:i}).attach("file",m.value,m.options);case 8:return n=a.sent,o=JSON.parse(n.text),a.next=12,pollBuildStatusPrivate({CLOUD_BUILD_POLL_URL:l,buildId:o.data});case 12:return p=a.sent,q=p.data.downloadUrl,a.next=16,remoteFileToLocal({originFile:q,h5Id:f});case 16:return a.abrupt("return",a.sent);case 19:throw a.prev=19,a.t0=a["catch"](0),new Error(a.t0.message);case 22:case"end":return a.stop();}},a,null,[[0,19]])}));return function(){return a.apply(this,arguments)}}();// private 查询构建结果
|
|
9
9
|
exports.cloudBuildPrivate=cloudBuildPrivate;var pollBuildStatusPrivate=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return c=b.CLOUD_BUILD_POLL_URL,d=b.buildId,a.prev=1,a.next=4,_superagent["default"].get(c).query({buildId:d});case 4:if(f=a.sent,g=JSON.parse(f.text),g.success){a.next=8;break}throw new Error(g.message);case 8:if("SUCCESS"!==(null===g||void 0===g||null===(e=g.data)||void 0===e?void 0:e.result)){a.next=10;break}return a.abrupt("return",g);case 10:;// 构建未完成,轮询查询
|
|
10
10
|
return a.next=13,(0,_.delay)(POLL_DELAY_TIME);case 13:return a.next=15,pollBuildStatusPrivate({CLOUD_BUILD_POLL_URL:c,buildId:d});case 15:return a.abrupt("return",a.sent);case 18:throw a.prev=18,a.t0=a["catch"](1),new Error(a.t0.message);case 21:case"end":return a.stop();}},a,null,[[1,18]])}));return function(){return a.apply(this,arguments)}}();// 将远程的tar文件转换为符合mPaaS条件的zip文件
|
|
11
|
-
exports.pollBuildStatusPrivate=pollBuildStatusPrivate;var remoteFileToLocal=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return c=b.originFile,d=b.
|
|
11
|
+
exports.pollBuildStatusPrivate=pollBuildStatusPrivate;var remoteFileToLocal=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return c=b.originFile,d=b.h5Id,a.prev=1,a.next=4,(0,_.downloadFile)({url:c});case 4:return e=a.sent,f=e.data,a.next=8,(0,_.getZipFromTar)({tarFilePath:f,h5Id:d});case 8:return g=a.sent,h=g.data,a.abrupt("return",{data:{file:h,originFile:c},success:!0});case 13:throw a.prev=13,a.t0=a["catch"](1),new Error(a.t0.message);case 16:case"end":return a.stop();}},a,null,[[1,13]])}));return function(){return a.apply(this,arguments)}}();exports.remoteFileToLocal=remoteFileToLocal;
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ return{data:{current:i,nextProd:j,nextDev:k},success:!0}}catch(a){throw new Erro
|
|
|
7
7
|
// export const getTmpDir = () => path.join(tmpdir(), uuid.v4());
|
|
8
8
|
// 获取uuid
|
|
9
9
|
exports.getVersion=getVersion;var getUUID=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return a.prev=0,a.next=3,_superagent["default"].get(b);case 3:return c=a.sent,d=c.text,a.abrupt("return",{data:d,success:!0});case 8:throw a.prev=8,a.t0=a["catch"](0),new Error(a.t0);case 11:case"end":return a.stop();}},a,null,[[0,8]])}));return function(){return a.apply(this,arguments)}}();// 创建zip
|
|
10
|
-
exports.getUUID=getUUID;var getZipFile=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return c=b.pathname,d=b.version,e=b.
|
|
10
|
+
exports.getUUID=getUUID;var getZipFile=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return c=b.pathname,d=b.version,e=b.h5Id,a.abrupt("return",new Promise(function(a,b){var f=getTmpDir();(0,_fsExtra.ensureDirSync)(f);try{var g="".concat(f,"/").concat(e,".zip");d&&(g="".concat(f,"/").concat(e,"_").concat(d.replace(/\./ig,"_"),".zip"));var h=(0,_fsExtra.createWriteStream)(g),i=(0,_archiver["default"])("zip",{zlib:{level:9}});i.pipe(h),h.on("close",function(){a(g)}),i.on("error",function(a){b(a)}),i.directory("".concat(c),e),i.finalize()}catch(a){(0,_fsExtra.removeSync)(f),b(a)}}));case 2:case"end":return a.stop();}},a)}));return function(){return a.apply(this,arguments)}}();exports.getZipFile=getZipFile;var getZipFromTar=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(){var b,c,d,e,f,g,h=arguments;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:return b=0<h.length&&void 0!==h[0]?h[0]:{},c=b.tarFilePath,d=b.h5Id,e=getTmpDir(),f=_path["default"].join(e,d),(0,_fsExtra.ensureDirSync)(f),a.prev=4,a.next=7,_tar["default"].x({file:_path["default"].resolve(c),cwd:f});case 7:return a.next=9,getZipFile({pathname:f,h5Id:d});case 9:return g=a.sent,a.abrupt("return",{data:g,success:!0});case 13:throw a.prev=13,a.t0=a["catch"](4),new Error(a.t0.message);case 16:return a.prev=16,(0,_fsExtra.removeSync)(e),a.finish(16);case 19:case"end":return a.stop();}},a,null,[[4,13,16,19]])}));return function(){return a.apply(this,arguments)}}();// mPaaS 日志打印
|
|
11
11
|
exports.getZipFromTar=getZipFromTar;var logger=function(){for(var a,b=arguments.length,c=Array(b),d=0;d<b;d++)c[d]=arguments[d];var e=c,f=["%c[mpaas-ide-openapi]","color: blue;"];if(Array.isArray(c))try{f[0]="".concat(f[0]," %c").concat(c[0]),f.push("color: red;"),e=c.slice(1)}catch(a){console.log(a)}(a=console).log.apply(a,f.concat((0,_toConsumableArray2["default"])(e)))};// 判断包类型
|
|
12
12
|
// 1-功能包
|
|
13
13
|
// 2-插件包
|
|
@@ -16,6 +16,7 @@ exports.getZipFromTar=getZipFromTar;var logger=function(){for(var a,b=arguments.
|
|
|
16
16
|
exports.logger=logger;var getPackageType=function(a){return{data:["1","2"].includes(a)?"production":"development",success:!0}};// 不规范json string转换json object
|
|
17
17
|
exports.getPackageType=getPackageType;var looseJsonParse=function(a){try{return{data:Function("\"use strict\";return (".concat(a,")"))(),success:!0}}catch(b){return{data:JSON.parse(a.replace(/"/ig,"\"")),success:!0}}};// 远程文件保存至本地 TODO:superagent进度条,不好搞??
|
|
18
18
|
exports.looseJsonParse=looseJsonParse;var downloadFile=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:if(c=b.url,d=b.target,a.prev=1,a.t0=d,a.t0){a.next=7;break}return a.next=6,getTmpDir();case 6:a.t0=a.sent;case 7:return e=a.t0,f="".concat(_uuid["default"].v4()).concat(_path["default"].extname(new URL(c).pathname)),g=_path["default"].join(e,f),logger("downloadFile","\u4E0B\u8F7D\u6587\u4EF6:".concat(c)),logger("downloadFile","\u672C\u5730\u8DEF\u5F84:".concat(g)),a.next=14,_superagent["default"].get(c);case 14:return h=a.sent,a.next=17,(0,_fsExtra.writeFileSync)(g,h.body,"binary");case 17:return logger("downloadFile","\u4E0B\u8F7D\u5B8C\u6210"),a.abrupt("return",{data:g,success:!0});case 21:throw a.prev=21,a.t1=a["catch"](1),new Error(a.t1.message);case 24:case"end":return a.stop();}},a,null,[[1,21]])}));return function(){return a.apply(this,arguments)}}();exports.downloadFile=downloadFile;// 检测上传之前的数据并返回
|
|
19
|
-
var getUploadData=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y
|
|
19
|
+
var getUploadData=/*#__PURE__*/function(){var a=(0,_asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function a(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$;return _regenerator["default"].wrap(function(a){for(;;)switch(a.prev=a.next){case 0:if(c=b.type,d=b.config,e=b.req,f=b.getVhostByApi,g=b.createWhitelistByApi,h=b.uploadFile,a.prev=1,i=d.appId,j=d.workspaceId,k=d.tenantId,l=d.userId,m=d.uuid_url,n=e.appInfo,o=e.packageType,p=e.resourceFile,q=e.iconFile,r=e.whiteListValue,s=e.sourceCodeFile,t=n||{},u=t.h5Id,v=t.h5Name,w=t.mainUrl,x=t.suburl,y=void 0===x?"":x,z=t.extendInfo,A=t.autoInstall,B=t.resourceType,C=t.installType,D=t.platform,E=t.clientVersionMin,F=t.clientVersionMax,G=t.enableTabBar,H=void 0===G?1:G,I=t.enableOptionMenu,J=void 0===I?1:I,K=t.enableKeepAlive,L=void 0===K?1:K,M=t.extraData,N=void 0===M?"":M,O={appId:i,workspaceId:j,tenantId:k,userId:l,h5Id:u,h5Name:v,mainUrl:w,suburl:y,extendInfo:z,autoInstall:A,resourceType:B,installType:C,platform:D,clientVersionMin:E,clientVersionMax:F,enableTabBar:H,enableOptionMenu:J,enableKeepAlive:L,packageType:1*o},p){a.next=8;break}throw new Error("\u6CA1\u6709\u5C0F\u7A0B\u5E8F\u5305\u8D44\u6E90\u6587\u4EF6\uFF01");case 8:if(o){a.next=10;break}throw new Error("\u6CA1\u6709\u5305\u7C7B\u578B\uFF01");case 10:return a.next=12,f();case 12:if(P=a.sent,P.success){a.next=15;break}throw new Error(P.resultMsg);case 15:if(P.data){a.next=17;break}throw new Error("\u65E0\u865A\u62DF\u57DF\u540D\uFF0C\u9700\u8981\u5148\u81F3\u63A7\u5236\u53F0\u8BBE\u7F6E\u865A\u62DF\u57DF\u540D");case 17:if(O.vhost="".concat(u,".").concat(P.data),"development"!==getPackageType(o).data){a.next=33;break}if(r){a.next=21;break}throw new Error("\u975E\u6B63\u5F0F\u5305\u9700\u8981\u6709\u767D\u540D\u5355\uFF01");case 21:if(0!=o-3){a.next=28;break}return a.next=24,getUUID(m);case 24:if(Q=a.sent,Q.success){a.next=27;break}throw new Error("\u8BF7\u6C42UUID\u9519\u8BEF\uFF01");case 27:O.uuid=Q.data;case 28:return a.next=30,g({whitelistValue:r,// 阿里云
|
|
20
20
|
whiteListValue:r,// 金融云
|
|
21
|
-
userId:l});case 30:if(
|
|
21
|
+
userId:l});case 30:if(R=a.sent,R.success){a.next=33;break}throw new Error(R.resultMsg);case 33:S=e.h5Version,S||(T=getVersion(null===n||void 0===n?void 0:n.h5Version).data,S="production"===getPackageType(o).data?T.nextProd:T.nextDev);;O.h5Version=S,U=looseJsonParse(N),V=U.data,V=void 0===V?{}:V,W=V.iconUrl,a.t0=c,a.next="aliyun"===a.t0?43:70;break;case 43:if(!p){a.next=50;break}return a.next=46,h(p);case 46:if(X=a.sent,X.success){a.next=49;break}throw new Error(X.resultMsg);case 49:O.resourceFileUrl=X.data;case 50:if(!q){a.next=60;break}return logger("\u4F20\u5165iconFile: ".concat(q)),a.next=54,h(p);case 54:if(Y=a.sent,Y.success){a.next=57;break}throw new Error(Y.resultMsg);case 57:O.iconFileUrl=Y.data,a.next=61;break;case 60:W&&(logger("\u672A\u4F20\u5165iconFile\uFF0C\u4E0A\u6B21\u53D1\u5E03\u6709iconUrl\uFF0C\u672C\u6B21\u53D1\u5E03\u7EE7\u7EED\u4F7F\u7528".concat(W)),O.iconUrl=W);case 61:;// 上传源码包文件
|
|
22
|
+
if(!s){a.next=69;break}return a.next=65,h(s);case 65:if(Z=a.sent,Z.success){a.next=68;break}throw new Error(Z.resultMsg);case 68:O.sourceCodeFileUrl=Z.data;case 69:return a.abrupt("break",76);case 70:$=[{name:"resourceFile",file:p}],q?(logger("\u4F20\u5165iconFile: ".concat(q)),$.push({name:"iconFile",file:q})):W&&(logger("\u672A\u4F20\u5165iconFile\uFF0C\u4E0A\u6B21\u53D1\u5E03\u6709iconUrl\uFF0C\u672C\u6B21\u53D1\u5E03\u7EE7\u7EED\u4F7F\u7528".concat(W)),O.iconUrl=W);;return s&&$.push({name:"sourceCodeFile",file:s}),O.files=$,a.abrupt("break",76);case 76:return a.abrupt("return",O);case 79:throw a.prev=79,a.t1=a["catch"](1),new Error(a.t1.message);case 82:case"end":return a.stop();}},a,null,[[1,79]])}));return function(){return a.apply(this,arguments)}}();exports.getUploadData=getUploadData;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alipay-inc/mpaas-ide-openapi-common",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.16",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"repository": "https://code.alipay.com/mPaaS-IDE-Adaptor/mPaaS-IDE-openAPI.git",
|
|
6
6
|
"author": "跟着勇哥有肉吃 <shengyong.zhu@antgroup.com>",
|
|
@@ -26,5 +26,5 @@
|
|
|
26
26
|
"publishConfig": {
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "06fa18ff0babeb7fc1bd1144002632da111677f1"
|
|
30
30
|
}
|