@abtnode/webapp 1.7.15 → 1.7.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.
@@ -1,2 +0,0 @@
1
- (this["webpackJsonp@abtnode/webapp"]=this["webpackJsonp@abtnode/webapp"]||[]).push([[20],{1192:function(e,t,n){"use strict";n.d(t,"e",(function(){return O})),n.d(t,"b",(function(){return w})),n.d(t,"a",(function(){return N})),n.d(t,"d",(function(){return R})),n.d(t,"c",(function(){return T}));var a=n(19),r=n.n(a),l=n(32),c=n(1193),o=n.n(c),i=n(1359),s=n.n(i),u=n(1360),d=n.n(u),m=n(1361),p=n(1362),f=n.n(p),b=n(155),h=n.n(b),g=n(1228),k=n.n(g),v=n(552),E=function(e){return function(e){for(var t=window.atob(e),n=new Uint8Array(t.length),a=0;a<t.length;a++)n[a]=t.charCodeAt(a);return n.buffer}(Object(v.toDataURL)(e,{size:200}).replace(/^[^,]*,/,""))};function O(e){return e.replace(/[\s/@_]/g,"-").replace(/[^a-zA-Z0-9_-]/g,"").replace(/(^[-\s]+)|([-\s]+$)/g,"").toLowerCase()}function w(e,t){var n=s()(o()(t.meta),(function(e){return null!==e}));return n.name=e,n.did=k()(e),n.logo="logo.png",n.interfaces.forEach((function(e){e.services||delete e.services})),t.children.forEach((function(e){e.dynamic&&e.bundleSource&&n.children.push({name:e.meta.name,source:e.bundleSource,title:e.meta.title,mountPoint:e.mountPoint})})),n.environments=(t.configs||[]).map((function(e){return{name:e.key,description:"Automatically generated when exporting",required:!!e.required,secure:!!e.secure,default:e.secure?"":e.value||""}})),n.capabilities.component=!1,n}var x=function(e){return"Copyright \xa9 2022 ".concat(e||"","\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \u201cSoftware\u201d), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \u201cAS IS\u201d, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.")},j=".DS_Store\n.blocklet",y="name: Deploy\n\non:\n push:\n branches:\n - main\n\njobs:\n Deploy:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repo\n uses: actions/checkout@v2\n\n - name: Blocklet workflow\n uses: blocklet/action-workflow@v1\n with:\n skip-upload: true\n skip-deploy: true\n bundle-command: blocklet bundle --create-release\n github-token: ${{ secrets.GITHUB_TOKEN }}";function N(e){return B.apply(this,arguments)}function B(){return(B=Object(l.a)(r.a.mark((function e(t){var n,a,l,c,o,i,s=arguments;return r.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=s.length>1&&void 0!==s[1]?s[1]:{},a=n.holder,l="".concat(t.name.split("/").pop()),c="# ".concat(t.title,"\n\n## Introduction\n\n").concat(t.description),o=new d.a,(i=o.folder(l)).file("blocklet.yml",m.a.dump(t)),i.file("blocklet.md",c),i.file("README.md",c),i.file("logo.png",E(t.did)),i.file("LICENSE",x(a)),i.file(".gitignore",j),i.folder("screenshots").file(".gitkeep",""),i.folder(".github").folder("workflows").file("main.yml",y),e.next=15,new Promise((function(e,t){o.generateAsync({type:"blob"}).then((function(t){f()(t,"".concat(l,".zip")),e()})).catch((function(e){t(e)}))}));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var R=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=t.routing.adminPath,r=n?encodeURIComponent(h()(window.location.origin,a)):h()(window.location.origin,a),l=h()(null===t||void 0===t?void 0:t.blockletRegistry,"/api/blocklets/".concat(e.did,"/blocklet.json"));return{serverUrl:r,metaUrl:l}},T=function(e,t){var n=R(e,t),a=n.metaUrl,r=n.serverUrl,l=new URL(h()(r,"/launch-blocklet/agreement"));return l.searchParams.set("blocklet_meta_url",a),l.searchParams.set("from",window.location.href),l.href}},1228:function(e,t,n){(function(t){var a=n(1207).types,r=n(1172).toHex,l=n(1368).fromPublicKey;e.exports=function(e){var n=r(t.from("string"===typeof e?e.trim():e));return l(n,{role:a.RoleType.ROLE_ANY})}}).call(this,n(760).Buffer)},1257:function(e,t){},1258:function(e,t){},1259:function(e,t){},1260:function(e,t){},1261:function(e,t){},1265:function(e,t){},1266:function(e,t){},1267:function(e,t){},1268:function(e,t){},1271:function(e,t){},1272:function(e,t){},1331:function(e,t,n){e.exports=n.p+"static/media/logo.3f75f557.svg"},1647:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=s;var a=o(n(0)),r=o(n(26)),l=o(n(8)),c=["children"];function o(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(null==e)return{};var n,a,r=function(e,t){if(null==e)return{};var n,a,r={},l=Object.keys(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a<l.length;a++)n=l[a],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function s(e){var t=e.children,n=i(e,c);return a.default.createElement(u,n,t)}s.propTypes={children:l.default.any.isRequired};var u=r.default.div.withConfig({displayName:"content-layout__Container",componentId:"sc-panu44-0"})(["display:flex;flex-direction:column;align-items:center;width:100%;height:100%;.header{text-align:center;}.body{display:flex;flex-direction:column;align-items:center;margin-top:30px;width:100%;min-height:200px;flex:1;","{padding:24px;}","{padding:0 16px 16px;}}.footer{display:flex;justify-content:center;","{padding-bottom:34px;}","{margin-top:auto;padding-bottom:10px;}}"],(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return e.theme.breakpoints.up("sm")}),(function(e){return e.theme.breakpoints.down("md")}))},2077:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return mt}));var a,r,l,c=n(29),o=n(111),i=n(19),s=n.n(i),u=n(32),d=n(0),m=n.n(d),p=n(41),f=n(1653),b=n(155),h=n.n(b),g=n(542),k=n.n(g),v=n(621),E=n(26),O=n(33),w=n(2029),x=n.n(w),j=n(1518),y=n(704),N=n.n(y),B=n(2031),R=n.n(B),T=n(2032),I=n.n(T),S=n(2033),A=n.n(S),U=n(2034),L=n.n(U),C=n(703),F=n.n(C),P=n(40),_=n(551),D=E.default.div(a||(a=Object(c.a)(["\n width: 100%;\n min-height: 100vh;\n padding: 20px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n"]))),M=n(1316),H=n.n(M),z=n(178),W=n(1379),G=n.n(W),Y=n(89),V=n.n(Y),q=n(1647),K=n.n(q),J=n(92),$=n.n(J);var X=E.default.a(r||(r=Object(c.a)(["\n display: block;\n height: 36px;\n color: ",";\n"])),(function(e){return e.theme.palette.primary.main})),Z=Object(E.default)(K.a)(l||(l=Object(c.a)(["\n .app-info_desc {\n font-weight: 400;\n margin-top: 40px;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .body {\n text-align: center;\n }\n\n "," {\n .app-info_desc {\n font-size: 16px;\n }\n }\n\n .circle_icon {\n font-size: 58px;\n color: ",";\n }\n"])),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return"error"===e.variant?e.theme.palette.error.main:e.theme.palette.success.main})),Q=function(e){var t=e.blocklet,n=Object(O.useLocaleContext)().t,a=Object(P.c)().info,r=Object(_.a)(),l=decodeURIComponent(r.get("accessUrl")||"");return H()(t)?m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null)):m.a.createElement(Z,null,m.a.createElement("div",{className:"body"},m.a.createElement(G.a,{variant:"success",title:Object(z.getDisplayName)(t,!0),subTitle:n("launchBlocklet.installSuccess",{serverName:a.name}),footer:m.a.createElement(X,{href:l,rel:"noreferrer","data-cy":"open-blocklet"},n("common.open"))})))},ee=n(11),te=n(90),ne=n(564),ae=n.n(ne),re=n(1248),le=n.n(re),ce=n(2036),oe=n.n(ce),ie=n(1178),se=n.n(ie),ue=n(724),de=n(1370),me=n.n(de),pe=n(182),fe=n.n(pe),be=n(545),he=n.n(be),ge=n(543),ke=n.n(ge),ve=n(51),Ee=n(1648),Oe=n.n(Ee),we=n(154),xe=n.n(we),je=n(2039),ye=n.n(je),Ne=n(596),Be=n(66),Re=n(110),Te=n(1192),Ie=n(204),Se=n(135),Ae=n.n(Se),Ue=["children"];function Le(e){var t=e.children,n=Object(Ie.a)(e,Ue);return m.a.createElement(Ae.a,Object.assign({variant:"contained",color:"primary"},n),t)}var Ce=m.a.forwardRef((function(e,t){return m.a.createElement(Le,Object.assign({},e,{forwardedRef:t}))})),Fe=n(8),Pe=n.n(Fe),_e=n(443),De=n.n(_e);function Me(e){var t=e.blocklet,n=e.blockletMetaUrl,a=t.meta,r=a.did,l=a.logo;return l?m.a.createElement(De.a,{src:Object(Re.l)({did:r,logoPath:l,baseUrl:new URL(n).origin}),width:64,size:"contain",placeholder:"application logo"}):m.a.createElement(ke.a,{did:r,size:64})}function He(e){var t=e.onCancel,n=e.onUpgrade,a=Object(O.useLocaleContext)().t;return m.a.createElement(G.a,{variant:"info",title:a("launchBlocklet.newVersion"),subTitle:a("launchBlocklet.newVersionDesc"),footer:m.a.createElement(m.a.Fragment,null,m.a.createElement(Ce,{onClick:t,variant:"outlined"},a("launchBlocklet.later")),m.a.createElement(Ce,{onClick:n,style:{marginLeft:24}},a("launchBlocklet.upgradeNow")))})}Me.propTypes={blocklet:Pe.a.object.isRequired,blockletMetaUrl:Pe.a.string.isRequired},He.defaultProps={onCancel:function(){},onUpgrade:function(){}};var ze,We,Ge,Ye,Ve=n(1331),qe=n.n(Ve),Ke=n(35);var Je,$e,Xe=E.default.a(ze||(ze=Object(c.a)(["\n display: flex;\n justify-content: center;\n align-items: center;\n height: 36px;\n color: ",";\n"])),(function(e){return e.theme.palette.primary.main})),Ze=E.default.div(We||(We=Object(c.a)(["\n color: #1dc1c7;\n"]))),Qe=Object(E.default)(K.a)(Ge||(Ge=Object(c.a)(["\n .body {\n align-items: center;\n }\n\n .illustrations {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: start;\n text-align: center;\n margin-top: 16px;\n margin-bottom: 40px;\n width: 100%;\n }\n\n .ills-block,\n .ills-block-inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n flex: 1;\n }\n .ills-block {\n max-width: 220px;\n .i-icon {\n width: 64px;\n height: 64px;\n }\n\n .i-name {\n margin-top: 16px;\n font-weight: 400;\n font-size: 16px;\n color: #222222;\n }\n\n .i-sub-name {\n color: #999999;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #c4c5ca;\n font-size: 30px;\n margin: 16px 0 0;\n "," {\n margin: 25px 24px 0;\n }\n }\n\n .status-icon {\n width: 48px;\n height: 48px;\n }\n\n .status-title {\n margin-top: 16px;\n text-align: center;\n font-size: 24px;\n line-height: 28px;\n }\n\n .status-desc {\n text-align: center;\n margin-top: 16px;\n color: #999999;\n font-size: 16px;\n line-height: 28px;\n }\n .launch-page-header {\n transition: all ease 0.3s;\n &.header-hide {\n opacity: 0;\n }\n }\n .result-footer {\n overflow: visible;\n }\n"])),(function(e){return e.theme.breakpoints.down("md")})),et=E.default.div(Ye||(Ye=Object(c.a)(["\n .msg-before {\n display: inline-block;\n color: #aaa;\n font-size: 14px;\n margin-right: 6px;\n }\n"]))),tt=function(e){var t=e.blocklet,n=Object(_.a)(),a=Object(p.k)(),r=Object(E.useTheme)(),l=Object(v.a)(r.breakpoints.down("md")),c=se()("skip-blocklet-setup",!1),i=Object(ee.a)(c,1)[0],f=n.get("blocklet_meta_url"),b=new URL(f).origin,h=function(e){var t=Object(d.useState)(""),n=Object(ee.a)(t,2),a=n[0],r=n[1],l=Object(d.useRef)(null);l.current=e;var c=function(e){return function(t){t.meta.did===l.current.meta.did&&e(t)}};return Object(Ke.b)(ve.BlockletEvents.added,c((function(){return r("added")}))),Object(Ke.b)(ve.BlockletEvents.installed,c((function(){return r("installed")}))),Object(Ke.b)(ve.BlockletEvents.statusChange,c((function(e){switch(e.status){case ve.BlockletStatus.downloading:r("downloading");break;case ve.BlockletStatus.installing:r("installing")}}))),Object(Ke.b)(ve.BlockletEvents.installFailed,c((function(){r("installFailed")}))),Object(Ke.b)(ve.BlockletEvents.downloadFailed,c((function(){r("downloadFailed")}))),a}(t),g=Object(P.c)(),w=g.api,x=g.info,j=g.loading,y=Object(O.useLocaleContext)(),N=y.t,B=y.locale,R=Object(Be.c)().session,T=Object(d.useState)(!1),I=Object(ee.a)(T,2),S=I[0],A=I[1],U=Object(d.useState)(!1),L=Object(ee.a)(U,2),C=L[0],F=L[1],D=Object(d.useState)({meta:null,loading:!0,error:null}),M=Object(ee.a)(D,2),W=M[0],Y=M[1],q=Object(d.useState)({exists:t.isInstalled,status:"launchBlocklet.installing",upgradeAvailable:null,blocklet:null,error:null,errorAction:t.isInstalled?"view":"retry"}),K=Object(ee.a)(q,2),J=K[0],X=K[1],Z=Object(d.useState)(""),Q=Object(ee.a)(Z,2),ne=Q[0],re=Q[1],ce=new URL(window.location.href).searchParams.get("from");if(Object(d.useEffect)((function(){(function(){var e=Object(u.a)(s.a.mark((function e(){var n,a,r;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t&&t.meta){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,w.getBlocklet({input:{did:t.meta.did}});case 5:if(n=e.sent,a=n.blocklet,Y((function(e){return Object(o.a)(Object(o.a)({},e),{},{loading:!1})})),a){e.next=10;break}return e.abrupt("return");case 10:if(!le.a.gt(t.meta.version,a.meta.version)){e.next=16;break}return r=a.environments.find((function(e){return"BLOCKLET_APP_ID"===e.key})),e.next=14,Ie(a,{appDid:r?r.value:"",did:a.meta.did,currentVersion:a.meta.version,version:t.meta.version});case 14:e.next=18;break;case 16:return e.next=18,Ie(a);case 18:e.next=24;break;case 20:e.prev=20,e.t0=e.catch(2),console.error("error fetch blocklet info",e.t0),Y((function(e){return Object(o.a)(Object(o.a)({},e),{},{loading:!1})}));case 24:case"end":return e.stop()}}),e,null,[[2,20]])})));return function(){return e.apply(this,arguments)}})()()}),[t]),"installFailed"!==h&&"downloadFailed"!==h||(F(!1),X(Object(o.a)(Object(o.a)({},J),{},{error:"launchBlocklet.error.".concat(h)}))),H()(t)||j)return m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null));var ie=Object(z.getDisplayName)(t,!0),de=null,pe=function(){var e=Object(u.a)(s.a.mark((function e(){return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(R.user&&(R.user.permissions||[]).includes("mutate_blocklet"))||!t.isFree){e.next=8;break}return F(!0),X(Object(o.a)(Object(o.a)({},J),{},{error:""})),e.next=6,w.installBlocklet({input:{url:f}}).catch((function(e){xe.a.error(e.message),console.error("install blocklet failed",e)}));case 6:return de=Ue(),e.abrupt("return");case 8:A(!0);case 9:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),be=function(e){X(Object(o.a)(Object(o.a)({},J),{},{status:"launchBlocklet.redirecting"})),clearInterval(de),setTimeout((function(){!function(e){var t="/blocklets/".concat(e.meta.did,"/configuration"),r="/launch-blocklet/complete?status=installed&name=".concat(encodeURIComponent(ie),"&accessUrl=").concat(encodeURIComponent(t),"&blocklet_meta_url=").concat(f),l=n.get("from");l&&(r+="from=".concat(l)),a.push(r)}(e)}),1500)},ge=function(){var e=Object(u.a)(s.a.mark((function e(n){var a,r,l,c;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n.interfaces.map((function(e){return e.url})),e.next=3,Object(Re.k)(r);case 3:if(l=e.sent,!H()(l)&&!i){e.next=7;break}return be(n),e.abrupt("return");case 7:X(Object(o.a)(Object(o.a)({},J),{},{status:"launchBlocklet.redirecting"})),clearInterval(de),(c=new URL(l)).searchParams.set("serverUrl",null===(a=Object(Te.d)(t,x))||void 0===a?void 0:a.serverUrl),"running"!==n.status&&c.searchParams.set("__start__","1"),re(c.href),setTimeout((function(){window.location.href=c.href}),1500);case 14:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),Ee=function(){var e=Object(u.a)(s.a.mark((function e(t){return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:setTimeout(Object(u.a)(s.a.mark((function e(){var n;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.getBlocklet({input:{did:t.meta.did}});case 2:if("installed"!==(n=e.sent).blocklet.status){e.next=8;break}return e.next=6,Ie(n.blocklet);case 6:e.next=9;break;case 8:de=Ue();case 9:case"end":return e.stop()}}),e)}))),1500);case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),we=function(e,t){return X(Object(o.a)(Object(o.a)({},J),{},{error:e,errorAction:t}))},je=function(e,t){if(!t)return["stopped","stopping"].includes(e.status)?(F(!1),void X((function(e){return Object(o.a)(Object(o.a)({},e),{},{exists:!0})}))):["error","corrupted"].includes(e.status)?(F(!1),void X((function(e){return Object(o.a)(Object(o.a)({},e),{},{exists:!0,error:"launchBlocklet.error.installedButError",errorAction:"view"})}))):void("running"!==e.status?"installed"===e.status&&ge(e):ge(e));!function(e,t){F(!1),X((function(e){return Object(o.a)(Object(o.a)({},e),{},{upgradeAvailable:t})}))}(0,t)},Ie=function(){var e=Object(u.a)(s.a.mark((function e(t,n){return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=4;break}return F(!1),X(Object(o.a)(Object(o.a)({},J),{},{error:"launchBlocklet.error.launchFailed"})),e.abrupt("return");case 4:X(Object(o.a)(Object(o.a)({},J),{},{blocklet:t})),je(t,n);case 6:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),Se=function(){var e=Object(u.a)(s.a.mark((function e(t,n){var a;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,a={did:t.meta.did,version:n.version,registryUrl:b},F(!0),X(Object(o.a)(Object(o.a)({},J),{},{status:"common.upgrading"})),e.next=6,w.upgradeBlocklet({input:a});case 6:e.next=12;break;case 8:e.prev=8,e.t0=e.catch(0),xe.a.error(e.t0.message),X(Object(o.a)(Object(o.a)({},J),{},{error:"launchBlocklet.error.upgradeFailed"}));case 12:case"end":return e.stop()}}),e,null,[[0,8]])})));return function(t,n){return e.apply(this,arguments)}}(),Ae=oe()(Object(u.a)(s.a.mark((function e(){var n,a,r;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,w.getBlocklet({input:{did:t.meta.did}});case 2:if(n=e.sent,a=n.blocklet){e.next=9;break}return clearInterval(de),F(!1),we("launchBlocklet.error.startFailed","retry"),e.abrupt("return");case 9:r=ve.BlockletStatus[a.status],[ve.BlockletStatus.error,ve.BlockletStatus.corrupted].includes(r)&&(F(!1),clearInterval(de),we("launchBlocklet.error.startFailed","view")),ve.BlockletStatus.installed===r&&(clearInterval(de),Ee(a)),[ve.BlockletStatus.stopped,ve.BlockletStatus.running].includes(r)&&Ie(a);case 13:case"end":return e.stop()}}),e)}))),2e3),Ue=function(){return setInterval(Ae,2e3)},Le=function(){var e=Object(u.a)(s.a.mark((function e(t,n){return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return localStorage.setItem("__sst",n(t.sessionToken)),e.next=3,R.refresh();case 3:F(!0),A(!1),de=Ue();case 6:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}();if(W.error)return m.a.createElement(k.a,{variant:"icon",type:"error"},W.error.message);if(W.loading)return m.a.createElement("div",{style:{marginTop:"100px",textAlign:"center",width:"100%"}},m.a.createElement(V.a,null));var Fe="/";window.env&&window.env.apiPrefix&&(Fe=window.env.apiPrefix);var Pe={view:m.a.createElement(Ce,{className:"bottom-button",component:te.Link,to:"/blocklets/".concat(t.meta.did,"/overview"),fullWidth:l,"data-cy":"view-blocklet",color:"primary",variant:"contained"},N("launchBlocklet.viewApplication")),retry:m.a.createElement(ue.a,{display:"flex",flexDirection:"column"},m.a.createElement(Ce,{className:"bottom-button","data-cy":"retry-install",disabled:S,fullWidth:l,onClick:pe},S&&m.a.createElement(V.a,{size:[16,10]}),N("common.retry")),ce&&m.a.createElement(Ce,{style:{marginTop:24},variant:"text",className:"bottom-button","data-cy":"go-back",disabled:S,fullWidth:l,onClick:function(){window.location.href=ce}},N("common.back")))};if(!C&&J.upgradeAvailable)return m.a.createElement(Qe,null,m.a.createElement(He,{onCancel:function(){return e=J.blocklet,void ge(e);var e},onUpgrade:function(){return Se(J.blocklet,J.upgradeAvailable)}}));if(!C&&J.exists)return m.a.createElement(Qe,null,m.a.createElement(G.a,{variant:"info",title:ie,subTitle:N("launchBlocklet.error.installedButStopped"),footer:Pe.view}));if(J.error)return m.a.createElement(Qe,null,m.a.createElement(G.a,{variant:"error",title:ie,subTitle:N(J.error,{appName:ie,serverName:x.name}),footer:Pe[J.errorAction]}));var _e={message:m.a.createElement(et,null,m.a.createElement("span",{className:"msg-before"},"1/5"),N("launchBlocklet.waiting.verifying"))};switch(h){case"downloading":_e={message:m.a.createElement(et,null,m.a.createElement("span",{className:"msg-before"},"2/5"),N("launchBlocklet.waiting.downloading"))};break;case"installing":_e={message:m.a.createElement(et,null,m.a.createElement("span",{className:"msg-before"},"3/5"),N("launchBlocklet.waiting.extracting"))};break;case"installed":_e={message:m.a.createElement(et,null,m.a.createElement("span",{className:"msg-before"},"4/5"),N("launchBlocklet.waiting.installing"))}}return m.a.createElement(Qe,null,!J.upgradeAvailable&&m.a.createElement("div",{className:"header"},m.a.createElement(Oe.a,{className:"launch-page-header ".concat(ne?"header-hide":""),title:N(C?"launchBlocklet.start":"common.launch"),subTitle:C?"":N("launchBlocklet.subTitle",{appName:ie,serverName:x.name})})),m.a.createElement("div",{className:"body"},!C&&m.a.createElement("div",{className:"illustrations"},m.a.createElement("div",{className:"ills-block ills-block-left"},m.a.createElement("div",{className:"ills-block-inner"},m.a.createElement(Me,{className:"i-icon",blocklet:t,blockletMetaUrl:f}),m.a.createElement("div",{className:"i-name"},ie))),m.a.createElement(me.a,{className:"arrow-icon"}),m.a.createElement("div",{className:"ills-block ills-block-right"},m.a.createElement("div",{className:"ills-block-inner"},m.a.createElement("img",{width:"64",height:"64",src:qe.a,alt:""}),m.a.createElement("div",{className:"i-name"},x.name),m.a.createElement(he.a,{size:12,prepend:m.a.createElement(ke.a,{did:x.did,size:12,style:{marginRight:4}})},x.did)))),!C&&!J.exists&&m.a.createElement(Ce,{className:"bottom-button","data-cy":"start-launch",disabled:S,onClick:pe},S&&m.a.createElement(V.a,{size:[16,10]}),N("common.next")),C&&!ne&&m.a.createElement(Ze,null,m.a.createElement(ye.a,Object.assign({},_e,{increaseSpeed:.3,messageLoop:!1}))),C&&!!ne&&m.a.createElement(G.a,{variant:ne?"success":"loading",title:ne?ie:"",subTitle:ne?N("launchBlocklet.installSuccess",{serverName:x.name}):N(J.status,{appName:ie,serverName:x.name}),footer:ne?m.a.createElement(Xe,{href:ne,rel:"noreferrer","data-cy":"open-blocklet"},m.a.createElement(V.a,{size:[16,10],style:{marginRight:14}})," ",N("common.redirecting")):"",style:{marginBottom:34}})),m.a.createElement(fe.a,{open:S,popup:!0,className:"connect",action:"launch-".concat(t.isFree?"free":"paid","-blocklet-by-").concat(Object(Ne.getServerAuthMethod)(x)),checkFn:ae.a.create({baseURL:Fe}).get,checkTimeout:6e5,socketUrl:w.socketUrl,webWalletUrl:Object(Re.s)(x),onSuccess:Le,onClose:function(){return A(!1)},locale:B,messages:{title:"".concat(N("launchBlocklet.dialog.title")),scan:t.isFree?N("launchBlocklet.dialog.freeDescription"):N("launchBlocklet.dialog.nonFreeDescription"),confirm:N("launchBlocklet.dialog.confirm"),success:N("launchBlocklet.dialog.success")},extraParams:{blockletMetaUrl:f}}))},nt=n(2046),at=n.n(nt),rt=n(2047),lt=n.n(rt);function ct(e){var t=Object.assign({},e);return m.a.createElement("div",Object.assign({},t,{style:{width:"100%"}}),m.a.createElement("h3",null,"End User License Agreement for Application"),m.a.createElement("p",null,"Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28"),m.a.createElement("p",null,"BLOCKLET SERVER LICENSE AGREEMENT"),m.a.createElement("p",null,"\u6682\u65e0"))}function ot(e){var t=e.blocklet,n=Object(p.k)(),a=Object(d.useState)(null),r=Object(ee.a)(a,2),l=r[0],c=r[1],o=Object(d.useState)(null),i=Object(ee.a)(o,2),f=i[0],b=i[1],h=Object(d.useState)(!1),g=Object(ee.a)(h,2),v=g[0],E=g[1],w=Object(O.useLocaleContext)(),x=w.t,j=w.locale,y=Object(P.c)(),N=y.info,B=y.api,R=t.isRunning,T=Object(d.useMemo)((function(){return H()(t)||v}),[t,v]);if(Object(d.useEffect)((function(){R&&function(){var e=Object(u.a)(s.a.mark((function e(){var n,a,r,l,o;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,E(!0),e.next=4,B.getBlocklet({input:{did:t.meta.did}});case 4:return n=e.sent,a=n.blocklet,r=a.interfaces.map((function(e){return e.url})),e.next=9,Object(Re.k)(r);case 9:if((l=e.sent)||!H()(l)){e.next=13;break}return c(null),e.abrupt("return");case 13:o=new URL(l),c(o.href),e.next=20;break;case 17:e.prev=17,e.t0=e.catch(0),b(e.t0.message);case 20:return e.prev=20,E(!1),e.finish(20);case 23:case"end":return e.stop()}}),e,null,[[0,17,20,23]])})));return function(){return e.apply(this,arguments)}}()()}),[t]),f)return m.a.createElement($.a,{relative:"parent"},m.a.createElement("div",null,m.a.createElement(k.a,{style:{wordBreak:"break-all"},variant:"icon",type:"error"},f)));if(T)return m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null));var I=t.meta,S={data:I};if(!I)return m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null));if(t.isInstalled){var A=l?"alreadyRunning":"alreadyInstalled";return m.a.createElement(G.a,{variant:"info",title:x("common.reminder"),subTitle:x("launchBlocklet.".concat(A),{name:Object(z.getDisplayName)(t,!0)}),footer:m.a.createElement(dt,null,m.a.createElement(Ce,{"data-cy":"view-blocklet",component:te.Link,to:"/blocklets/".concat(t.meta.did,"/overview"),variant:l?"outlined":"contained",color:"primary"},x("launchBlocklet.viewApplication")),l&&m.a.createElement(Ce,{className:"last-button",href:l,"data-cy":"open-blocklet"},x("common.open")))})}return N?m.a.createElement(ut,null,m.a.createElement(Oe.a,{title:x("launchBlocklet.introduction"),subTitle:x("launchBlocklet.welcome")}),m.a.createElement("div",{className:"app-content"},m.a.createElement("div",{className:"agreement"},m.a.createElement("div",{className:"agreement-content"},m.a.createElement(lt.a,{blockletMeta:S,locale:j})))),m.a.createElement("div",{className:"button-container","data-cy":"agree-all"},m.a.createElement(at.a,{onContinue:function(){n.push("/launch-blocklet/install".concat(window.location.search))},description:m.a.createElement(ct,null),texts:{listenName:x("launchBlocklet.license"),buttonNext:x("launchBlocklet.next")}}))):m.a.createElement($.a,{relative:"parent"},m.a.createElement(V.a,null))}var it,st,ut=E.default.div(Je||(Je=Object(c.a)(["\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n .app-content {\n padding: 34px 24px 24px;\n "," {\n padding-top: 10px;\n }\n width: 100%;\n flex: 1;\n }\n .agreement {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n border: 1px solid ",";\n border-radius: 12px;\n\n "," {\n margin-top: 24px;\n }\n\n "," {\n margin-top: 16px;\n }\n\n .agreement-content {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n font-size: 14px;\n overflow-y: auto;\n\n "," {\n padding: 0 24px;\n }\n\n "," {\n padding: 0 16px;\n }\n\n &:after {\n display: block;\n content: '';\n height: 24px;\n }\n }\n }\n .button-container {\n padding-top: 24px;\n padding-bottom: 34px;\n "," {\n padding-right: 24px;\n margin-left: auto;\n }\n "," {\n padding-top: 0;\n padding-bottom: 16px;\n }\n }\n"])),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return e.theme.palette.grey[100]}),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("md")}),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.breakpoints.down("md")})),dt=E.default.div($e||($e=Object(c.a)(["\n .MuiButton-root {\n "," {\n min-width: 200px;\n }\n }\n .last-button {\n margin-left: ","px;\n }\n"])),(function(e){return e.theme.breakpoints.up("md")}),(function(e){return e.theme.spacing(2)}));function mt(){var e=Object(v.a)((function(e){return e.breakpoints.down("md")})),t=Object(p.n)().path,n=Object(O.useLocaleContext)(),a=n.t,r=n.locale,l=Object(_.a)(),c=Object(P.c)(),i=c.api,d=c.info,b=!!l.get("from_launcher"),g=Object(Re.s)(d),E=(l.get("blocklet_meta_url")||"").trim();E=decodeURIComponent(E);var w=Object(f.a)(Object(u.a)(s.a.mark((function e(){var t,n,r,l,c;return s.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(E){e.next=2;break}throw new Error(a("common.invalidParam"));case 2:return e.next=4,i.getBlockletMetaFromUrl({input:{url:E,checkPrice:!0}});case 4:if(t=e.sent,n=t.meta,r=t.isFree,l=t.isInstalled,c=t.isRunning,n){e.next=11;break}throw new Error(a("launchBlocklet.error.loadMetaFailed"));case 11:return e.abrupt("return",{meta:n,isFree:r,isInstalled:l,isRunning:c});case 12:case"end":return e.stop()}}),e)}))));if(w.error)return m.a.createElement(D,null,m.a.createElement("div",null,m.a.createElement(k.a,{style:{width:"100%",wordBreak:"break-all"},variant:"icon",type:"error"},w.error.message)));var y=w.value||{},B=y.meta,T=y.isFree,S=h()(Object(Re.r)(),t),U=[{key:"agreement",name:a("launchBlocklet.introduction"),path:h()(S,"agreement")},{key:"install",name:a("launchBlocklet.launch"),path:h()(S,"install")},{key:"setup",name:a("launchBlocklet.setup"),path:h()(S,"complete")}],C=m.a.createElement(ft,null,m.a.createElement(F.a,{logo:e?m.a.createElement(I.a,{width:"32",height:"32"}):m.a.createElement(A.a,{width:"128",height:"48"})}));return b&&(U.splice(0,1),C=m.a.createElement(ft,null,m.a.createElement(F.a,{logo:e?m.a.createElement(I.a,{width:"32",height:"32"}):m.a.createElement(A.a,{width:"128",height:"48"}),previousData:{logo:e?m.a.createElement(R.a,{width:"32",height:"32"}):m.a.createElement(L.a,{width:"145",height:"48"})}}))),B&&(B.registryUrl=new URL(E).origin),m.a.createElement(j.StepProvider,{steps:U},m.a.createElement(x.a,{locale:r,blockletMeta:Object(o.a)(Object(o.a)({},B),{},{isFree:T}),navLogo:C,headerEndAddons:m.a.createElement(N.a,{webWalletUrl:g,SessionContext:Be.a}),pcWidth:"80%",logoUrl:B&&B.logo?Object(Re.l)({did:B.did,baseUrl:B.registryUrl,logoPath:B.logo}):null},m.a.createElement(pt,null,m.a.createElement(p.g,null,m.a.createElement(p.c,{exact:!0,path:t,to:"".concat(t,"/agreement").concat(window.location.search)}),m.a.createElement(p.d,{exact:!0,path:"".concat(t,"/agreement")},m.a.createElement(ot,{blocklet:w.value||{},loading:w.loading})),m.a.createElement(p.d,{exact:!0,path:"".concat(t,"/install")},m.a.createElement(tt,{blocklet:w.value||{}})),m.a.createElement(p.d,{exact:!0,path:"".concat(t,"/complete")},m.a.createElement(Q,{blocklet:w.value||{}}))))))}var pt=E.default.div(it||(it=Object(c.a)(["\n padding-top: 34px;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n .bottom-button {\n min-width: 200px;\n }\n"]))),ft=E.default.div(st||(st=Object(c.a)(["\n margin-top: -1px;\n"])))}}]);
2
- //# sourceMappingURL=20.ca430cdf.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["components/blocklet/util.js","../../../blocklet/meta/lib/did.js","assets/logo.svg","../../ux/lib/launch-blocklet/content-layout.js","components/launch-blocklet/center.js","components/launch-blocklet/step-complete.js","components/launch-blocklet/button.js","components/launch-blocklet/app-logo.js","components/launch-blocklet/status/upgrade-available.js","components/launch-blocklet/step-install.js","components/launch-blocklet/agreement-app.js","components/launch-blocklet/step-agreement.js","pages/launch-blocklet/index.js"],"names":["getLogo","did","base64","bufStr","window","atob","bytes","Uint8Array","length","i","charCodeAt","buffer","base64ToArrayBuffer","toDataURL","size","replace","getNameByTitle","title","toLowerCase","genExportedMeta","name","blocklet","meta","pickBy","cloneDeep","x","toBlockletDid","logo","interfaces","forEach","services","children","child","dynamic","bundleSource","push","source","mountPoint","environments","configs","map","key","description","required","secure","default","value","capabilities","component","license","holder","Gitignore","GithubAction","downloadExportedSource","a","folderName","split","pop","readme","zip","JSZip","folder","file","yaml","dump","Promise","resolve","reject","generateAsync","type","then","content","saveAs","catch","err","getLaunchURL","info","encodeURI","adminPath","routing","serverUrl","encodeURIComponent","joinURL","location","origin","metaUrl","blockletRegistry","getLaunchAgreementUrl","url","URL","searchParams","set","href","types","require","toHex","fromPublicKey","module","exports","pk","Buffer","from","trim","role","RoleType","ROLE_ANY","Object","defineProperty","ContentLayout","_react","_interopRequireDefault","_styledComponents","_propTypes","_excluded","obj","__esModule","_objectWithoutProperties","excluded","target","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","prototype","propertyIsEnumerable","call","_ref","props","createElement","Container","propTypes","any","isRequired","div","withConfig","displayName","componentId","theme","breakpoints","up","down","Center","styled","Link","palette","primary","main","variant","error","success","Complete","t","useLocaleContext","useNodeContext","query","useQuery","accessUrl","decodeURIComponent","get","isEmpty","relative","className","getDisplayName","subTitle","serverName","footer","rel","data-cy","WrappedButton","color","React","forwardRef","ref","forwardedRef","AppLogo","blockletMetaUrl","logoPath","src","getBlockletLogoUrl","baseUrl","width","placeholder","Upgrade","onCancel","onUpgrade","onClick","style","marginLeft","PropTypes","object","string","defaultProps","LinkEle","WaiterContainer","MessageDiv","Install","history","useHistory","useTheme","isBreakpointsDownSm","useMediaQuery","useLocalStorage","skipSetup","blockletRegistryUrl","waiterState","blockletData","useState","setWaiterState","useRef","current","createTargetHandler","handler","b","useSubscription","BlockletEvents","added","installed","statusChange","e","status","BlockletStatus","downloading","installing","installFailed","downloadFailed","useWaiterState","api","loading","locale","session","useSessionContext","openAuth","setOpenAuth","launching","setLaunching","blockletState","setBlockletState","exists","isInstalled","upgradeAvailable","errorAction","launchState","setLaunchState","nextAccessUrl","setNextAccessUrl","fromUrl","useEffect","getBlocklet","input","pre","semver","gt","version","appDidEnv","find","handleLaunchState","appDid","currentVersion","console","onMount","intervalId","handleLaunchStart","user","permissions","includes","isFree","installBlocklet","Toast","message","poll","visitOverview","clearInterval","setTimeout","nextUrl","redirectToBlockletOverview","visitBlocklet","urls","getAccessibleUrl","handleInstalled","result","handleError","handleBlockletExisted","handleUpgradeAvailable","handleUpgrade","registryUrl","upgradeBlocklet","checkBlockletStatus","throttle","statusCode","corrupted","stopped","running","setInterval","handleConnectSuccess","decrypt","localStorage","setItem","sessionToken","refresh","marginTop","textAlign","baseURL","env","apiPrefix","errorActions","view","to","fullWidth","retry","Box","display","flexDirection","disabled","appName","waiterData","height","serverLogo","alt","prepend","marginRight","increaseSpeed","messageLoop","marginBottom","open","popup","action","getServerAuthMethod","checkFn","axios","create","checkTimeout","socketUrl","webWalletUrl","getWebWalletUrl","onSuccess","onClose","messages","scan","confirm","extraParams","AgreementApp","Agreement","setAccessUrl","setError","accessUrlLoading","setAccessUrlLoading","isRunning","useMemo","accessUrlTmp","wordBreak","data","blockletMeta","already","ButtonWrap","onContinue","search","texts","listenName","buttonNext","grey","spacing","BlockletLauncher","isMobile","path","useRouteMatch","fromLauncher","state","useAsync","Error","getBlockletMetaFromUrl","checkPrice","basePath","joinUrl","getPathPrefix","steps","navLogo","LogoContainer","splice","previousData","headerEndAddons","SessionContext","pcWidth","logoUrl","Content","exact"],"mappings":"ucAoBMA,EAAU,SAAAC,GAGd,OAZ0B,SAAAC,GAG1B,IAFA,IAAMC,EAASC,OAAOC,KAAKH,GACrBI,EAAQ,IAAIC,WAAWJ,EAAOK,QAC3BC,EAAI,EAAGA,EAAIN,EAAOK,OAAQC,IACjCH,EAAMG,GAAKN,EAAOO,WAAWD,GAE/B,OAAOH,EAAMK,OAMNC,CAFKC,oBAAUZ,EAAK,CAAEa,KAAM,MAChBC,QAAQ,UAAW,MAIjC,SAASC,EAAeC,GAC7B,OAAOA,EACJF,QAAQ,WAAY,KACpBA,QAAQ,kBAAmB,IAC3BA,QAAQ,uBAAwB,IAChCG,cAGE,SAASC,EAAgBC,EAAMC,GACpC,IAAMC,EAAOC,IAAOC,IAAUH,EAASC,OAAO,SAAAG,GAAC,OAAU,OAANA,KAkCnD,OAhCAH,EAAKF,KAAOA,EACZE,EAAKrB,IAAMyB,IAAcN,GACzBE,EAAKK,KAAO,WAEZL,EAAKM,WAAWC,SAAQ,SAAAJ,GAEjBA,EAAEK,iBACEL,EAAEK,YAIbT,EAASU,SAASF,SAAQ,SAAAG,GACpBA,EAAMC,SAAWD,EAAME,cACzBZ,EAAKS,SAASI,KAAK,CACjBf,KAAMY,EAAMV,KAAKF,KACjBgB,OAAQJ,EAAME,aACdjB,MAAOe,EAAMV,KAAKL,MAClBoB,WAAYL,EAAMK,gBAKxBf,EAAKgB,cAAgBjB,EAASkB,SAAW,IAAIC,KAAI,SAAAf,GAAC,MAAK,CACrDL,KAAMK,EAAEgB,IACRC,YAAa,yCACbC,WAAYlB,EAAEkB,SACdC,SAAUnB,EAAEmB,OACZC,QAASpB,EAAEmB,OAAS,GAAKnB,EAAEqB,OAAS,OAGtCxB,EAAKyB,aAAaC,WAAY,EAEvB1B,EAGT,IAAM2B,EAAU,SAAAC,GAAM,oCAAwBA,GAAU,GAAlC,+hCAQhBC,EAAS,uBAGTC,EAAY,kcAuBX,SAAeC,EAAtB,kC,4CAAO,WAAsC/B,GAAtC,qCAAAgC,EAAA,8FAAyD,GAAXJ,EAA9C,EAA8CA,OAC7CK,EADD,UACiBjC,EAAKF,KAAKoC,MAAM,KAAKC,OACrCC,EAFD,YAEepC,EAAKL,MAFpB,kCAEmDK,EAAKoB,aAEvDiB,EAAM,IAAIC,KACVC,EAASF,EAAIE,OAAON,IACnBO,KAAK,eAAgBC,IAAKC,KAAK1C,IACtCuC,EAAOC,KAAK,cAAeJ,GAC3BG,EAAOC,KAAK,YAAaJ,GACzBG,EAAOC,KAAK,WAAY9D,EAAQsB,EAAKrB,MACrC4D,EAAOC,KAAK,UAAWb,EAAQC,IAC/BW,EAAOC,KAAK,aAAcX,GAC1BU,EAAOA,OAAO,eAAeC,KAAK,WAAY,IAC9CD,EAAOA,OAAO,WAAWA,OAAO,aAAaC,KAAK,WAAYV,GAbzD,UAcC,IAAIa,SAAQ,SAACC,EAASC,GAC1BR,EACGS,cAAc,CAAEC,KAAM,SACtBC,MAAK,SAAAC,GACJC,IAAOD,EAAD,UAAahB,EAAb,SACNW,OAEDO,OAAM,SAAAC,GACLP,EAAOO,SAtBR,6C,sBA0BA,IAAMC,EAAe,SAACrD,EAAMsD,GAA6B,IAAvBC,EAAsB,wDACvDC,EAAoDF,EAAKG,QAAQD,UACjEE,EAAYH,EACdI,mBAAmBC,IAAQ9E,OAAO+E,SAASC,OAAQN,IACnDI,IAAQ9E,OAAO+E,SAASC,OAAQN,GAC9BO,EAAUH,IAAO,OAACN,QAAD,IAACA,OAAD,EAACA,EAAMU,iBAAP,yBAA2ChE,EAAKrB,IAAhD,mBACvB,MAAO,CAAE+E,YAAWK,YAETE,EAAwB,SAACjE,EAAMsD,GAC1C,MAA+BD,EAAarD,EAAMsD,GAA1CS,EAAR,EAAQA,QAASL,EAAjB,EAAiBA,UAEXQ,EAAM,IAAIC,IAAIP,IAAQF,EAAW,+BAGvC,OAFAQ,EAAIE,aAAaC,IAAI,oBAAqBN,GAC1CG,EAAIE,aAAaC,IAAI,OAAQvF,OAAO+E,SAASS,MACtCJ,EAAII,O,sBClJb,gBAAQC,EAAUC,EAAQ,MAAlBD,MACAE,EAAUD,EAAQ,MAAlBC,MACAC,EAAkBF,EAAQ,MAA1BE,cAORC,EAAOC,QALe,SAAC9E,GACrB,IAAM+E,EAAKJ,EAAMK,EAAOC,KAAqB,kBAATjF,EAAoBA,EAAKkF,OAASlF,IACtE,OAAO4E,EAAcG,EAAI,CAAEI,KAAMV,EAAMW,SAASC,c,sRCNlDR,EAAOC,QAAU,IAA0B,kC,kCCE3CQ,OAAOC,eAAeT,EAAS,aAAc,CAC3CpD,OAAO,IAEToD,EAAQrD,QAAU+D,EAElB,IAAIC,EAASC,EAAuBhB,EAAQ,IAExCiB,EAAoBD,EAAuBhB,EAAQ,KAEnDkB,EAAaF,EAAuBhB,EAAQ,IAE1CmB,EAAY,CAAC,YAEnB,SAASH,EAAuBI,GAAO,OAAOA,GAAOA,EAAIC,WAAaD,EAAM,CAAErE,QAASqE,GAEvF,SAASE,EAAyBhF,EAAQiF,GAAY,GAAc,MAAVjF,EAAgB,MAAO,GAAI,IAAkEK,EAAKhC,EAAnE6G,EAEzF,SAAuClF,EAAQiF,GAAY,GAAc,MAAVjF,EAAgB,MAAO,GAAI,IAA2DK,EAAKhC,EAA5D6G,EAAS,GAAQC,EAAab,OAAOc,KAAKpF,GAAqB,IAAK3B,EAAI,EAAGA,EAAI8G,EAAW/G,OAAQC,IAAOgC,EAAM8E,EAAW9G,GAAQ4G,EAASI,QAAQhF,IAAQ,IAAa6E,EAAO7E,GAAOL,EAAOK,IAAQ,OAAO6E,EAFxMI,CAA8BtF,EAAQiF,GAAuB,GAAIX,OAAOiB,sBAAuB,CAAE,IAAIC,EAAmBlB,OAAOiB,sBAAsBvF,GAAS,IAAK3B,EAAI,EAAGA,EAAImH,EAAiBpH,OAAQC,IAAOgC,EAAMmF,EAAiBnH,GAAQ4G,EAASI,QAAQhF,IAAQ,GAAkBiE,OAAOmB,UAAUC,qBAAqBC,KAAK3F,EAAQK,KAAgB6E,EAAO7E,GAAOL,EAAOK,IAAU,OAAO6E,EAIne,SAASV,EAAcoB,GACjB,IACFjG,EACEiG,EADFjG,SAEEkG,EAAQb,EAAyBY,EAAMf,GAE3C,OAAoBJ,EAAOhE,QAAQqF,cAAcC,EAAWF,EAAOlG,GAGrE6E,EAAcwB,UAAY,CACxBrG,SAAUiF,EAAWnE,QAAQwF,IAAIC,YAGnC,IAAMH,EAAYpB,EAAkBlE,QAAQ0F,IAAIC,WAAW,CACzDC,YAAa,4BACbC,YAAa,eAFG3B,CAGf,CAAC,0NAA2N,kBAAmB,sEAAuE,yBAA0B,4CAA4C,SAAAkB,GAAK,OAAIA,EAAMU,MAAMC,YAAYC,GAAG,SAAO,SAAAZ,GAAK,OAAIA,EAAMU,MAAMC,YAAYE,KAAK,SAAO,SAAAb,GAAK,OAAIA,EAAMU,MAAMC,YAAYC,GAAG,SAAO,SAAAZ,GAAK,OAAIA,EAAMU,MAAMC,YAAYE,KAAK,U,mYCzBzhBC,EAVAC,UAAOT,IAAV,qL,oGC4CZ,IAAMU,EAAOD,UAAO1F,EAAV,+EAGC,SAAA2E,GAAK,OAAIA,EAAMU,MAAMO,QAAQC,QAAQC,QAG1CjB,EAAYa,kBAAOpC,IAAPoC,CAAH,sVAaX,SAAAf,GACA,OAAOA,EAAMU,MAAMC,YAAYE,KAAK,SAS3B,SAAAb,GAAK,MAAuB,UAAlBA,EAAMoB,QAAsBpB,EAAMU,MAAMO,QAAQI,MAAMF,KAAOnB,EAAMU,MAAMO,QAAQK,QAAQH,QAQjGI,EApEf,YAAiC,IAAbnI,EAAY,EAAZA,SACVoI,EAAMC,6BAAND,EACA7E,EAAS+E,cAAT/E,KACFgF,EAAQC,cACRC,EAAYC,mBAAmBH,EAAMI,IAAI,cAAgB,IAE/D,OAAIC,IAAQ5I,GAER,kBAAC,IAAD,CAAQ6I,SAAS,UACf,kBAAC,IAAD,OAKJ,kBAAC/B,EAAD,KACE,yBAAKgC,UAAU,QACb,kBAAC,IAAD,CACEd,QAAQ,UACRpI,MAAOmJ,yBAAe/I,GAAU,GAChCgJ,SAAUZ,EAAE,gCAAiC,CAAEa,WAAY1F,EAAKxD,OAChEmJ,OACE,kBAACtB,EAAD,CAAMrD,KAAMkE,EAAWU,IAAI,aAAaC,UAAQ,iBAC7ChB,EAAE,qB,yWCjCjB,SAASiB,GAAT,GAAgD,IAAvB3I,EAAsB,EAAtBA,SAAakG,EAAS,mBAC7C,OACE,kBAAC,KAAD,eAAQoB,QAAQ,YAAYsB,MAAM,WAAc1C,GAC7ClG,GASQ6I,WAAMC,YAAW,SAAC5C,EAAO6C,GAAR,OAAgB,kBAACJ,GAAD,iBAAmBzC,EAAnB,CAA0B8C,aAAcD,Q,wCCVzE,SAASE,GAAT,GAAiD,IAA9B3J,EAA6B,EAA7BA,SAAU4J,EAAmB,EAAnBA,gBAC1C,EAAgC5J,EAASC,KAAjCrB,EAAR,EAAQA,IAAWiL,EAAnB,EAAavJ,KAqBb,OAjBIuJ,EAEA,kBAAC,KAAD,CACEC,IAAKC,aAAmB,CACtBnL,MACAiL,WACAG,QAAS,IAAI5F,IAAIwF,GAAiB7F,SAEpCkG,MAAO,GACPxK,KAAK,UACLyK,YAAY,qBAIN,kBAAC,KAAD,CAAQtL,IAAKA,EAAKa,KAAM,KCnBvB,SAAS0K,GAAT,GAA2C,IAAxBC,EAAuB,EAAvBA,SAAUC,EAAa,EAAbA,UAClCjC,EAAMC,6BAAND,EAER,OACE,kBAAC,IAAD,CACEJ,QAAQ,OACRpI,MAAOwI,EAAE,6BACTY,SAAUZ,EAAE,iCACZc,OACE,oCACE,kBAAC,GAAD,CAAQoB,QAASF,EAAUpC,QAAQ,YAChCI,EAAE,yBAEL,kBAAC,GAAD,CAAQkC,QAASD,EAAWE,MAAO,CAAEC,WAAY,KAC9CpC,EAAE,iCDWfuB,GAAQ5C,UAAY,CAClB/G,SAAUyK,KAAUC,OAAOzD,WAC3B2C,gBAAiBa,KAAUE,OAAO1D,YCApCkD,GAAQS,aAAe,CACrBR,SAAU,aACVC,UAAW,c,+CC8jBb,I,MAAMQ,GAAUlD,UAAO1F,EAAV,oIAKF,SAAA2E,GAAK,OAAIA,EAAMU,MAAMO,QAAQC,QAAQC,QAG1C+C,GAAkBnD,UAAOT,IAAV,iDAIfJ,GAAYa,kBAAOpC,IAAPoC,CAAH,s3CAiDT,SAAAf,GAAK,OAAIA,EAAMU,MAAMC,YAAYE,KAAK,SAmCtCsD,GAAapD,UAAOT,IAAV,gJASD8D,GA9mBf,YAAgC,IAAbhL,EAAY,EAAZA,SACXuI,EAAQC,cACRyC,EAAUC,cACV5D,EAAQ6D,qBACRC,EAAsBC,YAAc/D,EAAMC,YAAYE,KAAK,OACjE,EAAoB6D,KAAgB,uBAAuB,GAApDC,EAAP,qBACM3B,EAAkBrB,EAAMI,IAAI,qBAC5B6C,EAAsB,IAAIpH,IAAIwF,GAAiB7F,OAC/C0H,EA7De,SAAAC,GACrB,MAAsCC,mBAAS,IAA/C,oBAAOF,EAAP,KAAoBG,EAApB,KACM5L,EAAW6L,iBAAO,MACxB7L,EAAS8L,QAAUJ,EAEnB,IAAMK,EAAsB,SAAAC,GAC1B,OAAO,SAAAC,GACDA,EAAEhM,KAAKrB,MAAQoB,EAAS8L,QAAQ7L,KAAKrB,KACvCoN,EAAQC,KA0Cd,OArCAC,aACEC,kBAAeC,MACfL,GAAoB,kBAAMH,EAAe,aAE3CM,aACEC,kBAAeE,UACfN,GAAoB,kBAAMH,EAAe,iBAG3CM,aACEC,kBAAeG,aACfP,GAAoB,SAAAQ,GAClB,OAAQA,EAAEC,QACR,KAAKC,kBAAeC,YAClBd,EAAe,eACf,MACF,KAAKa,kBAAeE,WAClBf,EAAe,mBAOvBM,aACEC,kBAAeS,cACfb,GAAoB,WAClBH,EAAe,qBAGnBM,aACEC,kBAAeU,eACfd,GAAoB,WAClBH,EAAe,sBAIZH,EAWaqB,CAAe9M,GAEnC,EAA+BsI,cAAvByE,EAAR,EAAQA,IAAKxJ,EAAb,EAAaA,KAAMyJ,EAAnB,EAAmBA,QACnB,EAAsB3E,6BAAdD,EAAR,EAAQA,EAAG6E,EAAX,EAAWA,OACHC,EAAYC,eAAZD,QAER,EAAgCvB,oBAAS,GAAzC,oBAAOyB,EAAP,KAAiBC,EAAjB,KACA,EAAkC1B,oBAAS,GAA3C,oBAAO2B,EAAP,KAAkBC,EAAlB,KACA,EAA0C5B,mBAAS,CAAE1L,KAAM,KAAM+M,SAAS,EAAM/E,MAAO,OAAvF,oBAAOuF,EAAP,KAAsBC,EAAtB,KACA,EAAsC9B,mBAAS,CAC7C+B,OAAQ1N,EAAS2N,YACjBnB,OAAQ,4BACRoB,iBAAkB,KAClB5N,SAAU,KACViI,MAAO,KACP4F,YAAa7N,EAAS2N,YAAc,OAAS,UAN/C,oBAAOG,EAAP,KAAoBC,EAApB,KAQA,EAA0CpC,mBAAS,IAAnD,oBAAOqC,GAAP,KAAsBC,GAAtB,KAEMC,GAAU,IAAI9J,IAAIrF,OAAO+E,SAASS,MAAMF,aAAasE,IAAI,QAsC/D,GApCAwF,qBAAU,YACK,uCAAG,gCAAAlM,EAAA,yDACTjC,GAAaA,EAASC,KADb,0EAKkB8M,EAAIqB,YAAY,CAAEC,MAAO,CAAEzP,IAAKoB,EAASC,KAAKrB,OALhE,mBAKMqN,EALN,EAKJjM,SACRyN,GAAiB,SAAAa,GAAG,kCAAUA,GAAV,IAAetB,SAAS,OACvCf,EAPO,uDAWRsC,KAAOC,GAAGxO,EAASC,KAAKwO,QAASxC,EAAEhM,KAAKwO,SAXhC,wBAYJC,EAAYzC,EAAEhL,aAAa0N,MAAK,SAAApC,GAAC,MAAc,oBAAVA,EAAEnL,OAZnC,UAaJwN,GAAkB3C,EAAG,CACzB4C,OAAQH,EAAYA,EAAUjN,MAAQ,GACtC7C,IAAKqN,EAAEhM,KAAKrB,IACZkQ,eAAgB7C,EAAEhM,KAAKwO,QACvBA,QAASzO,EAASC,KAAKwO,UAjBf,iDAoBJG,GAAkB3C,GApBd,0DAuBZ8C,QAAQ9G,MAAM,4BAAd,MACAwF,GAAiB,SAAAa,GAAG,kCAAUA,GAAV,IAAetB,SAAS,OAxBhC,0DAAH,qDA2BbgC,KACC,CAAChP,IAEgB,kBAAhByL,GAAmD,mBAAhBA,IACrC8B,GAAa,GACbQ,EAAe,2BAAKD,GAAN,IAAmB7F,MAAM,wBAAD,OAA0BwD,OAG9D7C,IAAQ5I,IAAagN,EACvB,OACE,kBAAC,IAAD,CAAQnE,SAAS,UACf,kBAAC,IAAD,OAKN,IAAM9I,GAAOgJ,yBAAe/I,GAAU,GAClCiP,GAAa,KAeXC,GAAiB,uCAAG,sBAAAjN,EAAA,2DACHiL,EAAQiC,OAASjC,EAAQiC,KAAKC,aAAe,IAAIC,SAAS,sBAC3DrP,EAASsP,OAFL,uBAGtB/B,GAAa,GACbQ,EAAe,2BAAKD,GAAN,IAAmB7F,MAAO,MAJlB,SAMhB8E,EACHwC,gBAAgB,CACflB,MAAO,CAAElK,IAAKyF,KAEfxG,OAAM,SAAAC,GACLmM,KAAMvH,MAAM5E,EAAIoM,SAChBV,QAAQ9G,MAAM,0BAA2B5E,MAZvB,cAetB4L,GAAaS,KAfS,0BAmBxBrC,GAAY,GAnBY,2CAAH,qDAsBjBsC,GAAgB,SAAA1D,GACpB8B,EAAe,2BAAKD,GAAN,IAAmBtB,OAAQ,gCACzCoD,cAAcX,IACdY,YAAW,YAtCsB,SAAA5D,GACjC,IAAMxD,EAAS,qBAAiBwD,EAAEhM,KAAKrB,IAAxB,kBACXkR,EAAO,0DAAsDlM,mBAC/D7D,IADS,sBAEI6D,mBAAmB6E,GAFvB,8BAEuDmB,GAE5D5E,EAAOuD,EAAMI,IAAI,QACnB3D,IACF8K,GAAO,eAAY9K,IAErBiG,EAAQnK,KAAKgP,GA6BXC,CAA2B9D,KAC1B,OAGC+D,GAAa,uCAAG,WAAM/D,GAAN,qBAAAhK,EAAA,6DACdgO,EAAOhE,EAAE1L,WAAWY,KAAI,SAAAf,GAAC,OAAIA,EAAE+D,OADjB,SAEI+L,aAAiBD,GAFrB,UAEdxH,EAFc,QAIhBG,IAAQH,KAAc8C,EAJN,uBAKlBoE,GAAc1D,GALI,0BASpB8B,EAAe,2BAAKD,GAAN,IAAmBtB,OAAQ,gCACzCoD,cAAcX,KAER9K,EAAM,IAAIC,IAAIqE,IAEhBpE,aAAaC,IAAI,YAArB,UAAkChB,aAAatD,EAAUuD,UAAzD,aAAkC,EAA8BI,WAE/C,YAAbsI,EAAEO,QACJrI,EAAIE,aAAaC,IAAI,YAAa,KAGpC2J,GAAiB9J,EAAII,MAErBsL,YAAW,WACT9Q,OAAO+E,SAASS,KAAOJ,EAAII,OAC1B,MAxBiB,4CAAH,sDA2Bb4L,GAAe,uCAAG,WAAMlE,GAAN,SAAAhK,EAAA,sDACtB4N,WAAU,sBAAC,4BAAA5N,EAAA,sEACY8K,EAAIqB,YAAY,CAAEC,MAAO,CAAEzP,IAAKqN,EAAEhM,KAAKrB,OADnD,UAEsB,eADzBwR,EADG,QAEEpQ,SAASwM,OAFX,gCAGDoC,GAAkBwB,EAAOpQ,UAHxB,6BAKPiP,GAAaS,KALN,2CAOR,MARmB,2CAAH,sDA+BfW,GAAc,SAACpI,EAAO4F,GAAR,OAAwBE,EAAe,2BAAKD,GAAN,IAAmB7F,QAAO4F,kBAE9EyC,GAAwB,SAACrE,EAAG2B,GAChC,IAAIA,EAKJ,MAAI,CAAC,UAAW,YAAYyB,SAASpD,EAAEO,SAZvCe,GAAa,QACbQ,GAAe,SAAAO,GAAG,kCAAUA,GAAV,IAAeZ,QAAQ,QAgBrC,CAAC,QAAS,aAAa2B,SAASpD,EAAEO,SAhCtCe,GAAa,QACbQ,GAAe,SAAAO,GAAG,kCACbA,GADa,IAEhBZ,QAAQ,EACRzF,MAAO,yCACP4F,YAAa,kBAgCE,YAAb5B,EAAEO,OAKW,cAAbP,EAAEO,QACJwD,GAAc/D,GALd+D,GAAc/D,KA7Ba,SAACA,EAAG2B,GACjCL,GAAa,GACbQ,GAAe,SAAAO,GAAG,kCAAUA,GAAV,IAAeV,wBAY/B2C,CAAuBtE,EAAG2B,IAwBxBgB,GAAiB,uCAAG,WAAO3C,EAAG2B,GAAV,SAAA3L,EAAA,yDACnBgK,EADmB,uBAEtBsB,GAAa,GACbQ,EAAe,2BAAKD,GAAN,IAAmB7F,MAAO,uCAHlB,0BAOxB8F,EAAe,2BAAKD,GAAN,IAAmB9N,SAAUiM,KAC3CqE,GAAsBrE,EAAG2B,GARD,2CAAH,wDAejB4C,GAAa,uCAAG,WAAOvE,EAAG2B,GAAV,eAAA3L,EAAA,sEAEZoM,EAAQ,CACZzP,IAAKqN,EAAEhM,KAAKrB,IACZ6P,QAASb,EAAiBa,QAC1BgC,YAAajF,GAGf+B,GAAa,GACbQ,EAAe,2BAAKD,GAAN,IAAmBtB,OAAQ,sBATvB,SAUZO,EAAI2D,gBAAgB,CAAErC,UAVV,uDAYlBmB,KAAMvH,MAAM,KAAMwH,SAClB1B,EAAe,2BAAKD,GAAN,IAAmB7F,MAAO,wCAbtB,yDAAH,wDAiBb0I,GAAsBC,KAAQ,sBAAC,gCAAA3O,EAAA,sEACL8K,EAAIqB,YAAY,CAAEC,MAAO,CAAEzP,IAAKoB,EAASC,KAAKrB,OADzC,mBACjBqN,EADiB,EAC3BjM,SAD2B,uBAIjC4P,cAAcX,IACd1B,GAAa,GACb8C,GAAY,mCAAoC,SANf,0BAU7BQ,EAAapE,kBAAeR,EAAEO,QAEhC,CAACC,kBAAexE,MAAOwE,kBAAeqE,WAAWzB,SAASwB,KAC5DtD,GAAa,GACbqC,cAAcX,IACdoB,GAAY,mCAAoC,SAG9C5D,kBAAeJ,YAAcwE,IAC/BjB,cAAcX,IACdkB,GAAgBlE,IAGd,CAACQ,kBAAesE,QAAStE,kBAAeuE,SAAS3B,SAASwB,IAC5DjC,GAAkB3C,GAxBe,4CA0BlC,KAEGyD,GAAO,kBAAMuB,YAAYN,GAAqB,MAE9CO,GAAoB,uCAAG,WAAOd,EAAQe,GAAf,SAAAlP,EAAA,6DAC3BmP,aAAaC,QAAQ,QAASF,EAAQf,EAAOkB,eADlB,SAErBpE,EAAQqE,UAFa,OAI3BhE,GAAa,GACbF,GAAY,GAEZ4B,GAAaS,KAPc,2CAAH,wDAY1B,GAAIlC,EAAcvF,MAChB,OACE,kBAAC,IAAD,CAAOD,QAAQ,OAAOhF,KAAK,SACxBwK,EAAcvF,MAAMwH,SAK3B,GAAIjC,EAAcR,QAChB,OACE,yBAAKzC,MAAO,CAAEiH,UAAW,QAASC,UAAW,SAAUxH,MAAO,SAC5D,kBAAC,IAAD,OAKN,IAAIyH,GAAU,IACV3S,OAAO4S,KAAO5S,OAAO4S,IAAIC,YAC3BF,GAAU3S,OAAO4S,IAAIC,WAGvB,IAAMC,GAAe,CACnBC,KACE,kBAAC,GAAD,CACEhJ,UAAU,gBACVnH,UAAWiG,QACXmK,GAAE,qBAAgB/R,EAASC,KAAKrB,IAA9B,aACFoT,UAAW5G,EACXhC,UAAQ,gBACRE,MAAM,UACNtB,QAAQ,aACPI,EAAE,mCAGP6J,MACE,kBAACC,GAAA,EAAD,CAAKC,QAAQ,OAAOC,cAAc,UAChC,kBAAC,GAAD,CACEtJ,UAAU,gBACVM,UAAQ,gBACRiJ,SAAUjF,EACV4E,UAAW5G,EACXd,QAAS4E,IACR9B,GAAY,kBAAC,IAAD,CAAS3N,KAAM,CAAC,GAAI,MAChC2I,EAAE,iBAEJ8F,IACC,kBAAC,GAAD,CACE3D,MAAO,CAAEiH,UAAW,IACpBxJ,QAAQ,OACRc,UAAU,gBACVM,UAAQ,UACRiJ,SAAUjF,EACV4E,UAAW5G,EACXd,QAAS,WACPvL,OAAO+E,SAASS,KAAO2J,KAExB9F,EAAE,kBAOb,IAAKkF,GAAaQ,EAAYF,iBAC5B,OACE,kBAAC,GAAD,KACE,kBAAC,GAAD,CACExD,SAAU,kBAlIU6B,EAkIgB6B,EAAY9N,cAjItDgQ,GAAc/D,GADY,IAAAA,GAmIpB5B,UAAW,kBAAMmG,GAAc1C,EAAY9N,SAAU8N,EAAYF,sBAMzE,IAAKN,GAAaQ,EAAYJ,OAC5B,OACE,kBAAC,GAAD,KACE,kBAAC,IAAD,CACE1F,QAAQ,OACRpI,MAAOG,GACPiJ,SAAUZ,EAAE,4CACZc,OAAQ2I,GAAaC,QAM7B,GAAIhE,EAAY7F,MACd,OACE,kBAAC,GAAD,KACE,kBAAC,IAAD,CACED,QAAQ,QACRpI,MAAOG,GACPiJ,SAAUZ,EAAE0F,EAAY7F,MAAO,CAAEqK,QAASvS,GAAMkJ,WAAY1F,EAAKxD,OACjEmJ,OAAQ2I,GAAa/D,EAAYD,gBAMzC,IAAI0E,GAAa,CACf9C,QACE,kBAAC1E,GAAD,KACE,0BAAMjC,UAAU,cAAhB,OACCV,EAAE,sCAKT,OAAQqD,GACN,IAAK,cACH8G,GAAa,CACX9C,QACE,kBAAC1E,GAAD,KACE,0BAAMjC,UAAU,cAAhB,OACCV,EAAE,wCAIT,MACF,IAAK,aACHmK,GAAa,CACX9C,QACE,kBAAC1E,GAAD,KACE,0BAAMjC,UAAU,cAAhB,OACCV,EAAE,uCAIT,MACF,IAAK,YACHmK,GAAa,CACX9C,QACE,kBAAC1E,GAAD,KACE,0BAAMjC,UAAU,cAAhB,OACCV,EAAE,uCAQb,OACE,kBAAC,GAAD,MACI0F,EAAYF,kBACZ,yBAAK9E,UAAU,UACb,kBAAC,KAAD,CACEA,UAAS,6BAAwBkF,GAAgB,cAAgB,IACjEpO,MAAmBwI,EAAZkF,EAAc,uBAA4B,iBACjDtE,SAAUsE,EAAY,GAAKlF,EAAE,0BAA2B,CAAEkK,QAASvS,GAAMkJ,WAAY1F,EAAKxD,UAIhG,yBAAK+I,UAAU,SACXwE,GACA,yBAAKxE,UAAU,iBACb,yBAAKA,UAAU,8BACb,yBAAKA,UAAU,oBACb,kBAACa,GAAD,CAASb,UAAU,SAAS9I,SAAUA,EAAU4J,gBAAiBA,IACjE,yBAAKd,UAAU,UAAU/I,MAG7B,kBAAC,KAAD,CAAc+I,UAAU,eACxB,yBAAKA,UAAU,+BACb,yBAAKA,UAAU,oBACb,yBAAKmB,MAAM,KAAKuI,OAAO,KAAK1I,IAAK2I,KAAYC,IAAI,KACjD,yBAAK5J,UAAU,UAAUvF,EAAKxD,MAC9B,kBAAC,KAAD,CAAYN,KAAM,GAAIkT,QAAS,kBAAC,KAAD,CAAQ/T,IAAK2E,EAAK3E,IAAKa,KAAM,GAAI8K,MAAO,CAAEqI,YAAa,MACnFrP,EAAK3E,SAMd0O,IAAcQ,EAAYJ,QAC1B,kBAAC,GAAD,CAAQ5E,UAAU,gBAAgBM,UAAQ,eAAeiJ,SAAUjF,EAAU9C,QAAS4E,IACnF9B,GAAY,kBAAC,IAAD,CAAS3N,KAAM,CAAC,GAAI,MAChC2I,EAAE,gBAGNkF,IAAcU,IACb,kBAAClD,GAAD,KACE,kBAAC,KAAD,iBAAqByH,GAArB,CAAiCM,cAAe,GAAKC,aAAa,MAGrExF,KAAeU,IACd,kBAAC,IAAD,CACEhG,QAASgG,GAAgB,UAAY,UACrCpO,MAAOoO,GAAgBjO,GAAO,GAC9BiJ,SACEgF,GACI5F,EAAE,gCAAiC,CAAEa,WAAY1F,EAAKxD,OACtDqI,EAAE0F,EAAYtB,OAAQ,CAAE8F,QAASvS,GAAMkJ,WAAY1F,EAAKxD,OAE9DmJ,OACE8E,GACE,kBAACnD,GAAD,CAAStG,KAAMyJ,GAAe7E,IAAI,aAAaC,UAAQ,iBACrD,kBAAC,IAAD,CAAS3J,KAAM,CAAC,GAAI,IAAK8K,MAAO,CAAEqI,YAAa,MADjD,IAC2DxK,EAAE,uBAG7D,GAGJmC,MAAO,CAAEwI,aAAc,OAI7B,kBAAC,KAAD,CACEC,KAAM5F,EACN6F,OAAK,EACLnK,UAAU,UACVoK,OAAM,iBAAYlT,EAASsP,OAAS,OAAS,OAAvC,wBAA6D6D,+BAAoB5P,IACvF6P,QAASC,KAAMC,OAAO,CAAE5B,aAAW/I,IACnC4K,aAAc,IACdC,UAAWzG,EAAIyG,UACfC,aAAcC,aAAgBnQ,GAC9BoQ,UAAWzC,GACX0C,QA5Nc,kBAAMvG,GAAY,IA6NhCJ,OAAQA,EACR4G,SAAU,CACRjU,MAAM,GAAD,OAAKwI,EAAE,gCACZ0L,KAAM9T,EAASsP,OACXlH,EAAE,yCACFA,EAAE,4CACN2L,QAAS3L,EAAE,iCACXF,QAASE,EAAE,kCAEb4L,YAAa,CAAEpK,uB,4CCrlBR,SAASqK,GAAT,GAAqC,IAAVrN,EAAS,oBACjD,OACE,yCAASA,EAAT,CAAgB2D,MAAO,CAAEN,MAAO,UAC9B,0EACA,kGACA,gEACA,4CCaS,SAASiK,GAAT,GAAkC,IAAblU,EAAY,EAAZA,SAC5BiL,EAAUC,cAChB,EAAkCS,mBAAS,MAA3C,oBAAOlD,EAAP,KAAkB0L,EAAlB,KACA,EAA0BxI,mBAAS,MAAnC,oBAAO1D,EAAP,KAAcmM,EAAd,KACA,EAAgDzI,oBAAS,GAAzD,oBAAO0I,EAAP,KAAyBC,EAAzB,KACA,EAAsBjM,6BAAdD,EAAR,EAAQA,EAAG6E,EAAX,EAAWA,OACX,EAAsB3E,cAAd/E,EAAR,EAAQA,KAAMwJ,EAAd,EAAcA,IACNwH,EAAcvU,EAAduU,UACFvH,EAAUwH,mBAAQ,kBAAM5L,IAAQ5I,IAAaqU,IAAkB,CAACrU,EAAUqU,IA+BhF,GAzBAlG,qBAAU,WAmBJoG,GAlBS,uCAAG,oCAAAtS,EAAA,sEAEZqS,GAAoB,GAFR,SAGkBvH,EAAIqB,YAAY,CAAEC,MAAO,CAAEzP,IAAKoB,EAASC,KAAKrB,OAHhE,uBAGMqN,EAHN,EAGJjM,SACFiQ,EAAOhE,EAAE1L,WAAWY,KAAI,SAAAf,GAAC,OAAIA,EAAE+D,OAJzB,SAKe+L,aAAiBD,GALhC,WAKNwE,EALM,UAMS7L,IAAQ6L,GANjB,wBAOVN,EAAa,MAPH,2BAUNhQ,EAAM,IAAIC,IAAIqQ,GACpBN,EAAahQ,EAAII,MAXL,kDAaZ6P,EAAS,KAAI3E,SAbD,yBAeZ6E,GAAoB,GAfR,6EAAH,oDAmBXtF,KAGD,CAAChP,IAEAiI,EACF,OACE,kBAAC,IAAD,CAAQY,SAAS,UACf,6BACE,kBAAC,IAAD,CAAO0B,MAAO,CAAEmK,UAAW,aAAe1M,QAAQ,OAAOhF,KAAK,SAC3DiF,KAOX,GAAI+E,EACF,OACE,kBAAC,IAAD,CAAQnE,SAAS,UACf,kBAAC,IAAD,OAKN,IAAM8L,EAAO3U,EAASC,KAChB2U,EAAe,CAAED,QAEvB,IAAKA,EACH,OACE,kBAAC,IAAD,CAAQ9L,SAAS,UACf,kBAAC,IAAD,OAKN,GAAI7I,EAAS2N,YAAa,CACxB,IAAMkH,EAAUpM,EAAY,iBAAmB,mBAC/C,OACE,kBAAC,IAAD,CACET,QAAQ,OACRpI,MAAOwI,EAAE,mBACTY,SAAUZ,EAAE,kBAAD,OAAmByM,GAAW,CAAE9U,KAAMgJ,yBAAe/I,GAAU,KAC1EkJ,OACE,kBAAC4L,GAAD,KACE,kBAAC,GAAD,CACE1L,UAAQ,gBACRzH,UAAWiG,QACXmK,GAAE,qBAAgB/R,EAASC,KAAKrB,IAA9B,aACFoJ,QAASS,EAAY,WAAa,YAClCa,MAAM,WACLlB,EAAE,mCAEJK,GACC,kBAAC,GAAD,CAAQK,UAAU,cAAcvE,KAAMkE,EAAWW,UAAQ,iBACtDhB,EAAE,mBASjB,OAAK7E,EASH,kBAAC,GAAD,KACE,kBAAC,KAAD,CAAY3D,MAAOwI,EAAE,+BAAgCY,SAAUZ,EAAE,4BACjE,yBAAKU,UAAU,eACb,yBAAKA,UAAU,aACb,yBAAKA,UAAU,qBACb,kBAAC,KAAD,CAAY8L,aAAcA,EAAc3H,OAAQA,OAItD,yBAAKnE,UAAU,mBAAmBM,UAAQ,aACxC,kBAAC,KAAD,CACE2L,WA5GU,WAChB9J,EAAQnK,KAAR,kCAAwC/B,OAAO+E,SAASkR,UA4GlD3T,YAAa,kBAAC4S,GAAD,MACbgB,MAAO,CACLC,WAAY9M,EAAE,0BACd+M,WAAY/M,EAAE,4BAtBpB,kBAAC,IAAD,CAAQS,SAAS,UACf,kBAAC,IAAD,OAiCR,I,MAAM/B,GAAYa,UAAOT,IAAV,qnCAST,SAAAN,GAAK,OAAIA,EAAMU,MAAMC,YAAYE,KAAK,SAYpB,SAAAb,GAAK,OAAIA,EAAMU,MAAMO,QAAQuN,KAAK,QAGpD,SAAAxO,GAAK,OAAIA,EAAMU,MAAMC,YAAYC,GAAG,SAIpC,SAAAZ,GAAK,OAAIA,EAAMU,MAAMC,YAAYE,KAAK,SAapC,SAAAb,GAAK,OAAIA,EAAMU,MAAMC,YAAYC,GAAG,SAIpC,SAAAZ,GAAK,OAAIA,EAAMU,MAAMC,YAAYE,KAAK,SAcxC,SAAAb,GAAK,OAAIA,EAAMU,MAAMC,YAAYC,GAAG,SAIpC,SAAAZ,GAAK,OAAIA,EAAMU,MAAMC,YAAYE,KAAK,SAOtCqN,GAAanN,UAAOT,IAAV,mJAEV,SAAAN,GAAK,OAAIA,EAAMU,MAAMC,YAAYC,GAAG,SAKvB,SAAAZ,GAAK,OAAIA,EAAMU,MAAM+N,QAAQ,MC7MjC,SAASC,KACtB,IAAMC,EAAWlK,aAAc,SAAA/D,GAAK,OAAIA,EAAMC,YAAYE,KAAK,SACvD+N,EAASC,cAATD,KACR,EAAsBnN,6BAAdD,EAAR,EAAQA,EAAG6E,EAAX,EAAWA,OACL1E,EAAQC,cACd,EAAsBF,cAAdyE,EAAR,EAAQA,IAAKxJ,EAAb,EAAaA,KACPmS,IAAiBnN,EAAMI,IAAI,iBAC3B8K,EAAeC,aAAgBnQ,GAEjCY,GAAOoE,EAAMI,IAAI,sBAAwB,IAAI1D,OACjDd,EAAMuE,mBAAmBvE,GAEzB,IAAMwR,EAAQC,YAAQ,sBAAC,oCAAA3T,EAAA,yDAChBkC,EADgB,sBAEb,IAAI0R,MAAMzN,EAAE,wBAFC,uBAKkC2E,EAAI+I,uBAAuB,CAChFzH,MAAO,CAAElK,MAAK4R,YAAY,KANP,mBAKb9V,EALa,EAKbA,KAAMqP,EALO,EAKPA,OAAQ3B,EALD,EAKCA,YAAa4G,EALd,EAKcA,UAG9BtU,EARgB,uBASb,IAAI4V,MAAMzN,EAAE,wCATC,iCAYd,CAAEnI,OAAMqP,SAAQ3B,cAAa4G,cAZf,6CAevB,GAAIoB,EAAM1N,MACR,OACE,kBAAC,EAAD,KACE,6BACE,kBAAC,IAAD,CAAOsC,MAAO,CAAEN,MAAO,OAAQyK,UAAW,aAAe1M,QAAQ,OAAOhF,KAAK,SAC1E2S,EAAM1N,MAAMwH,WAOvB,MAAyBkG,EAAMlU,OAAS,GAAhCxB,EAAR,EAAQA,KAAMqP,EAAd,EAAcA,OACR0G,EAAWC,IAAQC,eAAiBV,GACpCW,EAAQ,CACZ,CACE/U,IAAK,YACLrB,KAAMqI,EAAE,+BACRoN,KAAMS,IAAQD,EAAU,cAE1B,CACE5U,IAAK,UACLrB,KAAMqI,EAAE,yBACRoN,KAAMS,IAAQD,EAAU,YAE1B,CACE5U,IAAK,QACLrB,KAAMqI,EAAE,wBACRoN,KAAMS,IAAQD,EAAU,cAIxBI,EACF,kBAACC,GAAD,KACE,kBAAC,IAAD,CACE/V,KAAOiV,EAAoD,kBAAC,IAAD,CAAkBtL,MAAM,KAAKuI,OAAO,OAA7E,kBAAC,IAAD,CAAYvI,MAAM,MAAMuI,OAAO,UAyBvD,OAnBIkD,IACFS,EAAMG,OAAO,EAAG,GAEhBF,EACE,kBAACC,GAAD,KACE,kBAAC,IAAD,CACE/V,KAAOiV,EAAoD,kBAAC,IAAD,CAAkBtL,MAAM,KAAKuI,OAAO,OAA7E,kBAAC,IAAD,CAAYvI,MAAM,MAAMuI,OAAO,OACjD+D,aAAc,CACZjW,KAAOiV,EAAsD,kBAAC,IAAD,CAAoBtL,MAAM,KAAKuI,OAAO,OAAjF,kBAAC,IAAD,CAAcvI,MAAM,MAAMuI,OAAO,YAOzDvS,IACFA,EAAKwQ,YAAc,IAAIrM,IAAID,GAAKJ,QAIhC,kBAAC,eAAD,CAAcoS,MAAOA,GACnB,kBAAC,IAAD,CACElJ,OAAQA,EACR2H,aAAY,2BAAO3U,GAAP,IAAaqP,WACzB8G,QAASA,EACTI,gBAAiB,kBAAC,IAAD,CAAa/C,aAAcA,EAAcgD,eAAgBA,OAC1EC,QAAQ,MACRC,QACE1W,GAAQA,EAAKK,KACTyJ,aAAmB,CACjBnL,IAAKqB,EAAKrB,IACVoL,QAAS/J,EAAKwQ,YACd5G,SAAU5J,EAAKK,OAEjB,MAEN,kBAACsW,GAAD,KACE,kBAAC,IAAD,KACE,kBAAC,IAAD,CAAUC,OAAK,EAACrB,KAAMA,EAAMzD,GAAE,UAAKyD,EAAL,qBAAsBzW,OAAO+E,SAASkR,UACpE,kBAAC,IAAD,CAAO6B,OAAK,EAACrB,KAAI,UAAKA,EAAL,eACf,kBAACtB,GAAD,CAAWlU,SAAU2V,EAAMlU,OAAS,GAAIuL,QAAS2I,EAAM3I,WAEzD,kBAAC,IAAD,CAAO6J,OAAK,EAACrB,KAAI,UAAKA,EAAL,aACf,kBAAC,GAAD,CAASxV,SAAU2V,EAAMlU,OAAS,MAEpC,kBAAC,IAAD,CAAOoV,OAAK,EAACrB,KAAI,UAAKA,EAAL,cACf,kBAAC,EAAD,CAAUxV,SAAU2V,EAAMlU,OAAS,UASjD,IAAMmV,GAAUjP,UAAOT,IAAV,+NAaPmP,GAAgB1O,UAAOT,IAAV","file":"static/js/20.ca430cdf.chunk.js","sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport pickBy from 'lodash/pickBy';\nimport JSZip from 'jszip';\nimport yaml from 'js-yaml';\nimport saveAs from 'file-saver';\nimport joinURL from 'url-join';\n\nimport toBlockletDid from '@blocklet/meta/lib/did';\n\nimport { toDataURL } from '@arcblock/did-motif';\n\nconst base64ToArrayBuffer = base64 => {\n const bufStr = window.atob(base64);\n const bytes = new Uint8Array(bufStr.length);\n for (let i = 0; i < bufStr.length; i++) {\n bytes[i] = bufStr.charCodeAt(i);\n }\n return bytes.buffer;\n};\n\nconst getLogo = did => {\n const url = toDataURL(did, { size: 200 });\n const base64 = url.replace(/^[^,]*,/, '');\n return base64ToArrayBuffer(base64);\n};\n\nexport function getNameByTitle(title) {\n return title\n .replace(/[\\s/@_]/g, '-')\n .replace(/[^a-zA-Z0-9_-]/g, '')\n .replace(/(^[-\\s]+)|([-\\s]+$)/g, '')\n .toLowerCase();\n}\n\nexport function genExportedMeta(name, blocklet) {\n const meta = pickBy(cloneDeep(blocklet.meta), x => x !== null);\n\n meta.name = name;\n meta.did = toBlockletDid(name);\n meta.logo = 'logo.png';\n\n meta.interfaces.forEach(x => {\n // filter null or undefined\n if (!x.services) {\n delete x.services;\n }\n });\n\n blocklet.children.forEach(child => {\n if (child.dynamic && child.bundleSource) {\n meta.children.push({\n name: child.meta.name,\n source: child.bundleSource,\n title: child.meta.title,\n mountPoint: child.mountPoint,\n });\n }\n });\n\n meta.environments = (blocklet.configs || []).map(x => ({\n name: x.key,\n description: 'Automatically generated when exporting',\n required: !!x.required,\n secure: !!x.secure,\n default: x.secure ? '' : x.value || '',\n }));\n\n meta.capabilities.component = false;\n\n return meta;\n}\n\nconst license = holder => `Copyright © 2022 ${holder || ''}\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.`;\n\nconst Gitignore = `.DS_Store\n.blocklet`;\n\nconst GithubAction = `name: Deploy\n\non:\n push:\n branches:\n - main\n\njobs:\n Deploy:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout repo\n uses: actions/checkout@v2\n\n - name: Blocklet workflow\n uses: blocklet/action-workflow@v1\n with:\n skip-upload: true\n skip-deploy: true\n bundle-command: blocklet bundle --create-release\n github-token: \\${{ secrets.GITHUB_TOKEN }}`;\n\nexport async function downloadExportedSource(meta, { holder } = {}) {\n const folderName = `${meta.name.split('/').pop()}`;\n const readme = `# ${meta.title}\\n\\n## Introduction\\n\\n${meta.description}`;\n\n const zip = new JSZip();\n const folder = zip.folder(folderName);\n folder.file('blocklet.yml', yaml.dump(meta));\n folder.file('blocklet.md', readme);\n folder.file('README.md', readme);\n folder.file('logo.png', getLogo(meta.did));\n folder.file('LICENSE', license(holder));\n folder.file('.gitignore', Gitignore);\n folder.folder('screenshots').file('.gitkeep', '');\n folder.folder('.github').folder('workflows').file('main.yml', GithubAction);\n await new Promise((resolve, reject) => {\n zip\n .generateAsync({ type: 'blob' })\n .then(content => {\n saveAs(content, `${folderName}.zip`);\n resolve();\n })\n .catch(err => {\n reject(err);\n });\n });\n}\nexport const getLaunchURL = (meta, info, encodeURI = false) => {\n const adminPath = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';\n const serverUrl = encodeURI\n ? encodeURIComponent(joinURL(window.location.origin, adminPath))\n : joinURL(window.location.origin, adminPath);\n const metaUrl = joinURL(info?.blockletRegistry, `/api/blocklets/${meta.did}/blocklet.json`);\n return { serverUrl, metaUrl };\n};\nexport const getLaunchAgreementUrl = (meta, info) => {\n const { metaUrl, serverUrl } = getLaunchURL(meta, info);\n\n const url = new URL(joinURL(serverUrl, '/launch-blocklet/agreement'));\n url.searchParams.set('blocklet_meta_url', metaUrl);\n url.searchParams.set('from', window.location.href);\n return url.href;\n};\n","const { types } = require('@ocap/mcrypto');\nconst { toHex } = require('@ocap/util');\nconst { fromPublicKey } = require('@arcblock/did');\n\nconst toBlockletDid = (name) => {\n const pk = toHex(Buffer.from(typeof name === 'string' ? name.trim() : name));\n return fromPublicKey(pk, { role: types.RoleType.ROLE_ANY });\n};\n\nmodule.exports = toBlockletDid;\n","module.exports = __webpack_public_path__ + \"static/media/logo.3f75f557.svg\";","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = ContentLayout;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _styledComponents = _interopRequireDefault(require(\"styled-components\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nconst _excluded = [\"children\"];\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction ContentLayout(_ref) {\n let {\n children\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/_react.default.createElement(Container, props, children);\n}\n\nContentLayout.propTypes = {\n children: _propTypes.default.any.isRequired\n};\n\nconst Container = _styledComponents.default.div.withConfig({\n displayName: \"content-layout__Container\",\n componentId: \"sc-panu44-0\"\n})([\"display:flex;flex-direction:column;align-items:center;width:100%;height:100%;.header{text-align:center;}.body{display:flex;flex-direction:column;align-items:center;margin-top:30px;width:100%;min-height:200px;flex:1;\", \"{padding:24px;}\", \"{padding:0 16px 16px;}}.footer{display:flex;justify-content:center;\", \"{padding-bottom:34px;}\", \"{margin-top:auto;padding-bottom:10px;}}\"], props => props.theme.breakpoints.up('md'), props => props.theme.breakpoints.down('md'), props => props.theme.breakpoints.up('sm'), props => props.theme.breakpoints.down('md'));","import styled from 'styled-components';\n\nconst Center = styled.div`\n width: 100%;\n min-height: 100vh;\n padding: 20px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nexport default Center;\n","import React from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport ContentLayout from '@abtnode/ux/lib/launch-blocklet/content-layout';\nimport Center from '@arcblock/ux/lib/Center';\n\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nfunction Complete({ blocklet }) {\n const { t } = useLocaleContext();\n const { info } = useNodeContext();\n const query = useQuery();\n const accessUrl = decodeURIComponent(query.get('accessUrl') || '');\n\n if (isEmpty(blocklet)) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n return (\n <Container>\n <div className=\"body\">\n <ResultMessage\n variant=\"success\"\n title={getDisplayName(blocklet, true)}\n subTitle={t('launchBlocklet.installSuccess', { serverName: info.name })}\n footer={\n <Link href={accessUrl} rel=\"noreferrer\" data-cy=\"open-blocklet\">\n {t('common.open')}\n </Link>\n }\n />\n </div>\n </Container>\n );\n}\n\nconst Link = styled.a`\n display: block;\n height: 36px;\n color: ${props => props.theme.palette.primary.main};\n`;\n\nconst Container = styled(ContentLayout)`\n .app-info_desc {\n font-weight: 400;\n margin-top: 40px;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .body {\n text-align: center;\n }\n\n ${props => {\n return props.theme.breakpoints.down('md');\n }} {\n .app-info_desc {\n font-size: 16px;\n }\n }\n\n .circle_icon {\n font-size: 58px;\n color: ${props => (props.variant === 'error' ? props.theme.palette.error.main : props.theme.palette.success.main)};\n }\n`;\n\nComplete.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nexport default Complete;\n","import React from 'react';\nimport Button from '@arcblock/ux/lib/Button';\nimport PropTypes from 'prop-types';\n\nfunction WrappedButton({ children, ...props }) {\n return (\n <Button variant=\"contained\" color=\"primary\" {...props}>\n {children}\n </Button>\n );\n}\n\nWrappedButton.propTypes = {\n children: PropTypes.any.isRequired,\n};\n\nexport default React.forwardRef((props, ref) => <WrappedButton {...props} forwardedRef={ref} />);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Img from '@arcblock/ux/lib/Img';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport { getBlockletLogoUrl } from '../../libs/util';\n\nexport default function AppLogo({ blocklet, blockletMetaUrl }) {\n const { did, logo: logoPath } = blocklet.meta;\n\n let content;\n\n if (logoPath) {\n content = (\n <Img\n src={getBlockletLogoUrl({\n did,\n logoPath,\n baseUrl: new URL(blockletMetaUrl).origin,\n })}\n width={64}\n size=\"contain\"\n placeholder=\"application logo\"\n />\n );\n } else {\n content = <Avatar did={did} size={64} />;\n }\n\n return content;\n}\n\nAppLogo.propTypes = {\n blocklet: PropTypes.object.isRequired,\n blockletMetaUrl: PropTypes.string.isRequired,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport Button from '../button';\n\nexport default function Upgrade({ onCancel, onUpgrade }) {\n const { t } = useLocaleContext();\n\n return (\n <ResultMessage\n variant=\"info\"\n title={t('launchBlocklet.newVersion')}\n subTitle={t('launchBlocklet.newVersionDesc')}\n footer={\n <>\n <Button onClick={onCancel} variant=\"outlined\">\n {t('launchBlocklet.later')}\n </Button>\n <Button onClick={onUpgrade} style={{ marginLeft: 24 }}>\n {t('launchBlocklet.upgradeNow')}\n </Button>\n </>\n }\n />\n );\n}\n\nUpgrade.propTypes = {\n onCancel: PropTypes.func,\n onUpgrade: PropTypes.func,\n};\n\nUpgrade.defaultProps = {\n onCancel: () => {},\n onUpgrade: () => {},\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport { useHistory, Link } from 'react-router-dom';\nimport axios from 'axios';\nimport semver from 'semver';\nimport isEmpty from 'lodash/isEmpty';\nimport PropTypes from 'prop-types';\nimport styled, { useTheme } from 'styled-components';\nimport throttle from 'lodash/throttle';\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\nimport { useMediaQuery } from '@mui/material';\nimport Box from '@mui/material/Box';\nimport ArrowForward from '@mui/icons-material/ArrowForward';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Center from '@arcblock/ux/lib/Center';\nimport Connect from '@arcblock/did-connect/lib/Connect';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport { BlockletStatus, BlockletEvents } from '@blocklet/meta/lib/constants';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport PageHeader from '@blocklet/launcher-layout/lib/page-header';\nimport ContentLayout from '@abtnode/ux/lib/launch-blocklet/content-layout';\nimport Toast from '@abtnode/ux/lib/toast';\nimport AnimationWaiter from '@arcblock/ux/lib/AnimationWaiter';\nimport { getServerAuthMethod } from '@abtnode/auth/lib/util/get-auth-method';\nimport { useNodeContext } from '../../contexts/node';\nimport { useSessionContext } from '../../contexts/session';\nimport { getWebWalletUrl, getAccessibleUrl } from '../../libs/util';\nimport { getLaunchURL } from '../blocklet/util';\nimport useQuery from '../../hooks/query';\nimport Button from './button';\nimport AppLogo from './app-logo';\nimport StatusUpgrade from './status/upgrade-available';\nimport serverLogo from '../../assets/logo.svg';\nimport { useSubscription } from '../../libs/ws';\n\n// TODO: 当前state应该可以替换掉下面的 blockletState 和 launchState\nconst useWaiterState = blockletData => {\n const [waiterState, setWaiterState] = useState('');\n const blocklet = useRef(null);\n blocklet.current = blockletData;\n\n const createTargetHandler = handler => {\n return b => {\n if (b.meta.did === blocklet.current.meta.did) {\n handler(b);\n }\n };\n };\n\n useSubscription(\n BlockletEvents.added,\n createTargetHandler(() => setWaiterState('added'))\n );\n useSubscription(\n BlockletEvents.installed,\n createTargetHandler(() => setWaiterState('installed'))\n );\n\n useSubscription(\n BlockletEvents.statusChange,\n createTargetHandler(e => {\n switch (e.status) {\n case BlockletStatus.downloading:\n setWaiterState('downloading');\n break;\n case BlockletStatus.installing:\n setWaiterState('installing');\n break;\n default:\n }\n })\n );\n\n useSubscription(\n BlockletEvents.installFailed,\n createTargetHandler(() => {\n setWaiterState('installFailed');\n })\n );\n useSubscription(\n BlockletEvents.downloadFailed,\n createTargetHandler(() => {\n setWaiterState('downloadFailed');\n })\n );\n\n return waiterState;\n};\n\nfunction Install({ blocklet }) {\n const query = useQuery();\n const history = useHistory();\n const theme = useTheme();\n const isBreakpointsDownSm = useMediaQuery(theme.breakpoints.down('md'));\n const [skipSetup] = useLocalStorage('skip-blocklet-setup', false);\n const blockletMetaUrl = query.get('blocklet_meta_url');\n const blockletRegistryUrl = new URL(blockletMetaUrl).origin;\n const waiterState = useWaiterState(blocklet);\n\n const { api, info, loading } = useNodeContext();\n const { t, locale } = useLocaleContext();\n const { session } = useSessionContext();\n\n const [openAuth, setOpenAuth] = useState(false);\n const [launching, setLaunching] = useState(false);\n const [blockletState, setBlockletState] = useState({ meta: null, loading: true, error: null });\n const [launchState, setLaunchState] = useState({\n exists: blocklet.isInstalled,\n status: 'launchBlocklet.installing',\n upgradeAvailable: null,\n blocklet: null,\n error: null,\n errorAction: blocklet.isInstalled ? 'view' : 'retry',\n });\n const [nextAccessUrl, setNextAccessUrl] = useState('');\n // 当前安装过程中的状态\n const fromUrl = new URL(window.location.href).searchParams.get('from');\n\n useEffect(() => {\n const onMount = async () => {\n if (!blocklet || !blocklet.meta) {\n return;\n }\n try {\n const { blocklet: b } = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n setBlockletState(pre => ({ ...pre, loading: false }));\n if (!b) {\n return;\n }\n\n if (semver.gt(blocklet.meta.version, b.meta.version)) {\n const appDidEnv = b.environments.find(e => e.key === 'BLOCKLET_APP_ID');\n await handleLaunchState(b, {\n appDid: appDidEnv ? appDidEnv.value : '',\n did: b.meta.did,\n currentVersion: b.meta.version,\n version: blocklet.meta.version,\n });\n } else {\n await handleLaunchState(b);\n }\n } catch (err) {\n console.error('error fetch blocklet info', err);\n setBlockletState(pre => ({ ...pre, loading: false }));\n }\n };\n onMount();\n }, [blocklet]); // eslint-disable-line\n\n if (waiterState === 'installFailed' || waiterState === 'downloadFailed') {\n setLaunching(false);\n setLaunchState({ ...launchState, error: `launchBlocklet.error.${waiterState}` });\n }\n\n if (isEmpty(blocklet) || loading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n const name = getDisplayName(blocklet, true);\n let intervalId = null;\n\n const redirectToBlockletOverview = b => {\n const accessUrl = `/blocklets/${b.meta.did}/configuration`;\n let nextUrl = `/launch-blocklet/complete?status=installed&name=${encodeURIComponent(\n name\n )}&accessUrl=${encodeURIComponent(accessUrl)}&blocklet_meta_url=${blockletMetaUrl}`;\n\n const from = query.get('from');\n if (from) {\n nextUrl += `from=${from}`;\n }\n history.push(nextUrl);\n };\n\n const handleLaunchStart = async () => {\n const isAuthorized = session.user && (session.user.permissions || []).includes('mutate_blocklet');\n if (isAuthorized && blocklet.isFree) {\n setLaunching(true);\n setLaunchState({ ...launchState, error: '' });\n\n await api\n .installBlocklet({\n input: { url: blockletMetaUrl },\n })\n .catch(err => {\n Toast.error(err.message);\n console.error('install blocklet failed', err);\n });\n\n intervalId = poll();\n return;\n }\n\n setOpenAuth(true);\n };\n\n const visitOverview = b => {\n setLaunchState({ ...launchState, status: 'launchBlocklet.redirecting' });\n clearInterval(intervalId);\n setTimeout(() => {\n redirectToBlockletOverview(b);\n }, 1500);\n };\n\n const visitBlocklet = async b => {\n const urls = b.interfaces.map(x => x.url);\n const accessUrl = await getAccessibleUrl(urls);\n\n if (isEmpty(accessUrl) || skipSetup) {\n visitOverview(b);\n return;\n }\n\n setLaunchState({ ...launchState, status: 'launchBlocklet.redirecting' });\n clearInterval(intervalId);\n\n const url = new URL(accessUrl);\n // install blocklet 并跳转到 blocklet setup 界面时携带 serverUrl 查询参数\n url.searchParams.set('serverUrl', getLaunchURL(blocklet, info)?.serverUrl);\n\n if (b.status !== 'running') {\n url.searchParams.set('__start__', '1');\n }\n\n setNextAccessUrl(url.href);\n\n setTimeout(() => {\n window.location.href = url.href;\n }, 1500);\n };\n\n const handleInstalled = async b => {\n setTimeout(async () => {\n const result = await api.getBlocklet({ input: { did: b.meta.did } });\n if (result.blocklet.status === 'installed') {\n await handleLaunchState(result.blocklet);\n } else {\n intervalId = poll();\n }\n }, 1500);\n };\n\n const handleErrored = () => {\n setLaunching(false);\n setLaunchState(pre => ({\n ...pre,\n exists: true,\n error: 'launchBlocklet.error.installedButError',\n errorAction: 'view',\n }));\n };\n\n const handleUpgradeAvailable = (b, upgradeAvailable) => {\n setLaunching(false);\n setLaunchState(pre => ({ ...pre, upgradeAvailable }));\n };\n\n const handleStopped = () => {\n setLaunching(false);\n setLaunchState(pre => ({ ...pre, exists: true }));\n };\n\n const handleError = (error, errorAction) => setLaunchState({ ...launchState, error, errorAction });\n\n const handleBlockletExisted = (b, upgradeAvailable) => {\n if (upgradeAvailable) {\n handleUpgradeAvailable(b, upgradeAvailable);\n return;\n }\n\n if (['stopped', 'stopping'].includes(b.status)) {\n handleStopped(b);\n return;\n }\n\n if (['error', 'corrupted'].includes(b.status)) {\n handleErrored(b);\n return;\n }\n\n if (b.status === 'running') {\n visitBlocklet(b);\n return;\n }\n\n if (b.status === 'installed') {\n visitBlocklet(b);\n }\n };\n\n const handleLaunchState = async (b, upgradeAvailable) => {\n if (!b) {\n setLaunching(false);\n setLaunchState({ ...launchState, error: 'launchBlocklet.error.launchFailed' });\n return;\n }\n\n setLaunchState({ ...launchState, blocklet: b });\n handleBlockletExisted(b, upgradeAvailable);\n };\n\n const handleCancelUpgrade = b => {\n visitBlocklet(b);\n };\n\n const handleUpgrade = async (b, upgradeAvailable) => {\n try {\n const input = {\n did: b.meta.did,\n version: upgradeAvailable.version,\n registryUrl: blockletRegistryUrl,\n };\n\n setLaunching(true);\n setLaunchState({ ...launchState, status: 'common.upgrading' });\n await api.upgradeBlocklet({ input });\n } catch (error) {\n Toast.error(error.message);\n setLaunchState({ ...launchState, error: 'launchBlocklet.error.upgradeFailed' });\n }\n };\n\n const checkBlockletStatus = throttle(async () => {\n const { blocklet: b } = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n\n if (!b) {\n clearInterval(intervalId);\n setLaunching(false);\n handleError('launchBlocklet.error.startFailed', 'retry');\n return;\n }\n\n const statusCode = BlockletStatus[b.status];\n\n if ([BlockletStatus.error, BlockletStatus.corrupted].includes(statusCode)) {\n setLaunching(false);\n clearInterval(intervalId);\n handleError('launchBlocklet.error.startFailed', 'view');\n }\n\n if (BlockletStatus.installed === statusCode) {\n clearInterval(intervalId);\n handleInstalled(b);\n }\n\n if ([BlockletStatus.stopped, BlockletStatus.running].includes(statusCode)) {\n handleLaunchState(b);\n }\n }, 2000);\n\n const poll = () => setInterval(checkBlockletStatus, 2000);\n\n const handleConnectSuccess = async (result, decrypt) => {\n localStorage.setItem('__sst', decrypt(result.sessionToken));\n await session.refresh();\n\n setLaunching(true);\n setOpenAuth(false);\n\n intervalId = poll();\n };\n\n const handleClose = () => setOpenAuth(false);\n\n if (blockletState.error) {\n return (\n <Alert variant=\"icon\" type=\"error\">\n {blockletState.error.message}\n </Alert>\n );\n }\n\n if (blockletState.loading) {\n return (\n <div style={{ marginTop: '100px', textAlign: 'center', width: '100%' }}>\n <Spinner />\n </div>\n );\n }\n\n let baseURL = '/';\n if (window.env && window.env.apiPrefix) {\n baseURL = window.env.apiPrefix;\n }\n\n const errorActions = {\n view: (\n <Button\n className=\"bottom-button\"\n component={Link}\n to={`/blocklets/${blocklet.meta.did}/overview`}\n fullWidth={isBreakpointsDownSm}\n data-cy=\"view-blocklet\"\n color=\"primary\"\n variant=\"contained\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n ),\n retry: (\n <Box display=\"flex\" flexDirection=\"column\">\n <Button\n className=\"bottom-button\"\n data-cy=\"retry-install\"\n disabled={openAuth}\n fullWidth={isBreakpointsDownSm}\n onClick={handleLaunchStart}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.retry')}\n </Button>\n {fromUrl && (\n <Button\n style={{ marginTop: 24 }}\n variant=\"text\"\n className=\"bottom-button\"\n data-cy=\"go-back\"\n disabled={openAuth}\n fullWidth={isBreakpointsDownSm}\n onClick={() => {\n window.location.href = fromUrl;\n }}>\n {t('common.back')}\n </Button>\n )}\n </Box>\n ),\n };\n\n if (!launching && launchState.upgradeAvailable) {\n return (\n <Container>\n <StatusUpgrade\n onCancel={() => handleCancelUpgrade(launchState.blocklet)}\n onUpgrade={() => handleUpgrade(launchState.blocklet, launchState.upgradeAvailable)}\n />\n </Container>\n );\n }\n\n if (!launching && launchState.exists) {\n return (\n <Container>\n <ResultMessage\n variant=\"info\"\n title={name}\n subTitle={t('launchBlocklet.error.installedButStopped')}\n footer={errorActions.view}\n />\n </Container>\n );\n }\n\n if (launchState.error) {\n return (\n <Container>\n <ResultMessage\n variant=\"error\"\n title={name}\n subTitle={t(launchState.error, { appName: name, serverName: info.name })}\n footer={errorActions[launchState.errorAction]}\n />\n </Container>\n );\n }\n\n let waiterData = {\n message: (\n <MessageDiv>\n <span className=\"msg-before\">1/5</span>\n {t('launchBlocklet.waiting.verifying')}\n </MessageDiv>\n ),\n };\n\n switch (waiterState) {\n case 'downloading':\n waiterData = {\n message: (\n <MessageDiv>\n <span className=\"msg-before\">2/5</span>\n {t('launchBlocklet.waiting.downloading')}\n </MessageDiv>\n ),\n };\n break;\n case 'installing':\n waiterData = {\n message: (\n <MessageDiv>\n <span className=\"msg-before\">3/5</span>\n {t('launchBlocklet.waiting.extracting')}\n </MessageDiv>\n ),\n };\n break;\n case 'installed':\n waiterData = {\n message: (\n <MessageDiv>\n <span className=\"msg-before\">4/5</span>\n {t('launchBlocklet.waiting.installing')}\n </MessageDiv>\n ),\n };\n break;\n default:\n }\n\n return (\n <Container>\n {!launchState.upgradeAvailable && (\n <div className=\"header\">\n <PageHeader\n className={`launch-page-header ${nextAccessUrl ? 'header-hide' : ''}`}\n title={launching ? t('launchBlocklet.start') : t('common.launch')}\n subTitle={launching ? '' : t('launchBlocklet.subTitle', { appName: name, serverName: info.name })}\n />\n </div>\n )}\n <div className=\"body\">\n {!launching && (\n <div className=\"illustrations\">\n <div className=\"ills-block ills-block-left\">\n <div className=\"ills-block-inner\">\n <AppLogo className=\"i-icon\" blocklet={blocklet} blockletMetaUrl={blockletMetaUrl} />\n <div className=\"i-name\">{name}</div>\n </div>\n </div>\n <ArrowForward className=\"arrow-icon\" />\n <div className=\"ills-block ills-block-right\">\n <div className=\"ills-block-inner\">\n <img width=\"64\" height=\"64\" src={serverLogo} alt=\"\" />\n <div className=\"i-name\">{info.name}</div>\n <DidAddress size={12} prepend={<Avatar did={info.did} size={12} style={{ marginRight: 4 }} />}>\n {info.did}\n </DidAddress>\n </div>\n </div>\n </div>\n )}\n {!launching && !launchState.exists && (\n <Button className=\"bottom-button\" data-cy=\"start-launch\" disabled={openAuth} onClick={handleLaunchStart}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.next')}\n </Button>\n )}\n {launching && !nextAccessUrl && (\n <WaiterContainer>\n <AnimationWaiter {...waiterData} increaseSpeed={0.3} messageLoop={false} />\n </WaiterContainer>\n )}\n {launching && !!nextAccessUrl && (\n <ResultMessage\n variant={nextAccessUrl ? 'success' : 'loading'}\n title={nextAccessUrl ? name : ''}\n subTitle={\n nextAccessUrl\n ? t('launchBlocklet.installSuccess', { serverName: info.name })\n : t(launchState.status, { appName: name, serverName: info.name })\n }\n footer={\n nextAccessUrl ? (\n <LinkEle href={nextAccessUrl} rel=\"noreferrer\" data-cy=\"open-blocklet\">\n <Spinner size={[16, 10]} style={{ marginRight: 14 }} /> {t('common.redirecting')}\n </LinkEle>\n ) : (\n ''\n )\n }\n style={{ marginBottom: 34 }}\n />\n )}\n </div>\n <Connect\n open={openAuth}\n popup\n className=\"connect\"\n action={`launch-${blocklet.isFree ? 'free' : 'paid'}-blocklet-by-${getServerAuthMethod(info)}`}\n checkFn={axios.create({ baseURL }).get}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={getWebWalletUrl(info)}\n onSuccess={handleConnectSuccess}\n onClose={handleClose}\n locale={locale}\n messages={{\n title: `${t('launchBlocklet.dialog.title')}`,\n scan: blocklet.isFree\n ? t('launchBlocklet.dialog.freeDescription')\n : t('launchBlocklet.dialog.nonFreeDescription'),\n confirm: t('launchBlocklet.dialog.confirm'),\n success: t('launchBlocklet.dialog.success'),\n }}\n extraParams={{ blockletMetaUrl }}\n />\n </Container>\n );\n}\n\nInstall.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nconst LinkEle = styled.a`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 36px;\n color: ${props => props.theme.palette.primary.main};\n`;\n\nconst WaiterContainer = styled.div`\n color: #1dc1c7;\n`;\n\nconst Container = styled(ContentLayout)`\n .body {\n align-items: center;\n }\n\n .illustrations {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: start;\n text-align: center;\n margin-top: 16px;\n margin-bottom: 40px;\n width: 100%;\n }\n\n .ills-block,\n .ills-block-inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n flex: 1;\n }\n .ills-block {\n max-width: 220px;\n .i-icon {\n width: 64px;\n height: 64px;\n }\n\n .i-name {\n margin-top: 16px;\n font-weight: 400;\n font-size: 16px;\n color: #222222;\n }\n\n .i-sub-name {\n color: #999999;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #c4c5ca;\n font-size: 30px;\n margin: 16px 0 0;\n ${props => props.theme.breakpoints.down('md')} {\n margin: 25px 24px 0;\n }\n }\n\n .status-icon {\n width: 48px;\n height: 48px;\n }\n\n .status-title {\n margin-top: 16px;\n text-align: center;\n font-size: 24px;\n line-height: 28px;\n }\n\n .status-desc {\n text-align: center;\n margin-top: 16px;\n color: #999999;\n font-size: 16px;\n line-height: 28px;\n }\n .launch-page-header {\n transition: all ease 0.3s;\n &.header-hide {\n opacity: 0;\n }\n }\n .result-footer {\n overflow: visible;\n }\n`;\n\nconst MessageDiv = styled.div`\n .msg-before {\n display: inline-block;\n color: #aaa;\n font-size: 14px;\n margin-right: 6px;\n }\n`;\n\nexport default Install;\n","import React from 'react';\n\nexport default function AgreementApp({ ...props }) {\n return (\n <div {...props} style={{ width: '100%' }}>\n <h3>End User License Agreement for Application</h3>\n <p>Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28</p>\n <p>BLOCKLET SERVER LICENSE AGREEMENT</p>\n <p>暂无</p>\n </div>\n );\n}\n","import React, { useEffect, useState, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { useHistory, Link } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport ServerEula from '@blocklet/launcher-layout/lib/wizard/server-eula';\nimport WizardDesc from '@blocklet/launcher-layout/lib/wizard/wizard-desc';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport isEmpty from 'lodash/isEmpty';\nimport Center from '@arcblock/ux/lib/Center';\n\nimport PageHeader from '@blocklet/launcher-layout/lib/page-header';\nimport { useNodeContext } from '../../contexts/node';\nimport AgreementApp from './agreement-app';\nimport { getAccessibleUrl } from '../../libs/util';\nimport Button from './button';\n\n// TODO: 加载 Blocklet 定义的 Agreement\nexport default function Agreement({ blocklet }) {\n const history = useHistory();\n const [accessUrl, setAccessUrl] = useState(null);\n const [error, setError] = useState(null);\n const [accessUrlLoading, setAccessUrlLoading] = useState(false);\n const { t, locale } = useLocaleContext();\n const { info, api } = useNodeContext();\n const { isRunning } = blocklet;\n const loading = useMemo(() => isEmpty(blocklet) || accessUrlLoading, [blocklet, accessUrlLoading]);\n\n const clickNext = () => {\n history.push(`/launch-blocklet/install${window.location.search}`);\n };\n\n useEffect(() => {\n const onMount = async () => {\n try {\n setAccessUrlLoading(true);\n const { blocklet: b } = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n const urls = b.interfaces.map(x => x.url);\n const accessUrlTmp = await getAccessibleUrl(urls);\n if (!accessUrlTmp && isEmpty(accessUrlTmp)) {\n setAccessUrl(null);\n return;\n }\n const url = new URL(accessUrlTmp);\n setAccessUrl(url.href);\n } catch (err) {\n setError(err.message);\n } finally {\n setAccessUrlLoading(false);\n }\n };\n if (isRunning) {\n onMount();\n }\n // eslint-disable-next-line\n }, [blocklet]);\n\n if (error) {\n return (\n <Center relative=\"parent\">\n <div>\n <Alert style={{ wordBreak: 'break-all' }} variant=\"icon\" type=\"error\">\n {error}\n </Alert>\n </div>\n </Center>\n );\n }\n\n if (loading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n const data = blocklet.meta;\n const blockletMeta = { data };\n\n if (!data) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n if (blocklet.isInstalled) {\n const already = accessUrl ? 'alreadyRunning' : 'alreadyInstalled';\n return (\n <ResultMessage\n variant=\"info\"\n title={t('common.reminder')}\n subTitle={t(`launchBlocklet.${already}`, { name: getDisplayName(blocklet, true) })}\n footer={\n <ButtonWrap>\n <Button\n data-cy=\"view-blocklet\"\n component={Link}\n to={`/blocklets/${blocklet.meta.did}/overview`}\n variant={accessUrl ? 'outlined' : 'contained'}\n color=\"primary\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n {accessUrl && (\n <Button className=\"last-button\" href={accessUrl} data-cy=\"open-blocklet\">\n {t('common.open')}\n </Button>\n )}\n </ButtonWrap>\n }\n />\n );\n }\n\n if (!info) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n return (\n <Container>\n <PageHeader title={t('launchBlocklet.introduction')} subTitle={t('launchBlocklet.welcome')} />\n <div className=\"app-content\">\n <div className=\"agreement\">\n <div className=\"agreement-content\">\n <WizardDesc blockletMeta={blockletMeta} locale={locale} />\n </div>\n </div>\n </div>\n <div className=\"button-container\" data-cy=\"agree-all\">\n <ServerEula\n onContinue={clickNext}\n description={<AgreementApp />}\n texts={{\n listenName: t('launchBlocklet.license'),\n buttonNext: t('launchBlocklet.next'),\n }}\n />\n </div>\n </Container>\n );\n}\n\nAgreement.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n .app-content {\n padding: 34px 24px 24px;\n ${props => props.theme.breakpoints.down('md')} {\n padding-top: 10px;\n }\n width: 100%;\n flex: 1;\n }\n .agreement {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n border: 1px solid ${props => props.theme.palette.grey['100']};\n border-radius: 12px;\n\n ${props => props.theme.breakpoints.up('md')} {\n margin-top: 24px;\n }\n\n ${props => props.theme.breakpoints.down('md')} {\n margin-top: 16px;\n }\n\n .agreement-content {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n font-size: 14px;\n overflow-y: auto;\n\n ${props => props.theme.breakpoints.up('md')} {\n padding: 0 24px;\n }\n\n ${props => props.theme.breakpoints.down('md')} {\n padding: 0 16px;\n }\n\n &:after {\n display: block;\n content: '';\n height: 24px;\n }\n }\n }\n .button-container {\n padding-top: 24px;\n padding-bottom: 34px;\n ${props => props.theme.breakpoints.up('md')} {\n padding-right: 24px;\n margin-left: auto;\n }\n ${props => props.theme.breakpoints.down('md')} {\n padding-top: 0;\n padding-bottom: 16px;\n }\n }\n`;\n\nconst ButtonWrap = styled.div`\n .MuiButton-root {\n ${props => props.theme.breakpoints.up('md')} {\n min-width: 200px;\n }\n }\n .last-button {\n margin-left: ${props => props.theme.spacing(2)}px;\n }\n`;\n","import React from 'react';\nimport { useRouteMatch, Switch, Route, Redirect } from 'react-router-dom';\nimport { useAsync } from 'react-use';\nimport joinUrl from 'url-join';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport styled from 'styled-components';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Layout from '@blocklet/launcher-layout';\nimport { StepProvider } from '@blocklet/launcher-layout/lib/context/step';\nimport HeaderAddon from '@abtnode/ux/lib/layout/addon';\nimport LauncherLogoNotext from '@arcblock/icons/lib/LauncherLogoNotext';\nimport ServerLogoNotext from '@arcblock/icons/lib/ServerLogoNotext';\nimport ServerLogo from '@arcblock/icons/lib/ServerLogo';\nimport LauncherLogo from '@arcblock/icons/lib/LauncherLogo';\nimport NavLogo from '@abtnode/ux/lib/nav-logo';\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nimport Center from '../../components/launch-blocklet/center';\nimport Complete from '../../components/launch-blocklet/step-complete';\nimport Install from '../../components/launch-blocklet/step-install';\nimport Agreement from '../../components/launch-blocklet/step-agreement';\nimport { getBlockletLogoUrl, getPathPrefix, getWebWalletUrl } from '../../libs/util';\nimport { SessionContext } from '../../contexts/session';\n\n// TODO: add skeleton here\nexport default function BlockletLauncher() {\n const isMobile = useMediaQuery(theme => theme.breakpoints.down('md'));\n const { path } = useRouteMatch();\n const { t, locale } = useLocaleContext();\n const query = useQuery();\n const { api, info } = useNodeContext();\n const fromLauncher = !!query.get('from_launcher');\n const webWalletUrl = getWebWalletUrl(info);\n\n let url = (query.get('blocklet_meta_url') || '').trim();\n url = decodeURIComponent(url);\n\n const state = useAsync(async () => {\n if (!url) {\n throw new Error(t('common.invalidParam'));\n }\n\n const { meta, isFree, isInstalled, isRunning } = await api.getBlockletMetaFromUrl({\n input: { url, checkPrice: true },\n });\n if (!meta) {\n throw new Error(t('launchBlocklet.error.loadMetaFailed'));\n }\n\n return { meta, isFree, isInstalled, isRunning };\n });\n\n if (state.error) {\n return (\n <Center>\n <div>\n <Alert style={{ width: '100%', wordBreak: 'break-all' }} variant=\"icon\" type=\"error\">\n {state.error.message}\n </Alert>\n </div>\n </Center>\n );\n }\n\n const { meta, isFree } = state.value || {};\n const basePath = joinUrl(getPathPrefix(), path);\n const steps = [\n {\n key: 'agreement',\n name: t('launchBlocklet.introduction'),\n path: joinUrl(basePath, 'agreement'),\n },\n {\n key: 'install',\n name: t('launchBlocklet.launch'),\n path: joinUrl(basePath, 'install'),\n },\n {\n key: 'setup',\n name: t('launchBlocklet.setup'),\n path: joinUrl(basePath, 'complete'),\n },\n ];\n\n let navLogo = (\n <LogoContainer>\n <NavLogo\n logo={!isMobile ? <ServerLogo width=\"128\" height=\"48\" /> : <ServerLogoNotext width=\"32\" height=\"32\" />}\n />\n </LogoContainer>\n );\n\n // 从launcher 代表已经同意了 blocklet agreement\n if (fromLauncher) {\n steps.splice(0, 1);\n\n navLogo = (\n <LogoContainer>\n <NavLogo\n logo={!isMobile ? <ServerLogo width=\"128\" height=\"48\" /> : <ServerLogoNotext width=\"32\" height=\"32\" />}\n previousData={{\n logo: !isMobile ? <LauncherLogo width=\"145\" height=\"48\" /> : <LauncherLogoNotext width=\"32\" height=\"32\" />,\n }}\n />\n </LogoContainer>\n );\n }\n\n if (meta) {\n meta.registryUrl = new URL(url).origin;\n }\n\n return (\n <StepProvider steps={steps}>\n <Layout\n locale={locale}\n blockletMeta={{ ...meta, isFree }}\n navLogo={navLogo}\n headerEndAddons={<HeaderAddon webWalletUrl={webWalletUrl} SessionContext={SessionContext} />}\n pcWidth=\"80%\"\n logoUrl={\n meta && meta.logo\n ? getBlockletLogoUrl({\n did: meta.did,\n baseUrl: meta.registryUrl,\n logoPath: meta.logo,\n })\n : null\n }>\n <Content>\n <Switch>\n <Redirect exact path={path} to={`${path}/agreement${window.location.search}`} />\n <Route exact path={`${path}/agreement`}>\n <Agreement blocklet={state.value || {}} loading={state.loading} />\n </Route>\n <Route exact path={`${path}/install`}>\n <Install blocklet={state.value || {}} />\n </Route>\n <Route exact path={`${path}/complete`}>\n <Complete blocklet={state.value || {}} />\n </Route>\n </Switch>\n </Content>\n </Layout>\n </StepProvider>\n );\n}\n\nconst Content = styled.div`\n padding-top: 34px;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n .bottom-button {\n min-width: 200px;\n }\n`;\n\nconst LogoContainer = styled.div`\n margin-top: -1px;\n`;\n"],"sourceRoot":""}