anchor.diff:  import 'package:rpc/rpc.dart';
   import 'package:shelf/shelf.dart' as shelf;
   import 'package:shelf/src/body.dart';
  +import 'package:jwt/json_web_token.dart';
   import 'dart:convert';
   import '../managers/managers.dart' as mgrs;
   import 'user_service.dart' as userService;
  
positive.code: 
    static String lastVersionBranchName = "@@@@LAST####";
    static String lastVersionName = "latest";
  /*
  Not used yet
    @ApiMethod(method: 'PUT', path: 'artifacts/{idArtifact}')
  
negative.code: 
    static Future downloadFile(String idArtifact,{String token}) async {
      try {
        //verify token
        var jsonWebToken = new JsonWebTokenCodec(secret: config.currentLoadedConfig[config.MDT_TOKEN_SECRET]);
        Map tokenInfo = jsonWebToken.decode(token);
        DateTime now = new DateTime.now();
        DateTime validity = new DateTime.fromMillisecondsSinceEpoch(tokenInfo["validity"]);
        if (now.isAfter(validity)){
          throw new RpcError(401,"ARTIFACT_ERROR","Access expired");
        }
  
        var tokenArtifactId = tokenInfo["id"];
        //artifactID same as those in token
        if (idArtifact != tokenArtifactId){
          return new RpcError(401,"ARTIFACT_ERROR","Access denied");
        }
  
        var artifact = await mgrs.findArtifact(idArtifact);
        if (artifact == null){
          return new NotFoundError();
        }
  
        Stream stream = await mgrs.streamFromArtifact(artifact, mgrs.defaultStorage);
        var body = new Body(stream);
        var headers = {"Content-Type":artifact.contentType,"Content-length":"${artifact.size}","Content-Disposition":"attachment; filename=${artifact.filename}"};
  