fmode-ng 0.0.96 → 0.0.97

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.
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/parse/datatype/acl.mjs
7
+ */
8
+ export class FmodeACL{static{this._instance=null}static bindInstance(s){this._instance=s}constructor(s){this.permissions={},s&&(this.permissions={...s})}setPublicReadAccess(s){return this.permissions["*"]=this.permissions["*"]||{read:!1,write:!1},this.permissions["*"].read=s,this}setPublicWriteAccess(s){return this.permissions["*"]=this.permissions["*"]||{read:!1,write:!1},this.permissions["*"].write=s,this}setReadAccess(s,i){const e="string"==typeof s?s:s.id;if(!e)throw new Error("Invalid user ID");return this.permissions[e]=this.permissions[e]||{read:!1,write:!1},this.permissions[e].read=i,this}setWriteAccess(s,i){const e="string"==typeof s?s:s.id;if(!e)throw new Error("Invalid user ID");return this.permissions[e]=this.permissions[e]||{read:!1,write:!1},this.permissions[e].write=i,this}getPublicReadAccess(){return!!this.permissions["*"]?.read}getPublicWriteAccess(){return!!this.permissions["*"]?.write}getReadAccess(s){const i="string"==typeof s?s:s.id;return!!this.permissions[i]?.read}getWriteAccess(s){const i="string"==typeof s?s:s.id;return!!this.permissions[i]?.write}toJSON(){return{...this.permissions}}}
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3BhcnNlL2RhdGF0eXBlL2FjbC5tanM=`
10
+
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/parse/datatype/file.mjs
7
+ */
8
+ import{FmodeObject}from"../fmode.object";export class FmodeFile{static{this._instance=null}static bindInstance(e){this._instance=e}constructor(e,t){this.__type="File",this.name=e,this.data="object"==typeof t&&"base64"in t?this._base64ToArrayBuffer(t.base64):t,this.url=""}_base64ToArrayBuffer(e){const t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}static async save(e,t,n){if(!FmodeObject._instance)throw new Error("Not initialized");const r=new FormData;if(t instanceof Blob||t instanceof File)r.append("file",t,e);else if(t instanceof ArrayBuffer){const a=new Blob([new Uint8Array(t)],{type:n?.type});r.append("file",a,e)}else{const a=new Blob([t],{type:n?.type||"text/plain"});r.append("file",a,e)}const a={"X-Parse-Application-Id":FmodeObject._instance.appId};n?.useMasterKey&&FmodeObject._instance.config.masterKey&&(a["X-Parse-Master-Key"]=FmodeObject._instance.config.masterKey);const i=`${FmodeObject._instance.serverURL}/files/${e}`,s=await fetch(i,{method:"POST",headers:a,body:r}),o=await s.json();if(o.error)throw new Error(o.error);return new FmodeFile(o.name,o.url)}toJSON(){return{__type:"File",name:this.name,url:this.url}}}
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3BhcnNlL2RhdGF0eXBlL2ZpbGUubWpz`
10
+
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/parse/datatype/geopoint.mjs
7
+ */
8
+ export class FmodeGeoPoint{static{this._instance=null}static bindInstance(t){this._instance=t}constructor(t,e){if(this.__type="GeoPoint",t<-90||t>90)throw new Error("Latitude must be between -90 and 90");if(e<-180||e>180)throw new Error("Longitude must be between -180 and 180");this.latitude=t,this.longitude=e}static current(t){return new Promise(((e,i)=>{navigator.geolocation.getCurrentPosition((t=>{e(new FmodeGeoPoint(t.coords.latitude,t.coords.longitude))}),(t=>i(t)),t)}))}kilometersTo(t){return this._calculateDistance(t,"kilometers")}milesTo(t){return this._calculateDistance(t,"miles")}radiansTo(t){return this._calculateDistance(t,"radians")}_calculateDistance(t,e){const i={kilometers:6371,miles:3959,radians:1}[e],a=(t.latitude-this.latitude)*Math.PI/180,n=(t.longitude-this.longitude)*Math.PI/180,s=Math.sin(a/2)*Math.sin(a/2)+Math.cos(this.latitude*Math.PI/180)*Math.cos(t.latitude*Math.PI/180)*Math.sin(n/2)*Math.sin(n/2);return i*(2*Math.atan2(Math.sqrt(s),Math.sqrt(1-s)))}toJSON(){return{__type:"GeoPoint",latitude:this.latitude,longitude:this.longitude}}}
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3BhcnNlL2RhdGF0eXBlL2dlb3BvaW50Lm1qcw==`
10
+
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/parse/datatype/relation.mjs
7
+ */
8
+ import{FmodeQuery}from"../fmode.query";export class FmodeRelation{static{this._instance=null}static bindInstance(t){this._instance=t}constructor(t,e){this.__type="Relation",this.parent=t,this.key=e,this.className=t.className}add(t){if(!this.parent.id)throw new Error("Cannot add relation to unsaved object");if(Array.isArray(t)){t.map((t=>{if("function"!=typeof t.toPointer)throw new Error("Object does not have toPointer method");return t.toPointer()}))}else{if("function"!=typeof t.toPointer)throw new Error("Object does not have toPointer method");t.toPointer()}}remove(t){if(!this.parent.id)throw new Error("Cannot remove relation from unsaved object");t.map((t=>t.toPointer()))}query(){return new FmodeQuery(this.className).relatedTo(this.parent,this.key)}toJSON(){return{__type:"Relation",className:this.className}}}
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3BhcnNlL2RhdGF0eXBlL3JlbGF0aW9uLm1qcw==`
10
+
@@ -5,6 +5,6 @@
5
5
  * 保留所有权利 All Rights Reserved.
