@docker/sdk
Advanced tools
| export * from './protos/compose/v1/compose_pb'; |
+20
| "use strict"; | ||
| /* | ||
| Copyright 2020 Docker CLI JavaScript SDK authors | ||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||
| you may not use this file except in compliance with the License. | ||
| You may obtain a copy of the License at | ||
| http://www.apache.org/licenses/LICENSE-2.0 | ||
| Unless required by applicable law or agreed to in writing, software | ||
| distributed under the License is distributed on an "AS IS" BASIS, | ||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| See the License for the specific language governing permissions and | ||
| limitations under the License. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| const tslib_1 = require("tslib"); | ||
| tslib_1.__exportStar(require("./protos/compose/v1/compose_pb"), exports); | ||
| //# sourceMappingURL=compose.js.map |
| {"version":3,"file":"compose.js","sourceRoot":"","sources":["compose.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;EAcE;;;AAEF,yEAA+C"} |
+17
| /* | ||
| Copyright 2020 Docker CLI JavaScript SDK authors | ||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||
| you may not use this file except in compliance with the License. | ||
| You may obtain a copy of the License at | ||
| http://www.apache.org/licenses/LICENSE-2.0 | ||
| Unless required by applicable law or agreed to in writing, software | ||
| distributed under the License is distributed on an "AS IS" BASIS, | ||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| See the License for the specific language governing permissions and | ||
| limitations under the License. | ||
| */ | ||
| export * from './protos/compose/v1/compose_pb'; |
+1
-1
| { | ||
| "version": "1.0.2", | ||
| "version": "1.0.3", | ||
| "license": "Apache-2.0", | ||
@@ -4,0 +4,0 @@ "main": "index.js", |
@@ -14,2 +14,4 @@ // package: com.docker.api.protos.compose.v1 | ||
| down: IComposeService_IDown; | ||
| stacks: IComposeService_IStacks; | ||
| services: IComposeService_IServices; | ||
| } | ||
@@ -35,2 +37,20 @@ | ||
| } | ||
| interface IComposeService_IStacks extends grpc.MethodDefinition<compose_v1_compose_pb.ComposeStacksRequest, compose_v1_compose_pb.ComposeStacksResponse> { | ||
| path: string; // "/com.docker.api.protos.compose.v1.Compose/Stacks" | ||
| requestStream: false; | ||
| responseStream: false; | ||
| requestSerialize: grpc.serialize<compose_v1_compose_pb.ComposeStacksRequest>; | ||
| requestDeserialize: grpc.deserialize<compose_v1_compose_pb.ComposeStacksRequest>; | ||
| responseSerialize: grpc.serialize<compose_v1_compose_pb.ComposeStacksResponse>; | ||
| responseDeserialize: grpc.deserialize<compose_v1_compose_pb.ComposeStacksResponse>; | ||
| } | ||
| interface IComposeService_IServices extends grpc.MethodDefinition<compose_v1_compose_pb.ComposeServicesRequest, compose_v1_compose_pb.ComposeServicesResponse> { | ||
| path: string; // "/com.docker.api.protos.compose.v1.Compose/Services" | ||
| requestStream: false; | ||
| responseStream: false; | ||
| requestSerialize: grpc.serialize<compose_v1_compose_pb.ComposeServicesRequest>; | ||
| requestDeserialize: grpc.deserialize<compose_v1_compose_pb.ComposeServicesRequest>; | ||
| responseSerialize: grpc.serialize<compose_v1_compose_pb.ComposeServicesResponse>; | ||
| responseDeserialize: grpc.deserialize<compose_v1_compose_pb.ComposeServicesResponse>; | ||
| } | ||
@@ -42,2 +62,4 @@ export const ComposeService: IComposeService; | ||
| down: grpc.handleUnaryCall<compose_v1_compose_pb.ComposeDownRequest, compose_v1_compose_pb.ComposeDownResponse>; | ||
| stacks: grpc.handleUnaryCall<compose_v1_compose_pb.ComposeStacksRequest, compose_v1_compose_pb.ComposeStacksResponse>; | ||
| services: grpc.handleUnaryCall<compose_v1_compose_pb.ComposeServicesRequest, compose_v1_compose_pb.ComposeServicesResponse>; | ||
| } | ||
@@ -52,2 +74,8 @@ | ||
| down(request: compose_v1_compose_pb.ComposeDownRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeDownResponse) => void): grpc.ClientUnaryCall; | ||
| stacks(request: compose_v1_compose_pb.ComposeStacksRequest, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeStacksResponse) => void): grpc.ClientUnaryCall; | ||
| stacks(request: compose_v1_compose_pb.ComposeStacksRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeStacksResponse) => void): grpc.ClientUnaryCall; | ||
| stacks(request: compose_v1_compose_pb.ComposeStacksRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeStacksResponse) => void): grpc.ClientUnaryCall; | ||
| services(request: compose_v1_compose_pb.ComposeServicesRequest, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeServicesResponse) => void): grpc.ClientUnaryCall; | ||
| services(request: compose_v1_compose_pb.ComposeServicesRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeServicesResponse) => void): grpc.ClientUnaryCall; | ||
| services(request: compose_v1_compose_pb.ComposeServicesRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeServicesResponse) => void): grpc.ClientUnaryCall; | ||
| } | ||
@@ -63,2 +91,8 @@ | ||
| public down(request: compose_v1_compose_pb.ComposeDownRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeDownResponse) => void): grpc.ClientUnaryCall; | ||
| public stacks(request: compose_v1_compose_pb.ComposeStacksRequest, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeStacksResponse) => void): grpc.ClientUnaryCall; | ||
| public stacks(request: compose_v1_compose_pb.ComposeStacksRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeStacksResponse) => void): grpc.ClientUnaryCall; | ||
| public stacks(request: compose_v1_compose_pb.ComposeStacksRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeStacksResponse) => void): grpc.ClientUnaryCall; | ||
| public services(request: compose_v1_compose_pb.ComposeServicesRequest, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeServicesResponse) => void): grpc.ClientUnaryCall; | ||
| public services(request: compose_v1_compose_pb.ComposeServicesRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeServicesResponse) => void): grpc.ClientUnaryCall; | ||
| public services(request: compose_v1_compose_pb.ComposeServicesRequest, metadata: grpc.Metadata, options: Partial<grpc.CallOptions>, callback: (error: grpc.ServiceError | null, response: compose_v1_compose_pb.ComposeServicesResponse) => void): grpc.ClientUnaryCall; | ||
| } |
@@ -45,2 +45,46 @@ // GENERATED CODE -- DO NOT EDIT! | ||
| function serialize_com_docker_api_protos_compose_v1_ComposeServicesRequest(arg) { | ||
| if (!(arg instanceof compose_v1_compose_pb.ComposeServicesRequest)) { | ||
| throw new Error('Expected argument of type com.docker.api.protos.compose.v1.ComposeServicesRequest'); | ||
| } | ||
| return Buffer.from(arg.serializeBinary()); | ||
| } | ||
| function deserialize_com_docker_api_protos_compose_v1_ComposeServicesRequest(buffer_arg) { | ||
| return compose_v1_compose_pb.ComposeServicesRequest.deserializeBinary(new Uint8Array(buffer_arg)); | ||
| } | ||
| function serialize_com_docker_api_protos_compose_v1_ComposeServicesResponse(arg) { | ||
| if (!(arg instanceof compose_v1_compose_pb.ComposeServicesResponse)) { | ||
| throw new Error('Expected argument of type com.docker.api.protos.compose.v1.ComposeServicesResponse'); | ||
| } | ||
| return Buffer.from(arg.serializeBinary()); | ||
| } | ||
| function deserialize_com_docker_api_protos_compose_v1_ComposeServicesResponse(buffer_arg) { | ||
| return compose_v1_compose_pb.ComposeServicesResponse.deserializeBinary(new Uint8Array(buffer_arg)); | ||
| } | ||
| function serialize_com_docker_api_protos_compose_v1_ComposeStacksRequest(arg) { | ||
| if (!(arg instanceof compose_v1_compose_pb.ComposeStacksRequest)) { | ||
| throw new Error('Expected argument of type com.docker.api.protos.compose.v1.ComposeStacksRequest'); | ||
| } | ||
| return Buffer.from(arg.serializeBinary()); | ||
| } | ||
| function deserialize_com_docker_api_protos_compose_v1_ComposeStacksRequest(buffer_arg) { | ||
| return compose_v1_compose_pb.ComposeStacksRequest.deserializeBinary(new Uint8Array(buffer_arg)); | ||
| } | ||
| function serialize_com_docker_api_protos_compose_v1_ComposeStacksResponse(arg) { | ||
| if (!(arg instanceof compose_v1_compose_pb.ComposeStacksResponse)) { | ||
| throw new Error('Expected argument of type com.docker.api.protos.compose.v1.ComposeStacksResponse'); | ||
| } | ||
| return Buffer.from(arg.serializeBinary()); | ||
| } | ||
| function deserialize_com_docker_api_protos_compose_v1_ComposeStacksResponse(buffer_arg) { | ||
| return compose_v1_compose_pb.ComposeStacksResponse.deserializeBinary(new Uint8Array(buffer_arg)); | ||
| } | ||
| function serialize_com_docker_api_protos_compose_v1_ComposeUpRequest(arg) { | ||
@@ -92,4 +136,26 @@ if (!(arg instanceof compose_v1_compose_pb.ComposeUpRequest)) { | ||
| }, | ||
| stacks: { | ||
| path: '/com.docker.api.protos.compose.v1.Compose/Stacks', | ||
| requestStream: false, | ||
| responseStream: false, | ||
| requestType: compose_v1_compose_pb.ComposeStacksRequest, | ||
| responseType: compose_v1_compose_pb.ComposeStacksResponse, | ||
| requestSerialize: serialize_com_docker_api_protos_compose_v1_ComposeStacksRequest, | ||
| requestDeserialize: deserialize_com_docker_api_protos_compose_v1_ComposeStacksRequest, | ||
| responseSerialize: serialize_com_docker_api_protos_compose_v1_ComposeStacksResponse, | ||
| responseDeserialize: deserialize_com_docker_api_protos_compose_v1_ComposeStacksResponse, | ||
| }, | ||
| services: { | ||
| path: '/com.docker.api.protos.compose.v1.Compose/Services', | ||
| requestStream: false, | ||
| responseStream: false, | ||
| requestType: compose_v1_compose_pb.ComposeServicesRequest, | ||
| responseType: compose_v1_compose_pb.ComposeServicesResponse, | ||
| requestSerialize: serialize_com_docker_api_protos_compose_v1_ComposeServicesRequest, | ||
| requestDeserialize: deserialize_com_docker_api_protos_compose_v1_ComposeServicesRequest, | ||
| responseSerialize: serialize_com_docker_api_protos_compose_v1_ComposeServicesResponse, | ||
| responseDeserialize: deserialize_com_docker_api_protos_compose_v1_ComposeServicesResponse, | ||
| }, | ||
| }; | ||
| exports.ComposeClient = grpc.makeGenericClientConstructor(ComposeService); |
@@ -41,3 +41,6 @@ // package: com.docker.api.protos.compose.v1 | ||
| export class ComposeUpResponse extends jspb.Message { | ||
| getProjectname(): string; | ||
| setProjectname(value: string): ComposeUpResponse; | ||
| serializeBinary(): Uint8Array; | ||
@@ -55,2 +58,3 @@ toObject(includeInstance?: boolean): ComposeUpResponse.AsObject; | ||
| export type AsObject = { | ||
| projectname: string, | ||
| } | ||
@@ -60,3 +64,14 @@ } | ||
| export class ComposeDownRequest extends jspb.Message { | ||
| getProjectname(): string; | ||
| setProjectname(value: string): ComposeDownRequest; | ||
| getWorkdir(): string; | ||
| setWorkdir(value: string): ComposeDownRequest; | ||
| clearFilesList(): void; | ||
| getFilesList(): Array<string>; | ||
| setFilesList(value: Array<string>): ComposeDownRequest; | ||
| addFiles(value: string, index?: number): string; | ||
| serializeBinary(): Uint8Array; | ||
@@ -74,2 +89,5 @@ toObject(includeInstance?: boolean): ComposeDownRequest.AsObject; | ||
| export type AsObject = { | ||
| projectname: string, | ||
| workdir: string, | ||
| filesList: Array<string>, | ||
| } | ||
@@ -79,3 +97,6 @@ } | ||
| export class ComposeDownResponse extends jspb.Message { | ||
| getProjectname(): string; | ||
| setProjectname(value: string): ComposeDownResponse; | ||
| serializeBinary(): Uint8Array; | ||
@@ -93,3 +114,174 @@ toObject(includeInstance?: boolean): ComposeDownResponse.AsObject; | ||
| export type AsObject = { | ||
| projectname: string, | ||
| } | ||
| } | ||
| export class ComposeStacksRequest extends jspb.Message { | ||
| getProjectname(): string; | ||
| setProjectname(value: string): ComposeStacksRequest; | ||
| serializeBinary(): Uint8Array; | ||
| toObject(includeInstance?: boolean): ComposeStacksRequest.AsObject; | ||
| static toObject(includeInstance: boolean, msg: ComposeStacksRequest): ComposeStacksRequest.AsObject; | ||
| static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; | ||
| static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; | ||
| static serializeBinaryToWriter(message: ComposeStacksRequest, writer: jspb.BinaryWriter): void; | ||
| static deserializeBinary(bytes: Uint8Array): ComposeStacksRequest; | ||
| static deserializeBinaryFromReader(message: ComposeStacksRequest, reader: jspb.BinaryReader): ComposeStacksRequest; | ||
| } | ||
| export namespace ComposeStacksRequest { | ||
| export type AsObject = { | ||
| projectname: string, | ||
| } | ||
| } | ||
| export class ComposeStacksResponse extends jspb.Message { | ||
| clearStacksList(): void; | ||
| getStacksList(): Array<Stack>; | ||
| setStacksList(value: Array<Stack>): ComposeStacksResponse; | ||
| addStacks(value?: Stack, index?: number): Stack; | ||
| serializeBinary(): Uint8Array; | ||
| toObject(includeInstance?: boolean): ComposeStacksResponse.AsObject; | ||
| static toObject(includeInstance: boolean, msg: ComposeStacksResponse): ComposeStacksResponse.AsObject; | ||
| static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; | ||
| static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; | ||
| static serializeBinaryToWriter(message: ComposeStacksResponse, writer: jspb.BinaryWriter): void; | ||
| static deserializeBinary(bytes: Uint8Array): ComposeStacksResponse; | ||
| static deserializeBinaryFromReader(message: ComposeStacksResponse, reader: jspb.BinaryReader): ComposeStacksResponse; | ||
| } | ||
| export namespace ComposeStacksResponse { | ||
| export type AsObject = { | ||
| stacksList: Array<Stack.AsObject>, | ||
| } | ||
| } | ||
| export class Stack extends jspb.Message { | ||
| getId(): string; | ||
| setId(value: string): Stack; | ||
| getName(): string; | ||
| setName(value: string): Stack; | ||
| getStatus(): string; | ||
| setStatus(value: string): Stack; | ||
| getReason(): string; | ||
| setReason(value: string): Stack; | ||
| serializeBinary(): Uint8Array; | ||
| toObject(includeInstance?: boolean): Stack.AsObject; | ||
| static toObject(includeInstance: boolean, msg: Stack): Stack.AsObject; | ||
| static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; | ||
| static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; | ||
| static serializeBinaryToWriter(message: Stack, writer: jspb.BinaryWriter): void; | ||
| static deserializeBinary(bytes: Uint8Array): Stack; | ||
| static deserializeBinaryFromReader(message: Stack, reader: jspb.BinaryReader): Stack; | ||
| } | ||
| export namespace Stack { | ||
| export type AsObject = { | ||
| id: string, | ||
| name: string, | ||
| status: string, | ||
| reason: string, | ||
| } | ||
| } | ||
| export class ComposeServicesRequest extends jspb.Message { | ||
| getProjectname(): string; | ||
| setProjectname(value: string): ComposeServicesRequest; | ||
| getWorkdir(): string; | ||
| setWorkdir(value: string): ComposeServicesRequest; | ||
| clearFilesList(): void; | ||
| getFilesList(): Array<string>; | ||
| setFilesList(value: Array<string>): ComposeServicesRequest; | ||
| addFiles(value: string, index?: number): string; | ||
| serializeBinary(): Uint8Array; | ||
| toObject(includeInstance?: boolean): ComposeServicesRequest.AsObject; | ||
| static toObject(includeInstance: boolean, msg: ComposeServicesRequest): ComposeServicesRequest.AsObject; | ||
| static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; | ||
| static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; | ||
| static serializeBinaryToWriter(message: ComposeServicesRequest, writer: jspb.BinaryWriter): void; | ||
| static deserializeBinary(bytes: Uint8Array): ComposeServicesRequest; | ||
| static deserializeBinaryFromReader(message: ComposeServicesRequest, reader: jspb.BinaryReader): ComposeServicesRequest; | ||
| } | ||
| export namespace ComposeServicesRequest { | ||
| export type AsObject = { | ||
| projectname: string, | ||
| workdir: string, | ||
| filesList: Array<string>, | ||
| } | ||
| } | ||
| export class ComposeServicesResponse extends jspb.Message { | ||
| clearServicesList(): void; | ||
| getServicesList(): Array<Service>; | ||
| setServicesList(value: Array<Service>): ComposeServicesResponse; | ||
| addServices(value?: Service, index?: number): Service; | ||
| serializeBinary(): Uint8Array; | ||
| toObject(includeInstance?: boolean): ComposeServicesResponse.AsObject; | ||
| static toObject(includeInstance: boolean, msg: ComposeServicesResponse): ComposeServicesResponse.AsObject; | ||
| static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; | ||
| static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; | ||
| static serializeBinaryToWriter(message: ComposeServicesResponse, writer: jspb.BinaryWriter): void; | ||
| static deserializeBinary(bytes: Uint8Array): ComposeServicesResponse; | ||
| static deserializeBinaryFromReader(message: ComposeServicesResponse, reader: jspb.BinaryReader): ComposeServicesResponse; | ||
| } | ||
| export namespace ComposeServicesResponse { | ||
| export type AsObject = { | ||
| servicesList: Array<Service.AsObject>, | ||
| } | ||
| } | ||
| export class Service extends jspb.Message { | ||
| getId(): string; | ||
| setId(value: string): Service; | ||
| getName(): string; | ||
| setName(value: string): Service; | ||
| getReplicas(): number; | ||
| setReplicas(value: number): Service; | ||
| getDesired(): number; | ||
| setDesired(value: number): Service; | ||
| clearPortsList(): void; | ||
| getPortsList(): Array<string>; | ||
| setPortsList(value: Array<string>): Service; | ||
| addPorts(value: string, index?: number): string; | ||
| serializeBinary(): Uint8Array; | ||
| toObject(includeInstance?: boolean): Service.AsObject; | ||
| static toObject(includeInstance: boolean, msg: Service): Service.AsObject; | ||
| static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>}; | ||
| static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>}; | ||
| static serializeBinaryToWriter(message: Service, writer: jspb.BinaryWriter): void; | ||
| static deserializeBinary(bytes: Uint8Array): Service; | ||
| static deserializeBinaryFromReader(message: Service, reader: jspb.BinaryReader): Service; | ||
| } | ||
| export namespace Service { | ||
| export type AsObject = { | ||
| id: string, | ||
| name: string, | ||
| replicas: number, | ||
| desired: number, | ||
| portsList: Array<string>, | ||
| } | ||
| } |
@@ -25,2 +25,4 @@ // | ||
| rpc Down(ComposeDownRequest) returns (ComposeDownResponse); | ||
| rpc Stacks(ComposeStacksRequest)returns (ComposeStacksResponse); | ||
| rpc Services(ComposeServicesRequest)returns (ComposeServicesResponse); | ||
| } | ||
@@ -35,8 +37,46 @@ | ||
| message ComposeUpResponse { | ||
| string projectName = 1; | ||
| } | ||
| message ComposeDownRequest { | ||
| string projectName = 1; | ||
| string workDir = 2; | ||
| repeated string files = 3; | ||
| } | ||
| message ComposeDownResponse { | ||
| string projectName = 1; | ||
| } | ||
| message ComposeStacksRequest { | ||
| string projectName = 1; | ||
| } | ||
| message ComposeStacksResponse { | ||
| repeated Stack stacks = 1; | ||
| } | ||
| message Stack { | ||
| string id = 1; | ||
| string name = 2; | ||
| string status = 3; | ||
| string reason = 4; | ||
| } | ||
| message ComposeServicesRequest { | ||
| string projectName = 1; | ||
| string workDir = 2; | ||
| repeated string files = 3; | ||
| } | ||
| message ComposeServicesResponse { | ||
| repeated Service services = 1; | ||
| } | ||
| message Service { | ||
| string id = 1; | ||
| string name = 2; | ||
| uint32 replicas = 3; | ||
| uint32 desired = 4; | ||
| repeated string Ports = 5; | ||
| } |
Sorry, the diff of this file is too big to display
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
523398
14.23%51
8.51%11878
14.95%