6
6
  * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/parse/fmode.object.mjs
7
7
  */
8
- export class FmodeObject{static{this._instance=null}static bindInstance(t){this._instance=t}constructor(t){this.data={},this.className=t}static extend(t){return class extends FmodeObject{constructor(){super(t)}}}toPointer(){return{__type:"Pointer",className:this.className,objectId:this.id}}toJSON(){return{__type:"Object",className:this.className,objectId:this.id,...this.data,createdAt:this.createdAt,updatedAt:this.updatedAt,ACL:this.ACL}}get(t){return this.data[t]}set(t,e){return"object"==typeof t?Object.assign(this.data,t):this.data[t]=e,this}unset(t){return delete this.data[t],this}increment(t,e=1){const s=this.get(t)||0;return this.set(t,s+e),this}add(t,e){const s=this.get(t)||[];return this.set(t,[...s,...e]),this}addUnique(t,e){const s=new Set(this.get(t)||new Set);return e.forEach((t=>s.add(t))),this.set(t,Array.from(s)),this}remove(t,e){const s=this.get(t)||[],a=new Set(e);return this.set(t,s.filter((t=>!a.has(t)))),this}async save(t){if(!FmodeObject._instance)throw new Error("Not initialized");const e=this.id?"PUT":"POST";let s=`${FmodeObject._instance.serverURL}/classes/${this.className}`;this.id&&(s+=`/${this.id}`);const a={"Content-Type":"application/json","X-Parse-Application-Id":FmodeObject._instance.appId};t?.useMasterKey&&FmodeObject._instance.config.masterKey&&(a["X-Parse-Master-Key"]=FmodeObject._instance.config.masterKey);let r=this.data;delete r.createdAt,delete r.updatedAt;const i=await fetch(s,{method:e,headers:a,body:JSON.stringify(r)}),n=await i.json();if(n.error)throw new Error(n.error);return console.log(n,"result"),this.id=n.objectId||this.id,this.createdAt=new Date(n.createdAt||this.createdAt),this.updatedAt=new Date(n.updatedAt||n.updatedAt||n.createdAt),this}async destroy(t){if(!this.id)throw new Error("Cannot destroy unsaved object");if(!FmodeObject._instance)throw new Error("Not initialized");const e={"X-Parse-Application-Id":FmodeObject._instance.appId};t?.useMasterKey&&FmodeObject._instance.config.masterKey&&(e["X-Parse-Master-Key"]=FmodeObject._instance.config.masterKey);const s=`${FmodeObject._instance.serverURL}/classes/${this.className}/${this.id}`,a=await fetch(s,{method:"DELETE",headers:e});if(!a.ok){const t=await a.json();throw new Error(t.error||"Failed to delete object")}}static async create(t,e,s){const a=new this(t);return a.set(e),a.save(s)}static async fetchAll(t,e){if(!FmodeObject._instance)throw new Error("Not initialized");if(0===t.length)return[];const s={"Content-Type":"application/json","X-Parse-Application-Id":FmodeObject._instance.appId};e?.useMasterKey&&FmodeObject._instance.config.masterKey&&(s["X-Parse-Master-Key"]=FmodeObject._instance.config.masterKey);const a=`${FmodeObject._instance.serverURL}/batch`,r=t.map((t=>({method:"GET",path:`/classes/${t.className}/${t.id}`}))),i=await fetch(a,{method:"POST",headers:s,body:JSON.stringify({requests:r})}),n=await i.json();if(n.error)throw new Error(n.error);return n.map(((e,s)=>{const a=t[s];return a.set(e.success),a}))}relation(t){return{__type:"Relation",className:this.className}}static async fromFile(t,e,s){if(!FmodeObject._instance)throw new Error("Not initialized");const a=new FormData;a.append("file",e,t);const r={"X-Parse-Application-Id":FmodeObject._instance.appId},i=`${FmodeObject._instance.serverURL}/files/${t}`,n=await fetch(i,{method:"POST",headers:r,body:a}),c=await n.json();if(c.error)throw new Error(c.error);return{__type:"File",name:c.name,url:c.url}}}
8
+ import{FmodeRelation}from"./datatype/relation";export class FmodeObject{static{this._instance=null}static bindInstance(t){this._instance=t}constructor(t){this.data={},this.className=t}static extend(t){return class extends FmodeObject{constructor(){super(t)}}}toPointer(){return{__type:"Pointer",className:this.className,objectId:this.id}}toJSON(){const t={__type:"Object",className:this.className,...this.data};return this.id&&(t.objectId=this.id),this.createdAt&&(t.createdAt={__type:"Date",iso:this.createdAt.toISOString()}),this.updatedAt&&(t.updatedAt={__type:"Date",iso:this.updatedAt.toISOString()}),this.ACL&&(t.ACL=this.ACL),t}get(t){return this.data[t]}set(t,e){return"object"==typeof t?Object.assign(this.data,t):this.data[t]=e,this}unset(t){return delete this.data[t],this}increment(t,e=1){const s=this.get(t)||0;return this.set(t,s+e),this}add(t,e){const s=this.get(t)||[];return this.set(t,[...s,...e]),this}addUnique(t,e){const s=new Set(this.get(t)||new Set);return e.forEach((t=>s.add(t))),this.set(t,Array.from(s)),this}remove(t,e){const s=this.get(t)||[],i=new Set(e);return this.set(t,s.filter((t=>!i.has(t)))),this}async save(t){if(!FmodeObject._instance)throw new Error("Not initialized");const e=this.id?"PUT":"POST";let s=`${FmodeObject._instance.serverURL}/classes/${this.className}`;this.id&&(s+=`/${this.id}`);const i={"Content-Type":"application/json","X-Parse-Application-Id":FmodeObject._instance.appId};t?.useMasterKey&&FmodeObject._instance.config.masterKey&&(i["X-Parse-Master-Key"]=FmodeObject._instance.config.masterKey);const a=this.toJSON();delete a.createdAt,delete a.updatedAt,delete a.__type,delete a.className;for(const t in a)this.get(t)?.toPointer&&(a[t]=this.get(t).toPointer());const r=await fetch(s,{method:e,headers:i,body:JSON.stringify(a)});console.log(JSON.stringify(a));const n=await r.json();if(console.log(n),n.error)throw new Error(n.error);return this.id=n.objectId||this.id,this.createdAt=new Date(n.createdAt||this.createdAt),this.updatedAt=new Date(n.updatedAt||this.updatedAt),this}async destroy(t){if(!this.id)throw new Error("Cannot destroy unsaved object");if(!FmodeObject._instance)throw new Error("Not initialized");const e={"X-Parse-Application-Id":FmodeObject._instance.appId};t?.useMasterKey&&FmodeObject._instance.config.masterKey&&(e["X-Parse-Master-Key"]=FmodeObject._instance.config.masterKey);const s=`${FmodeObject._instance.serverURL}/classes/${this.className}/${this.id}`,i=await fetch(s,{method:"DELETE",headers:e});if(!i.ok){const t=await i.json();throw new Error(t.error||"Failed to delete object")}}static async create(t,e,s){const i=new this(t);return i.set(e),i.save(s)}static async fetchAll(t,e){if(!FmodeObject._instance)throw new Error("Not initialized");if(0===t.length)return[];const s={"Content-Type":"application/json","X-Parse-Application-Id":FmodeObject._instance.appId};e?.useMasterKey&&FmodeObject._instance.config.masterKey&&(s["X-Parse-Master-Key"]=FmodeObject._instance.config.masterKey);const i=`${FmodeObject._instance.serverURL}/batch`,a=t.map((t=>({method:"GET",path:`/classes/${t.className}/${t.id}`}))),r=await fetch(i,{method:"POST",headers:s,body:JSON.stringify({requests:a})}),n=await r.json();if(n.error)throw new Error(n.error);return n.map(((e,s)=>{const i=t[s];return i.set(e.success),i}))}relation(t){return new FmodeRelation(this,t)}static async fromFile(t,e,s){if(!FmodeObject._instance)throw new Error("Not initialized");const i=new FormData;i.append("file",e,t);const a={"X-Parse-Application-Id":FmodeObject._instance.appId},r=`${FmodeObject._instance.serverURL}/files/${t}`,n=await fetch(r,{method:"POST",headers:a,body:i}),o=await n.json();if(o.error)throw new Error(o.error);return{__type:"File",name:o.name,url:o.url}}}
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3BhcnNlL2Ztb2RlLm9iamVjdC5tanM=`
10
10
 
@@ -5,6 +5,6 @@
5
5
  * 保留所有权利 All Rights Reserved.
6
6
  * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/parse/fmode.parse.mjs
7
7
  */
8
- import{FmodeObject}from"./fmode.object";import{FmodeQuery}from"./fmode.query";import{FmodeUser}from"./fmode.user";class FmodeParse{static{this._instances={}}static{this._defaultInstance=null}constructor(e){this.config=e,this.Object=FmodeObject,this.Query=FmodeQuery,this.User=FmodeUser,FmodeObject.bindInstance(this),FmodeQuery.bindInstance(this),FmodeUser.bindInstance(this)}static initialize(e){let t;if("string"==typeof e){let s="https://dev.fmode.cn/parse";"http:"==location.protocol&&(s="http://dev.fmode.cn:1337/parse"),t=new FmodeParse({appId:e,serverURL:s}),this._defaultInstance=t,this._instances.default=t}else t=new FmodeParse(e),e.config&&(this._instances[e.config]=t),e.config&&"default"!==e.config||(this._defaultInstance=t);return t}static with(e){return this._instances[e]||this._defaultInstance}get serverURL(){return this.config.serverURL}set serverURL(e){this.config.serverURL=e}get appId(){return this.config.appId}}const defaultExport=new Proxy(FmodeParse,{apply:(e,t,s)=>FmodeParse.initialize.apply(e,s),get:(e,t)=>t in e?e[t]:FmodeParse.with("default")[t]});export{FmodeParse as default,defaultExport as FmodeParse};
8
+ import{FmodeACL}from"./datatype/acl";import{FmodeFile}from"./datatype/file";import{FmodeGeoPoint}from"./datatype/geopoint";import{FmodeRelation}from"./datatype/relation";import{FmodeObject}from"./fmode.object";import{FmodeQuery}from"./fmode.query";import{FmodeUser}from"./fmode.user";class FmodeParse{static{this._instances={}}static{this._defaultInstance=null}constructor(e){this.config=e,this.Object=FmodeObject,this.Query=FmodeQuery,this.User=FmodeUser,this.GeoPoint=FmodeGeoPoint,this.File=FmodeFile,this.ACL=FmodeACL,this.Relation=FmodeRelation,FmodeObject.bindInstance(this),FmodeQuery.bindInstance(this),FmodeUser.bindInstance(this),FmodeGeoPoint.bindInstance(this),FmodeRelation.bindInstance(this),FmodeFile.bindInstance(this),FmodeACL.bindInstance(this)}static initialize(e){let t;if("string"==typeof e){let o="https://dev.fmode.cn/parse";"undefined"!=typeof location&&"http:"===location.protocol&&(o="http://dev.fmode.cn:1337/parse"),t=new FmodeParse({appId:e,serverURL:o}),this._defaultInstance=t,this._instances.default=t}else t=new FmodeParse(e),e.config&&(this._instances[e.config]=t),e.config&&"default"!==e.config||(this._defaultInstance=t);return t}static with(e){return this._instances[e]||this._defaultInstance}get serverURL(){return this.config.serverURL}set serverURL(e){this.config.serverURL=e}get appId(){return this.config.appId}}const defaultExport=new Proxy(FmodeParse,{apply:(e,t,o)=>FmodeParse.initialize.apply(e,o),get:(e,t)=>t in e?e[t]:FmodeParse.with("default")[t]});export{FmodeParse as default,defaultExport as FmodeParse};
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3BhcnNlL2Ztb2RlLnBhcnNlLm1qcw==`
10
10
 
@@ -5,6 +5,6 @@
5
5
  * 保留所有权利 All Rights Reserved.
6
6
  * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/core/parse/fmode.query.mjs
7
7
  */
8
- import{FmodeObject}from"./fmode.object";export class FmodeQuery{static{this._instance=null}static bindInstance(e){this._instance=e}static get instance(){if(!this._instance)throw new Error("FmodeParse not initialized");return this._instance}constructor(e){this.where={},this._include=[],this._select=[],this._count=!1,this.or=function(...e){if(0===e.length)throw new Error("At least one query required");const t=e[0].className;if(e.some((e=>e.className!==t)))throw new Error("All queries must be for the same class");const s=new FmodeQuery(t);return s.where={$or:e.map((e=>e.where))},s},this.and=function(...e){if(0===e.length)throw new Error("At least one query required");const t=e[0].className;if(e.some((e=>e.className!==t)))throw new Error("All queries must be for the same class");const s=new FmodeQuery(t);return s.where={$and:e.map((e=>e.where))},s},this.className="string"==typeof e?e:e.prototype.constructor.name}equalTo(e,t){return this.where[e]=t,this}notEqualTo(e,t){return this.where[e]={$ne:t},this}lessThan(e,t){return this.where[e]={$lt:t},this}lessThanOrEqualTo(e,t){return this.where[e]={$lte:t},this}greaterThan(e,t){return this.where[e]={$gt:t},this}greaterThanOrEqualTo(e,t){return this.where[e]={$gte:t},this}containedIn(e,t){return this.where[e]={$in:t},this}notContainedIn(e,t){return this.where[e]={$nin:t},this}exists(e){return this.where[e]={$exists:!0},this}doesNotExist(e){return this.where[e]={$exists:!1},this}containsAll(e,t){return this.where[e]={$all:t},this}contains(e,t){return this.where[e]={$regex:t,$options:"i"},this}startsWith(e,t){return this.where[e]={$regex:`^${t}`,$options:"i"},this}endsWith(e,t){return this.where[e]={$regex:`${t}$`,$options:"i"},this}matches(e,t,s){return this.where[e]={$regex:t.source,$options:s},this}matchesQuery(e,t){return this.where[e]={$inQuery:{className:t.className,where:t.where}},this}doesNotMatchQuery(e,t){return this.where[e]={$notInQuery:{className:t.className,where:t.where}},this}matchesKeyInQuery(e,t,s){return this.where[e]={$select:{key:t,query:{className:s.className,where:s.where}}},this}doesNotMatchKeyInQuery(e,t,s){return this.where[e]={$dontSelect:{key:t,query:{className:s.className,where:s.where}}},this}near(e,t){return this.where[e]={$nearSphere:t},this}withinRadians(e,t,s){return this.where[e]={$nearSphere:t,$maxDistance:s},this}withinMiles(e,t,s){return this.withinRadians(e,t,s/3959)}withinKilometers(e,t,s){return this.withinRadians(e,t,s/6371)}withinGeoBox(e,t,s){return this.where[e]={$within:{$box:[t,s]}},this}polygonContains(e,t){return this.where[e]={$geoWithin:{$polygon:t}},this}include(...e){return this._include=e,this}select(...e){return this._select=e,this}limit(e){return this._limit=e,this}skip(e){return this._skip=e,this}ascending(...e){return this._order=e.map((e=>e.startsWith("-")?e.substring(1):e)),this}descending(...e){return this._order=e.map((e=>e.startsWith("-")?e.substring(1):`-${e}`)),this}addAscending(...e){return this._order||(this._order=[]),this._order.push(...e),this}addDescending(...e){return this._order||(this._order=[]),this._order.push(...e.map((e=>`-${e}`))),this}readPreference(e){return this._readPreference=e,this}includeReadPreference(e){return this._includeReadPreference=e,this}subqueryReadPreference(e){return this._subqueryReadPreference=e,this}hint(e){return this.hint=e,this}maxTimeMS(e){return this._maxTimeMS=e,this}explain(e=!0){return this._explain=e,this}withCount(e=!0){return this._count=e,this}async find(e){const t=new URL(`${FmodeQuery.instance.serverURL}/classes/${this.className}`),s=this._buildQueryParams();Object.entries(s).forEach((([e,s])=>{void 0!==s&&t.searchParams.set(e,"string"==typeof s?s:JSON.stringify(s))}));const r={"X-Parse-Application-Id":FmodeQuery.instance.appId};e?.useMasterKey&&FmodeQuery.instance.config.masterKey&&(r["X-Parse-Master-Key"]=FmodeQuery.instance.config.masterKey),this._sessionToken&&(r["X-Parse-Session-Token"]=this._sessionToken);const i=await fetch(t.toString(),{headers:r}),n=await i.json();if(n.error)throw new Error(n.error);return n.results.map((e=>{const t=new FmodeObject(this.className);return t.set(e),t.id=e.objectId,t.createdAt=new Date(e.createdAt),t.updatedAt=new Date(e.updatedAt||e.createdAt),t}))}async first(e){this.limit(1);return(await this.find(e))[0]||null}async get(e,t){const s=new URL(`${FmodeQuery.instance.serverURL}/classes/${this.className}/${e}`);this.include.length>0&&s.searchParams.set("include",this._include.join(","));const r={"X-Parse-Application-Id":FmodeQuery.instance.appId};t?.useMasterKey&&FmodeQuery.instance.config.masterKey&&(r["X-Parse-Master-Key"]=FmodeQuery.instance.config.masterKey),this._sessionToken&&(r["X-Parse-Session-Token"]=this._sessionToken);const i=await fetch(s.toString(),{headers:r}),n=await i.json();if(n.error)throw new Error(n.error);const h=new FmodeObject(this.className);return h.set(n),h.id=n.objectId,h.createdAt=new Date(n.createdAt),h.updatedAt=new Date(n.updatedAt||n.createdAt),h}async count(e){this.withCount();const t=new URL(`${FmodeQuery.instance.serverURL}/classes/${this.className}`);t.searchParams.set("count","1"),t.searchParams.set("limit","0"),Object.keys(this.where).length>0&&t.searchParams.set("where",JSON.stringify(this.where));const s={"X-Parse-Application-Id":FmodeQuery.instance.appId};e?.useMasterKey&&FmodeQuery.instance.config.masterKey&&(s["X-Parse-Master-Key"]=FmodeQuery.instance.config.masterKey);const r=await fetch(t.toString(),{headers:s}),i=await r.json();if(i.error)throw new Error(i.error);return i.count||0}_buildQueryParams(){const e={};return Object.keys(this.where).length>0&&(e.where=this.where),this._include.length>0&&(e.include=this._include.join(",")),this._select.length>0&&(e.keys=this._select.join(",")),void 0!==this._limit&&(e.limit=this._limit),void 0!==this._skip&&(e.skip=this._skip),this._order&&(e.order=this._order.join(",")),this._count&&(e.count=1),this._explain&&(e.explain=!0),this._hint&&(e.hint=this._hint),this._maxTimeMS&&(e.maxTimeMS=this._maxTimeMS),e}subscribe(){const e=new EventTarget,t=setInterval((async()=>{try{const t=await this.find();e.dispatchEvent(new CustomEvent("update",{detail:t}))}catch(t){e.dispatchEvent(new CustomEvent("error",{detail:t}))}}),5e3);return e.unsubscribe=()=>{clearInterval(t)},e}}
8
+ import{FmodeObject}from"./fmode.object";export class FmodeQuery{static{this._instance=null}static bindInstance(e){this._instance=e}static get instance(){if(!this._instance)throw new Error("FmodeParse not initialized");return this._instance}constructor(e){this.where={},this._include=[],this._select=[],this._count=!1,this.or=function(...e){if(0===e.length)throw new Error("At least one query required");const t=e[0].className;if(e.some((e=>e.className!==t)))throw new Error("All queries must be for the same class");const r=new FmodeQuery(t);return r.where={$or:e.map((e=>e.where))},r},this.and=function(...e){if(0===e.length)throw new Error("At least one query required");const t=e[0].className;if(e.some((e=>e.className!==t)))throw new Error("All queries must be for the same class");const r=new FmodeQuery(t);return r.where={$and:e.map((e=>e.where))},r},this.className="string"==typeof e?e:e.prototype.constructor.name}equalTo(e,t){return this.where[e]=t,this}notEqualTo(e,t){return this.where[e]={$ne:t},this}lessThan(e,t){return this.where[e]={$lt:t},this}lessThanOrEqualTo(e,t){return this.where[e]={$lte:t},this}greaterThan(e,t){return this.where[e]={$gt:t},this}greaterThanOrEqualTo(e,t){return this.where[e]={$gte:t},this}containedIn(e,t){return this.where[e]={$in:t},this}notContainedIn(e,t){return this.where[e]={$nin:t},this}exists(e){return this.where[e]={$exists:!0},this}doesNotExist(e){return this.where[e]={$exists:!1},this}containsAll(e,t){return this.where[e]={$all:t},this}contains(e,t){return this.where[e]={$regex:t,$options:"i"},this}startsWith(e,t){return this.where[e]={$regex:`^${t}`,$options:"i"},this}endsWith(e,t){return this.where[e]={$regex:`${t}$`,$options:"i"},this}matches(e,t,r){return this.where[e]={$regex:t.source,$options:r},this}matchesQuery(e,t){return this.where[e]={$inQuery:{className:t.className,where:t.where}},this}doesNotMatchQuery(e,t){return this.where[e]={$notInQuery:{className:t.className,where:t.where}},this}matchesKeyInQuery(e,t,r){return this.where[e]={$select:{key:t,query:{className:r.className,where:r.where}}},this}doesNotMatchKeyInQuery(e,t,r){return this.where[e]={$dontSelect:{key:t,query:{className:r.className,where:r.where}}},this}near(e,t){return this.where[e]={$nearSphere:t},this}withinRadians(e,t,r){return this.where[e]={$nearSphere:t,$maxDistance:r},this}withinMiles(e,t,r){return this.withinRadians(e,t,r/3959)}withinKilometers(e,t,r){return this.withinRadians(e,t,r/6371)}withinGeoBox(e,t,r){return this.where[e]={$within:{$box:[t,r]}},this}polygonContains(e,t){return this.where[e]={$geoWithin:{$polygon:t}},this}relatedTo(e,t){if(!e.id)throw new Error("Parent object must have an ID");return this.where.$relatedTo={object:e.toPointer(),key:t},this}relatedToObject(e,t){if(!e.id)throw new Error("Parent object must have an ID");return this.where.$relatedTo={object:e.toPointer(),key:t},this}relatedToQuery(e,t,r){return this.where.$relatedTo={key:t,query:{className:e,where:r.where}},this}matchesPointer(e,t){if(!t.id)throw new Error("Object must have an ID");return this.where[e]=t.toPointer(),this}matchesAnyPointer(e,t){const r=t.map((e=>{if(!e.id)throw new Error("All objects must have IDs");return e.toPointer()}));return this.where[e]={$in:r},this}static async findRelation(e,t,r){if(!e.id)throw new Error("Parent object must have an ID");return new FmodeQuery(e.className).relatedTo(e,t).find(r)}static async countRelation(e,t,r){if(!e.id)throw new Error("Parent object must have an ID");return new FmodeQuery(e.className).relatedTo(e,t).count(r)}static async addToRelation(e,t,r,s){if(!e.id)throw new Error("Parent object must have an ID");if(r.some((e=>!e.id)))throw new Error("All objects to add must have IDs");const i=r.map((e=>e.toPointer())),n=`${FmodeQuery.instance.serverURL}/classes/${e.className}/${e.id}`,a={"Content-Type":"application/json","X-Parse-Application-Id":FmodeQuery.instance.appId};s?.useMasterKey&&FmodeQuery.instance.config.masterKey&&(a["X-Parse-Master-Key"]=FmodeQuery.instance.config.masterKey);const o=await fetch(n,{method:"PUT",headers:a,body:JSON.stringify({[t]:{__op:"AddRelation",objects:i}})});if(!o.ok){const e=await o.json();throw new Error(e.error||"Failed to add to relation")}}static async removeFromRelation(e,t,r,s){if(!e.id)throw new Error("Parent object must have an ID");if(r.some((e=>!e.id)))throw new Error("All objects to remove must have IDs");const i=r.map((e=>e.toPointer())),n=`${FmodeQuery.instance.serverURL}/classes/${e.className}/${e.id}`,a={"Content-Type":"application/json","X-Parse-Application-Id":FmodeQuery.instance.appId};s?.useMasterKey&&FmodeQuery.instance.config.masterKey&&(a["X-Parse-Master-Key"]=FmodeQuery.instance.config.masterKey);const o=await fetch(n,{method:"PUT",headers:a,body:JSON.stringify({[t]:{__op:"RemoveRelation",objects:i}})});if(!o.ok){const e=await o.json();throw new Error(e.error||"Failed to remove from relation")}}include(...e){return this._include=e,this}select(...e){return this._select=e,this}limit(e){return this._limit=e,this}skip(e){return this._skip=e,this}ascending(...e){return this._order=e.map((e=>e.startsWith("-")?e.substring(1):e)),this}descending(...e){return this._order=e.map((e=>e.startsWith("-")?e.substring(1):`-${e}`)),this}addAscending(...e){return this._order||(this._order=[]),this._order.push(...e),this}addDescending(...e){return this._order||(this._order=[]),this._order.push(...e.map((e=>`-${e}`))),this}readPreference(e){return this._readPreference=e,this}includeReadPreference(e){return this._includeReadPreference=e,this}subqueryReadPreference(e){return this._subqueryReadPreference=e,this}hint(e){return this.hint=e,this}maxTimeMS(e){return this._maxTimeMS=e,this}explain(e=!0){return this._explain=e,this}withCount(e=!0){return this._count=e,this}async find(e){const t=new URL(`${FmodeQuery.instance.serverURL}/classes/${this.className}`),r=this._buildQueryParams();Object.entries(r).forEach((([e,r])=>{void 0!==r&&t.searchParams.set(e,"string"==typeof r?r:JSON.stringify(r))}));const s={"X-Parse-Application-Id":FmodeQuery.instance.appId};e?.useMasterKey&&FmodeQuery.instance.config.masterKey&&(s["X-Parse-Master-Key"]=FmodeQuery.instance.config.masterKey),this._sessionToken&&(s["X-Parse-Session-Token"]=this._sessionToken);const i=await fetch(t.toString(),{headers:s}),n=await i.json();if(n.error)throw new Error(n.error);return n.results.map((e=>{const t=new FmodeObject(this.className);return t.set(e),t.id=e.objectId,t.createdAt=new Date(e.createdAt),t.updatedAt=new Date(e.updatedAt||e.createdAt),t}))}async first(e){this.limit(1);return(await this.find(e))[0]||null}async get(e,t){const r=new URL(`${FmodeQuery.instance.serverURL}/classes/${this.className}/${e}`);this.include.length>0&&r.searchParams.set("include",this._include.join(","));const s={"X-Parse-Application-Id":FmodeQuery.instance.appId};t?.useMasterKey&&FmodeQuery.instance.config.masterKey&&(s["X-Parse-Master-Key"]=FmodeQuery.instance.config.masterKey),this._sessionToken&&(s["X-Parse-Session-Token"]=this._sessionToken);const i=await fetch(r.toString(),{headers:s}),n=await i.json();if(console.log(r,n),n.error)throw new Error(n.error);const a=new FmodeObject(this.className);return a.set(n),a.id=n.objectId,a.createdAt=new Date(n.createdAt),a.updatedAt=new Date(n.updatedAt||n.createdAt),a}async count(e){this.withCount();const t=new URL(`${FmodeQuery.instance.serverURL}/classes/${this.className}`);t.searchParams.set("count","1"),t.searchParams.set("limit","0"),Object.keys(this.where).length>0&&t.searchParams.set("where",JSON.stringify(this.where));const r={"X-Parse-Application-Id":FmodeQuery.instance.appId};e?.useMasterKey&&FmodeQuery.instance.config.masterKey&&(r["X-Parse-Master-Key"]=FmodeQuery.instance.config.masterKey);const s=await fetch(t.toString(),{headers:r}),i=await s.json();if(i.error)throw new Error(i.error);return i.count||0}_buildQueryParams(){const e={};return Object.keys(this.where).length>0&&(e.where=this.where),this._include.length>0&&(e.include=this._include.join(",")),this._select.length>0&&(e.keys=this._select.join(",")),void 0!==this._limit&&(e.limit=this._limit),void 0!==this._skip&&(e.skip=this._skip),this._order&&(e.order=this._order.join(",")),this._count&&(e.count=1),this._explain&&(e.explain=!0),this._hint&&(e.hint=this._hint),this._maxTimeMS&&(e.maxTimeMS=this._maxTimeMS),e}subscribe(){const e=new EventTarget,t=setInterval((async()=>{try{const t=await this.find();e.dispatchEvent(new CustomEvent("update",{detail:t}))}catch(t){e.dispatchEvent(new CustomEvent("error",{detail:t}))}}),5e3);return e.unsubscribe=()=>{clearInterval(t)},e}}
9
9
  var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9jb3JlL3BhcnNlL2Ztb2RlLnF1ZXJ5Lm1qcw==`
10
10